/* Convert 4.4.0 */

/* Drop Constraints... */
RECONNECT;

ALTER TABLE DISCCOND DROP CONSTRAINT PRI_DISCCOND;


ALTER TABLE DISCCOND DROP CONSTRAINT UNQ_DISCCOND_CODE;


RECONNECT;

ALTER TABLE DISCS DROP CONSTRAINT PRI_DISCS;


ALTER TABLE DISCS DROP CONSTRAINT UNQ_DISCS_CODE;


RECONNECT;

ALTER TABLE DISCSCHM DROP CONSTRAINT PRI_DISCSCHM;


ALTER TABLE DISCSCHM DROP CONSTRAINT UNQ_DISCSCHM_CODE;



/* Create Domain... */
CREATE DOMAIN FVARCHAR13 AS VARCHAR(13);

CREATE DOMAIN FVARCHAR4 AS VARCHAR(4);

/* Declare UDF */
DECLARE EXTERNAL FUNCTION INDATERANGE
DATE,INTEGER,CSTRING(255),CSTRING(255),CSTRING(255),CSTRING(255),CSTRING(255),CSTRING(255)
RETURNS INTEGER BY VALUE
ENTRY_POINT 'InDateRange' MODULE_NAME 'UDFAtol';


/* Empty trigger body before drop... */
SET TERM ^ ;

ALTER TRIGGER INS_BEF_DISCCOND
 AS Declare variable I integer;
BEGIN I = 0; END
^

/* Empty trigger body before drop... */
ALTER TRIGGER UPD_BEF_DISCCOND
 AS Declare variable I integer;
BEGIN I = 0; END
^

/* Alter Procedure (Before Drop)... */
/* AssignEmptyBody proc */
ALTER PROCEDURE APPENDDISC(IDISCOUNTSCHEMECODE INTEGER,
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ICODE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
INAME VARCHAR(100),
IPRICEBEG NUMERIC(15,2),
IPRICEEND NUMERIC(15,2),
IQUANTITYBEG NUMERIC(15,2),
IQUANTITYEND NUMERIC(15,2),
IQUANTITYRECBEG NUMERIC(15,2),
IQUANTITYRECEND NUMERIC(15,2),
IQUANTITYWAREBEG NUMERIC(15,2),
IQUANTITYWAREEND NUMERIC(15,2),
ISUMMBEG NUMERIC(15,2),
ISUMMEND NUMERIC(15,2),
ISUMMRECBEG NUMERIC(15,2),
ISUMMRECEND NUMERIC(15,2),
ISUMMWAREBEG NUMERIC(15,2),
ISUMMWAREEND NUMERIC(15,2),
ITEXT VARCHAR(100),
ITIMEBEG TIME,
ITIMEEND TIME,
ITYPE INTEGER,
IVAL VARCHAR(100),
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* AssignEmptyBody proc */
ALTER PROCEDURE APPENDDISCCLIENT(ICODE INTEGER,
IDISCOUNTSCHEMEID INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDELETED INTEGER)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* AssignEmptyBody proc */
ALTER PROCEDURE APPENDDISCSCHM(ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IDISCCOLLOPER INTEGER,
IDELETED INTEGER)
 AS
 BEGIN EXIT; END
^


/* Drop Procedure... */
SET TERM ; ^

DROP PROCEDURE APPENDDISC;

DROP PROCEDURE APPENDDISCCLIENT;

DROP PROCEDURE APPENDDISCSCHM;

DROP PROCEDURE GRANT_ALL_TO_PUBLIC;


/* Drop Trigger... */
DROP TRIGGER INS_BEF_DISCCOND;

DROP TRIGGER UPD_BEF_DISCCOND;


/* Drop Index... */
RECONNECT;

DROP INDEX IDX_DC_CARDPRBED;

RECONNECT;

DROP INDEX IDX_DC_CARDPREND;


/* Drop Fields on Table... */
/* Empty APPENDCARD for drop CARD(SUMM) */
/* AssignEmptyBody proc */
SET TERM ^ ;

ALTER PROCEDURE APPENDCARD(ICARDGROUPCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IEXPDATEBEG DATE,
IEXPDATEEND DATE,
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ISUMM DOUBLE PRECISION,
INOMINAL DOUBLE PRECISION,
ISTATE INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

SET TERM ; ^

ALTER TABLE CARD DROP SUMM;

/* Empty APPENDCARDGROUP for drop CARDGROUP(PAYTYPE) */
/* AssignEmptyBody proc */
SET TERM ^ ;

ALTER PROCEDURE APPENDCARDGROUP(ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IENTERTYPE INTEGER,
IPAYTYPE INTEGER,
ICHANGESUMM INTEGER,
IDELETED INTEGER)
 AS
 BEGIN EXIT; END
^

SET TERM ; ^

ALTER TABLE CARDGROUP DROP PAYTYPE;

ALTER TABLE CARDGROUP DROP CHANGESUMM;

/* Empty APPENDREMAIN for drop REMAIN(DISCOUNTTYPE) */
/* AssignEmptyBody proc */
SET TERM ^ ;

ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

SET TERM ; ^

ALTER TABLE REMAIN DROP DISCOUNTTYPE;

ALTER TABLE REMAIN DROP DISCOUNTVALUE;

ALTER TABLE RMK DROP INFDATACHNG;

/* Empty APPENDWARE for drop SPRT(INTDISCSCHMID) */
/* AssignEmptyBody proc */
SET TERM ^ ;

ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE DOUBLE PRECISION,
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

SET TERM ; ^

ALTER TABLE SPRT DROP INTDISCSCHMID;

ALTER TABLE SPRT DROP DISCOUNTTYPE;

ALTER TABLE SPRT DROP DISCOUNTVALUE;


RECONNECT;

/* Drop Tables... */
DROP TABLE DISCCOND;

/* AssignEmptyBody proc */
SET TERM ^ ;

ALTER PROCEDURE APPENDFIXDISCS(ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IPREFIX VARCHAR(40),
IVAL DOUBLE PRECISION,
ITYPE INTEGER,
IDATERANGEBEG DATE,
IDATERANGEEND DATE,
IDESTINATION INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

SET TERM ; ^

DROP TABLE DISCS;

DROP TABLE DISCSCHM;


ALTER TABLE PAYCARDDEV ADD SLIPCOUNT FINT;

ALTER TABLE RMK ADD RMKVERSION FLAG NOT NULL;

ALTER TABLE SPRT ADD REWARDTYPE FINT;

ALTER TABLE SPRT ADD REWARDVAL FNUM15_3 NOT NULL;

ALTER TABLE TRANZT ADD CHQTRANZCOUNT FINT NOT NULL;

/* Create Table... */
CREATE TABLE ACTDISC(ID FID,
CODE FINT NOT NULL,
GRPACTDISCID FREF,
NAME FVARCHAR100,
DELETED FLAG,
CONDITIONID FREF NOT NULL,
DISCRATEID FREF,
ACTSCRIPTID FREF,
PRIORITY FRINT NOT NULL);


CREATE TABLE ACTDISCOBJ(ID FID NOT NULL,
CLIENTID RREF,
WAREID RREF,
ASPECTVALUE1ID FREF,
ASPECTVALUE2ID FREF,
ASPECTVALUE3ID FREF,
ASPECTVALUE4ID FREF,
ASPECTVALUE5ID FREF,
PAYMENTID RREF,
DISCRATEID FREF,
ACTSCRIPTID FREF,
GRPACTDISCID FREF,
CARDID FREF NOT NULL);


CREATE TABLE ACTSCRIPT(ID FID NOT NULL,
CODE FINT NOT NULL,
NAME FVARCHAR100,
DATA FBLOBTEXT,
ACTEVENT FRINT NOT NULL);


CREATE TABLE CCARD(ID FID NOT NULL,
CODE FRINT,
GRPCCARDID RREF,
VAL FVARCHAR40,
EXPDATEBEG FDATE,
EXPDATEEND FDATE,
STATE FLAG,
DELETED FLAG);


CREATE TABLE CCARDCOUNTER(CCARDID FREF NOT NULL,
COUNTERID FREF NOT NULL);


CREATE TABLE CLIENT(ID FID NOT NULL,
CODE FRINT,
PARENTID RREF,
NAME FVARCHAR100,
TEXT FVARCHAR100,
ISFOLDER FLAG NOT NULL,
DESCRIPTION FBLOBTEXT,
SEX FLAG,
MEMDATE FDATE,
BIRTHDATE FDATE,
REGDATE FDATE NOT NULL,
ZIPCODE FVARCHAR10,
CITY FVARCHAR100,
ADDRESS FVARCHAR255,
EMAIL FVARCHAR30,
WEB FVARCHAR30,
TELEPHONE FVARCHAR30,
INN FVARCHAR20,
DOCUMENT FVARCHAR100,
OKPO FVARCHAR13,
OKPD FVARCHAR4);


CREATE TABLE CLIENTCARD(CLIENTID FREF NOT NULL,
CCARDID FREF NOT NULL);


CREATE TABLE CLIENTCOUNTER(CLIENTID FREF NOT NULL,
COUNTERID FREF NOT NULL);


CREATE TABLE CONDITION(ID FID,
TIMEBEG FTIME,
TIMEEND FTIME,
DATEBEG FDATE,
DATEEND FDATE,
DAYBEG FINT,
DAYEND FINT,
QUANTITYBEG FNUM,
QUANTITYEND FNUM,
SUMMBEG FNUM,
SUMMEND FNUM,
SUMMRECBEG FNUM,
SUMMRECEND FNUM,
CARDPREFIXBEG FVARCHAR40,
CARDPREFIXEND FVARCHAR40,
QUANTITYRECBEG FNUM,
QUANTITYRECEND FNUM,
PRICEBEG FNUM,
PRICEEND FNUM,
WAREID FINT,
SUMMWAREBEG FNUM,
SUMMWAREEND FNUM,
QUANTITYWAREEND FNUM,
QUANTITYWAREBEG FNUM,
CARDSTATE FINT NOT NULL,
CARDLENBEG FINT,
CARDLENEND FINT,
MEMDAYBEG FINT,
MEMDAYEND FINT,
MEMMONTHBEG FINT,
MEMMONTHEND FINT,
MEMYEARBEG FINT,
MEMYEAREND FINT,
REGDAYBEG FINT,
REGDAYEND FINT,
REGMONTHBEG FINT,
REGMONTHEND FINT,
REGYEARBEG FINT,
REGYEAREND FINT,
COUNTERBEG1 FNUM,
COUNTEREND1 FNUM,
COUNTERTYPE1ID FREF,
BIRTHDAYBEG FINT,
BIRTHDAYEND FINT,
BIRTHMONTHBEG FINT,
BIRTHMONTHEND FINT,
BIRTHYEARBEG FINT,
BIRTHYEAREND FINT,
REGDATECOND FINT,
REGDATEBEG FDATE,
REGDATEEND FDATE,
MEMDATEBEG FDATE,
MEMDATEEND FDATE,
MEMDATECOND FINT,
BIRTHDATEBEG FDATE,
BIRTHDATEEND FDATE,
BIRTHDATECOND FINT,
COUNTERBEG2 FNUM,
COUNTEREND2 FNUM,
COUNTERTYPE2ID FREF,
COUNTERBEG3 FNUM,
COUNTEREND3 FNUM,
COUNTERTYPE3ID FREF,
SEX FINT);


CREATE TABLE COUNTER(ID FID NOT NULL,
CODE FRINT,
VAL FNUM15_3,
COUNTERTYPEID FREF);


CREATE TABLE COUNTERD(ID FID NOT NULL,
COUNTERID RREF,
DELTA FNUM15_3,
CHEQUEIDENT FINT);


CREATE TABLE COUNTERTYPE(ID FID NOT NULL,
CODE FRINT,
NAME FRVARCHAR100,
AUTOCREATE FRINT NOT NULL);


CREATE TABLE DISCRATE(ID FID,
PARENTID FRINT NOT NULL,
CODE FRINT NOT NULL,
NAME FVARCHAR100,
TEXT FVARCHAR100,
VAL FVARCHAR100,
BEGVAL FVARCHAR100,
ENDVAL FVARCHAR100,
WAREID FREF,
"TYPE" FINT,
DESTINATION FINT,
KIND FINT,
ISFOLDER FLAG NOT NULL,
DISCCOLLOPER FINT);


CREATE TABLE GRPACTDISC(ID FID,
CODE FRINT NOT NULL,
NAME FVARCHAR100,
ACTV FLAG NOT NULL,
DEPENDOTHERPOS FLAG NOT NULL,
DELETED FLAG);


CREATE TABLE GRPCCARD(ID FID NOT NULL,
CODE FRINT,
NAME FVARCHAR100,
TEXT FVARCHAR100,
AUTOREGCLIENT FINT,
AUTOREGCARD FINT,
CARDPREFIXBEG FVARCHAR40,
CARDPREFIXEND FVARCHAR40,
CARDLENBEG FINT,
CARDLENEND FINT,
ENTERTYPE FINT);



/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG NUMERIC(15,2),
IPRICEEND NUMERIC(15,2),
IQUANTITYBEG NUMERIC(15,2),
IQUANTITYEND NUMERIC(15,2),
IQUANTITYRECBEG NUMERIC(15,2),
IQUANTITYRECEND NUMERIC(15,2),
IQUANTITYWAREBEG NUMERIC(15,2),
IQUANTITYWAREEND NUMERIC(15,2),
ISUMMBEG NUMERIC(15,2),
ISUMMEND NUMERIC(15,2),
ISUMMRECBEG NUMERIC(15,2),
ISUMMRECEND NUMERIC(15,2),
ISUMMWAREBEG NUMERIC(15,2),
ISUMMWAREEND NUMERIC(15,2),
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE APPENDCONDITION(ICONDITIONID INTEGER,
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG DOUBLE PRECISION,
IPRICEEND DOUBLE PRECISION,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IQUANTITYRECBEG DOUBLE PRECISION,
IQUANTITYRECEND DOUBLE PRECISION,
IQUANTITYWAREBEG DOUBLE PRECISION,
IQUANTITYWAREEND DOUBLE PRECISION,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
ISUMMWAREBEG DOUBLE PRECISION,
ISUMMWAREEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE APPENDDEFAULTGRPDISC(ITYPE INTEGER,
ICODE INTEGER,
IFREEWARE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE APPENDDISCRATE(IPARENTID INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
IBEGVAL VARCHAR(100),
IENDVAL VARCHAR(100),
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
IISFOLDER INTEGER,
IDISCCOLLOPER INTEGER,
IGRPACTDISCID INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE APPENDGESTCLIENT(ICARD VARCHAR(100),
ITYPE INTEGER,
IVALUE VARCHAR(100),
INAME VARCHAR(100),
IGRPACTDISC INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE APPENDGRPACTDISC(ICODE INTEGER,
INAME VARCHAR(100),
IACTV INTEGER,
IDISCCOLLOPER INTEGER,
IDEPENDOTHERPOS INTEGER,
IDISCRATEGRPCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE APPPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE DEL_MARKED AS
 BEGIN EXIT; END
^

CREATE PROCEDURE DEL_MARKED_EX(C_WARE INTEGER,
C_BARCODE INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_CLIENT_PARENTS(ID_CLIENT INTEGER,
IN_NUM INTEGER)
 RETURNS(ID_PARENT INTEGER,
NUM INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_CLIENT_PARENTS0(ID_CLIENT INTEGER)
 RETURNS(ID_PARENT INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_DISCRATE_PARENTS(ID_DISCRATE INTEGER,
IN_NUM INTEGER)
 RETURNS(ID_PARENT INTEGER,
NUM INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_IDLIST(IDLIST VARCHAR(255))
 RETURNS(ID INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_WARE_PARENTS0(ID_WARE INTEGER)
 RETURNS(ID_PARENT INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE INITDISCSUPERMAG(IFORWARE INTEGER,
IDESTINATION INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE SENDDATACNGEVENT AS
 BEGIN EXIT; END
^


/* Create Index... */
SET TERM ; ^

CREATE INDEX IDX_ACTDISCOBJ_CLIENTID ON ACTDISCOBJ(CLIENTID);

CREATE INDEX IDX_ACTDISCOBJ2 ON ACTDISCOBJ(CLIENTID,CARDID,WAREID,ASPECTVALUE5ID,ASPECTVALUE4ID,ASPECTVALUE3ID,ASPECTVALUE2ID,ASPECTVALUE1ID,PAYMENTID);

CREATE INDEX IDX_C_CARDPRBEG ON CONDITION(CARDPREFIXBEG);

CREATE INDEX IDX_C_CARDPREND ON CONDITION(CARDPREFIXEND);

CREATE INDEX IDX_CCARD_VAL ON CCARD(VAL);

CREATE INDEX IDX_CLI_PARENT ON CLIENT(PARENTID);

CREATE INDEX IDX_CLIENT_NAME ON CLIENT(NAME);

CREATE INDEX IDX_DISCRATE_VAL_NAME ON DISCRATE(NAME,VAL);

CREATE INDEX IND_CNTD1 ON COUNTERD(CHEQUEIDENT);


/* Create Generator... */
CREATE GENERATOR GCNTCODE;

CREATE GENERATOR GCOUNTERD;


/* Create Exception... */
CREATE EXCEPTION E_CLIENT_STRUCT_CORRUPT '    ';

CREATE EXCEPTION E_DISCRATE_STRUCT_CORRUPT '     ';


/* Create Primary Key... */
ALTER TABLE ACTDISC ADD CONSTRAINT PRI_ACTDISC PRIMARY KEY (ID);

ALTER TABLE ACTDISCOBJ ADD CONSTRAINT PK_ACTDISCOBJ PRIMARY KEY (ID);

ALTER TABLE ACTSCRIPT ADD CONSTRAINT PK_ACTSCRIPT PRIMARY KEY (ID);

ALTER TABLE CCARD ADD CONSTRAINT PK_CCARD PRIMARY KEY (ID);

ALTER TABLE CCARDCOUNTER ADD CONSTRAINT PK_CCARDCOUNTER PRIMARY KEY (CCARDID,COUNTERID);

ALTER TABLE CLIENT ADD CONSTRAINT PK_CLIENT PRIMARY KEY (ID);

ALTER TABLE CLIENTCARD ADD CONSTRAINT PK_CLIENTCARD PRIMARY KEY (CLIENTID,CCARDID);

ALTER TABLE CLIENTCOUNTER ADD CONSTRAINT PK_CLIENTCOUNTER PRIMARY KEY (CLIENTID,COUNTERID);

ALTER TABLE CONDITION ADD CONSTRAINT PRI_CONDITION PRIMARY KEY (ID);

ALTER TABLE COUNTER ADD CONSTRAINT PK_COUNTER PRIMARY KEY (ID);

ALTER TABLE COUNTERD ADD CONSTRAINT PK_COUNTERD PRIMARY KEY (ID);

ALTER TABLE COUNTERTYPE ADD CONSTRAINT PK_COUNTERTYPE PRIMARY KEY (ID);

ALTER TABLE DISCRATE ADD CONSTRAINT PRI_DISCRATE PRIMARY KEY (ID);

ALTER TABLE GRPACTDISC ADD CONSTRAINT PK_GRPACTDISC PRIMARY KEY (ID);

ALTER TABLE GRPCCARD ADD CONSTRAINT PK_GRPCCARD PRIMARY KEY (ID);

/* Create Unique... */
ALTER TABLE ACTDISC ADD CONSTRAINT UNQ_ACTDISC UNIQUE (GRPACTDISCID,CODE,DELETED);

ALTER TABLE ACTSCRIPT ADD CONSTRAINT UNQ_ACTSCRIPT_CODE UNIQUE (CODE);

ALTER TABLE CCARD ADD CONSTRAINT UNQ_CCARD UNIQUE (CODE,GRPCCARDID);

ALTER TABLE CLIENT ADD CONSTRAINT UNQ_CLIENT_CODE UNIQUE (CODE);

ALTER TABLE COUNTER ADD CONSTRAINT UNQ_COUNTER_CODE UNIQUE (CODE,COUNTERTYPEID);

ALTER TABLE COUNTERTYPE ADD CONSTRAINT UNQ_COUNTERTYPE_CODE UNIQUE (CODE);

ALTER TABLE DISCRATE ADD CONSTRAINT UNQ_DISCRATE_CODE UNIQUE (CODE);

ALTER TABLE GRPACTDISC ADD CONSTRAINT UNQ_GRPACTDISC_CODE UNIQUE (CODE,DELETED);

ALTER TABLE GRPCCARD ADD CONSTRAINT UNQ_GRPCCARD_CODE UNIQUE (CODE);

/* Create Foreign Key... */
RECONNECT;

ALTER TABLE ACTDISC ADD CONSTRAINT FK_AD_ACTSCRIPT FOREIGN KEY (ACTSCRIPTID) REFERENCES ACTSCRIPT(ID) ON DELETE SET NULL;

ALTER TABLE ACTDISC ADD CONSTRAINT FK_AD_CONDITION FOREIGN KEY (CONDITIONID) REFERENCES CONDITION(ID);

ALTER TABLE ACTDISC ADD CONSTRAINT FK_AD_DISCRATE FOREIGN KEY (DISCRATEID) REFERENCES DISCRATE(ID) ON DELETE SET NULL;

ALTER TABLE ACTDISC ADD CONSTRAINT FK_AD_GRPACTDISC FOREIGN KEY (GRPACTDISCID) REFERENCES GRPACTDISC(ID) ON DELETE SET NULL;

ALTER TABLE ACTDISCOBJ ADD CONSTRAINT FK_ADO_ACTSCRIPT FOREIGN KEY (ACTSCRIPTID) REFERENCES ACTSCRIPT(ID) ON DELETE SET NULL;

ALTER TABLE ACTDISCOBJ ADD CONSTRAINT FK_ADO_DISCRATE FOREIGN KEY (DISCRATEID) REFERENCES DISCRATE(ID) ON DELETE SET NULL;

ALTER TABLE CCARD ADD CONSTRAINT FK_CCARD FOREIGN KEY (GRPCCARDID) REFERENCES GRPCCARD(ID) ON DELETE CASCADE;

ALTER TABLE CCARDCOUNTER ADD CONSTRAINT FK_CCARDCOUNTER_CARD FOREIGN KEY (CCARDID) REFERENCES CCARD(ID) ON DELETE CASCADE;

ALTER TABLE CCARDCOUNTER ADD CONSTRAINT FK_CCARDCOUNTER_COUNTER FOREIGN KEY (COUNTERID) REFERENCES COUNTER(ID) ON DELETE CASCADE;

ALTER TABLE CLIENTCARD ADD CONSTRAINT FK_CLIENTCARD_CARD FOREIGN KEY (CCARDID) REFERENCES CCARD(ID) ON DELETE CASCADE;

ALTER TABLE CLIENTCARD ADD CONSTRAINT FK_CLIENTCARD_CLIENT FOREIGN KEY (CLIENTID) REFERENCES CLIENT(ID) ON DELETE CASCADE;

ALTER TABLE CLIENTCOUNTER ADD CONSTRAINT FK_CLIENTCOUNTER_CLIENT FOREIGN KEY (CLIENTID) REFERENCES CLIENT(ID) ON DELETE CASCADE;

ALTER TABLE CLIENTCOUNTER ADD CONSTRAINT FK_CLIENTCOUNTER_COUNTER FOREIGN KEY (COUNTERID) REFERENCES COUNTER(ID) ON DELETE CASCADE;

ALTER TABLE COUNTER ADD CONSTRAINT FK_CNT_CNTTYPE FOREIGN KEY (COUNTERTYPEID) REFERENCES COUNTERTYPE(ID) ON DELETE CASCADE;

ALTER TABLE COUNTERD ADD CONSTRAINT FK_CNTD_CNT FOREIGN KEY (COUNTERID) REFERENCES COUNTER(ID) ON DELETE CASCADE;

/* Alter Procedure... */
/* Alter (APPEND_WARE_DISC) */
SET TERM ^ ;

ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TID INTEGER;
BEGIN

    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, '  ', '  ',
                                     :IDISCTYPE, :IDISCVALUE, NULL, NULL, '', NULL,
                                     NULL, 2, 0, NULL, NULL)
          RETURNING_VALUES ERRORCODE, TDISCRATEID;

    SELECT FIRST 1 A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL
    INTO TACTDISCOBJID;

    IF (TACTDISCOBJID IS NULL) THEN
      INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                               ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                               PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
      VALUES   (GEN_ID(GID, 1), :IWAREID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                -1, :TDISCRATEID, NULL, 0);
    ELSE
      BEGIN
        UPDATE ACTDISCOBJ SET
           DISCRATEID = :TDISCRATEID
        WHERE ID = :TACTDISCOBJID;

        FOR SELECT A.ID
        FROM ACTDISCOBJ A JOIN DISCRATE D ON
                        D.ID = A.DISCRATEID AND D.KIND = 2
        WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
              A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
              A.ASPECTVALUE1ID IS NULL AND
              A.ASPECTVALUE2ID IS NULL AND
              A.ASPECTVALUE3ID IS NULL AND
              A.ASPECTVALUE4ID IS NULL AND
              A.ASPECTVALUE5ID IS NULL AND
              A.ID <> :TACTDISCOBJID
        INTO TID
        DO
          DELETE FROM ACTDISCOBJ WHERE ID = :TID;
      END
END
^

/* Alter (APPENDACTDISC) */
ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG NUMERIC(15,2),
IPRICEEND NUMERIC(15,2),
IQUANTITYBEG NUMERIC(15,2),
IQUANTITYEND NUMERIC(15,2),
IQUANTITYRECBEG NUMERIC(15,2),
IQUANTITYRECEND NUMERIC(15,2),
IQUANTITYWAREBEG NUMERIC(15,2),
IQUANTITYWAREEND NUMERIC(15,2),
ISUMMBEG NUMERIC(15,2),
ISUMMEND NUMERIC(15,2),
ISUMMRECBEG NUMERIC(15,2),
ISUMMRECEND NUMERIC(15,2),
ISUMMWAREBEG NUMERIC(15,2),
ISUMMWAREEND NUMERIC(15,2),
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :IGRPACTDISCCODE
  INTO GRPACTDISCID;

  IF (GRPACTDISCID IS NULL) THEN
   BEGIN
      ERRORCODE = 1;
      EXIT;
    END

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :GRPACTDISCID
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, :IDATEBEG, :IDATEEND,
                                    :IDAYBEG, :IDAYEND, :IPRICEBEG, :IPRICEEND,
                                    :IQUANTITYBEG, :IQUANTITYEND,
                                    :IQUANTITYRECBEG, :IQUANTITYRECEND,
                                    :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,
                                    :ISUMMWAREBEG, :ISUMMWAREEND, :ITIMEBEG, :ITIMEEND,
                                    :IWARECODE, :IWARECODETOMARK)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (IDISCRATEPARENTCODE IS NOT NULL) THEN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEPARENTCODE AND ISFOLDER > 0
      INTO IDISCRATEPARENTID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, '', 0,
                                   NULL, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPENDCARD) */
ALTER PROCEDURE APPENDCARD(ICARDGROUPCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IEXPDATEBEG DATE,
IEXPDATEEND DATE,
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
INOMINAL DOUBLE PRECISION,
ISTATE INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE CARDGROUPID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM CARDGROUP
  WHERE CODE = :ICARDGROUPCODE
  INTO CARDGROUPID;

  IF (CARDGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 24;
      EXIT;
    END

  SELECT ID
  FROM CARD
  WHERE CODE = :ICODE AND CARDGROUPID = :CARDGROUPID
  INTO ID;

  IF (ID IS NULL) THEN
    INSERT INTO CARD
           (ID, CARDGROUPID, CODE, NAME, TEXT,
            EXPDATEBEG, EXPDATEEND,
            CARDLENBEG, CARDLENEND,
            CARDPREFIXBEG, CARDPREFIXEND,
            NOMINAL, STATE, DELETED)
    VALUES
           (GEN_ID(GID, 1), :CARDGROUPID, :ICODE, :INAME, :ITEXT,
            :IEXPDATEBEG, :IEXPDATEEND,
            :ICARDLENBEG, :ICARDLENEND,
            :ICARDPREFIXBEG, :ICARDPREFIXEND,
            :INOMINAL, :ISTATE, :IDELETED);
  ELSE
    UPDATE CARD
    SET
      NAME = :INAME,
      TEXT = :ITEXT, 
      EXPDATEBEG = :IEXPDATEBEG,
      EXPDATEEND = :IEXPDATEEND,
      CARDLENBEG = :ICARDLENBEG,
      CARDLENEND = :ICARDLENEND,
      CARDPREFIXBEG = :ICARDPREFIXBEG,
      CARDPREFIXEND = :ICARDPREFIXEND,
      NOMINAL = :INOMINAL,
      STATE =  :ISTATE,
      DELETED = :IDELETED
    WHERE ID = :ID;
END
^

/* Alter (APPENDCARDGROUP) */
ALTER PROCEDURE APPENDCARDGROUP(ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IENTERTYPE INTEGER,
IDELETED INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  SELECT ID
  FROM CARDGROUP
  WHERE CODE = :ICODE
  INTO ID;

  IF (ID IS NULL) THEN
    INSERT INTO CARDGROUP 
           (ID, CODE, NAME, TEXT, ENTERTYPE, DELETED)
    VALUES
           (GEN_ID(GID, 1), :ICODE, :INAME, :ITEXT, :IENTERTYPE, :IDELETED);
  ELSE
    UPDATE CARDGROUP
    SET
      NAME = :INAME,
      TEXT = :ITEXT, 
      ENTERTYPE = :IENTERTYPE,
      DELETED = :IDELETED
    WHERE ID = :ID;
END
^

/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), -1, -1, :CARDID, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END
END
^

/* Alter (APPENDCONDITION) */
ALTER PROCEDURE APPENDCONDITION(ICONDITIONID INTEGER,
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG DOUBLE PRECISION,
IPRICEEND DOUBLE PRECISION,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IQUANTITYRECBEG DOUBLE PRECISION,
IQUANTITYRECEND DOUBLE PRECISION,
IQUANTITYWAREBEG DOUBLE PRECISION,
IQUANTITYWAREEND DOUBLE PRECISION,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
ISUMMWAREBEG DOUBLE PRECISION,
ISUMMWAREEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
BEGIN
  ERRORCODE = 0;

  ID = ICONDITIONID;

  IF (IWARECODE <> '') THEN
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID
      FROM SPRT
      WHERE CODE = :IWARECODE
      INTO WAREID;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID
      FROM SPRT
      WHERE MARK = :IWARECODE
      INTO WAREID;
    END

    IF (WAREID IS NULL) THEN
    BEGIN
      ERRORCODE = 16;
      EXIT;
    END
  END

 /* IF (ICOUNTERTYPECODE > 0) THEN
    BEGIN
      SELECT ID
      FROM COUNTERTYPE
      WHERE CODE = :ICOUNTERTYPECODE
      INTO COUNTERTYPEID;

      IF (COUNTERTYPEID IS NULL) THEN
        BEGIN
          ERRORCODE = 99; --   .
          EXIT;
        END
    END   */

  IF (ID IS NULL) THEN
    BEGIN
      ID = GEN_ID(GID, 1);
      INSERT INTO CONDITION
            (ID,
             TIMEBEG, TIMEEND, DATEBEG, DATEEND, DAYBEG, DAYEND,
             QUANTITYBEG, QUANTITYEND, SUMMBEG, SUMMEND,
             SUMMRECBEG, SUMMRECEND,
             CARDPREFIXBEG, CARDPREFIXEND,
             QUANTITYRECBEG, QUANTITYRECEND, PRICEBEG, PRICEEND,
             WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND,
             CARDSTATE, CARDLENBEG, CARDLENEND, SEX
          /*   MEMDAYBEG, MEMDAYEND, MEMMONTHBEG, MEMMONTHEND, MEMYEARBEG, MEMYEAREND,
             REGDAYBEG, REGDAYEND, REGMONTHBEG, REGMONTHEND, REGYEARBEG, REGYEAREND,
             BIRTHDAYBEG, BIRTHDAYEND, BIRTHMONTHBEG, BIRTHMONTHEND, BIRTHYEARBEG, BIRTHYEAREND,
             COUNTERBEG, COUNTEREND, COUNTERTYPEID,*/)
      VALUES
            (:ID,
             :ITIMEBEG, :ITIMEEND, :IDATEBEG, :IDATEEND, :IDAYBEG, :IDAYEND,
             :IQUANTITYBEG, :IQUANTITYEND, :ISUMMBEG, :ISUMMEND,
             :ISUMMRECBEG, :ISUMMRECEND,
             :ICARDPREFIXBEG, :ICARDPREFIXEND,
             :IQUANTITYRECBEG, :IQUANTITYRECEND, :IPRICEBEG, :IPRICEEND,
             :WAREID, :ISUMMWAREBEG, :ISUMMWAREEND, :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
             :ICARDSTATE, :ICARDLENBEG, :ICARDLENEND, 0
           /*  :IMEMDAYBEG, :IMEMDAYEND, :IMEMMONTHBEG, :IMEMMONTHEND, :IMEMYEARBEG, :IMEMYEAREND,
             :IREGDAYBEG, :IREGDAYEND, :IREGMONTHBEG, :IREGMONTHEND, :IREGYEARBEG, :IREGYEAREND,
             :IBIRTHDAYBEG, :IBIRTHDAYEND, :IBIRTHMONTHBEG, :IBIRTHMONTHEND, :IBIRTHYEARBEG, :IBIRTHYEAREND,
             :ICOUNTERBEG, :ICOUNTEREND, :COUNTERTYPEID, */);
    END
  ELSE
    UPDATE CONDITION SET
      TIMEBEG = :ITIMEBEG,
      TIMEEND = :ITIMEEND,
      DATEBEG = :IDATEBEG,
      DATEEND = :IDATEEND,
      DAYBEG = :IDAYBEG,
      DAYEND = :IDAYEND,
      QUANTITYBEG = :IQUANTITYBEG,
      QUANTITYEND = :IQUANTITYEND,
      SUMMBEG = :ISUMMBEG,
      SUMMEND = :ISUMMEND,
      SUMMRECBEG = :ISUMMRECBEG,
      SUMMRECEND = :ISUMMRECEND,
      CARDPREFIXBEG = :ICARDPREFIXBEG,
      CARDPREFIXEND = :ICARDPREFIXEND,
      QUANTITYRECBEG = :IQUANTITYRECBEG,
      QUANTITYRECEND = :IQUANTITYRECEND,
      PRICEBEG = :IPRICEBEG,
      PRICEEND = :IPRICEEND,
      WAREID = :WAREID,
      SUMMWAREBEG = :ISUMMWAREBEG,
      SUMMWAREEND = :ISUMMWAREEND,
      QUANTITYWAREBEG = :IQUANTITYWAREBEG,
      QUANTITYWAREEND = :IQUANTITYWAREEND,
      CARDSTATE = :ICARDSTATE,
      CARDLENBEG = :ICARDLENBEG,
      CARDLENEND = :ICARDLENEND

   /*   MEMDAYBEG  = :IMEMDAYBEG,
      MEMDAYEND  = :IMEMDAYEND,
      MEMMONTHBEG  = :IMEMMONTHBEG,
      MEMMONTHEND = :IMEMMONTHEND,
      MEMYEARBEG  = :IMEMYEARBEG,
      MEMYEAREND  = :IMEMYEAREND,

      REGDAYBEG  = :IREGDAYBEG,
      REGDAYEND  = :IREGDAYEND,
      REGMONTHBEG = :IREGMONTHBEG,
      REGMONTHEND = :IREGMONTHEND,
      REGYEARBEG  = :IREGYEARBEG,
      REGYEAREND  = :IREGYEAREND,

      BIRTHDAYBEG = :IBIRTHDAYBEG,
      BIRTHDAYEND = :IBIRTHDAYEND,
      BIRTHMONTHBEG = :IBIRTHMONTHBEG,
      BIRTHMONTHEND = :IBIRTHMONTHEND,
      BIRTHYEARBEG  = :IBIRTHYEARBEG,
      BIRTHYEAREND  = :IBIRTHYEAREND,

      COUNTERBEG  = :ICOUNTERBEG,
      COUNTEREND  = :ICOUNTEREND,
      COUNTERTYPEID  = :COUNTERTYPEID,  */

    WHERE ID = :ID;
END
^

/* Alter (APPENDDEFAULTGRPDISC) */
ALTER PROCEDURE APPENDDEFAULTGRPDISC(ITYPE INTEGER,
ICODE INTEGER,
IFREEWARE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE ADOID INTEGER;
DECLARE VARIABLE TWAREID INTEGER;
BEGIN

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :ICODE
  INTO  ID;

  IF (ID IS NULL) THEN
    BEGIN
      ERRORCODE = 1; --   
      EXIT;
    END

  IF (IFREEWARE = 1) THEN
    TWAREID = 0;
  ELSE
    TWAREID = -1;

  SELECT FIRST 1 ADO.ID
  FROM ACTDISCOBJ ADO JOIN GRPACTDISC GAD ON
                      ADO.GRPACTDISCID = GAD.ID AND GAD.CODE <> 10000000
                      JOIN ACTDISC    AD  ON
                      GAD.ID = AD.GRPACTDISCID
                      JOIN DISCRATE   DR  ON
                      AD.DISCRATEID = DR.ID
  WHERE ADO.CLIENTID = -1 AND ADO.WAREID = :TWAREID AND ADO.CARDID = -1 AND
        ADO.PAYMENTID = -1 AND ADO.DISCRATEID IS NULL AND
        DR.DESTINATION = :ITYPE
  INTO ADOID;

  IF (ADOID IS NULL) THEN
      INSERT INTO ACTDISCOBJ (ID, WAREID, CLIENTID, PAYMENTID, CARDID,
                              ASPECTVALUE1ID,
                              ASPECTVALUE2ID,
                              ASPECTVALUE3ID,
                              ASPECTVALUE4ID,
                              ASPECTVALUE5ID,
                              DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
      VALUES (GEN_ID(GID, 1), :TWAREID, -1, -1, -1, NULL, NULL, NULL, NULL, NULL,
              NULL, NULL, :ID);
  ELSE
    UPDATE ACTDISCOBJ SET
        GRPACTDISCID = :ID
    WHERE ID = :ADOID;

  UPDATE DISCRATE DR SET
      DR.DESTINATION = :ITYPE
  WHERE DR.ID IN (select AD.DISCRATEID from ACTDISC AD where AD.GRPACTDISCID = :ID);
END
^

/* Alter (APPENDDISCRATE) */
ALTER PROCEDURE APPENDDISCRATE(IPARENTID INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
IBEGVAL VARCHAR(100),
IENDVAL VARCHAR(100),
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
IISFOLDER INTEGER,
IDISCCOLLOPER INTEGER,
IGRPACTDISCID INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
DECLARE VARIABLE DISCRATECODE INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DISTINATION INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
BEGIN

  ERRORCODE = 0;
  WHERECLAUSE = '';

  IF (IVAL = '') THEN
    IVAL = '0';

  IF (IWARECODE <> '') THEN
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID
      FROM SPRT
      WHERE CODE = :IWARECODE
      INTO WAREID;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID
      FROM SPRT
      WHERE MARK = :IWARECODE
      INTO WAREID;
    END

    IF (WAREID IS NULL) THEN
    BEGIN
      ERRORCODE = 16;
      EXIT;
    END
  END

  IF (IDESTINATION IS NOT NULL) THEN
    WHERECLAUSE = WHERECLAUSE || ' AND D.DESTINATION = ' || :IDESTINATION;

  IF (IGRPACTDISCID IS NOT NULL) THEN
    WHERECLAUSE = WHERECLAUSE || ' AND ((A.GRPACTDISCID = ' || :IGRPACTDISCID || ') OR (A.ID IS NULL))';

  EXECUTE STATEMENT 'SELECT FIRST 1 D.ID ' ||
                    'FROM DISCRATE D LEFT JOIN ACTDISC A ON '||
                                     'D.ID = A.DISCRATEID '||
                     'WHERE D.PARENTID = '|| :IPARENTID ||' AND D.VAL = '''|| :IVAL ||''' AND '||
                           'D."TYPE" = '|| :ITYPE ||'AND D.NAME = '''|| :INAME ||''' AND D.KIND = '||:IKIND || WHERECLAUSE
  INTO ID;

  IF (ID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);

    SELECT NULLTONUM(MAX(CODE)) + 1
    FROM DISCRATE
    WHERE CODE < 100000000
    INTO DISCRATECODE;

    DISTINATION = IDESTINATION;
    IF (DISTINATION IS NULL) THEN
      IF (IGRPACTDISCID IS NULL) THEN
        DISTINATION = 0;
      ELSE
        BEGIN
          SELECT FIRST 1 D.DESTINATION
          FROM ACTDISC A LEFT JOIN DISCRATE D ON
                         D.ID = A.DISCRATEID
          WHERE A.GRPACTDISCID = :IGRPACTDISCID
          INTO DISTINATION;

          IF (DISTINATION IS NULL) THEN
            DISTINATION = 0;
        END

    INSERT INTO DISCRATE (ID, PARENTID, CODE, NAME, TEXT,
                          VAL, BEGVAL, ENDVAL,
                          WAREID, "TYPE", DESTINATION, KIND,
                          ISFOLDER, DISCCOLLOPER)
    VALUES (:ID, :IPARENTID, :DISCRATECODE, :INAME, :ITEXT,
            :IVAL, :IBEGVAL, :IENDVAL, :WAREID, :ITYPE, :DISTINATION, :IKIND,
            :IISFOLDER, :IDISCCOLLOPER);
  END
END
^

/* Alter (APPENDFIXDISCS) */
ALTER PROCEDURE APPENDFIXDISCS(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IPREFIX VARCHAR(40),
IVAL VARCHAR(100),
ITYPE INTEGER,
IDATERANGEBEG DATE,
IDATERANGEEND DATE,
IDESTINATION INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN

  ERRORCODE = 0;

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :IGRPACTDISCID
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL,
                                    :IPREFIX, :IPREFIX,
                                    0, :IDATERANGEBEG, :IDATERANGEEND,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME , :ITEXT, :ITYPE,
                                   :IVAL, NULL, NULL, '', 0, :IDESTINATION,
                                   1, 0, NULL, :IGRPACTDISCID)
        RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :IGRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPENDGESTCLIENT) */
ALTER PROCEDURE APPENDGESTCLIENT(ICARD VARCHAR(100),
ITYPE INTEGER,
IVALUE VARCHAR(100),
INAME VARCHAR(100),
IGRPACTDISC INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE DRNAME VARCHAR(30);
DECLARE VARIABLE OLDDISCRATEVAL DOUBLE PRECISION;
DECLARE VARIABLE OLDDISCRATETYPE INTEGER;
DECLARE VARIABLE CARDLEN INTEGER;
BEGIN

  SELECT FIRST 1 AD.ID, AD.DISCRATEID, DR.VAL, DR."TYPE"
  FROM ACTDISC AD
    JOIN CONDITION C ON AD.CONDITIONID = C.ID
    JOIN DISCRATE DR ON DR.ID = AD.DISCRATEID
  WHERE (C.CARDPREFIXBEG = ADDRIGHT(:ICARD, 1, 40)) AND (C.CARDPREFIXEND = ADDRIGHT(:ICARD, 255, 40))
  INTO ACTDISCID, DISCRATEID, OLDDISCRATEVAL, OLDDISCRATETYPE;

  IF (DISCRATEID IS NULL) THEN
  BEGIN
    DISCRATEID = GEN_ID(GID, 1);
    IF (ITYPE = 0) THEN DRNAME = '-'||IVALUE||'%';
    IF (ITYPE = 1) THEN  DRNAME = '-'||IVALUE;
    IF (ITYPE = 2) THEN  DRNAME = '+'||IVALUE||'%';
    IF (ITYPE = 3) THEN  DRNAME = '+'||IVALUE;
    
    INSERT INTO DISCRATE (ID, CODE, NAME, PARENTID, ISFOLDER, "TYPE", VAL, DESTINATION, KIND)
    SELECT :DISCRATEID, NULLTOINT(MAX(CODE)) + 1, :DRNAME, 0, 0, :ITYPE, :IVALUE, 1, 2 FROM DISCRATE;

    IF (ACTDISCID IS NULL) THEN
    BEGIN
      CARDLEN = LEN(ICARD);
      CONDITIONID = GEN_ID(GID, 1);
      INSERT INTO CONDITION (ID, CARDPREFIXBEG, CARDPREFIXEND, CARDSTATE, CARDLENBEG, CARDLENEND, SEX)
      VALUES (:CONDITIONID,  :ICARD,  :ICARD, 1, :CARDLEN, :CARDLEN, 0);

      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, NAME, GRPACTDISCID, PRIORITY, DISCRATEID, CONDITIONID, DISCRATEID)
        SELECT :ACTDISCID, NULLTOINT(MAX(CODE)) + 1, :INAME, :IGRPACTDISC, 0, :DISCRATEID, :CONDITIONID, :DISCRATEID
        FROM ACTDISC;
    END
  END
  ELSE
  BEGIN
    IF ((OLDDISCRATEVAL <> IVALUE) OR (OLDDISCRATETYPE <> :ITYPE))  THEN
    BEGIN
      IF (ITYPE = 0) THEN DRNAME = '-'||IVALUE||'%';
      IF (ITYPE = 1) THEN  DRNAME = '-'||IVALUE;
      IF (ITYPE = 2) THEN  DRNAME = '+'||IVALUE||'%';
      IF (ITYPE = 3) THEN  DRNAME = '+'||IVALUE;
      UPDATE DISCRATE SET VAL = :IVALUE, NAME = :DRNAME, "TYPE" = :ITYPE WHERE ID = :DISCRATEID;
    END
  END
END
^

/* Alter (APPENDGRPACTDISC) */
ALTER PROCEDURE APPENDGRPACTDISC(ICODE INTEGER,
INAME VARCHAR(100),
IACTV INTEGER,
IDISCCOLLOPER INTEGER,
IDEPENDOTHERPOS INTEGER,
IDISCRATEGRPCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
DECLARE VARIABLE GRPDISCRATEID INTEGER;
BEGIN

  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :ICODE
  INTO ID;

  IF (ID IS NULL) THEN
    BEGIN
      ID = GEN_ID(GID, 1);
      INSERT INTO GRPACTDISC
        (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
      VALUES
        (:ID, :ICODE, :INAME, :IACTV, :IDEPENDOTHERPOS, :IDELETED);
    END
  ELSE
    UPDATE GRPACTDISC SET
      CODE = :ICODE,
      NAME = :INAME,
      ACTV = :IACTV,
      DEPENDOTHERPOS = :IDEPENDOTHERPOS,
      DELETED = :IDELETED
    WHERE ID = :ID;

  IF (IDISCRATEGRPCODE IS NOT NULL) THEN
    BEGIN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEGRPCODE
      INTO GRPDISCRATEID;

      IF (GRPDISCRATEID IS NULL) THEN
        INSERT INTO DISCRATE (ID, PARENTID, CODE, NAME, TEXT,
                              ISFOLDER, DISCCOLLOPER)
        VALUES (GEN_ID(GID, 1), :IDISCRATEPARENTID, :IDISCRATEGRPCODE, :INAME, :INAME,
                              1, :IDISCCOLLOPER);
      ELSE
        UPDATE DISCRATE SET
           PARENTID = :IDISCRATEPARENTID,
           CODE = :IDISCRATEGRPCODE,
           NAME = :INAME,
           TEXT = :INAME,
           ISFOLDER = 1,
           DISCCOLLOPER = :IDISCCOLLOPER
        WHERE ID = :GRPDISCRATEID;
    END
END
^

/* Alter (APPENDREMAIN) */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, :ASPECTSCHEMEID;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, :ASPECTSCHEMEID;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
      BEGIN
        IF (ASPCODE = 1)  THEN
          IF (IASPV1 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
            INTO AD1;
          ELSE
          BEGIN
            ERRORCODE = 10;
            EXIT;
          END

        IF (ASPCODE = 2)  THEN
          IF (IASPV2 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
            INTO AD2;
          ELSE
          BEGIN
            ERRORCODE = 11;
            EXIT;
          END

        IF (ASPCODE = 3)  THEN
          IF (IASPV3 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
            INTO AD3;
          ELSE
          BEGIN
            ERRORCODE = 12;
            EXIT;
          END

        IF (ASPCODE = 4)  THEN
          IF (IASPV4 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
            INTO AD4;
          ELSE
          BEGIN
            ERRORCODE = 13;
            EXIT;
          END

        IF (ASPCODE = 5)  THEN
          IF (IASPV5 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
            INTO AD5;
          ELSE
          BEGIN
            ERRORCODE = 14;
            EXIT;
          END
      END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR
(AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, REMAIN, PRICE,
       DELETED)
    VALUES
      (GEN_ID(GID, 1), :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5, :IREMAIN,
      :IPRICE, :IDELETED);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE = 1) THEN
      IF (NOT :IREMAIN IS NULL) THEN
        UPDATE REMAIN SET
          REMAIN = REMAIN + :IREMAIN,
          PRICE = :IPRICE,
          DELETED = :IDELETED
        WHERE ID = :REMAINID;
      ELSE
        UPDATE REMAIN SET
          PRICE = :IPRICE,
          DELETED = :IDELETED
        WHERE ID = :REMAINID;
    ELSE
      UPDATE REMAIN SET
        REMAIN = :IREMAIN,
        PRICE = :IPRICE,
        DELETED = :IDELETED
      WHERE ID = :REMAINID;
    IF ((IADDREPLACE = 2) AND (NOT :IREMAIN IS NULL)) THEN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID;
  END

  IF (IDISCOUNTVALUE <> '0' AND IDISCOUNTVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       NULL, 2, 0, NULL, NULL)
            RETURNING_VALUES ERRORCODE, TDISCRATEID;

      WHERECLAUSE = '';

      IF (AD1 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
      ELSE
        AD1 = NULL;

      IF (AD2 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
      ELSE
        AD2 = NULL;

      IF (AD3 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
      ELSE
        AD3 = NULL;

      IF (AD4 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
      ELSE
        AD4 = NULL;

      IF (AD5 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
      ELSE
        AD5 = NULL;

      EXECUTE STATEMENT 'SELECT FIRST 1 A.ID ' ||
                            'FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                            'D.ID = A.DISCRATEID AND D.KIND = 2 '||
                            'WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                            '      A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                  -1, :TDISCRATEID, NULL, 0);
      ELSE
        UPDATE ACTDISCOBJ SET
           DISCRATEID = :TDISCRATEID
        WHERE ID = :TACTDISCOBJID;
    END
END
^

/* Alter (APPENDWARE) */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
DECLARE VARIABLE TISWARE INTEGER;
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TDELETED INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE HIERLEVEL INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE BARC VARCHAR(40);
BEGIN
  ERRORCODE = 0;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      IF (IEXCHANGEFORMAT <> 1) THEN
        BEGIN
          ERRORCODE = 8;
          EXIT;
        END
      ELSE
        IFIRSTASPECTVALUE = 0;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  HIERLEVEL = 0;
  IF (IPARENTCODE <> '') then
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (CODE = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (MARK = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
  END
  ELSE
    PARENTID = 0;
  HIERLEVEL = HIERLEVEL + 1;

  IF (IISWARE <> 1) THEN
    BEGIN
      IISWARE = -2147483647 + HIERLEVEL;
    END

  IF ((PARENTID IS NULL) OR (TISWARE > 0)) THEN
  BEGIN
    ERRORCODE = 2;
    EXIT;
  END

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  IF (IWARECODETOMARK = 0) THEN
  begin
    SELECT ID
    FROM SPRT
    WHERE CODE = :ICODE
    INTO TID;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, DELETED
    FROM SPRT
    WHERE MARK = :IMARK
    INTO TID, TDELETED;
  END

  IF (TID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO SPRT (ID, PARENTID, CODE, MARK, NAME, TEXT, HIERLEVEL,
      MINPRICE, ECRDEVID, TAXGROUPID, RCPPRNDEVID,
      ASPECTSCHEMEID, PRICELABELID,
      MAXDISCOUNT, ISWARE, PRICE, FLAGS, LIFE, SERIES,
      CERTIFICAT, SCALELPDEVID, SCALELPWARECODE, ASPECTTYPE, QUANTITYPREC,
      SCALELPLOADED, PRICELBPRINTED, DELETED, DESCRIPTION, PICTURE, REWARDTYPE, REWARDVAL)
    VALUES (:ID, :PARENTID, :ICODE, :IMARK, :INAME, :ITEXT, :HIERLEVEL,
      :IMINPRICE, :ECRDEVID, :TAXGROUPID, :RCPPRNDEVID,
      :ASPECTSCHEMEID, :PRICELABELID,
      :IMAXDISCOUNT, :IISWARE, :IPRICE, :IFLAGS, :ILIFE, :ISERIES,
      :ICERTIFICAT, :SCALELPDEVID, :ISCALELPWARECODE, :IASPECTTYPE, :IQUANTITYPREC,
      :ISCALELPLOADED, :IPRICELBPRINTED, :IDELETED, :IDESCRIPTION, :IPICTURE, :IREWARDTYPE, :IREWARDVAL);
    INCREMENTCODE = 1;
  END
  ELSE
  BEGIN
    ID = TID;
    IF (TDELETED = IDELETED) THEN
      UPDATE SPRT SET
        ASPECTSCHEMEID = :ASPECTSCHEMEID,  NAME = :INAME,
        ASPECTTYPE = :IASPECTTYPE,         PARENTID = :PARENTID,
        CERTIFICAT = :ICERTIFICAT,         PICTURE = :IPICTURE,
                                           PRICE = :IPRICE,
        DELETED = :IDELETED,               PRICELABELID = :PRICELABELID,
        DESCRIPTION = :IDESCRIPTION,       PRICELBPRINTED = :IPRICELBPRINTED,
        ECRDEVID = :ECRDEVID,              QUANTITYPREC = :IQUANTITYPREC,
        FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
        HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
        ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
        LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
        MARK = :IMARK,                     SERIES = :ISERIES,
        MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
        MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
        REWARDTYPE = :IREWARDTYPE,           REWARDVAL = :IREWARDVAL
      WHERE ID = :ID;
    ELSE
      BEGIN
        UPDATE SPRT SET
          ASPECTSCHEMEID = :ASPECTSCHEMEID,  NAME = :INAME,
          ASPECTTYPE = :IASPECTTYPE,         PARENTID = :PARENTID,
          CERTIFICAT = :ICERTIFICAT,         PICTURE = :IPICTURE,
          CODE = :ICODE,                     PRICE = :IPRICE,
          DELETED = :IDELETED,               PRICELABELID = :PRICELABELID,
          DESCRIPTION = :IDESCRIPTION,       PRICELBPRINTED = :IPRICELBPRINTED,
          ECRDEVID = :ECRDEVID,              QUANTITYPREC = :IQUANTITYPREC,
          FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
          HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
          ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
          LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
          MARK = :IMARK,                     SERIES = :ISERIES,
          MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
          MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
          REWARDTYPE = :IREWARDTYPE,          REWARDVAL = :IREWARDVAL
        WHERE ID = :ID;
        INCREMENTCODE = 1;
      END
  END

  IF (IISWARE = 1) THEN
  BEGIN
    EXECUTE PROCEDURE APPENDREMAINBYWAREID (:ID, :IFIRSTASPECTVALUE, :ASPECTSCHEMEID, :IREMAIN, :IDELETEDREMAIN, :IDELETEDASPECT, :IADDREPLACE)
      RETURNING_VALUES ERRORCODE;

    IF (ERRORCODE > 0) THEN
      EXIT;

    WHILE (IBARCODES <> '') DO
    BEGIN
      BARC = EXTRACTSTR(IBARCODES, ',');

      EXECUTE PROCEDURE APPENDBARCODEBYWAREID (:BARC, :ID, 0, 0, 0, 0, 0, null, 0, :IDELETEDBARCODE)
        RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;

      IBARCODES = PCOPY(IBARCODES, LEN(BARC) + 1, LEN(IBARCODES) - LEN(BARC) - 1);
    END
  END

  IF (IDISCOUNTVALUE <> '0' AND IDISCOUNTVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPEND_WARE_DISC(:ID, :IDISCOUNTTYPE, :IDISCOUNTVALUE, :IDISCRATEPARENTID)
            RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;
    END

  IF (TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :ID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :ID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
END
^

/* Alter (APPPEND_SUPERMAG_DISC) */
ALTER PROCEDURE APPPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
BEGIN

  IF (IAPPENDTYPE = 0) THEN   -- DiscCli
    BEGIN
      WHERECLAUSE = '';

      IF (ICARDPREFIXBEG IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG = '''|| :ICARDPREFIXBEG ||'''';

      IF (ICARDPREFIXEND IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND = '''|| :ICARDPREFIXEND ||'''';

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.CONDITIONID
                          FROM CONDITION C LEFT JOIN ACTDISC A ON
                                           C.ID = A.CONDITIONID
                          WHERE A.GRPACTDISCID = '|| :IGRPACTDISCID ||' AND
                                C.SUMMBEG IS NULL AND C.TIMEBEG IS NULL '|| WHERECLAUSE ||'
                          PLAN JOIN (C INDEX (IDX_C_CARDPRBEG,IDX_C_CARDPREND),A INDEX (FK_AD_CONDITION,FK_AD_GRPACTDISC))'
      INTO :ACTDISCID, :CONDITIONID;
    END
  ELSE
    IF (IAPPENDTYPE = 1) THEN   -- CliClass

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                       C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :IGRPACTDISCID  AND
            C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
            C.QUANTITYBEG IS NULL
      INTO ACTDISCID, CONDITIONID;

    ELSE
      IF (IAPPENDTYPE = 2) THEN   -- DiscSumm
        BEGIN

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :IGRPACTDISCID  AND
                C.SUMMBEG = :ISUMMBEG AND
                C.TIMEBEG = :ITIMEBEG AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

          IF (IDELETECURRENT = 1) THEN
            IF (ACTDISCID IS NULL) THEN
              EXIT;
            ELSE
              BEGIN
                DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                EXIT;
              END
        END
      ELSE
        IF (IAPPENDTYPE = 3) THEN   -- DiscCard

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :IGRPACTDISCID  AND
                C.QUANTITYBEG = :IQUANTITYBEG     AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

        ELSE
          IF (IAPPENDTYPE = 4) THEN   -- CliSumm

            SELECT FIRST 1 A.ID, A.CONDITIONID
            FROM CONDITION C LEFT JOIN ACTDISC A ON
                             C.ID = A.CONDITIONID
            WHERE A.GRPACTDISCID  = :IGRPACTDISCID  AND
                  C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                  C.SUMMBEG = :ISUMMBEG             AND
                  C.TIMEBEG IS NULL
            INTO ACTDISCID, CONDITIONID;

          ELSE
            BEGIN
              ERRORCODE = 90; --  IAPPENDTYPE
              EXIT;
            END

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, NULL, NULL, NULL, NULL, NULL, NULL,
                                    :IQUANTITYBEG, :IQUANTITYEND,  NULL, NULL, NULL, NULL,
                                    :ISUMMBEG, :ISUMMEND, NULL, NULL,  NULL, NULL,
                                    :ITIMEBEG, :ITIMEEND, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, NULL, NULL,
                                   :IDESTINATION, 2, 0, NULL, :IGRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                         CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
    VALUES     (GEN_ID(GID, 1), :ICODE, :IGRPACTDISCID, :INAME,
                :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
  ELSE
    UPDATE ACTDISC SET
       NAME = :INAME,
       CONDITIONID = :CONDITIONID,
       DISCRATEID = :DISCRATEID,
       DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (DEL_MARKED) */
ALTER PROCEDURE DEL_MARKED AS
BEGIN
  DELETE FROM SPRT WHERE DELETED = 1;
  DELETE FROM BARCODE WHERE DELETED = 1;
  DELETE FROM REMAIN WHERE DELETED = 1;
  DELETE FROM ASPVALUE WHERE DELETED = 1;
  DELETE FROM ASPECT WHERE DELETED = 1;
  DELETE FROM ASPSCHM WHERE DELETED = 1;
  DELETE FROM TAXGRPRT WHERE DELETED = 1;
  DELETE FROM TAXRATE WHERE DELETED = 1;
  DELETE FROM TAXGROUP WHERE DELETED = 1;
  DELETE FROM "USER" WHERE DELETED = 1;
  DELETE FROM PROFILE WHERE DELETED = 1;
  DELETE FROM CURRENCY WHERE DELETED = 1;
  DELETE FROM PAYMENT WHERE DELETED = 1;
  DELETE FROM DENOMIN WHERE DELETED = 1;
  DELETE FROM ANALOG WHERE DELETED = 1;
  DELETE FROM COMMENT WHERE DELETED = 1;
  DELETE FROM CARDGROUP WHERE DELETED = 1;
  DELETE FROM CARD WHERE DELETED = 1;
END
^

/* Alter (DEL_MARKED_EX) */
ALTER PROCEDURE DEL_MARKED_EX(C_WARE INTEGER,
C_BARCODE INTEGER)
 AS
BEGIN
  DELETE FROM SPRT WHERE DELETED < :C_WARE;
  UPDATE SPRT SET DELETED = 0 WHERE DELETED <> 0;
  DELETE FROM BARCODE WHERE DELETED < :C_BARCODE;
  UPDATE BARCODE SET DELETED = 0 WHERE DELETED <> 0;
END
^

/* empty dependent procedure body */
/* Clear: DEL_WARE for: DEL_WARE */
/* AssignEmptyBody proc */
ALTER PROCEDURE DEL_WARE(WAREID INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter (DEL_WARE) */
ALTER PROCEDURE DEL_WARE(WAREID INTEGER)
 AS
DECLARE VARIABLE ISWARE INTEGER;
DECLARE VARIABLE TMP_ID INTEGER;
BEGIN
  SELECT ISWARE
  FROM SPRT
  WHERE ID = :WAREID
  INTO  ISWARE;

  IF (ISWARE > 0) THEN
  BEGIN
    DELETE FROM BARCODE WHERE WAREID = :WAREID;
    DELETE FROM REMAIN WHERE WAREID = :WAREID;
  END
  ELSE
    FOR
      SELECT ISWARE, ID
      FROM   SPRT
      WHERE  PARENTID = :WAREID
      INTO   ISWARE, TMP_ID
      DO
        IF (ISWARE > 0) THEN
        BEGIN
          DELETE FROM BARCODE WHERE WAREID = :TMP_ID;
          DELETE FROM REMAIN WHERE WAREID = :TMP_ID;
          DELETE FROM SPRT WHERE ID = :TMP_ID;
        END
        ELSE
          EXECUTE PROCEDURE DEL_WARE(:TMP_ID);
  DELETE FROM SPRT WHERE ID = :WAREID;
  DELETE FROM ACTDISCOBJ WHERE ID = :WAREID;
END
^

/* Alter (GET_ACTSCRIPT) */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER)
 AS
DECLARE VARIABLE OLDGRPCODE INTEGER;
DECLARE VARIABLE OLDPRIORITY INTEGER;
BEGIN
  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;
  ID = 1;

  FOR
    SELECT  CODE, DATA, NULLTONUM(GRPCODE), NULLTONUM(PRIORITY)
    FROM GET_ACTSCRIPT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
      :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,:IWEEKDAY,
      :IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,:ICARD,
      :ICARDLEN,:IANYCARD,:ICARDSTATE,:IACTEVENT,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY, CODE
    INTO CODE, DATA, GRPCODE, PRIORITY
  DO
  BEGIN
    IF (OLDGRPCODE IS NULL) THEN
      OLDGRPCODE = GRPCODE;
    IF (OLDPRIORITY IS NULL) THEN
      OLDPRIORITY = PRIORITY;
    IF (GRPCODE <> OLDGRPCODE) THEN
    BEGIN
      OLDPRIORITY = PRIORITY;
      OLDGRPCODE = GRPCODE;
    END
    IF (OLDPRIORITY = PRIORITY) THEN
    BEGIN
      SUSPEND;
      ID = ID + 1;
    END
  END
END
^

/* Alter (GET_ACTSCRIPT_CUSTOM) */
ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER)
 AS
DECLARE VARIABLE CARD VARCHAR(255);
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
DECLARE VARIABLE OLDPRIORITY INTEGER;
DECLARE VARIABLE OLDGRPCODE INTEGER;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (INDATERANGE(:REGDATE,
                  AC.REGDATECOND,
                  AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                  AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND) > 0) AND

      (INDATERANGE(:MEMDATE,
                  AC.MEMDATECOND,
                  AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                  AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND) > 0) AND

      (INDATERANGE(:BIRTHDATE,
                  AC.BIRTHDATECOND,
                  AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                  AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND) > 0) AND

      (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
      (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
      (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)
    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO DATA, CODE, GRPCODE, PRIORITY
    DO
    BEGIN
      IF (OLDGRPCODE IS NULL) THEN
        OLDGRPCODE = NULLTONUM(GRPCODE);
      IF (OLDPRIORITY IS NULL) THEN
        OLDPRIORITY = PRIORITY;
      IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
      BEGIN
        OLDPRIORITY = PRIORITY;
        OLDGRPCODE = GRPCODE;
      END
      IF (OLDPRIORITY = PRIORITY) THEN
        SUSPEND;
    END

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    OLDPRIORITY = NULL;
    OLDGRPCODE = NULL;

    FOR
      SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
      WHERE
        ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
        (INDATERANGE(:REGDATE,
                    AC.REGDATECOND,
                    AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                    AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND) > 0) AND

        (INDATERANGE(:MEMDATE,
                    AC.MEMDATECOND,
                    AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                    AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND) > 0) AND

        (INDATERANGE(:BIRTHDATE,
                    AC.BIRTHDATECOND,
                    AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                    AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND) > 0) AND

        (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
        (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
        (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
     PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
     ORDER BY GD.CODE, AD.PRIORITY
     INTO DATA, CODE, GRPCODE, PRIORITY
     DO
     BEGIN
        IF (OLDGRPCODE IS NULL) THEN
          OLDGRPCODE = NULLTONUM(GRPCODE);
        IF (OLDPRIORITY IS NULL) THEN
          OLDPRIORITY = PRIORITY;
        IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
        BEGIN
          OLDPRIORITY = PRIORITY;
          OLDGRPCODE = GRPCODE;
        END
        IF (OLDPRIORITY = PRIORITY) THEN
          SUSPEND;
     END

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  PRIORITY = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTSCRIPT ACS ON ACS.ID = A.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
  INTO DATA, CODE
  DO
    SUSPEND;

END
^

/* Alter (GET_ASPECTS) */
ALTER PROCEDURE GET_ASPECTS(ASPSCHMCODE INTEGER,
ASPVALUECODE1 INTEGER,
ASPVALUECODE2 INTEGER,
ASPVALUECODE3 INTEGER,
ASPVALUECODE4 INTEGER,
ASPVALUECODE5 INTEGER)
 RETURNS(RES VARCHAR(255))
 AS
DECLARE VARIABLE ASPSCHMID INTEGER;
DECLARE VARIABLE TMPSTR VARCHAR(100);
DECLARE VARIABLE TMPLEN INTEGER;
DECLARE VARIABLE GENLEN INTEGER;
BEGIN
  SELECT ID
  FROM   ASPSCHM ASS
  WHERE  ASS.CODE = :ASPSCHMCODE
  INTO ASPSCHMID;

  RES = '';
  TMPSTR = NULL;
  GENLEN = 0;
  SELECT (SELECT AV.NAME FROM ASPVALUE AV WHERE AV.ASPECTID = A.ID AND AV.CODE = :ASPVALUECODE1)
  FROM  ASPECT A
  WHERE A.ASPECTSCHEMEID = :ASPSCHMID AND A.CODE = 1
  INTO TMPSTR;

  IF (NOT TMPSTR IS NULL) THEN
  BEGIN
    TMPLEN = LEN(TMPSTR);
    RES = RES || PCOPY(TMPSTR, 0, 252 - LEN(RES) - TMPLEN);
    GENLEN = GENLEN + TMPLEN;
  END
    ELSE
    BEGIN
      IF (GENLEN > 252) THEN
        RES = RES || '...';
      SUSPEND;
      EXIT;
    END

  TMPSTR = NULL;
  SELECT (SELECT AV.NAME FROM ASPVALUE AV WHERE AV.ASPECTID = A.ID AND AV.CODE = :ASPVALUECODE2)
  FROM  ASPECT A
  WHERE A.ASPECTSCHEMEID = :ASPSCHMID AND A.CODE = 2
  INTO TMPSTR;

  IF (NOT TMPSTR IS NULL) THEN
  BEGIN
    TMPLEN = LEN(TMPSTR) + 2;
    RES = RES || PCOPY(', ' || TMPSTR, 0, 252 - LEN(RES) - TMPLEN);
    GENLEN = GENLEN + TMPLEN;
  END
    ELSE
    BEGIN
      IF (GENLEN > 252) THEN
        RES = RES || '...';
      SUSPEND;
      EXIT;
    END

  TMPSTR = NULL;
  SELECT (SELECT AV.NAME FROM ASPVALUE AV WHERE AV.ASPECTID = A.ID AND AV.CODE = :ASPVALUECODE3)
  FROM  ASPECT A
  WHERE A.ASPECTSCHEMEID = :ASPSCHMID AND A.CODE = 3
  INTO TMPSTR;

  IF (NOT TMPSTR IS NULL) THEN
  BEGIN
    TMPLEN = LEN(TMPSTR) + 2;
    RES = RES || PCOPY(', ' || TMPSTR, 0, 252 - LEN(RES) - TMPLEN);
    GENLEN = GENLEN + TMPLEN;
  END
    ELSE
    BEGIN
      IF (GENLEN > 252) THEN
        RES = RES || '...';
      SUSPEND;
      EXIT;
    END

  TMPSTR = NULL;
  SELECT (SELECT AV.NAME FROM ASPVALUE AV WHERE AV.ASPECTID = A.ID AND AV.CODE = :ASPVALUECODE4)
  FROM  ASPECT A
  WHERE A.ASPECTSCHEMEID = :ASPSCHMID AND A.CODE = 4
  INTO TMPSTR;

  IF (NOT TMPSTR IS NULL) THEN
  BEGIN
    TMPLEN = LEN(TMPSTR) + 2;
    RES = RES || PCOPY(', ' || TMPSTR, 0, 252 - LEN(RES) - TMPLEN);
    GENLEN = GENLEN + TMPLEN;
  END
    ELSE
    BEGIN
      IF (GENLEN > 252) THEN
        RES = RES || '...';
      SUSPEND;
      EXIT;
    END

  TMPSTR = NULL;
  SELECT (SELECT AV.NAME FROM ASPVALUE AV WHERE AV.ASPECTID = A.ID AND AV.CODE = :ASPVALUECODE5)
  FROM  ASPECT A
  WHERE A.ASPECTSCHEMEID = :ASPSCHMID AND A.CODE = 5
  INTO TMPSTR;

  IF (NOT TMPSTR IS NULL) THEN
  BEGIN
    TMPLEN = LEN(TMPSTR) + 2;
    RES = RES || PCOPY(', ' || TMPSTR, 0, 252 - LEN(RES) - TMPLEN);
    GENLEN = GENLEN + TMPLEN;
  END
    ELSE
    BEGIN
      IF (GENLEN > 252) THEN
        RES = RES || '...';
      SUSPEND;
      EXIT;
    END

  IF (GENLEN > 252) THEN
    RES = RES || '...';
  SUSPEND;
END
^

/* Alter (GET_CLIENT_PARENTS) */
ALTER PROCEDURE GET_CLIENT_PARENTS(ID_CLIENT INTEGER,
IN_NUM INTEGER)
 RETURNS(ID_PARENT INTEGER,
NUM INTEGER)
 AS
DECLARE VARIABLE TMP_NUM INTEGER;
BEGIN

  IF (ID_CLIENT <> 0) THEN
  BEGIN

    SELECT S.PARENTID
    FROM   CLIENT S
    WHERE  S.ID = :ID_CLIENT
    INTO   ID_PARENT;

    IF (ID_PARENT = ID_CLIENT) THEN
      EXCEPTION E_CLIENT_STRUCT_CORRUPT;

    IF (ID_PARENT <> 0) THEN
    BEGIN
      TMP_NUM = IN_NUM + 1;
      FOR
        SELECT ID_PARENT, NUM
        FROM   GET_CLIENT_PARENTS(:ID_PARENT, :TMP_NUM)
        INTO   ID_PARENT, NUM
        DO
          SUSPEND;
    END

    NUM = IN_NUM;
    ID_PARENT = ID_CLIENT;
    SUSPEND;
  END
END
^

/* Alter (GET_CLIENT_PARENTS0) */
ALTER PROCEDURE GET_CLIENT_PARENTS0(ID_CLIENT INTEGER)
 RETURNS(ID_PARENT INTEGER)
 AS
BEGIN
  ID_PARENT = -1;
  SUSPEND;
  IF (ID_CLIENT = 0) THEN
  BEGIN
    ID_PARENT = 0;
    SUSPEND;
    EXIT;
  END

  FOR
    SELECT ID_PARENT
    FROM GET_CLIENT_PARENTS(:ID_CLIENT, 0)
    INTO ID_PARENT
    DO
      SUSPEND;
END
^

/* Alter (GET_DISCOUNT) */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
DECLARE VARIABLE OLDGRPCODE INTEGER;
DECLARE VARIABLE OLDPRIORITY INTEGER;
BEGIN
  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;
  ID = 1;

  FOR
    SELECT NULLTONUM(GRPCODE), VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
           "TYPE", NAME, TEXT,
           CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, NULLTONUM(PRIORITY), PARENTID, BEGVAL, ENDVAL,
           CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
    FROM GET_DISCOUNT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
          :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,
          :IWEEKDAY,:IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,
          :ICARD,:ICARDLEN,:IANYCARD,:ICARDSTATE,:IDESTINATION,
          :IKIND,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID, "TYPE", NAME, TEXT,
         CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, PRIORITY, PARENTID, BEGVAL, ENDVAL,
         CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
  DO
  BEGIN
    IF (OLDGRPCODE IS NULL) THEN
      OLDGRPCODE = GRPCODE;
    IF (OLDPRIORITY IS NULL) THEN
      OLDPRIORITY = PRIORITY;
    IF (GRPCODE <> OLDGRPCODE) THEN
    BEGIN
      OLDPRIORITY = PRIORITY;
      OLDGRPCODE = GRPCODE;
    END
    IF (OLDPRIORITY = PRIORITY) THEN
    BEGIN
      SUSPEND;
      ID = ID + 1;
    END
  END

END
^

/* Alter (GET_DISCOUNT_CUSTOM) */
ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
DECLARE VARIABLE OLDGRPCODE INTEGER;
DECLARE VARIABLE OLDPRIORITY INTEGER;
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
BEGIN

  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3, AR.CODE,
      (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID), AR.WAREID
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (INDATERANGE(:REGDATE,
                  AC.REGDATECOND,
                  AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                  AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND) > 0) AND

      (INDATERANGE(:MEMDATE,
                  AC.MEMDATECOND,
                  AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                  AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND) > 0) AND

      (INDATERANGE(:BIRTHDATE,
                  AC.BIRTHDATECOND,
                  AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                  AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND) > 0) AND

      (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
      (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
      (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)

    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,DISCRATECODE,CARD, DISCRATEWAREID
    DO
    BEGIN
      IF (OLDGRPCODE IS NULL) THEN
        OLDGRPCODE = NULLTONUM(GRPCODE);
      IF (OLDPRIORITY IS NULL) THEN
        OLDPRIORITY = PRIORITY;
      IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
      BEGIN
        OLDPRIORITY = PRIORITY;
        OLDGRPCODE = GRPCODE;
      END
      IF (OLDPRIORITY = PRIORITY) THEN
        SUSPEND;
    END

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    OLDPRIORITY = NULL;
    OLDGRPCODE = NULL;

    FOR
      SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
        QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID,AR.BEGVAL,AR.ENDVAL,
        AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3,AR.CODE, AR.WAREID
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
      WHERE
        (INDATERANGE(:REGDATE,
                    AC.REGDATECOND,
                    AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                    AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND) > 0) AND

        (INDATERANGE(:MEMDATE,
                    AC.MEMDATECOND,
                    AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                    AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND) > 0) AND

        (INDATERANGE(:BIRTHDATE,
                    AC.BIRTHDATECOND,
                    AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                    AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND) > 0) AND

        (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
        (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
        (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND

        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
      ORDER BY GD.CODE, AD.PRIORITY
      INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,DISCRATECODE, DISCRATEWAREID
      DO
      BEGIN
        IF (OLDGRPCODE IS NULL) THEN
          OLDGRPCODE = NULLTONUM(GRPCODE);
        IF (OLDPRIORITY IS NULL) THEN
          OLDPRIORITY = PRIORITY;
        IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
        BEGIN
          OLDPRIORITY = PRIORITY;
          OLDGRPCODE = GRPCODE;
        END
        IF (OLDPRIORITY = PRIORITY) THEN
          SUSPEND;
      END

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  VAL = NULL;
  WAREID = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;
  "TYPE" = NULL;
  TEXT = NULL;
  CODE = NULL;
  CARDPREFIXBEG = NULL;
  CARDPREFIXEND = NULL;
  DEPENDOTHERPOS = NULL;
  BEGVAL = NULL;
  ENDVAL = NULL;
  CNTTYPE1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  CNTTYPE2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  CNTTYPE3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  PRIORITY = 0;
  CARD = NULL;

  FOR
    SELECT AR.VAL, AR.WAREID, AR."TYPE", AR.NAME, AR.TEXT,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AR.CODE, (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID)
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN DISCRATE AR ON AR.ID = A.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
--    PLAN SORT (JOIN (JOIN (AR NATURAL,A INDEX (IDX_ACTDISCOBJ2,FK_ADO_DISCRATE))))
  INTO VAL, DISCRATEWAREID,"TYPE",NAME, TEXT,PARENTID, BEGVAL, ENDVAL, DISCRATECODE, CARD
  DO
    SUSPEND;
END
^

/* Alter (GET_DISCRATE_PARENTS) */
ALTER PROCEDURE GET_DISCRATE_PARENTS(ID_DISCRATE INTEGER,
IN_NUM INTEGER)
 RETURNS(ID_PARENT INTEGER,
NUM INTEGER)
 AS
DECLARE VARIABLE TMP_NUM INTEGER;
BEGIN

  IF (ID_DISCRATE <> 0) THEN
  BEGIN

    SELECT S.PARENTID
    FROM   DISCRATE S
    WHERE  S.ID = :ID_DISCRATE
    INTO   ID_PARENT;

    IF (ID_PARENT = ID_DISCRATE) THEN
      EXCEPTION E_DISCRATE_STRUCT_CORRUPT;

    IF (ID_PARENT <> 0) THEN
    BEGIN
      TMP_NUM = IN_NUM + 1;
      FOR
        SELECT ID_PARENT, NUM
        FROM   GET_DISCRATE_PARENTS(:ID_PARENT, :TMP_NUM)
        INTO   ID_PARENT, NUM
        DO
          SUSPEND;
    END

    NUM = IN_NUM;
    ID_PARENT = ID_DISCRATE;
    SUSPEND;
  END
END
^

/* Alter (GET_IDLIST) */
ALTER PROCEDURE GET_IDLIST(IDLIST VARCHAR(255))
 RETURNS(ID INTEGER)
 AS
BEGIN
  ID = -1;
  SUSPEND;
  IF (IDLIST IS NULL OR IDLIST = '') THEN
  BEGIN
    ID = 0;
    SUSPEND;
    EXIT;
  END

  WHILE (IDLIST <> '') DO
  BEGIN
    ID = EXTRACTSTR(IDLIST, ',');
    SUSPEND;
    IDLIST = PCOPY(IDLIST, LEN(ID) + 1, LEN(IDLIST) - LEN(ID) - 1);
  END
END
^

/* Alter (GET_OPERDAY) */
ALTER PROCEDURE GET_OPERDAY(DATE1 DATE,
DATE2 DATE,
POSNUMBER INTEGER)
 RETURNS(TRANZ1 INTEGER,
TRANZ2 INTEGER)
 AS
DECLARE VARIABLE TMPC1 INTEGER;
DECLARE VARIABLE TMPT INTEGER;
DECLARE VARIABLE D1 DATE;
BEGIN

/*   " " -   , 
        (   )*/

  TRANZ1 = 0;
  TRANZ2 = 0;

  SELECT MIN(TRANZCOUNT)
  FROM TRANZT T
  WHERE T.POSNUMBER = :POSNUMBER
  INTO TMPC1;

  SELECT TRANZDATE
  FROM TRANZT T
  WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT = :TMPC1
  INTO  D1;

  IF (D1 >= DATE1) THEN
    TRANZ1 = TMPC1;
    ELSE
    BEGIN
      SELECT MIN(T.TRANZCOUNT)
      FROM TRANZT T, TRANZT TT
      WHERE T.POSNUMBER = :POSNUMBER AND TT.POSNUMBER = :POSNUMBER AND
        T.TRANZCOUNT = TT.TRANZCOUNT + 1 AND TT.TRANZTYPE = 61 AND
        T.TRANZDATE BETWEEN :DATE1 AND :DATE2
      INTO TRANZ1;
    END

  IF (TRANZ1 IS NULL) THEN
    EXIT;

  TMPC1 = NULL;
  SELECT MAX(TRANZCOUNT)
  FROM TRANZT T
  WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT >= :TRANZ1
    AND T.TRANZDATE <= :DATE2
  INTO TMPC1;

  SELECT TRANZTYPE
  FROM   TRANZT T
  WHERE  T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT = :TMPC1
  INTO   TMPT;

  IF (TMPT = 61) THEN
    TRANZ2 = TMPC1;
    ELSE
    BEGIN
      TRANZ2 = NULL;
      SELECT MIN(TRANZCOUNT)
      FROM TRANZT T
      WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT > :TMPC1 AND
        T.TRANZTYPE = 61
      INTO TRANZ2;

      IF (TRANZ2 IS NULL) THEN
        SELECT MAX(TRANZCOUNT)
        FROM TRANZT T
        WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT < :TMPC1 AND
          T.TRANZTYPE = 61
        INTO TRANZ2;
    END
END
^

/* Alter (GET_WARE_PARENTS0) */
ALTER PROCEDURE GET_WARE_PARENTS0(ID_WARE INTEGER)
 RETURNS(ID_PARENT INTEGER)
 AS
BEGIN
  ID_PARENT = -1;
  SUSPEND;
  IF (ID_WARE = 0) THEN
  BEGIN
    ID_PARENT = 0;
    SUSPEND;
    EXIT;
  END

  FOR
    SELECT ID_PARENT
    FROM GET_WARE_PARENTS(:ID_WARE, 0)
    INTO ID_PARENT
    DO
      SUSPEND;
END
^

/* Alter (INITDISCSUPERMAG) */
ALTER PROCEDURE INITDISCSUPERMAG(IFORWARE INTEGER,
IDESTINATION INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  FOR SELECT DISTINCT GAD.ID
  FROM GRPACTDISC GAD JOIN ACTDISC A ON
                        A.GRPACTDISCID = GAD.ID
                      JOIN DISCRATE D ON
                        D.ID = A.DISCRATEID
                      JOIN ACTDISCOBJ ADO ON
                        ADO.GRPACTDISCID = GAD.ID AND
                        ADO.CLIENTID = -1 AND ADO.PAYMENTID = -1 AND
                        ADO.CARDID = -1
  WHERE  D.DESTINATION = :IDESTINATION AND ((:IFORWARE = 0 AND ADO.WAREID = -1) OR (:IFORWARE = 1 AND ADO.WAREID > 0))
  INTO ID
  DO
    BEGIN
      DELETE FROM ACTDISCOBJ WHERE GRPACTDISCID = :ID;
      DELETE FROM ACTDISC WHERE GRPACTDISCID = :ID;
      DELETE FROM GRPACTDISC WHERE ID = :ID;
    END
END
^

/* Alter (SENDDATACNGEVENT) */
ALTER PROCEDURE SENDDATACNGEVENT AS
BEGIN
  POST_EVENT 'DATACHANGED';
END
^

/* Create Trigger... */
CREATE TRIGGER DEL_AFT_ACTDISC0 FOR ACTDISC
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  DELETE FROM CONDITION WHERE ID = OLD.CONDITIONID;
END
^

CREATE TRIGGER DEL_BEF_CCARD FOR CCARD
ACTIVE BEFORE DELETE POSITION 0 
AS
DECLARE VARIABLE TMPID INTEGER;
BEGIN
  FOR
    SELECT CC.COUNTERID
    FROM CCARDCOUNTER CC
    JOIN COUNTER CO ON CO.ID = CC.COUNTERID
    JOIN COUNTERTYPE CT ON CT.ID = CO.COUNTERTYPEID AND CT.AUTOCREATE = 1
    WHERE CC.CCARDID = OLD.ID
    INTO TMPID
    DO
      DELETE FROM COUNTER WHERE ID = :TMPID;
END
^

CREATE TRIGGER DEL_BEF_CLIENT FOR CLIENT
ACTIVE BEFORE DELETE POSITION 0 
AS
DECLARE VARIABLE TMPID INTEGER;
BEGIN
  IF (OLD.ISFOLDER <> 0) THEN
    DELETE FROM CLIENT WHERE PARENTID = OLD.ID;
  ELSE
  FOR
    SELECT CC.COUNTERID
    FROM CLIENTCOUNTER CC
    JOIN COUNTER CO ON CO.ID = CC.COUNTERID
    JOIN COUNTERTYPE CT ON CT.ID = CO.COUNTERTYPEID AND CT.AUTOCREATE = 2
    WHERE CC.CLIENTID = OLD.ID
    INTO TMPID
    DO
      DELETE FROM COUNTER WHERE ID = :TMPID;
END
^

CREATE TRIGGER DEL_BEF_DISCRATE FOR DISCRATE
ACTIVE BEFORE DELETE POSITION 0 
AS
BEGIN
  IF (OLD.ISFOLDER = 1) THEN
    DELETE FROM DISCRATE WHERE PARENTID = OLD.ID;
END
^

CREATE TRIGGER DEL_BEF_TAXGROUP0 FOR TAXGROUP
ACTIVE BEFORE DELETE POSITION 0 
AS
BEGIN
  DELETE FROM TAXGRPRT WHERE TAXGROUPID = OLD.ID;
END
^

CREATE TRIGGER DEL_BEF_TAXRATE0 FOR TAXRATE
ACTIVE BEFORE DELETE POSITION 0 
AS
BEGIN
  UPDATE TAXGRPRT SET TAXRATEID = NULL WHERE TAXRATEID = OLD.ID;
END
^

CREATE TRIGGER IND_AFT_COUNTERTYPE FOR COUNTERTYPE
ACTIVE AFTER INSERT POSITION 0 
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
BEGIN
  IF (NEW.AUTOCREATE = 1) THEN
    FOR
      SELECT ID
      FROM CCARD
      INTO TMPID1
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, VAL, COUNTERTYPEID) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), 0, NEW.ID);
        INSERT INTO CCARDCOUNTER (COUNTERID, CCARDID) VALUES (:TMPID2, :TMPID1);
      END
  IF (NEW.AUTOCREATE = 2) THEN
    FOR
      SELECT ID
      FROM CLIENT
      INTO TMPID1
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, VAL, COUNTERTYPEID) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), 0, NEW.ID);
        INSERT INTO CLIENTCOUNTER (COUNTERID, CLIENTID) VALUES (:TMPID2, :TMPID1);
      END
END
^

CREATE TRIGGER INS_AFT_CCARD FOR CCARD
ACTIVE AFTER INSERT POSITION 0 
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
BEGIN
  FOR
    SELECT CT.ID
    FROM COUNTERTYPE CT
    WHERE CT.AUTOCREATE = 1
    INTO TMPID1
    DO
    BEGIN
      TMPID2 = GEN_ID(GID, 1);
      INSERT INTO COUNTER (ID, CODE, VAL, COUNTERTYPEID) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), 0, :TMPID1);
      INSERT INTO CCARDCOUNTER (COUNTERID, CCARDID) VALUES (:TMPID2, NEW.ID);
    END
END
^

CREATE TRIGGER INS_AFT_CLIENT FOR CLIENT
ACTIVE AFTER INSERT POSITION 0 
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
BEGIN
  IF (NEW.ISFOLDER = 0) THEN
  FOR
    SELECT CT.ID
    FROM COUNTERTYPE CT
    WHERE CT.AUTOCREATE = 2
    INTO TMPID1
    DO
    BEGIN
      TMPID2 = GEN_ID(GID, 1);
      INSERT INTO COUNTER (ID, CODE, VAL, COUNTERTYPEID) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), 0, :TMPID1);
      INSERT INTO CLIENTCOUNTER (COUNTERID, CLIENTID) VALUES (:TMPID2, NEW.ID);
    END
END
^

CREATE TRIGGER INS_BEF_CONDITION FOR CONDITION
ACTIVE BEFORE INSERT POSITION 0 
AS
BEGIN
  IF (NOT NEW.CARDPREFIXBEG IS NULL) THEN
    NEW.CARDPREFIXBEG = ADDRIGHT(NEW.CARDPREFIXBEG, 1, 40);
  IF (NOT NEW.CARDPREFIXEND IS NULL) THEN
    NEW.CARDPREFIXEND = ADDRIGHT(NEW.CARDPREFIXEND, 255, 40);
END
^

CREATE TRIGGER UPD_AFT_COUNTERTYPE FOR COUNTERTYPE
ACTIVE AFTER UPDATE POSITION 0 
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
BEGIN
  IF (NEW.AUTOCREATE <> OLD.AUTOCREATE) THEN
  BEGIN
/*  DELETE FROM COUNTER C WHERE C.COUNTERTYPEID = OLD.ID;*/
  IF (NEW.AUTOCREATE = 1) THEN
    FOR
      SELECT ID
      FROM CCARD
      INTO TMPID1
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, VAL, COUNTERTYPEID) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), 0, NEW.ID);
        INSERT INTO CCARDCOUNTER (COUNTERID, CCARDID) VALUES (:TMPID2, :TMPID1);
      END
  IF (NEW.AUTOCREATE = 2) THEN
    FOR
      SELECT ID
      FROM CLIENT
      INTO TMPID1
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, VAL, COUNTERTYPEID) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), 0, NEW.ID);
        INSERT INTO CLIENTCOUNTER (COUNTERID, CLIENTID) VALUES (:TMPID2, :TMPID1);
      END
  END
END
^

CREATE TRIGGER UPD_BEF_CONDITION FOR CONDITION
ACTIVE BEFORE UPDATE POSITION 0 
AS
BEGIN
  IF (NOT NEW.CARDPREFIXBEG IS NULL) THEN
    NEW.CARDPREFIXBEG = ADDRIGHT(NEW.CARDPREFIXBEG, 1, 40);
  IF (NOT NEW.CARDPREFIXEND IS NULL) THEN
    NEW.CARDPREFIXEND = ADDRIGHT(NEW.CARDPREFIXEND, 255, 40);
END
^

CREATE TRIGGER UPD_BEF_GRPCCARD FOR GRPCCARD
ACTIVE BEFORE UPDATE POSITION 0 
AS
BEGIN
  IF (NOT NEW.CARDPREFIXBEG IS NULL) THEN
    NEW.CARDPREFIXBEG = ADDRIGHT(NEW.CARDPREFIXBEG, 1, 40);
  IF (NOT NEW.CARDPREFIXEND IS NULL) THEN
    NEW.CARDPREFIXEND = ADDRIGHT(NEW.CARDPREFIXEND, 255, 40);
END
^


/* Alter exist trigger... */
ALTER TRIGGER INS_BEF_TRANZT0
AS
BEGIN
  IF (NEW.WAREMARK IS NULL) THEN
    NEW.WAREMARK = '';
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GTRANZT, 1);
END
^

/* Alter Procedure... */
/* Alter (APPEND_WARE_DISC) */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TID INTEGER;
BEGIN

    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, '  ', '  ',
                                     :IDISCTYPE, :IDISCVALUE, NULL, NULL, '', NULL,
                                     NULL, 2, 0, NULL, NULL)
          RETURNING_VALUES ERRORCODE, TDISCRATEID;

    SELECT FIRST 1 A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL
    INTO TACTDISCOBJID;

    IF (TACTDISCOBJID IS NULL) THEN
      INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                               ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                               PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
      VALUES   (GEN_ID(GID, 1), :IWAREID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                -1, :TDISCRATEID, NULL, 0);
    ELSE
      BEGIN
        UPDATE ACTDISCOBJ SET
           DISCRATEID = :TDISCRATEID
        WHERE ID = :TACTDISCOBJID;

        FOR SELECT A.ID
        FROM ACTDISCOBJ A JOIN DISCRATE D ON
                        D.ID = A.DISCRATEID AND D.KIND = 2
        WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
              A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
              A.ASPECTVALUE1ID IS NULL AND
              A.ASPECTVALUE2ID IS NULL AND
              A.ASPECTVALUE3ID IS NULL AND
              A.ASPECTVALUE4ID IS NULL AND
              A.ASPECTVALUE5ID IS NULL AND
              A.ID <> :TACTDISCOBJID
        INTO TID
        DO
          DELETE FROM ACTDISCOBJ WHERE ID = :TID;
      END
END
^

/* Alter (APPENDACTDISC) */
ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG NUMERIC(15,2),
IPRICEEND NUMERIC(15,2),
IQUANTITYBEG NUMERIC(15,2),
IQUANTITYEND NUMERIC(15,2),
IQUANTITYRECBEG NUMERIC(15,2),
IQUANTITYRECEND NUMERIC(15,2),
IQUANTITYWAREBEG NUMERIC(15,2),
IQUANTITYWAREEND NUMERIC(15,2),
ISUMMBEG NUMERIC(15,2),
ISUMMEND NUMERIC(15,2),
ISUMMRECBEG NUMERIC(15,2),
ISUMMRECEND NUMERIC(15,2),
ISUMMWAREBEG NUMERIC(15,2),
ISUMMWAREEND NUMERIC(15,2),
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :IGRPACTDISCCODE
  INTO GRPACTDISCID;

  IF (GRPACTDISCID IS NULL) THEN
   BEGIN
      ERRORCODE = 1;
      EXIT;
    END

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :GRPACTDISCID
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, :IDATEBEG, :IDATEEND,
                                    :IDAYBEG, :IDAYEND, :IPRICEBEG, :IPRICEEND,
                                    :IQUANTITYBEG, :IQUANTITYEND,
                                    :IQUANTITYRECBEG, :IQUANTITYRECEND,
                                    :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,
                                    :ISUMMWAREBEG, :ISUMMWAREEND, :ITIMEBEG, :ITIMEEND,
                                    :IWARECODE, :IWARECODETOMARK)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (IDISCRATEPARENTCODE IS NOT NULL) THEN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEPARENTCODE AND ISFOLDER > 0
      INTO IDISCRATEPARENTID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, '', 0,
                                   NULL, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPENDCARD) */
ALTER PROCEDURE APPENDCARD(ICARDGROUPCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IEXPDATEBEG DATE,
IEXPDATEEND DATE,
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
INOMINAL DOUBLE PRECISION,
ISTATE INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE CARDGROUPID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM CARDGROUP
  WHERE CODE = :ICARDGROUPCODE
  INTO CARDGROUPID;

  IF (CARDGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 24;
      EXIT;
    END

  SELECT ID
  FROM CARD
  WHERE CODE = :ICODE AND CARDGROUPID = :CARDGROUPID
  INTO ID;

  IF (ID IS NULL) THEN
    INSERT INTO CARD
           (ID, CARDGROUPID, CODE, NAME, TEXT,
            EXPDATEBEG, EXPDATEEND,
            CARDLENBEG, CARDLENEND,
            CARDPREFIXBEG, CARDPREFIXEND,
            NOMINAL, STATE, DELETED)
    VALUES
           (GEN_ID(GID, 1), :CARDGROUPID, :ICODE, :INAME, :ITEXT,
            :IEXPDATEBEG, :IEXPDATEEND,
            :ICARDLENBEG, :ICARDLENEND,
            :ICARDPREFIXBEG, :ICARDPREFIXEND,
            :INOMINAL, :ISTATE, :IDELETED);
  ELSE
    UPDATE CARD
    SET
      NAME = :INAME,
      TEXT = :ITEXT, 
      EXPDATEBEG = :IEXPDATEBEG,
      EXPDATEEND = :IEXPDATEEND,
      CARDLENBEG = :ICARDLENBEG,
      CARDLENEND = :ICARDLENEND,
      CARDPREFIXBEG = :ICARDPREFIXBEG,
      CARDPREFIXEND = :ICARDPREFIXEND,
      NOMINAL = :INOMINAL,
      STATE =  :ISTATE,
      DELETED = :IDELETED
    WHERE ID = :ID;
END
^

/* Alter (APPENDCARDGROUP) */
ALTER PROCEDURE APPENDCARDGROUP(ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IENTERTYPE INTEGER,
IDELETED INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  SELECT ID
  FROM CARDGROUP
  WHERE CODE = :ICODE
  INTO ID;

  IF (ID IS NULL) THEN
    INSERT INTO CARDGROUP 
           (ID, CODE, NAME, TEXT, ENTERTYPE, DELETED)
    VALUES
           (GEN_ID(GID, 1), :ICODE, :INAME, :ITEXT, :IENTERTYPE, :IDELETED);
  ELSE
    UPDATE CARDGROUP
    SET
      NAME = :INAME,
      TEXT = :ITEXT, 
      ENTERTYPE = :IENTERTYPE,
      DELETED = :IDELETED
    WHERE ID = :ID;
END
^

/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), -1, -1, :CARDID, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END
END
^

/* Alter (APPENDCONDITION) */
ALTER PROCEDURE APPENDCONDITION(ICONDITIONID INTEGER,
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG DOUBLE PRECISION,
IPRICEEND DOUBLE PRECISION,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IQUANTITYRECBEG DOUBLE PRECISION,
IQUANTITYRECEND DOUBLE PRECISION,
IQUANTITYWAREBEG DOUBLE PRECISION,
IQUANTITYWAREEND DOUBLE PRECISION,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
ISUMMWAREBEG DOUBLE PRECISION,
ISUMMWAREEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
BEGIN
  ERRORCODE = 0;

  ID = ICONDITIONID;

  IF (IWARECODE <> '') THEN
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID
      FROM SPRT
      WHERE CODE = :IWARECODE
      INTO WAREID;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID
      FROM SPRT
      WHERE MARK = :IWARECODE
      INTO WAREID;
    END

    IF (WAREID IS NULL) THEN
    BEGIN
      ERRORCODE = 16;
      EXIT;
    END
  END

 /* IF (ICOUNTERTYPECODE > 0) THEN
    BEGIN
      SELECT ID
      FROM COUNTERTYPE
      WHERE CODE = :ICOUNTERTYPECODE
      INTO COUNTERTYPEID;

      IF (COUNTERTYPEID IS NULL) THEN
        BEGIN
          ERRORCODE = 99; --   .
          EXIT;
        END
    END   */

  IF (ID IS NULL) THEN
    BEGIN
      ID = GEN_ID(GID, 1);
      INSERT INTO CONDITION
            (ID,
             TIMEBEG, TIMEEND, DATEBEG, DATEEND, DAYBEG, DAYEND,
             QUANTITYBEG, QUANTITYEND, SUMMBEG, SUMMEND,
             SUMMRECBEG, SUMMRECEND,
             CARDPREFIXBEG, CARDPREFIXEND,
             QUANTITYRECBEG, QUANTITYRECEND, PRICEBEG, PRICEEND,
             WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND,
             CARDSTATE, CARDLENBEG, CARDLENEND, SEX
          /*   MEMDAYBEG, MEMDAYEND, MEMMONTHBEG, MEMMONTHEND, MEMYEARBEG, MEMYEAREND,
             REGDAYBEG, REGDAYEND, REGMONTHBEG, REGMONTHEND, REGYEARBEG, REGYEAREND,
             BIRTHDAYBEG, BIRTHDAYEND, BIRTHMONTHBEG, BIRTHMONTHEND, BIRTHYEARBEG, BIRTHYEAREND,
             COUNTERBEG, COUNTEREND, COUNTERTYPEID,*/)
      VALUES
            (:ID,
             :ITIMEBEG, :ITIMEEND, :IDATEBEG, :IDATEEND, :IDAYBEG, :IDAYEND,
             :IQUANTITYBEG, :IQUANTITYEND, :ISUMMBEG, :ISUMMEND,
             :ISUMMRECBEG, :ISUMMRECEND,
             :ICARDPREFIXBEG, :ICARDPREFIXEND,
             :IQUANTITYRECBEG, :IQUANTITYRECEND, :IPRICEBEG, :IPRICEEND,
             :WAREID, :ISUMMWAREBEG, :ISUMMWAREEND, :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
             :ICARDSTATE, :ICARDLENBEG, :ICARDLENEND, 0
           /*  :IMEMDAYBEG, :IMEMDAYEND, :IMEMMONTHBEG, :IMEMMONTHEND, :IMEMYEARBEG, :IMEMYEAREND,
             :IREGDAYBEG, :IREGDAYEND, :IREGMONTHBEG, :IREGMONTHEND, :IREGYEARBEG, :IREGYEAREND,
             :IBIRTHDAYBEG, :IBIRTHDAYEND, :IBIRTHMONTHBEG, :IBIRTHMONTHEND, :IBIRTHYEARBEG, :IBIRTHYEAREND,
             :ICOUNTERBEG, :ICOUNTEREND, :COUNTERTYPEID, */);
    END
  ELSE
    UPDATE CONDITION SET
      TIMEBEG = :ITIMEBEG,
      TIMEEND = :ITIMEEND,
      DATEBEG = :IDATEBEG,
      DATEEND = :IDATEEND,
      DAYBEG = :IDAYBEG,
      DAYEND = :IDAYEND,
      QUANTITYBEG = :IQUANTITYBEG,
      QUANTITYEND = :IQUANTITYEND,
      SUMMBEG = :ISUMMBEG,
      SUMMEND = :ISUMMEND,
      SUMMRECBEG = :ISUMMRECBEG,
      SUMMRECEND = :ISUMMRECEND,
      CARDPREFIXBEG = :ICARDPREFIXBEG,
      CARDPREFIXEND = :ICARDPREFIXEND,
      QUANTITYRECBEG = :IQUANTITYRECBEG,
      QUANTITYRECEND = :IQUANTITYRECEND,
      PRICEBEG = :IPRICEBEG,
      PRICEEND = :IPRICEEND,
      WAREID = :WAREID,
      SUMMWAREBEG = :ISUMMWAREBEG,
      SUMMWAREEND = :ISUMMWAREEND,
      QUANTITYWAREBEG = :IQUANTITYWAREBEG,
      QUANTITYWAREEND = :IQUANTITYWAREEND,
      CARDSTATE = :ICARDSTATE,
      CARDLENBEG = :ICARDLENBEG,
      CARDLENEND = :ICARDLENEND

   /*   MEMDAYBEG  = :IMEMDAYBEG,
      MEMDAYEND  = :IMEMDAYEND,
      MEMMONTHBEG  = :IMEMMONTHBEG,
      MEMMONTHEND = :IMEMMONTHEND,
      MEMYEARBEG  = :IMEMYEARBEG,
      MEMYEAREND  = :IMEMYEAREND,

      REGDAYBEG  = :IREGDAYBEG,
      REGDAYEND  = :IREGDAYEND,
      REGMONTHBEG = :IREGMONTHBEG,
      REGMONTHEND = :IREGMONTHEND,
      REGYEARBEG  = :IREGYEARBEG,
      REGYEAREND  = :IREGYEAREND,

      BIRTHDAYBEG = :IBIRTHDAYBEG,
      BIRTHDAYEND = :IBIRTHDAYEND,
      BIRTHMONTHBEG = :IBIRTHMONTHBEG,
      BIRTHMONTHEND = :IBIRTHMONTHEND,
      BIRTHYEARBEG  = :IBIRTHYEARBEG,
      BIRTHYEAREND  = :IBIRTHYEAREND,

      COUNTERBEG  = :ICOUNTERBEG,
      COUNTEREND  = :ICOUNTEREND,
      COUNTERTYPEID  = :COUNTERTYPEID,  */

    WHERE ID = :ID;
END
^

/* Alter (APPENDDEFAULTGRPDISC) */
ALTER PROCEDURE APPENDDEFAULTGRPDISC(ITYPE INTEGER,
ICODE INTEGER,
IFREEWARE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE ADOID INTEGER;
DECLARE VARIABLE TWAREID INTEGER;
BEGIN

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :ICODE
  INTO  ID;

  IF (ID IS NULL) THEN
    BEGIN
      ERRORCODE = 1; --   
      EXIT;
    END

  IF (IFREEWARE = 1) THEN
    TWAREID = 0;
  ELSE
    TWAREID = -1;

  SELECT FIRST 1 ADO.ID
  FROM ACTDISCOBJ ADO JOIN GRPACTDISC GAD ON
                      ADO.GRPACTDISCID = GAD.ID AND GAD.CODE <> 10000000
                      JOIN ACTDISC    AD  ON
                      GAD.ID = AD.GRPACTDISCID
                      JOIN DISCRATE   DR  ON
                      AD.DISCRATEID = DR.ID
  WHERE ADO.CLIENTID = -1 AND ADO.WAREID = :TWAREID AND ADO.CARDID = -1 AND
        ADO.PAYMENTID = -1 AND ADO.DISCRATEID IS NULL AND
        DR.DESTINATION = :ITYPE
  INTO ADOID;

  IF (ADOID IS NULL) THEN
      INSERT INTO ACTDISCOBJ (ID, WAREID, CLIENTID, PAYMENTID, CARDID,
                              ASPECTVALUE1ID,
                              ASPECTVALUE2ID,
                              ASPECTVALUE3ID,
                              ASPECTVALUE4ID,
                              ASPECTVALUE5ID,
                              DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
      VALUES (GEN_ID(GID, 1), :TWAREID, -1, -1, -1, NULL, NULL, NULL, NULL, NULL,
              NULL, NULL, :ID);
  ELSE
    UPDATE ACTDISCOBJ SET
        GRPACTDISCID = :ID
    WHERE ID = :ADOID;

  UPDATE DISCRATE DR SET
      DR.DESTINATION = :ITYPE
  WHERE DR.ID IN (select AD.DISCRATEID from ACTDISC AD where AD.GRPACTDISCID = :ID);
END
^

/* Alter (APPENDDISCRATE) */
ALTER PROCEDURE APPENDDISCRATE(IPARENTID INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
IBEGVAL VARCHAR(100),
IENDVAL VARCHAR(100),
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
IISFOLDER INTEGER,
IDISCCOLLOPER INTEGER,
IGRPACTDISCID INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
DECLARE VARIABLE DISCRATECODE INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DISTINATION INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
BEGIN

  ERRORCODE = 0;
  WHERECLAUSE = '';

  IF (IVAL = '') THEN
    IVAL = '0';

  IF (IWARECODE <> '') THEN
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID
      FROM SPRT
      WHERE CODE = :IWARECODE
      INTO WAREID;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID
      FROM SPRT
      WHERE MARK = :IWARECODE
      INTO WAREID;
    END

    IF (WAREID IS NULL) THEN
    BEGIN
      ERRORCODE = 16;
      EXIT;
    END
  END

  IF (IDESTINATION IS NOT NULL) THEN
    WHERECLAUSE = WHERECLAUSE || ' AND D.DESTINATION = ' || :IDESTINATION;

  IF (IGRPACTDISCID IS NOT NULL) THEN
    WHERECLAUSE = WHERECLAUSE || ' AND ((A.GRPACTDISCID = ' || :IGRPACTDISCID || ') OR (A.ID IS NULL))';

  EXECUTE STATEMENT 'SELECT FIRST 1 D.ID ' ||
                    'FROM DISCRATE D LEFT JOIN ACTDISC A ON '||
                                     'D.ID = A.DISCRATEID '||
                     'WHERE D.PARENTID = '|| :IPARENTID ||' AND D.VAL = '''|| :IVAL ||''' AND '||
                           'D."TYPE" = '|| :ITYPE ||'AND D.NAME = '''|| :INAME ||''' AND D.KIND = '||:IKIND || WHERECLAUSE
  INTO ID;

  IF (ID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);

    SELECT NULLTONUM(MAX(CODE)) + 1
    FROM DISCRATE
    WHERE CODE < 100000000
    INTO DISCRATECODE;

    DISTINATION = IDESTINATION;
    IF (DISTINATION IS NULL) THEN
      IF (IGRPACTDISCID IS NULL) THEN
        DISTINATION = 0;
      ELSE
        BEGIN
          SELECT FIRST 1 D.DESTINATION
          FROM ACTDISC A LEFT JOIN DISCRATE D ON
                         D.ID = A.DISCRATEID
          WHERE A.GRPACTDISCID = :IGRPACTDISCID
          INTO DISTINATION;

          IF (DISTINATION IS NULL) THEN
            DISTINATION = 0;
        END

    INSERT INTO DISCRATE (ID, PARENTID, CODE, NAME, TEXT,
                          VAL, BEGVAL, ENDVAL,
                          WAREID, "TYPE", DESTINATION, KIND,
                          ISFOLDER, DISCCOLLOPER)
    VALUES (:ID, :IPARENTID, :DISCRATECODE, :INAME, :ITEXT,
            :IVAL, :IBEGVAL, :IENDVAL, :WAREID, :ITYPE, :DISTINATION, :IKIND,
            :IISFOLDER, :IDISCCOLLOPER);
  END
END
^

/* Alter (APPENDFIXDISCS) */
ALTER PROCEDURE APPENDFIXDISCS(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IPREFIX VARCHAR(40),
IVAL VARCHAR(100),
ITYPE INTEGER,
IDATERANGEBEG DATE,
IDATERANGEEND DATE,
IDESTINATION INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN

  ERRORCODE = 0;

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :IGRPACTDISCID
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL,
                                    :IPREFIX, :IPREFIX,
                                    0, :IDATERANGEBEG, :IDATERANGEEND,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME , :ITEXT, :ITYPE,
                                   :IVAL, NULL, NULL, '', 0, :IDESTINATION,
                                   1, 0, NULL, :IGRPACTDISCID)
        RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :IGRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPENDGESTCLIENT) */
ALTER PROCEDURE APPENDGESTCLIENT(ICARD VARCHAR(100),
ITYPE INTEGER,
IVALUE VARCHAR(100),
INAME VARCHAR(100),
IGRPACTDISC INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE DRNAME VARCHAR(30);
DECLARE VARIABLE OLDDISCRATEVAL DOUBLE PRECISION;
DECLARE VARIABLE OLDDISCRATETYPE INTEGER;
DECLARE VARIABLE CARDLEN INTEGER;
BEGIN

  SELECT FIRST 1 AD.ID, AD.DISCRATEID, DR.VAL, DR."TYPE"
  FROM ACTDISC AD
    JOIN CONDITION C ON AD.CONDITIONID = C.ID
    JOIN DISCRATE DR ON DR.ID = AD.DISCRATEID
  WHERE (C.CARDPREFIXBEG = ADDRIGHT(:ICARD, 1, 40)) AND (C.CARDPREFIXEND = ADDRIGHT(:ICARD, 255, 40))
  INTO ACTDISCID, DISCRATEID, OLDDISCRATEVAL, OLDDISCRATETYPE;

  IF (DISCRATEID IS NULL) THEN
  BEGIN
    DISCRATEID = GEN_ID(GID, 1);
    IF (ITYPE = 0) THEN DRNAME = '-'||IVALUE||'%';
    IF (ITYPE = 1) THEN  DRNAME = '-'||IVALUE;
    IF (ITYPE = 2) THEN  DRNAME = '+'||IVALUE||'%';
    IF (ITYPE = 3) THEN  DRNAME = '+'||IVALUE;
    
    INSERT INTO DISCRATE (ID, CODE, NAME, PARENTID, ISFOLDER, "TYPE", VAL, DESTINATION, KIND)
    SELECT :DISCRATEID, NULLTOINT(MAX(CODE)) + 1, :DRNAME, 0, 0, :ITYPE, :IVALUE, 1, 2 FROM DISCRATE;

    IF (ACTDISCID IS NULL) THEN
    BEGIN
      CARDLEN = LEN(ICARD);
      CONDITIONID = GEN_ID(GID, 1);
      INSERT INTO CONDITION (ID, CARDPREFIXBEG, CARDPREFIXEND, CARDSTATE, CARDLENBEG, CARDLENEND, SEX)
      VALUES (:CONDITIONID,  :ICARD,  :ICARD, 1, :CARDLEN, :CARDLEN, 0);

      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, NAME, GRPACTDISCID, PRIORITY, DISCRATEID, CONDITIONID, DISCRATEID)
        SELECT :ACTDISCID, NULLTOINT(MAX(CODE)) + 1, :INAME, :IGRPACTDISC, 0, :DISCRATEID, :CONDITIONID, :DISCRATEID
        FROM ACTDISC;
    END
  END
  ELSE
  BEGIN
    IF ((OLDDISCRATEVAL <> IVALUE) OR (OLDDISCRATETYPE <> :ITYPE))  THEN
    BEGIN
      IF (ITYPE = 0) THEN DRNAME = '-'||IVALUE||'%';
      IF (ITYPE = 1) THEN  DRNAME = '-'||IVALUE;
      IF (ITYPE = 2) THEN  DRNAME = '+'||IVALUE||'%';
      IF (ITYPE = 3) THEN  DRNAME = '+'||IVALUE;
      UPDATE DISCRATE SET VAL = :IVALUE, NAME = :DRNAME, "TYPE" = :ITYPE WHERE ID = :DISCRATEID;
    END
  END
END
^

/* Alter (APPENDGRPACTDISC) */
ALTER PROCEDURE APPENDGRPACTDISC(ICODE INTEGER,
INAME VARCHAR(100),
IACTV INTEGER,
IDISCCOLLOPER INTEGER,
IDEPENDOTHERPOS INTEGER,
IDISCRATEGRPCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
DECLARE VARIABLE GRPDISCRATEID INTEGER;
BEGIN

  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :ICODE
  INTO ID;

  IF (ID IS NULL) THEN
    BEGIN
      ID = GEN_ID(GID, 1);
      INSERT INTO GRPACTDISC
        (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
      VALUES
        (:ID, :ICODE, :INAME, :IACTV, :IDEPENDOTHERPOS, :IDELETED);
    END
  ELSE
    UPDATE GRPACTDISC SET
      CODE = :ICODE,
      NAME = :INAME,
      ACTV = :IACTV,
      DEPENDOTHERPOS = :IDEPENDOTHERPOS,
      DELETED = :IDELETED
    WHERE ID = :ID;

  IF (IDISCRATEGRPCODE IS NOT NULL) THEN
    BEGIN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEGRPCODE
      INTO GRPDISCRATEID;

      IF (GRPDISCRATEID IS NULL) THEN
        INSERT INTO DISCRATE (ID, PARENTID, CODE, NAME, TEXT,
                              ISFOLDER, DISCCOLLOPER)
        VALUES (GEN_ID(GID, 1), :IDISCRATEPARENTID, :IDISCRATEGRPCODE, :INAME, :INAME,
                              1, :IDISCCOLLOPER);
      ELSE
        UPDATE DISCRATE SET
           PARENTID = :IDISCRATEPARENTID,
           CODE = :IDISCRATEGRPCODE,
           NAME = :INAME,
           TEXT = :INAME,
           ISFOLDER = 1,
           DISCCOLLOPER = :IDISCCOLLOPER
        WHERE ID = :GRPDISCRATEID;
    END
END
^

/* Alter (APPENDREMAIN) */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, :ASPECTSCHEMEID;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, :ASPECTSCHEMEID;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
      BEGIN
        IF (ASPCODE = 1)  THEN
          IF (IASPV1 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
            INTO AD1;
          ELSE
          BEGIN
            ERRORCODE = 10;
            EXIT;
          END

        IF (ASPCODE = 2)  THEN
          IF (IASPV2 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
            INTO AD2;
          ELSE
          BEGIN
            ERRORCODE = 11;
            EXIT;
          END

        IF (ASPCODE = 3)  THEN
          IF (IASPV3 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
            INTO AD3;
          ELSE
          BEGIN
            ERRORCODE = 12;
            EXIT;
          END

        IF (ASPCODE = 4)  THEN
          IF (IASPV4 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
            INTO AD4;
          ELSE
          BEGIN
            ERRORCODE = 13;
            EXIT;
          END

        IF (ASPCODE = 5)  THEN
          IF (IASPV5 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
            INTO AD5;
          ELSE
          BEGIN
            ERRORCODE = 14;
            EXIT;
          END
      END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR
(AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, REMAIN, PRICE,
       DELETED)
    VALUES
      (GEN_ID(GID, 1), :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5, :IREMAIN,
      :IPRICE, :IDELETED);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE = 1) THEN
      IF (NOT :IREMAIN IS NULL) THEN
        UPDATE REMAIN SET
          REMAIN = REMAIN + :IREMAIN,
          PRICE = :IPRICE,
          DELETED = :IDELETED
        WHERE ID = :REMAINID;
      ELSE
        UPDATE REMAIN SET
          PRICE = :IPRICE,
          DELETED = :IDELETED
        WHERE ID = :REMAINID;
    ELSE
      UPDATE REMAIN SET
        REMAIN = :IREMAIN,
        PRICE = :IPRICE,
        DELETED = :IDELETED
      WHERE ID = :REMAINID;
    IF ((IADDREPLACE = 2) AND (NOT :IREMAIN IS NULL)) THEN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID;
  END

  IF (IDISCOUNTVALUE <> '0' AND IDISCOUNTVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       NULL, 2, 0, NULL, NULL)
            RETURNING_VALUES ERRORCODE, TDISCRATEID;

      WHERECLAUSE = '';

      IF (AD1 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
      ELSE
        AD1 = NULL;

      IF (AD2 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
      ELSE
        AD2 = NULL;

      IF (AD3 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
      ELSE
        AD3 = NULL;

      IF (AD4 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
      ELSE
        AD4 = NULL;

      IF (AD5 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
      ELSE
        AD5 = NULL;

      EXECUTE STATEMENT 'SELECT FIRST 1 A.ID ' ||
                            'FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                            'D.ID = A.DISCRATEID AND D.KIND = 2 '||
                            'WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                            '      A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                  -1, :TDISCRATEID, NULL, 0);
      ELSE
        UPDATE ACTDISCOBJ SET
           DISCRATEID = :TDISCRATEID
        WHERE ID = :TACTDISCOBJID;
    END
END
^

/* Alter (APPENDWARE) */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
DECLARE VARIABLE TISWARE INTEGER;
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TDELETED INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE HIERLEVEL INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE BARC VARCHAR(40);
BEGIN
  ERRORCODE = 0;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      IF (IEXCHANGEFORMAT <> 1) THEN
        BEGIN
          ERRORCODE = 8;
          EXIT;
        END
      ELSE
        IFIRSTASPECTVALUE = 0;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  HIERLEVEL = 0;
  IF (IPARENTCODE <> '') then
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (CODE = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (MARK = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
  END
  ELSE
    PARENTID = 0;
  HIERLEVEL = HIERLEVEL + 1;

  IF (IISWARE <> 1) THEN
    BEGIN
      IISWARE = -2147483647 + HIERLEVEL;
    END

  IF ((PARENTID IS NULL) OR (TISWARE > 0)) THEN
  BEGIN
    ERRORCODE = 2;
    EXIT;
  END

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  IF (IWARECODETOMARK = 0) THEN
  begin
    SELECT ID
    FROM SPRT
    WHERE CODE = :ICODE
    INTO TID;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, DELETED
    FROM SPRT
    WHERE MARK = :IMARK
    INTO TID, TDELETED;
  END

  IF (TID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO SPRT (ID, PARENTID, CODE, MARK, NAME, TEXT, HIERLEVEL,
      MINPRICE, ECRDEVID, TAXGROUPID, RCPPRNDEVID,
      ASPECTSCHEMEID, PRICELABELID,
      MAXDISCOUNT, ISWARE, PRICE, FLAGS, LIFE, SERIES,
      CERTIFICAT, SCALELPDEVID, SCALELPWARECODE, ASPECTTYPE, QUANTITYPREC,
      SCALELPLOADED, PRICELBPRINTED, DELETED, DESCRIPTION, PICTURE, REWARDTYPE, REWARDVAL)
    VALUES (:ID, :PARENTID, :ICODE, :IMARK, :INAME, :ITEXT, :HIERLEVEL,
      :IMINPRICE, :ECRDEVID, :TAXGROUPID, :RCPPRNDEVID,
      :ASPECTSCHEMEID, :PRICELABELID,
      :IMAXDISCOUNT, :IISWARE, :IPRICE, :IFLAGS, :ILIFE, :ISERIES,
      :ICERTIFICAT, :SCALELPDEVID, :ISCALELPWARECODE, :IASPECTTYPE, :IQUANTITYPREC,
      :ISCALELPLOADED, :IPRICELBPRINTED, :IDELETED, :IDESCRIPTION, :IPICTURE, :IREWARDTYPE, :IREWARDVAL);
    INCREMENTCODE = 1;
  END
  ELSE
  BEGIN
    ID = TID;
    IF (TDELETED = IDELETED) THEN
      UPDATE SPRT SET
        ASPECTSCHEMEID = :ASPECTSCHEMEID,  NAME = :INAME,
        ASPECTTYPE = :IASPECTTYPE,         PARENTID = :PARENTID,
        CERTIFICAT = :ICERTIFICAT,         PICTURE = :IPICTURE,
                                           PRICE = :IPRICE,
        DELETED = :IDELETED,               PRICELABELID = :PRICELABELID,
        DESCRIPTION = :IDESCRIPTION,       PRICELBPRINTED = :IPRICELBPRINTED,
        ECRDEVID = :ECRDEVID,              QUANTITYPREC = :IQUANTITYPREC,
        FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
        HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
        ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
        LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
        MARK = :IMARK,                     SERIES = :ISERIES,
        MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
        MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
        REWARDTYPE = :IREWARDTYPE,           REWARDVAL = :IREWARDVAL
      WHERE ID = :ID;
    ELSE
      BEGIN
        UPDATE SPRT SET
          ASPECTSCHEMEID = :ASPECTSCHEMEID,  NAME = :INAME,
          ASPECTTYPE = :IASPECTTYPE,         PARENTID = :PARENTID,
          CERTIFICAT = :ICERTIFICAT,         PICTURE = :IPICTURE,
          CODE = :ICODE,                     PRICE = :IPRICE,
          DELETED = :IDELETED,               PRICELABELID = :PRICELABELID,
          DESCRIPTION = :IDESCRIPTION,       PRICELBPRINTED = :IPRICELBPRINTED,
          ECRDEVID = :ECRDEVID,              QUANTITYPREC = :IQUANTITYPREC,
          FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
          HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
          ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
          LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
          MARK = :IMARK,                     SERIES = :ISERIES,
          MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
          MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
          REWARDTYPE = :IREWARDTYPE,          REWARDVAL = :IREWARDVAL
        WHERE ID = :ID;
        INCREMENTCODE = 1;
      END
  END

  IF (IISWARE = 1) THEN
  BEGIN
    EXECUTE PROCEDURE APPENDREMAINBYWAREID (:ID, :IFIRSTASPECTVALUE, :ASPECTSCHEMEID, :IREMAIN, :IDELETEDREMAIN, :IDELETEDASPECT, :IADDREPLACE)
      RETURNING_VALUES ERRORCODE;

    IF (ERRORCODE > 0) THEN
      EXIT;

    WHILE (IBARCODES <> '') DO
    BEGIN
      BARC = EXTRACTSTR(IBARCODES, ',');

      EXECUTE PROCEDURE APPENDBARCODEBYWAREID (:BARC, :ID, 0, 0, 0, 0, 0, null, 0, :IDELETEDBARCODE)
        RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;

      IBARCODES = PCOPY(IBARCODES, LEN(BARC) + 1, LEN(IBARCODES) - LEN(BARC) - 1);
    END
  END

  IF (IDISCOUNTVALUE <> '0' AND IDISCOUNTVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPEND_WARE_DISC(:ID, :IDISCOUNTTYPE, :IDISCOUNTVALUE, :IDISCRATEPARENTID)
            RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;
    END

  IF (TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :ID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :ID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
END
^

/* Alter (APPPEND_SUPERMAG_DISC) */
ALTER PROCEDURE APPPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
BEGIN

  IF (IAPPENDTYPE = 0) THEN   -- DiscCli
    BEGIN
      WHERECLAUSE = '';

      IF (ICARDPREFIXBEG IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG = '''|| :ICARDPREFIXBEG ||'''';

      IF (ICARDPREFIXEND IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND = '''|| :ICARDPREFIXEND ||'''';

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.CONDITIONID
                          FROM CONDITION C LEFT JOIN ACTDISC A ON
                                           C.ID = A.CONDITIONID
                          WHERE A.GRPACTDISCID = '|| :IGRPACTDISCID ||' AND
                                C.SUMMBEG IS NULL AND C.TIMEBEG IS NULL '|| WHERECLAUSE ||'
                          PLAN JOIN (C INDEX (IDX_C_CARDPRBEG,IDX_C_CARDPREND),A INDEX (FK_AD_CONDITION,FK_AD_GRPACTDISC))'
      INTO :ACTDISCID, :CONDITIONID;
    END
  ELSE
    IF (IAPPENDTYPE = 1) THEN   -- CliClass

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                       C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :IGRPACTDISCID  AND
            C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
            C.QUANTITYBEG IS NULL
      INTO ACTDISCID, CONDITIONID;

    ELSE
      IF (IAPPENDTYPE = 2) THEN   -- DiscSumm
        BEGIN

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :IGRPACTDISCID  AND
                C.SUMMBEG = :ISUMMBEG AND
                C.TIMEBEG = :ITIMEBEG AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

          IF (IDELETECURRENT = 1) THEN
            IF (ACTDISCID IS NULL) THEN
              EXIT;
            ELSE
              BEGIN
                DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                EXIT;
              END
        END
      ELSE
        IF (IAPPENDTYPE = 3) THEN   -- DiscCard

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :IGRPACTDISCID  AND
                C.QUANTITYBEG = :IQUANTITYBEG     AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

        ELSE
          IF (IAPPENDTYPE = 4) THEN   -- CliSumm

            SELECT FIRST 1 A.ID, A.CONDITIONID
            FROM CONDITION C LEFT JOIN ACTDISC A ON
                             C.ID = A.CONDITIONID
            WHERE A.GRPACTDISCID  = :IGRPACTDISCID  AND
                  C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                  C.SUMMBEG = :ISUMMBEG             AND
                  C.TIMEBEG IS NULL
            INTO ACTDISCID, CONDITIONID;

          ELSE
            BEGIN
              ERRORCODE = 90; --  IAPPENDTYPE
              EXIT;
            END

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, NULL, NULL, NULL, NULL, NULL, NULL,
                                    :IQUANTITYBEG, :IQUANTITYEND,  NULL, NULL, NULL, NULL,
                                    :ISUMMBEG, :ISUMMEND, NULL, NULL,  NULL, NULL,
                                    :ITIMEBEG, :ITIMEEND, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, NULL, NULL,
                                   :IDESTINATION, 2, 0, NULL, :IGRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                         CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
    VALUES     (GEN_ID(GID, 1), :ICODE, :IGRPACTDISCID, :INAME,
                :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
  ELSE
    UPDATE ACTDISC SET
       NAME = :INAME,
       CONDITIONID = :CONDITIONID,
       DISCRATEID = :DISCRATEID,
       DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (DEL_MARKED) */
ALTER PROCEDURE DEL_MARKED AS
BEGIN
  DELETE FROM SPRT WHERE DELETED = 1;
  DELETE FROM BARCODE WHERE DELETED = 1;
  DELETE FROM REMAIN WHERE DELETED = 1;
  DELETE FROM ASPVALUE WHERE DELETED = 1;
  DELETE FROM ASPECT WHERE DELETED = 1;
  DELETE FROM ASPSCHM WHERE DELETED = 1;
  DELETE FROM TAXGRPRT WHERE DELETED = 1;
  DELETE FROM TAXRATE WHERE DELETED = 1;
  DELETE FROM TAXGROUP WHERE DELETED = 1;
  DELETE FROM "USER" WHERE DELETED = 1;
  DELETE FROM PROFILE WHERE DELETED = 1;
  DELETE FROM CURRENCY WHERE DELETED = 1;
  DELETE FROM PAYMENT WHERE DELETED = 1;
  DELETE FROM DENOMIN WHERE DELETED = 1;
  DELETE FROM ANALOG WHERE DELETED = 1;
  DELETE FROM COMMENT WHERE DELETED = 1;
  DELETE FROM CARDGROUP WHERE DELETED = 1;
  DELETE FROM CARD WHERE DELETED = 1;
END
^

/* Alter (DEL_MARKED_EX) */
ALTER PROCEDURE DEL_MARKED_EX(C_WARE INTEGER,
C_BARCODE INTEGER)
 AS
BEGIN
  DELETE FROM SPRT WHERE DELETED < :C_WARE;
  UPDATE SPRT SET DELETED = 0 WHERE DELETED <> 0;
  DELETE FROM BARCODE WHERE DELETED < :C_BARCODE;
  UPDATE BARCODE SET DELETED = 0 WHERE DELETED <> 0;
END
^

/* Alter (DEL_WARE) */
ALTER PROCEDURE DEL_WARE(WAREID INTEGER)
 AS
DECLARE VARIABLE ISWARE INTEGER;
DECLARE VARIABLE TMP_ID INTEGER;
BEGIN
  SELECT ISWARE
  FROM SPRT
  WHERE ID = :WAREID
  INTO  ISWARE;

  IF (ISWARE > 0) THEN
  BEGIN
    DELETE FROM BARCODE WHERE WAREID = :WAREID;
    DELETE FROM REMAIN WHERE WAREID = :WAREID;
  END
  ELSE
    FOR
      SELECT ISWARE, ID
      FROM   SPRT
      WHERE  PARENTID = :WAREID
      INTO   ISWARE, TMP_ID
      DO
        IF (ISWARE > 0) THEN
        BEGIN
          DELETE FROM BARCODE WHERE WAREID = :TMP_ID;
          DELETE FROM REMAIN WHERE WAREID = :TMP_ID;
          DELETE FROM SPRT WHERE ID = :TMP_ID;
        END
        ELSE
          EXECUTE PROCEDURE DEL_WARE(:TMP_ID);
  DELETE FROM SPRT WHERE ID = :WAREID;
  DELETE FROM ACTDISCOBJ WHERE ID = :WAREID;
END
^

/* Alter (GET_ACTSCRIPT) */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER)
 AS
DECLARE VARIABLE OLDGRPCODE INTEGER;
DECLARE VARIABLE OLDPRIORITY INTEGER;
BEGIN
  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;
  ID = 1;

  FOR
    SELECT  CODE, DATA, NULLTONUM(GRPCODE), NULLTONUM(PRIORITY)
    FROM GET_ACTSCRIPT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
      :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,:IWEEKDAY,
      :IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,:ICARD,
      :ICARDLEN,:IANYCARD,:ICARDSTATE,:IACTEVENT,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY, CODE
    INTO CODE, DATA, GRPCODE, PRIORITY
  DO
  BEGIN
    IF (OLDGRPCODE IS NULL) THEN
      OLDGRPCODE = GRPCODE;
    IF (OLDPRIORITY IS NULL) THEN
      OLDPRIORITY = PRIORITY;
    IF (GRPCODE <> OLDGRPCODE) THEN
    BEGIN
      OLDPRIORITY = PRIORITY;
      OLDGRPCODE = GRPCODE;
    END
    IF (OLDPRIORITY = PRIORITY) THEN
    BEGIN
      SUSPEND;
      ID = ID + 1;
    END
  END
END
^

/* Alter (GET_ACTSCRIPT_CUSTOM) */
ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER)
 AS
DECLARE VARIABLE CARD VARCHAR(255);
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
DECLARE VARIABLE OLDPRIORITY INTEGER;
DECLARE VARIABLE OLDGRPCODE INTEGER;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (INDATERANGE(:REGDATE,
                  AC.REGDATECOND,
                  AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                  AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND) > 0) AND

      (INDATERANGE(:MEMDATE,
                  AC.MEMDATECOND,
                  AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                  AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND) > 0) AND

      (INDATERANGE(:BIRTHDATE,
                  AC.BIRTHDATECOND,
                  AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                  AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND) > 0) AND

      (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
      (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
      (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)
    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO DATA, CODE, GRPCODE, PRIORITY
    DO
    BEGIN
      IF (OLDGRPCODE IS NULL) THEN
        OLDGRPCODE = NULLTONUM(GRPCODE);
      IF (OLDPRIORITY IS NULL) THEN
        OLDPRIORITY = PRIORITY;
      IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
      BEGIN
        OLDPRIORITY = PRIORITY;
        OLDGRPCODE = GRPCODE;
      END
      IF (OLDPRIORITY = PRIORITY) THEN
        SUSPEND;
    END

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    OLDPRIORITY = NULL;
    OLDGRPCODE = NULL;

    FOR
      SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
      WHERE
        ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
        (INDATERANGE(:REGDATE,
                    AC.REGDATECOND,
                    AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                    AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND) > 0) AND

        (INDATERANGE(:MEMDATE,
                    AC.MEMDATECOND,
                    AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                    AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND) > 0) AND

        (INDATERANGE(:BIRTHDATE,
                    AC.BIRTHDATECOND,
                    AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                    AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND) > 0) AND

        (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
        (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
        (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
     PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
     ORDER BY GD.CODE, AD.PRIORITY
     INTO DATA, CODE, GRPCODE, PRIORITY
     DO
     BEGIN
        IF (OLDGRPCODE IS NULL) THEN
          OLDGRPCODE = NULLTONUM(GRPCODE);
        IF (OLDPRIORITY IS NULL) THEN
          OLDPRIORITY = PRIORITY;
        IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
        BEGIN
          OLDPRIORITY = PRIORITY;
          OLDGRPCODE = GRPCODE;
        END
        IF (OLDPRIORITY = PRIORITY) THEN
          SUSPEND;
     END

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  PRIORITY = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTSCRIPT ACS ON ACS.ID = A.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
  INTO DATA, CODE
  DO
    SUSPEND;

END
^

/* Alter (GET_ASPECTS) */
ALTER PROCEDURE GET_ASPECTS(ASPSCHMCODE INTEGER,
ASPVALUECODE1 INTEGER,
ASPVALUECODE2 INTEGER,
ASPVALUECODE3 INTEGER,
ASPVALUECODE4 INTEGER,
ASPVALUECODE5 INTEGER)
 RETURNS(RES VARCHAR(255))
 AS
DECLARE VARIABLE ASPSCHMID INTEGER;
DECLARE VARIABLE TMPSTR VARCHAR(100);
DECLARE VARIABLE TMPLEN INTEGER;
DECLARE VARIABLE GENLEN INTEGER;
BEGIN
  SELECT ID
  FROM   ASPSCHM ASS
  WHERE  ASS.CODE = :ASPSCHMCODE
  INTO ASPSCHMID;

  RES = '';
  TMPSTR = NULL;
  GENLEN = 0;
  SELECT (SELECT AV.NAME FROM ASPVALUE AV WHERE AV.ASPECTID = A.ID AND AV.CODE = :ASPVALUECODE1)
  FROM  ASPECT A
  WHERE A.ASPECTSCHEMEID = :ASPSCHMID AND A.CODE = 1
  INTO TMPSTR;

  IF (NOT TMPSTR IS NULL) THEN
  BEGIN
    TMPLEN = LEN(TMPSTR);
    RES = RES || PCOPY(TMPSTR, 0, 252 - LEN(RES) - TMPLEN);
    GENLEN = GENLEN + TMPLEN;
  END
    ELSE
    BEGIN
      IF (GENLEN > 252) THEN
        RES = RES || '...';
      SUSPEND;
      EXIT;
    END

  TMPSTR = NULL;
  SELECT (SELECT AV.NAME FROM ASPVALUE AV WHERE AV.ASPECTID = A.ID AND AV.CODE = :ASPVALUECODE2)
  FROM  ASPECT A
  WHERE A.ASPECTSCHEMEID = :ASPSCHMID AND A.CODE = 2
  INTO TMPSTR;

  IF (NOT TMPSTR IS NULL) THEN
  BEGIN
    TMPLEN = LEN(TMPSTR) + 2;
    RES = RES || PCOPY(', ' || TMPSTR, 0, 252 - LEN(RES) - TMPLEN);
    GENLEN = GENLEN + TMPLEN;
  END
    ELSE
    BEGIN
      IF (GENLEN > 252) THEN
        RES = RES || '...';
      SUSPEND;
      EXIT;
    END

  TMPSTR = NULL;
  SELECT (SELECT AV.NAME FROM ASPVALUE AV WHERE AV.ASPECTID = A.ID AND AV.CODE = :ASPVALUECODE3)
  FROM  ASPECT A
  WHERE A.ASPECTSCHEMEID = :ASPSCHMID AND A.CODE = 3
  INTO TMPSTR;

  IF (NOT TMPSTR IS NULL) THEN
  BEGIN
    TMPLEN = LEN(TMPSTR) + 2;
    RES = RES || PCOPY(', ' || TMPSTR, 0, 252 - LEN(RES) - TMPLEN);
    GENLEN = GENLEN + TMPLEN;
  END
    ELSE
    BEGIN
      IF (GENLEN > 252) THEN
        RES = RES || '...';
      SUSPEND;
      EXIT;
    END

  TMPSTR = NULL;
  SELECT (SELECT AV.NAME FROM ASPVALUE AV WHERE AV.ASPECTID = A.ID AND AV.CODE = :ASPVALUECODE4)
  FROM  ASPECT A
  WHERE A.ASPECTSCHEMEID = :ASPSCHMID AND A.CODE = 4
  INTO TMPSTR;

  IF (NOT TMPSTR IS NULL) THEN
  BEGIN
    TMPLEN = LEN(TMPSTR) + 2;
    RES = RES || PCOPY(', ' || TMPSTR, 0, 252 - LEN(RES) - TMPLEN);
    GENLEN = GENLEN + TMPLEN;
  END
    ELSE
    BEGIN
      IF (GENLEN > 252) THEN
        RES = RES || '...';
      SUSPEND;
      EXIT;
    END

  TMPSTR = NULL;
  SELECT (SELECT AV.NAME FROM ASPVALUE AV WHERE AV.ASPECTID = A.ID AND AV.CODE = :ASPVALUECODE5)
  FROM  ASPECT A
  WHERE A.ASPECTSCHEMEID = :ASPSCHMID AND A.CODE = 5
  INTO TMPSTR;

  IF (NOT TMPSTR IS NULL) THEN
  BEGIN
    TMPLEN = LEN(TMPSTR) + 2;
    RES = RES || PCOPY(', ' || TMPSTR, 0, 252 - LEN(RES) - TMPLEN);
    GENLEN = GENLEN + TMPLEN;
  END
    ELSE
    BEGIN
      IF (GENLEN > 252) THEN
        RES = RES || '...';
      SUSPEND;
      EXIT;
    END

  IF (GENLEN > 252) THEN
    RES = RES || '...';
  SUSPEND;
END
^

/* Alter (GET_CLIENT_PARENTS) */
ALTER PROCEDURE GET_CLIENT_PARENTS(ID_CLIENT INTEGER,
IN_NUM INTEGER)
 RETURNS(ID_PARENT INTEGER,
NUM INTEGER)
 AS
DECLARE VARIABLE TMP_NUM INTEGER;
BEGIN

  IF (ID_CLIENT <> 0) THEN
  BEGIN

    SELECT S.PARENTID
    FROM   CLIENT S
    WHERE  S.ID = :ID_CLIENT
    INTO   ID_PARENT;

    IF (ID_PARENT = ID_CLIENT) THEN
      EXCEPTION E_CLIENT_STRUCT_CORRUPT;

    IF (ID_PARENT <> 0) THEN
    BEGIN
      TMP_NUM = IN_NUM + 1;
      FOR
        SELECT ID_PARENT, NUM
        FROM   GET_CLIENT_PARENTS(:ID_PARENT, :TMP_NUM)
        INTO   ID_PARENT, NUM
        DO
          SUSPEND;
    END

    NUM = IN_NUM;
    ID_PARENT = ID_CLIENT;
    SUSPEND;
  END
END
^

/* Alter (GET_CLIENT_PARENTS0) */
ALTER PROCEDURE GET_CLIENT_PARENTS0(ID_CLIENT INTEGER)
 RETURNS(ID_PARENT INTEGER)
 AS
BEGIN
  ID_PARENT = -1;
  SUSPEND;
  IF (ID_CLIENT = 0) THEN
  BEGIN
    ID_PARENT = 0;
    SUSPEND;
    EXIT;
  END

  FOR
    SELECT ID_PARENT
    FROM GET_CLIENT_PARENTS(:ID_CLIENT, 0)
    INTO ID_PARENT
    DO
      SUSPEND;
END
^

/* Alter (GET_DISCOUNT) */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
DECLARE VARIABLE OLDGRPCODE INTEGER;
DECLARE VARIABLE OLDPRIORITY INTEGER;
BEGIN
  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;
  ID = 1;

  FOR
    SELECT NULLTONUM(GRPCODE), VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
           "TYPE", NAME, TEXT,
           CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, NULLTONUM(PRIORITY), PARENTID, BEGVAL, ENDVAL,
           CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
    FROM GET_DISCOUNT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
          :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,
          :IWEEKDAY,:IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,
          :ICARD,:ICARDLEN,:IANYCARD,:ICARDSTATE,:IDESTINATION,
          :IKIND,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID, "TYPE", NAME, TEXT,
         CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, PRIORITY, PARENTID, BEGVAL, ENDVAL,
         CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
  DO
  BEGIN
    IF (OLDGRPCODE IS NULL) THEN
      OLDGRPCODE = GRPCODE;
    IF (OLDPRIORITY IS NULL) THEN
      OLDPRIORITY = PRIORITY;
    IF (GRPCODE <> OLDGRPCODE) THEN
    BEGIN
      OLDPRIORITY = PRIORITY;
      OLDGRPCODE = GRPCODE;
    END
    IF (OLDPRIORITY = PRIORITY) THEN
    BEGIN
      SUSPEND;
      ID = ID + 1;
    END
  END

END
^

/* Alter (GET_DISCOUNT_CUSTOM) */
ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
DECLARE VARIABLE OLDGRPCODE INTEGER;
DECLARE VARIABLE OLDPRIORITY INTEGER;
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
BEGIN

  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3, AR.CODE,
      (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID), AR.WAREID
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (INDATERANGE(:REGDATE,
                  AC.REGDATECOND,
                  AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                  AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND) > 0) AND

      (INDATERANGE(:MEMDATE,
                  AC.MEMDATECOND,
                  AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                  AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND) > 0) AND

      (INDATERANGE(:BIRTHDATE,
                  AC.BIRTHDATECOND,
                  AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                  AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND) > 0) AND

      (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
      (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
      (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)

    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,DISCRATECODE,CARD, DISCRATEWAREID
    DO
    BEGIN
      IF (OLDGRPCODE IS NULL) THEN
        OLDGRPCODE = NULLTONUM(GRPCODE);
      IF (OLDPRIORITY IS NULL) THEN
        OLDPRIORITY = PRIORITY;
      IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
      BEGIN
        OLDPRIORITY = PRIORITY;
        OLDGRPCODE = GRPCODE;
      END
      IF (OLDPRIORITY = PRIORITY) THEN
        SUSPEND;
    END

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    OLDPRIORITY = NULL;
    OLDGRPCODE = NULL;

    FOR
      SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
        QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID,AR.BEGVAL,AR.ENDVAL,
        AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3,AR.CODE, AR.WAREID
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
      WHERE
        (INDATERANGE(:REGDATE,
                    AC.REGDATECOND,
                    AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                    AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND) > 0) AND

        (INDATERANGE(:MEMDATE,
                    AC.MEMDATECOND,
                    AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                    AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND) > 0) AND

        (INDATERANGE(:BIRTHDATE,
                    AC.BIRTHDATECOND,
                    AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                    AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND) > 0) AND

        (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
        (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
        (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND

        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
      ORDER BY GD.CODE, AD.PRIORITY
      INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,DISCRATECODE, DISCRATEWAREID
      DO
      BEGIN
        IF (OLDGRPCODE IS NULL) THEN
          OLDGRPCODE = NULLTONUM(GRPCODE);
        IF (OLDPRIORITY IS NULL) THEN
          OLDPRIORITY = PRIORITY;
        IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
        BEGIN
          OLDPRIORITY = PRIORITY;
          OLDGRPCODE = GRPCODE;
        END
        IF (OLDPRIORITY = PRIORITY) THEN
          SUSPEND;
      END

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  VAL = NULL;
  WAREID = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;
  "TYPE" = NULL;
  TEXT = NULL;
  CODE = NULL;
  CARDPREFIXBEG = NULL;
  CARDPREFIXEND = NULL;
  DEPENDOTHERPOS = NULL;
  BEGVAL = NULL;
  ENDVAL = NULL;
  CNTTYPE1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  CNTTYPE2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  CNTTYPE3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  PRIORITY = 0;
  CARD = NULL;

  FOR
    SELECT AR.VAL, AR.WAREID, AR."TYPE", AR.NAME, AR.TEXT,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AR.CODE, (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID)
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN DISCRATE AR ON AR.ID = A.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
--    PLAN SORT (JOIN (JOIN (AR NATURAL,A INDEX (IDX_ACTDISCOBJ2,FK_ADO_DISCRATE))))
  INTO VAL, DISCRATEWAREID,"TYPE",NAME, TEXT,PARENTID, BEGVAL, ENDVAL, DISCRATECODE, CARD
  DO
    SUSPEND;
END
^

/* Alter (GET_DISCRATE_PARENTS) */
ALTER PROCEDURE GET_DISCRATE_PARENTS(ID_DISCRATE INTEGER,
IN_NUM INTEGER)
 RETURNS(ID_PARENT INTEGER,
NUM INTEGER)
 AS
DECLARE VARIABLE TMP_NUM INTEGER;
BEGIN

  IF (ID_DISCRATE <> 0) THEN
  BEGIN

    SELECT S.PARENTID
    FROM   DISCRATE S
    WHERE  S.ID = :ID_DISCRATE
    INTO   ID_PARENT;

    IF (ID_PARENT = ID_DISCRATE) THEN
      EXCEPTION E_DISCRATE_STRUCT_CORRUPT;

    IF (ID_PARENT <> 0) THEN
    BEGIN
      TMP_NUM = IN_NUM + 1;
      FOR
        SELECT ID_PARENT, NUM
        FROM   GET_DISCRATE_PARENTS(:ID_PARENT, :TMP_NUM)
        INTO   ID_PARENT, NUM
        DO
          SUSPEND;
    END

    NUM = IN_NUM;
    ID_PARENT = ID_DISCRATE;
    SUSPEND;
  END
END
^

/* Alter (GET_IDLIST) */
ALTER PROCEDURE GET_IDLIST(IDLIST VARCHAR(255))
 RETURNS(ID INTEGER)
 AS
BEGIN
  ID = -1;
  SUSPEND;
  IF (IDLIST IS NULL OR IDLIST = '') THEN
  BEGIN
    ID = 0;
    SUSPEND;
    EXIT;
  END

  WHILE (IDLIST <> '') DO
  BEGIN
    ID = EXTRACTSTR(IDLIST, ',');
    SUSPEND;
    IDLIST = PCOPY(IDLIST, LEN(ID) + 1, LEN(IDLIST) - LEN(ID) - 1);
  END
END
^

/* Alter (GET_OPERDAY) */
ALTER PROCEDURE GET_OPERDAY(DATE1 DATE,
DATE2 DATE,
POSNUMBER INTEGER)
 RETURNS(TRANZ1 INTEGER,
TRANZ2 INTEGER)
 AS
DECLARE VARIABLE TMPC1 INTEGER;
DECLARE VARIABLE TMPT INTEGER;
DECLARE VARIABLE D1 DATE;
BEGIN

/*   " " -   , 
        (   )*/

  TRANZ1 = 0;
  TRANZ2 = 0;

  SELECT MIN(TRANZCOUNT)
  FROM TRANZT T
  WHERE T.POSNUMBER = :POSNUMBER
  INTO TMPC1;

  SELECT TRANZDATE
  FROM TRANZT T
  WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT = :TMPC1
  INTO  D1;

  IF (D1 >= DATE1) THEN
    TRANZ1 = TMPC1;
    ELSE
    BEGIN
      SELECT MIN(T.TRANZCOUNT)
      FROM TRANZT T, TRANZT TT
      WHERE T.POSNUMBER = :POSNUMBER AND TT.POSNUMBER = :POSNUMBER AND
        T.TRANZCOUNT = TT.TRANZCOUNT + 1 AND TT.TRANZTYPE = 61 AND
        T.TRANZDATE BETWEEN :DATE1 AND :DATE2
      INTO TRANZ1;
    END

  IF (TRANZ1 IS NULL) THEN
    EXIT;

  TMPC1 = NULL;
  SELECT MAX(TRANZCOUNT)
  FROM TRANZT T
  WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT >= :TRANZ1
    AND T.TRANZDATE <= :DATE2
  INTO TMPC1;

  SELECT TRANZTYPE
  FROM   TRANZT T
  WHERE  T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT = :TMPC1
  INTO   TMPT;

  IF (TMPT = 61) THEN
    TRANZ2 = TMPC1;
    ELSE
    BEGIN
      TRANZ2 = NULL;
      SELECT MIN(TRANZCOUNT)
      FROM TRANZT T
      WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT > :TMPC1 AND
        T.TRANZTYPE = 61
      INTO TRANZ2;

      IF (TRANZ2 IS NULL) THEN
        SELECT MAX(TRANZCOUNT)
        FROM TRANZT T
        WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT < :TMPC1 AND
          T.TRANZTYPE = 61
        INTO TRANZ2;
    END
END
^

/* Alter (GET_WARE_PARENTS0) */
ALTER PROCEDURE GET_WARE_PARENTS0(ID_WARE INTEGER)
 RETURNS(ID_PARENT INTEGER)
 AS
BEGIN
  ID_PARENT = -1;
  SUSPEND;
  IF (ID_WARE = 0) THEN
  BEGIN
    ID_PARENT = 0;
    SUSPEND;
    EXIT;
  END

  FOR
    SELECT ID_PARENT
    FROM GET_WARE_PARENTS(:ID_WARE, 0)
    INTO ID_PARENT
    DO
      SUSPEND;
END
^

/* Alter (INITDISCSUPERMAG) */
ALTER PROCEDURE INITDISCSUPERMAG(IFORWARE INTEGER,
IDESTINATION INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  FOR SELECT DISTINCT GAD.ID
  FROM GRPACTDISC GAD JOIN ACTDISC A ON
                        A.GRPACTDISCID = GAD.ID
                      JOIN DISCRATE D ON
                        D.ID = A.DISCRATEID
                      JOIN ACTDISCOBJ ADO ON
                        ADO.GRPACTDISCID = GAD.ID AND
                        ADO.CLIENTID = -1 AND ADO.PAYMENTID = -1 AND
                        ADO.CARDID = -1
  WHERE  D.DESTINATION = :IDESTINATION AND ((:IFORWARE = 0 AND ADO.WAREID = -1) OR (:IFORWARE = 1 AND ADO.WAREID > 0))
  INTO ID
  DO
    BEGIN
      DELETE FROM ACTDISCOBJ WHERE GRPACTDISCID = :ID;
      DELETE FROM ACTDISC WHERE GRPACTDISCID = :ID;
      DELETE FROM GRPACTDISC WHERE ID = :ID;
    END
END
^

/* Alter (SENDDATACNGEVENT) */
ALTER PROCEDURE SENDDATACNGEVENT AS
BEGIN
  POST_EVENT 'DATACHANGED';
END
^

SET TERM ; ^

ALTER TABLE CARD ALTER COLUMN ID POSITION 1;

ALTER TABLE CARD ALTER COLUMN CARDGROUPID POSITION 2;

ALTER TABLE CARD ALTER COLUMN CODE POSITION 3;

ALTER TABLE CARD ALTER COLUMN NAME POSITION 4;

ALTER TABLE CARD ALTER COLUMN TEXT POSITION 5;

ALTER TABLE CARD ALTER COLUMN EXPDATEBEG POSITION 6;

ALTER TABLE CARD ALTER COLUMN EXPDATEEND POSITION 7;

ALTER TABLE CARD ALTER COLUMN CARDLENBEG POSITION 8;

ALTER TABLE CARD ALTER COLUMN CARDLENEND POSITION 9;

ALTER TABLE CARD ALTER COLUMN CARDPREFIXBEG POSITION 10;

ALTER TABLE CARD ALTER COLUMN CARDPREFIXEND POSITION 11;

ALTER TABLE CARD ALTER COLUMN NOMINAL POSITION 12;

ALTER TABLE CARD ALTER COLUMN STATE POSITION 13;

ALTER TABLE CARD ALTER COLUMN DELETED POSITION 14;

ALTER TABLE CARDGROUP ALTER COLUMN ID POSITION 1;

ALTER TABLE CARDGROUP ALTER COLUMN CODE POSITION 2;

ALTER TABLE CARDGROUP ALTER COLUMN NAME POSITION 3;

ALTER TABLE CARDGROUP ALTER COLUMN TEXT POSITION 4;

ALTER TABLE CARDGROUP ALTER COLUMN ENTERTYPE POSITION 5;

ALTER TABLE CARDGROUP ALTER COLUMN DELETED POSITION 6;

ALTER TABLE PAYCARDDEV ALTER COLUMN ID POSITION 1;

ALTER TABLE PAYCARDDEV ALTER COLUMN CAPPAY POSITION 2;

ALTER TABLE PAYCARDDEV ALTER COLUMN CAPINTPAY POSITION 3;

ALTER TABLE PAYCARDDEV ALTER COLUMN CAPDISC POSITION 4;

ALTER TABLE PAYCARDDEV ALTER COLUMN CAPMOBILE POSITION 5;

ALTER TABLE PAYCARDDEV ALTER COLUMN CAPGKH POSITION 6;

ALTER TABLE PAYCARDDEV ALTER COLUMN DEVICEID POSITION 7;

ALTER TABLE PAYCARDDEV ALTER COLUMN SLIPCOUNT POSITION 8;

ALTER TABLE REMAIN ALTER COLUMN ID POSITION 1;

ALTER TABLE REMAIN ALTER COLUMN WAREID POSITION 2;

ALTER TABLE REMAIN ALTER COLUMN ASPECTVALUE1ID POSITION 3;

ALTER TABLE REMAIN ALTER COLUMN ASPECTVALUE2ID POSITION 4;

ALTER TABLE REMAIN ALTER COLUMN ASPECTVALUE3ID POSITION 5;

ALTER TABLE REMAIN ALTER COLUMN ASPECTVALUE4ID POSITION 6;

ALTER TABLE REMAIN ALTER COLUMN ASPECTVALUE5ID POSITION 7;

ALTER TABLE REMAIN ALTER COLUMN REMAIN POSITION 8;

ALTER TABLE REMAIN ALTER COLUMN PRICE POSITION 9;

ALTER TABLE REMAIN ALTER COLUMN DELETED POSITION 10;

ALTER TABLE RMK ALTER COLUMN ID POSITION 1;

ALTER TABLE RMK ALTER COLUMN CODE POSITION 2;

ALTER TABLE RMK ALTER COLUMN NAME POSITION 3;

ALTER TABLE RMK ALTER COLUMN TEXT POSITION 4;

ALTER TABLE RMK ALTER COLUMN EDUCATIONMODE POSITION 5;

ALTER TABLE RMK ALTER COLUMN RMKVERSION POSITION 6;

ALTER TABLE SPRT ALTER COLUMN ID POSITION 1;

ALTER TABLE SPRT ALTER COLUMN CODE POSITION 2;

ALTER TABLE SPRT ALTER COLUMN MARK POSITION 3;

ALTER TABLE SPRT ALTER COLUMN PARENTID POSITION 4;

ALTER TABLE SPRT ALTER COLUMN NAME POSITION 5;

ALTER TABLE SPRT ALTER COLUMN TEXT POSITION 6;

ALTER TABLE SPRT ALTER COLUMN PRICE POSITION 7;

ALTER TABLE SPRT ALTER COLUMN MINPRICE POSITION 8;

ALTER TABLE SPRT ALTER COLUMN MAXDISCOUNT POSITION 9;

ALTER TABLE SPRT ALTER COLUMN ASPECTSCHEMEID POSITION 10;

ALTER TABLE SPRT ALTER COLUMN ISWARE POSITION 11;

ALTER TABLE SPRT ALTER COLUMN HIERLEVEL POSITION 12;

ALTER TABLE SPRT ALTER COLUMN LIFE POSITION 13;

ALTER TABLE SPRT ALTER COLUMN FLAGS POSITION 14;

ALTER TABLE SPRT ALTER COLUMN SERIES POSITION 15;

ALTER TABLE SPRT ALTER COLUMN CERTIFICAT POSITION 16;

ALTER TABLE SPRT ALTER COLUMN ECRDEVID POSITION 17;

ALTER TABLE SPRT ALTER COLUMN TAXGROUPID POSITION 18;

ALTER TABLE SPRT ALTER COLUMN SCALELPDEVID POSITION 19;

ALTER TABLE SPRT ALTER COLUMN SCALELPLOADED POSITION 20;

ALTER TABLE SPRT ALTER COLUMN SCALELPWARECODE POSITION 21;

ALTER TABLE SPRT ALTER COLUMN ASPECTTYPE POSITION 22;

ALTER TABLE SPRT ALTER COLUMN RCPPRNDEVID POSITION 23;

ALTER TABLE SPRT ALTER COLUMN PICTURE POSITION 24;

ALTER TABLE SPRT ALTER COLUMN DESCRIPTION POSITION 25;

ALTER TABLE SPRT ALTER COLUMN QUANTITYPREC POSITION 26;

ALTER TABLE SPRT ALTER COLUMN PRICELABELID POSITION 27;

ALTER TABLE SPRT ALTER COLUMN DELETED POSITION 28;

ALTER TABLE SPRT ALTER COLUMN PRICELBPRINTED POSITION 29;

ALTER TABLE SPRT ALTER COLUMN REWARDTYPE POSITION 30;

ALTER TABLE SPRT ALTER COLUMN REWARDVAL POSITION 31;

ALTER TABLE TRANZT ALTER COLUMN ID POSITION 1;

ALTER TABLE TRANZT ALTER COLUMN TRANZCOUNT POSITION 2;

ALTER TABLE TRANZT ALTER COLUMN TRANZDATE POSITION 3;

ALTER TABLE TRANZT ALTER COLUMN TRANZTIME POSITION 4;

ALTER TABLE TRANZT ALTER COLUMN TRANZHOUR POSITION 5;

ALTER TABLE TRANZT ALTER COLUMN TRANZTYPE POSITION 6;

ALTER TABLE TRANZT ALTER COLUMN POSNUMBER POSITION 7;

ALTER TABLE TRANZT ALTER COLUMN CHEQUENUMBER POSITION 8;

ALTER TABLE TRANZT ALTER COLUMN SELLER POSITION 9;

ALTER TABLE TRANZT ALTER COLUMN WARECODE POSITION 10;

ALTER TABLE TRANZT ALTER COLUMN WAREMARK POSITION 11;

ALTER TABLE TRANZT ALTER COLUMN ASPECTSCHEME POSITION 12;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE1 POSITION 13;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE2 POSITION 14;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE3 POSITION 15;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE4 POSITION 16;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE5 POSITION 17;

ALTER TABLE TRANZT ALTER COLUMN PRICE POSITION 18;

ALTER TABLE TRANZT ALTER COLUMN QUANTITY POSITION 19;

ALTER TABLE TRANZT ALTER COLUMN SUMM POSITION 20;

ALTER TABLE TRANZT ALTER COLUMN PRICEWD POSITION 21;

ALTER TABLE TRANZT ALTER COLUMN SUMMWD POSITION 22;

ALTER TABLE TRANZT ALTER COLUMN CHEQUETYPE POSITION 23;

ALTER TABLE TRANZT ALTER COLUMN ISRET POSITION 24;

ALTER TABLE TRANZT ALTER COLUMN IMID POSITION 25;

ALTER TABLE TRANZT ALTER COLUMN ECRSESSION POSITION 26;

ALTER TABLE TRANZT ALTER COLUMN INFO POSITION 27;

ALTER TABLE TRANZT ALTER COLUMN INFOSTR POSITION 28;

ALTER TABLE TRANZT ALTER COLUMN CURRENCY POSITION 29;

ALTER TABLE TRANZT ALTER COLUMN TRANZCOUNTREF POSITION 30;

ALTER TABLE TRANZT ALTER COLUMN PRNONECR POSITION 31;

ALTER TABLE TRANZT ALTER COLUMN ECRNUMBER POSITION 32;

ALTER TABLE TRANZT ALTER COLUMN POSID POSITION 33;

ALTER TABLE TRANZT ALTER COLUMN POSNUMB POSITION 34;

ALTER TABLE TRANZT ALTER COLUMN EDUCATION POSITION 35;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCPOS POSITION 36;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCREC POSITION 37;

ALTER TABLE TRANZT ALTER COLUMN IDENTIF POSITION 38;

ALTER TABLE TRANZT ALTER COLUMN COMMENTCODE POSITION 39;

ALTER TABLE TRANZT ALTER COLUMN DOCKINDCODE POSITION 40;

ALTER TABLE TRANZT ALTER COLUMN RESTORED POSITION 41;

ALTER TABLE TRANZT ALTER COLUMN SAVED POSITION 42;

ALTER TABLE TRANZT ALTER COLUMN CHQTRANZCOUNT POSITION 43;

/* DROP: -- GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON DISCCOND TO PUBLIC */
REVOKE DELETE, INSERT, SELECT, UPDATE, REFERENCES ON DISCCOND FROM PUBLIC;

/* DROP: -- GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON DISCS TO PUBLIC */
REVOKE DELETE, INSERT, SELECT, UPDATE, REFERENCES ON DISCS FROM PUBLIC;

/* DROP: -- GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON DISCSCHM TO PUBLIC */
REVOKE DELETE, INSERT, SELECT, UPDATE, REFERENCES ON DISCSCHM FROM PUBLIC;

/* DROP: -- GRANT EXECUTE ON PROCEDURE APPENDDISC TO PUBLIC */
REVOKE EXECUTE ON PROCEDURE APPENDDISC FROM PUBLIC;

/* DROP: -- GRANT EXECUTE ON PROCEDURE APPENDDISCCLIENT TO PUBLIC */
REVOKE EXECUTE ON PROCEDURE APPENDDISCCLIENT FROM PUBLIC;

/* DROP: -- GRANT EXECUTE ON PROCEDURE APPENDDISCSCHM TO PUBLIC */
REVOKE EXECUTE ON PROCEDURE APPENDDISCSCHM FROM PUBLIC;

/* DROP: -- GRANT EXECUTE ON PROCEDURE GRANT_ALL_TO_PUBLIC TO PUBLIC */
REVOKE EXECUTE ON PROCEDURE GRANT_ALL_TO_PUBLIC FROM PUBLIC;

/* Create(Add) Crant */
GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON ACTDISC TO PUBLIC;

GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON ACTDISCOBJ TO PUBLIC;

GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON ACTSCRIPT TO PUBLIC;

GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON CCARD TO PUBLIC;

GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON CLIENT TO PUBLIC;

GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON CONDITION TO PUBLIC;

GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON COUNTER TO PUBLIC;

GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON COUNTERD TO PUBLIC;

GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON COUNTERTYPE TO PUBLIC;

GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON DISCRATE TO PUBLIC;

GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON GRPACTDISC TO PUBLIC;

GRANT DELETE, INSERT, SELECT, UPDATE, REFERENCES ON GRPCCARD TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPEND_WARE_DISC TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPENDACTDISC TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPENDCONDITION TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPENDDEFAULTGRPDISC TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPENDDISCRATE TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPENDGESTCLIENT TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPENDGRPACTDISC TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPPEND_SUPERMAG_DISC TO PUBLIC;

GRANT EXECUTE ON PROCEDURE DEL_MARKED TO PUBLIC;

GRANT EXECUTE ON PROCEDURE DEL_MARKED_EX TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_ACTSCRIPT TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_ACTSCRIPT_CUSTOM TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_CLIENT_PARENTS TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_CLIENT_PARENTS0 TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_DISCOUNT TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_DISCOUNT_CUSTOM TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_DISCRATE_PARENTS TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_IDLIST TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_WARE_PARENTS0 TO PUBLIC;

GRANT EXECUTE ON PROCEDURE SENDDATACNGEVENT TO PUBLIC;

/*MAN*/
EXECUTE PROCEDURE MERGE_SETTING('InputMultipleCards', 0);
/*MAN*/

/* TEXT BLOCK END */


/* Convert 4.4.1 */
/* Declare UDF */
DECLARE EXTERNAL FUNCTION INDATERANGE1
DATE,INTEGER,CSTRING(255),CSTRING(255),CSTRING(255),CSTRING(255),CSTRING(255),CSTRING(255),DATE
RETURNS INTEGER BY VALUE
ENTRY_POINT 'InDateRange1' MODULE_NAME 'UDFAtol';


/* Drop Index... */
RECONNECT;


/* Drop Fields on Table... */
/* ALTER TABLE GRPCCARD DROP ENTERTYPE;

ALTER TABLE GRPCCARD ADD ENTERMANUAL FLAG;

ALTER TABLE GRPCCARD ADD ENTERREADER FLAG;

ALTER TABLE GRPCCARD ADD ENTERVIS FLAG;

ALTER TABLE GRPCCARD ADD ENTERSCAN FLAG; */   


DROP INDEX IDX_CCARD_VAL;

ALTER TABLE RECTEMPLATE ADD MASTERSETTINGS FBLOBTEXT;

ALTER TABLE COUNTERD ADD DELTADATE FDATE;

ALTER TABLE COUNTERTYPE ADD COUNTERALG FRINT NOT NULL;

/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL INTEGER,
ICARDID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^


/* Create Index... */
SET TERM ; ^

CREATE INDEX IND_CNTD2 ON COUNTERD(COUNTERID,DELTADATE);


/* Create Unique... */
ALTER TABLE CCARD ADD CONSTRAINT UNQ_CCARD_VAL UNIQUE (VAL);

/*  Empty GET_ACTSCRIPT for GET_ACTSCRIPT_CUSTOM(param list change)  */
/* AssignEmptyBody proc */
SET TERM ^ ;

ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter empty procedure GET_ACTSCRIPT_CUSTOM with new param-list */
ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN EXIT; END
^

/* Alter Procedure... */
/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 INTEGER,
ICOUNTERVAL2 INTEGER,
ICOUNTERVAL3 INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), -1, -1, :CARDID, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID)
      RETURNING_VALUES ERRORCODE;
END
^

/* Alter (APPENDCOUNTERBYTYPE) */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL INTEGER,
ICARDID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE COUNTERTYPEID INTEGER;
DECLARE VARIABLE COUNTERID INTEGER;
DECLARE VARIABLE CID INTEGER;
DECLARE VARIABLE COUNTERCODE INTEGER;
BEGIN

  SELECT ID
  FROM COUNTERTYPE
  WHERE :ICOUNTERTYPE = CODE
  INTO :COUNTERTYPEID;

  IF (:COUNTERTYPEID IS NULL) THEN
  BEGIN
    ERRORCODE = 28;
    EXIT;
  END
  ELSE
  BEGIN
    CID = NULL;
    FOR
      SELECT C.ID
      FROM COUNTER C
      LEFT JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
      LEFT JOIN CCARDCOUNTER CC ON CC.COUNTERID = C.ID
      WHERE CT.CODE = :ICOUNTERTYPE  AND CC.CCARDID = :ICARDID
      INTO :COUNTERID
    DO
    BEGIN
      IF (CID IS NULL) THEN
      BEGIN
        DELETE FROM COUNTERD
        WHERE COUNTERID = :COUNTERID;
      END

      CID = 0;

      UPDATE COUNTER SET
        VAL = :ICOUNTERVAL
      WHERE ID = :COUNTERID;
    END

    IF (:CID IS NULL) THEN
    BEGIN
      COUNTERID = GEN_ID(GID, 1);

      SELECT MAX(CODE)
      FROM COUNTER
      WHERE :COUNTERTYPEID = COUNTERTYPEID
      INTO :COUNTERCODE;

      IF (:COUNTERCODE IS NULL) THEN
        COUNTERCODE = 0;

      INSERT INTO COUNTER(ID, CODE, VAL, COUNTERTYPEID)
      VALUES (:COUNTERID, :COUNTERCODE + 1, :ICOUNTERVAL, :COUNTERTYPEID);

      INSERT INTO CCARDCOUNTER(CCARDID, COUNTERID)
      VALUES (:ICARDID, :COUNTERID);
    END

  END
END
^

/* Alter (CANCELSTORED) */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER)
 RETURNS(TRANZCOUNT INTEGER)
 AS
DECLARE VARIABLE IDTRANZ INTEGER;
DECLARE VARIABLE TRANZCOUNTREF INTEGER;
BEGIN

  FOR
    SELECT ID, TRANZCOUNT
    FROM TRANZT
    WHERE POSNUMBER = :APOSNUMBER AND TRANZTYPE=54 AND
      (TRANZCOUNT NOT IN (SELECT TRANZCOUNTREF
                          FROM TRANZT
                          WHERE POSNUMBER = :APOSNUMBER AND TRANZTYPE = 57))
    INTO  IDTRANZ, TRANZCOUNTREF
    DO
    BEGIN
      SELECT MAX(TRANZCOUNT) + 1
      FROM TRANZT
      WHERE POSNUMBER = :APOSNUMBER
      INTO TRANZCOUNT;
      IF (TRANZCOUNT IS NULL) THEN
        TRANZCOUNT = 1;

      INSERT INTO TRANZT (
        ID, ASPECTSCHEME, ASPECTVALUE1, ASPECTVALUE2, ASPECTVALUE3,
        ASPECTVALUE4, ASPECTVALUE5, CHEQUENUMBER, CHEQUETYPE,
        CURRENCY, ECRNUMBER, ECRSESSION, EDUCATION,
        IDENTIF, IMID, INFO, INFOSTR, ISRET, POSID,
        POSNUMB, POSNUMBER, PRICE, PRICEWD, PRNONECR,
        QUANTITY, RESTORED, SELLER, SUMM, SUMMDISCPOS,
        SUMMDISCREC, SUMMWD, TRANZCOUNT, TRANZCOUNTREF,
        TRANZDATE, TRANZHOUR, TRANZTIME, TRANZTYPE,
        WARECODE, WAREMARK, SAVED, CHQTRANZCOUNT)
      SELECT GEN_ID(GTRANZT, 1), T.ASPECTSCHEME, T.ASPECTVALUE1, T.ASPECTVALUE2, T.ASPECTVALUE3,
        T.ASPECTVALUE4, T.ASPECTVALUE5, T.CHEQUENUMBER, T.CHEQUETYPE,
        T.CURRENCY, T.ECRNUMBER, T.ECRSESSION, T.EDUCATION,
        T.IDENTIF, T.IMID, T.INFO, T.INFOSTR, T.ISRET, T.POSID,
        T.POSNUMB, :APOSNUMBER, T.PRICE, T.PRICEWD, T.PRNONECR,
        T.QUANTITY, T.RESTORED, :ASELLERID, T.SUMM, T.SUMMDISCPOS,
        T.SUMMDISCREC, T.SUMMWD, :TRANZCOUNT, :TRANZCOUNTREF,
        :ATRANZDATE, :ATRANZHOUR, :ATRANZTIME, 57,
        T.WARECODE, T.WAREMARK, :ASAVED, 0
      FROM TRANZT T
      WHERE T.ID = :IDTRANZ;
    END

END
^

ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
DECLARE VARIABLE CARD VARCHAR(255);
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
DECLARE VARIABLE OLDPRIORITY INTEGER;
DECLARE VARIABLE OLDGRPCODE INTEGER;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
      AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
      AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (INDATERANGE1(:REGDATE,
                  AC.REGDATECOND,
                  AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                  AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:MEMDATE,
                  AC.MEMDATECOND,
                  AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                  AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:BIRTHDATE,
                  AC.BIRTHDATECOND,
                  AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                  AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

      (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
      (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
      (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)
    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3
    DO
    BEGIN
      IF (OLDGRPCODE IS NULL) THEN
        OLDGRPCODE = NULLTONUM(GRPCODE);
      IF (OLDPRIORITY IS NULL) THEN
        OLDPRIORITY = PRIORITY;
      IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
      BEGIN
        OLDPRIORITY = PRIORITY;
        OLDGRPCODE = GRPCODE;
      END
      IF (OLDPRIORITY = PRIORITY) THEN
        SUSPEND;
    END

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    OLDPRIORITY = NULL;
    OLDGRPCODE = NULL;

    FOR
      SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
        AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
        AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
      WHERE
        ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
        (INDATERANGE1(:REGDATE,
                    AC.REGDATECOND,
                    AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                    AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:MEMDATE,
                    AC.MEMDATECOND,
                    AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                    AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:BIRTHDATE,
                    AC.BIRTHDATECOND,
                    AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                    AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

        (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
        (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
        (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
     PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
     ORDER BY GD.CODE, AD.PRIORITY
     INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3
     DO
     BEGIN
        IF (OLDGRPCODE IS NULL) THEN
          OLDGRPCODE = NULLTONUM(GRPCODE);
        IF (OLDPRIORITY IS NULL) THEN
          OLDPRIORITY = PRIORITY;
        IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
        BEGIN
          OLDPRIORITY = PRIORITY;
          OLDGRPCODE = GRPCODE;
        END
        IF (OLDPRIORITY = PRIORITY) THEN
          SUSPEND;
     END

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  PRIORITY = 0;
  WAREID = NULL;
  CNTTYPE1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  CNTTYPE2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  CNTTYPE3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTSCRIPT ACS ON ACS.ID = A.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
  INTO DATA, CODE
  DO
    SUSPEND;

END
^

/* Alter (GET_ACTSCRIPT) */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
DECLARE VARIABLE OLDGRPCODE INTEGER;
DECLARE VARIABLE OLDPRIORITY INTEGER;
BEGIN
  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;
  ID = 1;

  FOR
    SELECT  CODE, DATA, NULLTONUM(GRPCODE), NULLTONUM(PRIORITY), WAREID,
      SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, CNTTYPE1,
      CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3
    FROM GET_ACTSCRIPT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
      :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,:IWEEKDAY,
      :IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,:ICARD,
      :ICARDLEN,:IANYCARD,:ICARDSTATE,:IACTEVENT,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY, CODE
    INTO CODE, DATA, GRPCODE, PRIORITY,WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3
  DO
  BEGIN
    IF (OLDGRPCODE IS NULL) THEN
      OLDGRPCODE = GRPCODE;
    IF (OLDPRIORITY IS NULL) THEN
      OLDPRIORITY = PRIORITY;
    IF (GRPCODE <> OLDGRPCODE) THEN
    BEGIN
      OLDPRIORITY = PRIORITY;
      OLDGRPCODE = GRPCODE;
    END
    IF (OLDPRIORITY = PRIORITY) THEN
    BEGIN
      SUSPEND;
      ID = ID + 1;
    END
  END
END
^

/* Alter (GET_ACTSCRIPT_CUSTOM) */
ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
DECLARE VARIABLE CARD VARCHAR(255);
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
DECLARE VARIABLE OLDPRIORITY INTEGER;
DECLARE VARIABLE OLDGRPCODE INTEGER;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
      AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
      AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (INDATERANGE1(:REGDATE,
                  AC.REGDATECOND,
                  AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                  AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:MEMDATE,
                  AC.MEMDATECOND,
                  AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                  AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:BIRTHDATE,
                  AC.BIRTHDATECOND,
                  AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                  AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

      (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
      (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
      (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)
    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3
    DO
    BEGIN
      IF (OLDGRPCODE IS NULL) THEN
        OLDGRPCODE = NULLTONUM(GRPCODE);
      IF (OLDPRIORITY IS NULL) THEN
        OLDPRIORITY = PRIORITY;
      IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
      BEGIN
        OLDPRIORITY = PRIORITY;
        OLDGRPCODE = GRPCODE;
      END
      IF (OLDPRIORITY = PRIORITY) THEN
        SUSPEND;
    END

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    OLDPRIORITY = NULL;
    OLDGRPCODE = NULL;

    FOR
      SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
        AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
        AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
      WHERE
        ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
        (INDATERANGE1(:REGDATE,
                    AC.REGDATECOND,
                    AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                    AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:MEMDATE,
                    AC.MEMDATECOND,
                    AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                    AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:BIRTHDATE,
                    AC.BIRTHDATECOND,
                    AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                    AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

        (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
        (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
        (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
     PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
     ORDER BY GD.CODE, AD.PRIORITY
     INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3
     DO
     BEGIN
        IF (OLDGRPCODE IS NULL) THEN
          OLDGRPCODE = NULLTONUM(GRPCODE);
        IF (OLDPRIORITY IS NULL) THEN
          OLDPRIORITY = PRIORITY;
        IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
        BEGIN
          OLDPRIORITY = PRIORITY;
          OLDGRPCODE = GRPCODE;
        END
        IF (OLDPRIORITY = PRIORITY) THEN
          SUSPEND;
     END

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  PRIORITY = 0;
  WAREID = NULL;
  CNTTYPE1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  CNTTYPE2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  CNTTYPE3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTSCRIPT ACS ON ACS.ID = A.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
  INTO DATA, CODE
  DO
    SUSPEND;

END
^

/* empty dependent procedure body */
/* Clear: GET_DISCOUNT_CUSTOM for: GET_CLIENT_PARENTS0 */
/* AssignEmptyBody proc */
ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN EXIT; END
^

/* Alter (GET_CLIENT_PARENTS0) */
ALTER PROCEDURE GET_CLIENT_PARENTS0(ID_CLIENT INTEGER)
 RETURNS(ID_PARENT INTEGER)
 AS
BEGIN
  ID_PARENT = -1;
  SUSPEND;
  IF (ID_CLIENT = 0) THEN
  BEGIN
    ID_PARENT = 0;
    SUSPEND;
    EXIT;
  END

  IF (ID_CLIENT > 0) THEN
  FOR
    SELECT ID_PARENT
    FROM GET_CLIENT_PARENTS(:ID_CLIENT, 0)
    INTO ID_PARENT
    DO
      SUSPEND;
END
^

/* empty dependent procedure body */
/* Clear: GET_DISCOUNT for: GET_DISCOUNT_CUSTOM */
/* AssignEmptyBody proc */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN EXIT; END
^

/* Alter (GET_DISCOUNT_CUSTOM) */
ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
DECLARE VARIABLE OLDGRPCODE INTEGER;
DECLARE VARIABLE OLDPRIORITY INTEGER;
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
BEGIN

  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3, AR.CODE,
      (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID), AR.WAREID
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (INDATERANGE1(:REGDATE,
                  AC.REGDATECOND,
                  AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                  AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:MEMDATE,
                  AC.MEMDATECOND,
                  AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                  AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:BIRTHDATE,
                  AC.BIRTHDATECOND,
                  AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                  AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

      (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
      (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
      (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)

    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,DISCRATECODE,CARD, DISCRATEWAREID
    DO
    BEGIN
      IF (OLDGRPCODE IS NULL) THEN
        OLDGRPCODE = NULLTONUM(GRPCODE);
      IF (OLDPRIORITY IS NULL) THEN
        OLDPRIORITY = PRIORITY;
      IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
      BEGIN
        OLDPRIORITY = PRIORITY;
        OLDGRPCODE = GRPCODE;
      END
      IF (OLDPRIORITY = PRIORITY) THEN
        SUSPEND;
    END

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    OLDPRIORITY = NULL;
    OLDGRPCODE = NULL;

    FOR
      SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
        QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID,AR.BEGVAL,AR.ENDVAL,
        AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3,AR.CODE, AR.WAREID
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
      WHERE
        (INDATERANGE1(:REGDATE,
                    AC.REGDATECOND,
                    AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                    AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:MEMDATE,
                    AC.MEMDATECOND,
                    AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                    AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:BIRTHDATE,
                    AC.BIRTHDATECOND,
                    AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                    AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

        (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
        (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
        (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND

        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
      ORDER BY GD.CODE, AD.PRIORITY
      INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,DISCRATECODE, DISCRATEWAREID
      DO
      BEGIN
        IF (OLDGRPCODE IS NULL) THEN
          OLDGRPCODE = NULLTONUM(GRPCODE);
        IF (OLDPRIORITY IS NULL) THEN
          OLDPRIORITY = PRIORITY;
        IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
        BEGIN
          OLDPRIORITY = PRIORITY;
          OLDGRPCODE = GRPCODE;
        END
        IF (OLDPRIORITY = PRIORITY) THEN
          SUSPEND;
      END

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  VAL = NULL;
  WAREID = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;
  "TYPE" = NULL;
  TEXT = NULL;
  CODE = NULL;
  CARDPREFIXBEG = NULL;
  CARDPREFIXEND = NULL;
  DEPENDOTHERPOS = NULL;
  BEGVAL = NULL;
  ENDVAL = NULL;
  CNTTYPE1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  CNTTYPE2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  CNTTYPE3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  PRIORITY = 0;
  CARD = NULL;

  FOR
    SELECT AR.VAL, AR.WAREID, AR."TYPE", AR.NAME, AR.TEXT,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AR.CODE, (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID)
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN DISCRATE AR ON AR.ID = A.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
--    PLAN SORT (JOIN (JOIN (AR NATURAL,A INDEX (IDX_ACTDISCOBJ2,FK_ADO_DISCRATE))))
  INTO VAL, DISCRATEWAREID,"TYPE",NAME, TEXT,PARENTID, BEGVAL, ENDVAL, DISCRATECODE, CARD
  DO
    SUSPEND;
END
^

/* Alter (GET_WARE_PARENTS0) */
ALTER PROCEDURE GET_WARE_PARENTS0(ID_WARE INTEGER)
 RETURNS(ID_PARENT INTEGER)
 AS
BEGIN
  ID_PARENT = -1;
  SUSPEND;
  IF (ID_WARE = 0) THEN
  BEGIN
    ID_PARENT = 0;
    SUSPEND;
    EXIT;
  END

  IF (ID_WARE > 0) THEN
  FOR
    SELECT ID_PARENT
    FROM GET_WARE_PARENTS(:ID_WARE, 0)
    INTO ID_PARENT
    DO
      SUSPEND;
END
^

/* Restore procedure body: GET_DISCOUNT */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
DECLARE VARIABLE OLDGRPCODE INTEGER;
DECLARE VARIABLE OLDPRIORITY INTEGER;
BEGIN
  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;
  ID = 1;

  FOR
    SELECT NULLTONUM(GRPCODE), VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
           "TYPE", NAME, TEXT,
           CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, NULLTONUM(PRIORITY), PARENTID, BEGVAL, ENDVAL,
           CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
    FROM GET_DISCOUNT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
          :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,
          :IWEEKDAY,:IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,
          :ICARD,:ICARDLEN,:IANYCARD,:ICARDSTATE,:IDESTINATION,
          :IKIND,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID, "TYPE", NAME, TEXT,
         CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, PRIORITY, PARENTID, BEGVAL, ENDVAL,
         CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
  DO
  BEGIN
    IF (OLDGRPCODE IS NULL) THEN
      OLDGRPCODE = GRPCODE;
    IF (OLDPRIORITY IS NULL) THEN
      OLDPRIORITY = PRIORITY;
    IF (GRPCODE <> OLDGRPCODE) THEN
    BEGIN
      OLDPRIORITY = PRIORITY;
      OLDGRPCODE = GRPCODE;
    END
    IF (OLDPRIORITY = PRIORITY) THEN
    BEGIN
      SUSPEND;
      ID = ID + 1;
    END
  END

END
^

/* Create Trigger... */
CREATE TRIGGER INS_BEF_GRPCCARD FOR GRPCCARD
ACTIVE BEFORE INSERT POSITION 0 
AS
BEGIN
  IF (NOT NEW.CARDPREFIXBEG IS NULL) THEN
    NEW.CARDPREFIXBEG = ADDRIGHT(NEW.CARDPREFIXBEG, 1, 40);
  IF (NOT NEW.CARDPREFIXEND IS NULL) THEN
    NEW.CARDPREFIXEND = ADDRIGHT(NEW.CARDPREFIXEND, 255, 40);
END
^


/* Alter exist trigger... */
ALTER TRIGGER UPD_AFT_COUNTERTYPE
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
BEGIN
/*  OLD.AUTOCREATE >= 0   -.   */
/*      ,     */
/*      . */
/*        -        "" */
  IF (OLD.AUTOCREATE >= 0 AND NEW.AUTOCREATE <> OLD.AUTOCREATE) THEN
  BEGIN
  IF (NEW.AUTOCREATE = 1) THEN
  BEGIN
    DELETE FROM COUNTER WHERE COUNTERTYPEID = NEW.ID;
    FOR
      SELECT ID
      FROM CCARD C
--      WHERE NOT EXISTS(SELECT 1 FROM CCARDCOUNTER CC JOIN COUNTER CN ON CN.ID = CC.COUNTERID
--        WHERE CC.CCARDID = C.ID AND CN.COUNTERTYPEID = NEW.ID)
      INTO TMPID1
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, VAL, COUNTERTYPEID) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), 0, NEW.ID);
        INSERT INTO CCARDCOUNTER (COUNTERID, CCARDID) VALUES (:TMPID2, :TMPID1);
      END
  END
  IF (NEW.AUTOCREATE = 2) THEN
  BEGIN
    DELETE FROM COUNTER WHERE COUNTERTYPEID = NEW.ID;
    FOR
      SELECT ID
      FROM CLIENT C
--      WHERE NOT EXISTS(SELECT 1 FROM CLIENTCOUNTER CC JOIN COUNTER CN ON CN.ID = CC.COUNTERID
--        WHERE CC.COUNTERID = C.ID AND CN.COUNTERTYPEID = NEW.ID)
      INTO TMPID1
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, VAL, COUNTERTYPEID) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), 0, NEW.ID);
        INSERT INTO CLIENTCOUNTER (COUNTERID, CLIENTID) VALUES (:TMPID2, :TMPID1);
      END
  END
  END
END
^

/* Alter empty procedure GET_ACTSCRIPT_CUSTOM with new param-list */
ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN EXIT; END
^

/* Alter Procedure... */
/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 INTEGER,
ICOUNTERVAL2 INTEGER,
ICOUNTERVAL3 INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), -1, -1, :CARDID, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID)
      RETURNING_VALUES ERRORCODE;
END
^

/* Alter (APPENDCOUNTERBYTYPE) */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL INTEGER,
ICARDID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE COUNTERTYPEID INTEGER;
DECLARE VARIABLE COUNTERID INTEGER;
DECLARE VARIABLE CID INTEGER;
DECLARE VARIABLE COUNTERCODE INTEGER;
BEGIN

  SELECT ID
  FROM COUNTERTYPE
  WHERE :ICOUNTERTYPE = CODE
  INTO :COUNTERTYPEID;

  IF (:COUNTERTYPEID IS NULL) THEN
  BEGIN
    ERRORCODE = 28;
    EXIT;
  END
  ELSE
  BEGIN
    CID = NULL;
    FOR
      SELECT C.ID
      FROM COUNTER C
      LEFT JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
      LEFT JOIN CCARDCOUNTER CC ON CC.COUNTERID = C.ID
      WHERE CT.CODE = :ICOUNTERTYPE  AND CC.CCARDID = :ICARDID
      INTO :COUNTERID
    DO
    BEGIN
      IF (CID IS NULL) THEN
      BEGIN
        DELETE FROM COUNTERD
        WHERE COUNTERID = :COUNTERID;
      END

      CID = 0;

      UPDATE COUNTER SET
        VAL = :ICOUNTERVAL
      WHERE ID = :COUNTERID;
    END

    IF (:CID IS NULL) THEN
    BEGIN
      COUNTERID = GEN_ID(GID, 1);

      SELECT MAX(CODE)
      FROM COUNTER
      WHERE :COUNTERTYPEID = COUNTERTYPEID
      INTO :COUNTERCODE;

      IF (:COUNTERCODE IS NULL) THEN
        COUNTERCODE = 0;

      INSERT INTO COUNTER(ID, CODE, VAL, COUNTERTYPEID)
      VALUES (:COUNTERID, :COUNTERCODE + 1, :ICOUNTERVAL, :COUNTERTYPEID);

      INSERT INTO CCARDCOUNTER(CCARDID, COUNTERID)
      VALUES (:ICARDID, :COUNTERID);
    END

  END
END
^

/* Alter (CANCELSTORED) */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER)
 RETURNS(TRANZCOUNT INTEGER)
 AS
DECLARE VARIABLE IDTRANZ INTEGER;
DECLARE VARIABLE TRANZCOUNTREF INTEGER;
BEGIN

  FOR
    SELECT ID, TRANZCOUNT
    FROM TRANZT
    WHERE POSNUMBER = :APOSNUMBER AND TRANZTYPE=54 AND
      (TRANZCOUNT NOT IN (SELECT TRANZCOUNTREF
                          FROM TRANZT
                          WHERE POSNUMBER = :APOSNUMBER AND TRANZTYPE = 57))
    INTO  IDTRANZ, TRANZCOUNTREF
    DO
    BEGIN
      SELECT MAX(TRANZCOUNT) + 1
      FROM TRANZT
      WHERE POSNUMBER = :APOSNUMBER
      INTO TRANZCOUNT;
      IF (TRANZCOUNT IS NULL) THEN
        TRANZCOUNT = 1;

      INSERT INTO TRANZT (
        ID, ASPECTSCHEME, ASPECTVALUE1, ASPECTVALUE2, ASPECTVALUE3,
        ASPECTVALUE4, ASPECTVALUE5, CHEQUENUMBER, CHEQUETYPE,
        CURRENCY, ECRNUMBER, ECRSESSION, EDUCATION,
        IDENTIF, IMID, INFO, INFOSTR, ISRET, POSID,
        POSNUMB, POSNUMBER, PRICE, PRICEWD, PRNONECR,
        QUANTITY, RESTORED, SELLER, SUMM, SUMMDISCPOS,
        SUMMDISCREC, SUMMWD, TRANZCOUNT, TRANZCOUNTREF,
        TRANZDATE, TRANZHOUR, TRANZTIME, TRANZTYPE,
        WARECODE, WAREMARK, SAVED, CHQTRANZCOUNT)
      SELECT GEN_ID(GTRANZT, 1), T.ASPECTSCHEME, T.ASPECTVALUE1, T.ASPECTVALUE2, T.ASPECTVALUE3,
        T.ASPECTVALUE4, T.ASPECTVALUE5, T.CHEQUENUMBER, T.CHEQUETYPE,
        T.CURRENCY, T.ECRNUMBER, T.ECRSESSION, T.EDUCATION,
        T.IDENTIF, T.IMID, T.INFO, T.INFOSTR, T.ISRET, T.POSID,
        T.POSNUMB, :APOSNUMBER, T.PRICE, T.PRICEWD, T.PRNONECR,
        T.QUANTITY, T.RESTORED, :ASELLERID, T.SUMM, T.SUMMDISCPOS,
        T.SUMMDISCREC, T.SUMMWD, :TRANZCOUNT, :TRANZCOUNTREF,
        :ATRANZDATE, :ATRANZHOUR, :ATRANZTIME, 57,
        T.WARECODE, T.WAREMARK, :ASAVED, 0
      FROM TRANZT T
      WHERE T.ID = :IDTRANZ;
    END

END
^

ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
DECLARE VARIABLE CARD VARCHAR(255);
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
DECLARE VARIABLE OLDPRIORITY INTEGER;
DECLARE VARIABLE OLDGRPCODE INTEGER;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
      AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
      AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (INDATERANGE1(:REGDATE,
                  AC.REGDATECOND,
                  AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                  AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:MEMDATE,
                  AC.MEMDATECOND,
                  AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                  AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:BIRTHDATE,
                  AC.BIRTHDATECOND,
                  AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                  AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

      (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
      (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
      (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)
    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3
    DO
    BEGIN
      IF (OLDGRPCODE IS NULL) THEN
        OLDGRPCODE = NULLTONUM(GRPCODE);
      IF (OLDPRIORITY IS NULL) THEN
        OLDPRIORITY = PRIORITY;
      IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
      BEGIN
        OLDPRIORITY = PRIORITY;
        OLDGRPCODE = GRPCODE;
      END
      IF (OLDPRIORITY = PRIORITY) THEN
        SUSPEND;
    END

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    OLDPRIORITY = NULL;
    OLDGRPCODE = NULL;

    FOR
      SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
        AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
        AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
      WHERE
        ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
        (INDATERANGE1(:REGDATE,
                    AC.REGDATECOND,
                    AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                    AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:MEMDATE,
                    AC.MEMDATECOND,
                    AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                    AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:BIRTHDATE,
                    AC.BIRTHDATECOND,
                    AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                    AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

        (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
        (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
        (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
     PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
     ORDER BY GD.CODE, AD.PRIORITY
     INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3
     DO
     BEGIN
        IF (OLDGRPCODE IS NULL) THEN
          OLDGRPCODE = NULLTONUM(GRPCODE);
        IF (OLDPRIORITY IS NULL) THEN
          OLDPRIORITY = PRIORITY;
        IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
        BEGIN
          OLDPRIORITY = PRIORITY;
          OLDGRPCODE = GRPCODE;
        END
        IF (OLDPRIORITY = PRIORITY) THEN
          SUSPEND;
     END

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  PRIORITY = 0;
  WAREID = NULL;
  CNTTYPE1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  CNTTYPE2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  CNTTYPE3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTSCRIPT ACS ON ACS.ID = A.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
  INTO DATA, CODE
  DO
    SUSPEND;

END
^

/* Alter (GET_ACTSCRIPT) */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
DECLARE VARIABLE OLDGRPCODE INTEGER;
DECLARE VARIABLE OLDPRIORITY INTEGER;
BEGIN
  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;
  ID = 1;

  FOR
    SELECT  CODE, DATA, NULLTONUM(GRPCODE), NULLTONUM(PRIORITY), WAREID,
      SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, CNTTYPE1,
      CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3
    FROM GET_ACTSCRIPT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
      :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,:IWEEKDAY,
      :IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,:ICARD,
      :ICARDLEN,:IANYCARD,:ICARDSTATE,:IACTEVENT,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY, CODE
    INTO CODE, DATA, GRPCODE, PRIORITY,WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3
  DO
  BEGIN
    IF (OLDGRPCODE IS NULL) THEN
      OLDGRPCODE = GRPCODE;
    IF (OLDPRIORITY IS NULL) THEN
      OLDPRIORITY = PRIORITY;
    IF (GRPCODE <> OLDGRPCODE) THEN
    BEGIN
      OLDPRIORITY = PRIORITY;
      OLDGRPCODE = GRPCODE;
    END
    IF (OLDPRIORITY = PRIORITY) THEN
    BEGIN
      SUSPEND;
      ID = ID + 1;
    END
  END
END
^

/* Alter (GET_ACTSCRIPT_CUSTOM) */
ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB SEGMENT SIZE 80,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
DECLARE VARIABLE CARD VARCHAR(255);
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
DECLARE VARIABLE OLDPRIORITY INTEGER;
DECLARE VARIABLE OLDGRPCODE INTEGER;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
      AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
      AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (INDATERANGE1(:REGDATE,
                  AC.REGDATECOND,
                  AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                  AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:MEMDATE,
                  AC.MEMDATECOND,
                  AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                  AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:BIRTHDATE,
                  AC.BIRTHDATECOND,
                  AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                  AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

      (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
      (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
      (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)
    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3
    DO
    BEGIN
      IF (OLDGRPCODE IS NULL) THEN
        OLDGRPCODE = NULLTONUM(GRPCODE);
      IF (OLDPRIORITY IS NULL) THEN
        OLDPRIORITY = PRIORITY;
      IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
      BEGIN
        OLDPRIORITY = PRIORITY;
        OLDGRPCODE = GRPCODE;
      END
      IF (OLDPRIORITY = PRIORITY) THEN
        SUSPEND;
    END

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    OLDPRIORITY = NULL;
    OLDGRPCODE = NULL;

    FOR
      SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
        AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
        AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
      WHERE
        ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
        (INDATERANGE1(:REGDATE,
                    AC.REGDATECOND,
                    AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                    AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:MEMDATE,
                    AC.MEMDATECOND,
                    AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                    AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:BIRTHDATE,
                    AC.BIRTHDATECOND,
                    AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                    AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

        (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
        (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
        (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
     PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
     ORDER BY GD.CODE, AD.PRIORITY
     INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3
     DO
     BEGIN
        IF (OLDGRPCODE IS NULL) THEN
          OLDGRPCODE = NULLTONUM(GRPCODE);
        IF (OLDPRIORITY IS NULL) THEN
          OLDPRIORITY = PRIORITY;
        IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
        BEGIN
          OLDPRIORITY = PRIORITY;
          OLDGRPCODE = GRPCODE;
        END
        IF (OLDPRIORITY = PRIORITY) THEN
          SUSPEND;
     END

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  PRIORITY = 0;
  WAREID = NULL;
  CNTTYPE1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  CNTTYPE2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  CNTTYPE3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTSCRIPT ACS ON ACS.ID = A.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
  INTO DATA, CODE
  DO
    SUSPEND;

END
^

/* Alter (GET_CLIENT_PARENTS0) */
ALTER PROCEDURE GET_CLIENT_PARENTS0(ID_CLIENT INTEGER)
 RETURNS(ID_PARENT INTEGER)
 AS
BEGIN
  ID_PARENT = -1;
  SUSPEND;
  IF (ID_CLIENT = 0) THEN
  BEGIN
    ID_PARENT = 0;
    SUSPEND;
    EXIT;
  END

  IF (ID_CLIENT > 0) THEN
  FOR
    SELECT ID_PARENT
    FROM GET_CLIENT_PARENTS(:ID_CLIENT, 0)
    INTO ID_PARENT
    DO
      SUSPEND;
END
^

/* Alter (GET_DISCOUNT) */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
DECLARE VARIABLE OLDGRPCODE INTEGER;
DECLARE VARIABLE OLDPRIORITY INTEGER;
BEGIN
  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;
  ID = 1;

  FOR
    SELECT NULLTONUM(GRPCODE), VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
           "TYPE", NAME, TEXT,
           CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, NULLTONUM(PRIORITY), PARENTID, BEGVAL, ENDVAL,
           CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
    FROM GET_DISCOUNT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
          :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,
          :IWEEKDAY,:IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,
          :ICARD,:ICARDLEN,:IANYCARD,:ICARDSTATE,:IDESTINATION,
          :IKIND,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID, "TYPE", NAME, TEXT,
         CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, PRIORITY, PARENTID, BEGVAL, ENDVAL,
         CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
  DO
  BEGIN
    IF (OLDGRPCODE IS NULL) THEN
      OLDGRPCODE = GRPCODE;
    IF (OLDPRIORITY IS NULL) THEN
      OLDPRIORITY = PRIORITY;
    IF (GRPCODE <> OLDGRPCODE) THEN
    BEGIN
      OLDPRIORITY = PRIORITY;
      OLDGRPCODE = GRPCODE;
    END
    IF (OLDPRIORITY = PRIORITY) THEN
    BEGIN
      SUSPEND;
      ID = ID + 1;
    END
  END

END
^

/* Alter (GET_DISCOUNT_CUSTOM) */
ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
DECLARE VARIABLE OLDGRPCODE INTEGER;
DECLARE VARIABLE OLDPRIORITY INTEGER;
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
BEGIN

  OLDPRIORITY = NULL;
  OLDGRPCODE = NULL;

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3, AR.CODE,
      (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID), AR.WAREID
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (INDATERANGE1(:REGDATE,
                  AC.REGDATECOND,
                  AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                  AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:MEMDATE,
                  AC.MEMDATECOND,
                  AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                  AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:BIRTHDATE,
                  AC.BIRTHDATECOND,
                  AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                  AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

      (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
      (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
      (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)

    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,DISCRATECODE,CARD, DISCRATEWAREID
    DO
    BEGIN
      IF (OLDGRPCODE IS NULL) THEN
        OLDGRPCODE = NULLTONUM(GRPCODE);
      IF (OLDPRIORITY IS NULL) THEN
        OLDPRIORITY = PRIORITY;
      IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
      BEGIN
        OLDPRIORITY = PRIORITY;
        OLDGRPCODE = GRPCODE;
      END
      IF (OLDPRIORITY = PRIORITY) THEN
        SUSPEND;
    END

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    OLDPRIORITY = NULL;
    OLDGRPCODE = NULL;

    FOR
      SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
        QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID,AR.BEGVAL,AR.ENDVAL,
        AC.COUNTERTYPE1ID, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.COUNTERTYPE2ID, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.COUNTERTYPE3ID, AC.COUNTERBEG3, AC.COUNTEREND3,AR.CODE, AR.WAREID
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
      WHERE
        (INDATERANGE1(:REGDATE,
                    AC.REGDATECOND,
                    AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                    AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:MEMDATE,
                    AC.MEMDATECOND,
                    AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                    AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:BIRTHDATE,
                    AC.BIRTHDATECOND,
                    AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                    AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

        (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
        (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
        (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND

        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
      ORDER BY GD.CODE, AD.PRIORITY
      INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      CNTTYPE1,CNTBEG1,CNTEND1,CNTTYPE2,CNTBEG2,CNTEND2,CNTTYPE3,CNTBEG3,CNTEND3,DISCRATECODE, DISCRATEWAREID
      DO
      BEGIN
        IF (OLDGRPCODE IS NULL) THEN
          OLDGRPCODE = NULLTONUM(GRPCODE);
        IF (OLDPRIORITY IS NULL) THEN
          OLDPRIORITY = PRIORITY;
        IF (NULLTONUM(GRPCODE) <> OLDGRPCODE) THEN
        BEGIN
          OLDPRIORITY = PRIORITY;
          OLDGRPCODE = GRPCODE;
        END
        IF (OLDPRIORITY = PRIORITY) THEN
          SUSPEND;
      END

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  VAL = NULL;
  WAREID = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;
  "TYPE" = NULL;
  TEXT = NULL;
  CODE = NULL;
  CARDPREFIXBEG = NULL;
  CARDPREFIXEND = NULL;
  DEPENDOTHERPOS = NULL;
  BEGVAL = NULL;
  ENDVAL = NULL;
  CNTTYPE1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  CNTTYPE2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  CNTTYPE3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  PRIORITY = 0;
  CARD = NULL;

  FOR
    SELECT AR.VAL, AR.WAREID, AR."TYPE", AR.NAME, AR.TEXT,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AR.CODE, (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID)
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN DISCRATE AR ON AR.ID = A.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
--    PLAN SORT (JOIN (JOIN (AR NATURAL,A INDEX (IDX_ACTDISCOBJ2,FK_ADO_DISCRATE))))
  INTO VAL, DISCRATEWAREID,"TYPE",NAME, TEXT,PARENTID, BEGVAL, ENDVAL, DISCRATECODE, CARD
  DO
    SUSPEND;
END
^

/* Alter (GET_WARE_PARENTS0) */
ALTER PROCEDURE GET_WARE_PARENTS0(ID_WARE INTEGER)
 RETURNS(ID_PARENT INTEGER)
 AS
BEGIN
  ID_PARENT = -1;
  SUSPEND;
  IF (ID_WARE = 0) THEN
  BEGIN
    ID_PARENT = 0;
    SUSPEND;
    EXIT;
  END

  IF (ID_WARE > 0) THEN
  FOR
    SELECT ID_PARENT
    FROM GET_WARE_PARENTS(:ID_WARE, 0)
    INTO ID_PARENT
    DO
      SUSPEND;
END
^

SET TERM ; ^

ALTER TABLE COUNTERD ALTER COLUMN ID POSITION 1;

ALTER TABLE COUNTERD ALTER COLUMN COUNTERID POSITION 2;

ALTER TABLE COUNTERD ALTER COLUMN DELTA POSITION 3;

ALTER TABLE COUNTERD ALTER COLUMN CHEQUEIDENT POSITION 4;

ALTER TABLE COUNTERD ALTER COLUMN DELTADATE POSITION 5;

ALTER TABLE COUNTERTYPE ALTER COLUMN ID POSITION 1;

ALTER TABLE COUNTERTYPE ALTER COLUMN CODE POSITION 2;

ALTER TABLE COUNTERTYPE ALTER COLUMN NAME POSITION 3;

ALTER TABLE COUNTERTYPE ALTER COLUMN AUTOCREATE POSITION 4;

ALTER TABLE COUNTERTYPE ALTER COLUMN COUNTERALG POSITION 5;

ALTER TABLE GRPCCARD ALTER COLUMN ID POSITION 1;

ALTER TABLE GRPCCARD ALTER COLUMN CODE POSITION 2;

ALTER TABLE GRPCCARD ALTER COLUMN NAME POSITION 3;

ALTER TABLE GRPCCARD ALTER COLUMN TEXT POSITION 4;

ALTER TABLE GRPCCARD ALTER COLUMN AUTOREGCLIENT POSITION 5;

ALTER TABLE GRPCCARD ALTER COLUMN AUTOREGCARD POSITION 6;

ALTER TABLE GRPCCARD ALTER COLUMN CARDPREFIXBEG POSITION 7;

ALTER TABLE GRPCCARD ALTER COLUMN CARDPREFIXEND POSITION 8;

ALTER TABLE GRPCCARD ALTER COLUMN CARDLENBEG POSITION 9;

ALTER TABLE GRPCCARD ALTER COLUMN CARDLENEND POSITION 10;

ALTER TABLE GRPCCARD ALTER COLUMN ENTERMANUAL POSITION 11;

ALTER TABLE GRPCCARD ALTER COLUMN ENTERREADER POSITION 12;

ALTER TABLE GRPCCARD ALTER COLUMN ENTERVIS POSITION 13;

ALTER TABLE GRPCCARD ALTER COLUMN ENTERSCAN POSITION 14;

ALTER TABLE RECTEMPLATE ALTER COLUMN ID POSITION 1;

ALTER TABLE RECTEMPLATE ALTER COLUMN CODE POSITION 2;

ALTER TABLE RECTEMPLATE ALTER COLUMN NAME POSITION 3;

ALTER TABLE RECTEMPLATE ALTER COLUMN DATA POSITION 4;

ALTER TABLE RECTEMPLATE ALTER COLUMN MASTERSETTINGS POSITION 5;

/* DROP: -- GRANT EXECUTE ON PROCEDURE CANCELSTORED TO PUBLIC */
REVOKE EXECUTE ON PROCEDURE CANCELSTORED FROM PUBLIC;
/* TEXT BLOCK END */

/* Convert 4.5.0 */

ALTER TABLE ACTDISC DROP CONSTRAINT FK_AD_GRPACTDISC;

ALTER TABLE CONDITION ADD FORMULA1 FVARCHAR100;

ALTER TABLE CONDITION ADD FORMULA2 FVARCHAR100;

ALTER TABLE CONDITION ADD FORMULA3 FVARCHAR100;

ALTER TABLE TRANZT ADD COUNTFILLS FNUM15_2;

ALTER TABLE TRANZT ADD COUNTPRINTS FNUM15_2;

RECONNECT;

/*       () */

UPDATE CONDITION C SET
  FORMULA1 = '=CounterByTypeCode['||(SELECT CODE FROM COUNTERTYPE WHERE ID = C.COUNTERTYPE1ID)||']'
WHERE NOT COUNTERTYPE1ID IS NULL;

UPDATE CONDITION C SET
  FORMULA2 = '=CounterByTypeCode['||(SELECT CODE FROM COUNTERTYPE WHERE ID = C.COUNTERTYPE2ID)||']'
WHERE NOT COUNTERTYPE2ID IS NULL;

UPDATE CONDITION C SET
  FORMULA3 = '=CounterByTypeCode['||(SELECT CODE FROM COUNTERTYPE WHERE ID = C.COUNTERTYPE3ID)||']'
WHERE NOT COUNTERTYPE3ID IS NULL;
/* () */

/*      -  */
UPDATE TRANZT SET COUNTFILLS = 0, COUNTPRINTS = 0;

RECONNECT;

/* Alter Field (Null / Not Null)... */
UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = 1 WHERE RDB$FIELD_NAME='GRPACTDISCID' AND RDB$RELATION_NAME='ACTDISC';


/* Drop table-fields... */
/* Empty GET_ACTSCRIPT_CUSTOM for drop CONDITION(COUNTERTYPE1ID) */
SET TERM ^ ;

ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN EXIT; END
^

/* Empty GET_DISCOUNT_CUSTOM for drop CONDITION(COUNTERTYPE1ID) */
ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN EXIT; END
^

SET TERM ; ^

ALTER TABLE CONDITION DROP COUNTERTYPE1ID;

ALTER TABLE CONDITION DROP COUNTERTYPE2ID;

ALTER TABLE CONDITION DROP COUNTERTYPE3ID;


/* Alter index (Drop, Create)... */
RECONNECT;

/* Drop: IDX_ACTDISCOBJ2 (TIdxData) */
DROP INDEX IDX_ACTDISCOBJ2;

CREATE INDEX IDX_ACTDISCOBJ2 ON ACTDISCOBJ(CLIENTID, CARDID, PAYMENTID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID);


/* Create Exception... */
CREATE EXCEPTION E_CNT_CCARD_EXISTS '    ';

CREATE EXCEPTION E_CNT_CLIENT_EXISTS '    ';


/* Create Foreign Key... */
RECONNECT;

ALTER TABLE ACTDISC ADD CONSTRAINT FK_AD_GRPACTDISC FOREIGN KEY (GRPACTDISCID) REFERENCES GRPACTDISC (ID) ON DELETE CASCADE;

/*  Empty APPENDCCARDDISCS for APPENDCOUNTERBYTYPE(param list change)  */
SET TERM ^ ;

ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 INTEGER,
ICOUNTERVAL2 INTEGER,
ICOUNTERVAL3 INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/*  Empty GET_ACTSCRIPT for GET_ACTSCRIPT_CUSTOM(param list change)  */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN EXIT; END
^

/*  Empty GET_DISCOUNT for GET_DISCOUNT_CUSTOM(param list change)  */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
CNTTYPE1 INTEGER,
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
CNTTYPE2 INTEGER,
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
CNTTYPE3 INTEGER,
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN EXIT; END
^

/* Alter empty procedure APPENDCOUNTERBYTYPE with new param-list */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter empty procedure GET_ACTSCRIPT_CUSTOM with new param-list */
ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN EXIT; END
^

/* Alter empty procedure GET_DISCOUNT_CUSTOM with new param-list */
ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN EXIT; END
^

/* Alter Procedure... */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE COUNTERTYPEID INTEGER;
DECLARE VARIABLE COUNTERID INTEGER;
DECLARE VARIABLE CID INTEGER;
DECLARE VARIABLE COUNTERCODE INTEGER;
BEGIN

  SELECT ID
  FROM COUNTERTYPE
  WHERE :ICOUNTERTYPE = CODE
  INTO :COUNTERTYPEID;

  IF (:COUNTERTYPEID IS NULL) THEN
  BEGIN
    ERRORCODE = 28;
    EXIT;
  END
  ELSE
  BEGIN
    CID = NULL;
    FOR
      SELECT C.ID
      FROM COUNTER C
      JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
      JOIN CCARDCOUNTER CC ON CC.COUNTERID = C.ID
      WHERE CT.CODE = :ICOUNTERTYPE  AND CC.CCARDID = :ICARDID
      INTO :COUNTERID
    DO
    BEGIN
      IF (CID IS NULL) THEN
      BEGIN
        DELETE FROM COUNTERD
        WHERE COUNTERID = :COUNTERID;
      END

      CID = 0;

      UPDATE COUNTER SET
        VAL = :ICOUNTERVAL
      WHERE ID = :COUNTERID;
    END

    IF (:CID IS NULL) THEN
    BEGIN
      COUNTERID = GEN_ID(GID, 1);

      SELECT MAX(CODE)
      FROM COUNTER
      WHERE :COUNTERTYPEID = COUNTERTYPEID
      INTO :COUNTERCODE;

      IF (:COUNTERCODE IS NULL) THEN
        COUNTERCODE = 0;

      INSERT INTO COUNTER(ID, CODE, VAL, COUNTERTYPEID)
      VALUES (:COUNTERID, :COUNTERCODE + 1, :ICOUNTERVAL, :COUNTERTYPEID);

      INSERT INTO CCARDCOUNTER(CCARDID, COUNTERID)
      VALUES (:ICARDID, :COUNTERID);
    END

  END
END
^

/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), -1, -1, :CARDID, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID)
      RETURNING_VALUES ERRORCODE;
END
^

/* Alter (APPENDDEFAULTGRPDISC) */
ALTER PROCEDURE APPENDDEFAULTGRPDISC(ITYPE INTEGER,
ICODE INTEGER,
IWARE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE ADOID INTEGER;
BEGIN

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :ICODE
  INTO  ID;

  IF (ID IS NULL) THEN
    BEGIN
      ERRORCODE = 1; /*   */
      EXIT;
    END

  SELECT FIRST 1 ID
  FROM ACTDISCOBJ
  WHERE CLIENTID = -1 AND WAREID <= 0 AND CARDID = -1 AND
        PAYMENTID = -1 AND DISCRATEID IS NULL AND GRPACTDISCID = :ID
  INTO ADOID;

  IF (ADOID IS NULL) THEN
      INSERT INTO ACTDISCOBJ (ID, WAREID, CLIENTID, PAYMENTID, CARDID,
                              ASPECTVALUE1ID,
                              ASPECTVALUE2ID,
                              ASPECTVALUE3ID,
                              ASPECTVALUE4ID,
                              ASPECTVALUE5ID,
                              DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
      VALUES (GEN_ID(GID, 1), :IWARE, -1, -1, -1, NULL, NULL, NULL, NULL, NULL,
              NULL, NULL, :ID);
  ELSE
    UPDATE ACTDISCOBJ SET
        WAREID = :IWARE
    WHERE ID = :ADOID;

  UPDATE DISCRATE DR SET
      DR.DESTINATION = :ITYPE
  WHERE DR.ID IN (select AD.DISCRATEID from ACTDISC AD where AD.GRPACTDISCID = :ID);
END
^

/* Alter (APPENDREMAIN) */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE WARENAME VARCHAR(100);
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE GRPACTDISCCODE INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
      BEGIN
        IF (ASPCODE = 1)  THEN
          IF (IASPV1 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
            INTO AD1;
          ELSE
          BEGIN
            ERRORCODE = 10;
            EXIT;
          END

        IF (ASPCODE = 2)  THEN
          IF (IASPV2 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
            INTO AD2;
          ELSE
          BEGIN
            ERRORCODE = 11;
            EXIT;
          END

        IF (ASPCODE = 3)  THEN
          IF (IASPV3 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
            INTO AD3;
          ELSE
          BEGIN
            ERRORCODE = 12;
            EXIT;
          END

        IF (ASPCODE = 4)  THEN
          IF (IASPV4 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
            INTO AD4;
          ELSE
          BEGIN
            ERRORCODE = 13;
            EXIT;
          END

        IF (ASPCODE = 5)  THEN
          IF (IASPV5 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
            INTO AD5;
          ELSE
          BEGIN
            ERRORCODE = 14;
            EXIT;
          END
      END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR
(AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, REMAIN, PRICE,
       DELETED)
    VALUES
      (GEN_ID(GID, 1), :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5, :IREMAIN,
      :IPRICE, :IDELETED);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE = 1) THEN
      IF (NOT :IREMAIN IS NULL) THEN
        UPDATE REMAIN SET
          REMAIN = REMAIN + :IREMAIN,
          PRICE = :IPRICE,
          DELETED = :IDELETED
        WHERE ID = :REMAINID;
      ELSE
        UPDATE REMAIN SET
          PRICE = :IPRICE,
          DELETED = :IDELETED
        WHERE ID = :REMAINID;
    ELSE
      UPDATE REMAIN SET
        REMAIN = :IREMAIN,
        PRICE = :IPRICE,
        DELETED = :IDELETED
      WHERE ID = :REMAINID;
    IF ((IADDREPLACE = 2) AND (NOT :IREMAIN IS NULL)) THEN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID;
  END

  IF (IDISCOUNTVALUE <> '0' AND IDISCOUNTVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       NULL, 2, 0, NULL, NULL)
            RETURNING_VALUES ERRORCODE, TDISCRATEID;

      WHERECLAUSE = '';

      IF (AD1 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
      ELSE
      BEGIN
        AD1 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID IS NULL ';
      END

      IF (AD2 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
      ELSE
      BEGIN
        AD2 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID IS NULL ';
      END

      IF (AD3 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
      ELSE
      BEGIN
        AD3 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID IS NULL ';
      END

      IF (AD4 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
      ELSE
      BEGIN
        AD4 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID IS NULL ';
      END

     IF (AD5 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
      ELSE
      BEGIN
        AD5 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID IS NULL ';
      END

      IF (IUSEGRPACTDISC <> 0) THEN
      BEGIN
        EXECUTE STATEMENT 'SELECT FIRST 1 A.ID, G.ID ' ||
                              'FROM ACTDISCOBJ A JOIN DISCRATE D ON D.ID = A.DISCRATEID AND D.KIND = 2 '||
                                                'JOIN  GRPACTDISC G ON G.ID = A.GRPACTDISCID AND G.CODE BETWEEN 5000000 AND 9999999 '||
                              'WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                              '      A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID IS NULL '|| WHERECLAUSE
        INTO TACTDISCOBJID, GRPACTDISCID;

        IF (TACTDISCOBJID IS NULL) THEN
        BEGIN
          GRPACTDISCID = GEN_ID(GID, 1);

          SELECT MAX(CODE)
          FROM GRPACTDISC
          WHERE CODE BETWEEN 5000000 AND 9999999
          INTO GRPACTDISCCODE;
          IF (GRPACTDISCCODE = 9999999) THEN
          BEGIN
            ERRORCODE = 29;
            EXIT;
          END
          IF (GRPACTDISCCODE IS NULL) THEN
            GRPACTDISCCODE = 5000000;
          ELSE
            GRPACTDISCCODE = GRPACTDISCCODE + 1;
          INSERT INTO GRPACTDISC
          (ID, CODE, NAME, ACTV)
          VALUES
          (:GRPACTDISCID, :GRPACTDISCCODE, :WARENAME, 1);

          CONDITIONID = GEN_ID(GID, 1);
          INSERT INTO CONDITION (ID,TIMEBEG,TIMEEND,DATEBEG,DATEEND,DAYBEG,DAYEND,QUANTITYBEG,QUANTITYEND,SUMMBEG,SUMMEND,SUMMRECBEG,SUMMRECEND,CARDPREFIXBEG,CARDPREFIXEND,QUANTITYRECBEG,QUANTITYRECEND,PRICEBEG,PRICEEND,WAREID,SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREEND,QUANTITYWAREBEG,CARDSTATE,CARDLENBEG,CARDLENEND,MEMDAYBEG,MEMDAYEND,MEMMONTHBEG,MEMMONTHEND,MEMYEARBEG,MEMYEAREND,REGDAYBEG,REGDAYEND,REGMONTHBEG,REGMONTHEND,REGYEARBEG,REGYEAREND,COUNTERBEG1,COUNTEREND1,BIRTHDAYBEG,BIRTHDAYEND,BIRTHMONTHBEG,BIRTHMONTHEND,BIRTHYEARBEG,BIRTHYEAREND,REGDATECOND,REGDATEBEG,REGDATEEND,MEMDATEBEG,MEMDATEEND,MEMDATECOND,BIRTHDATEBEG,BIRTHDATEEND,BIRTHDATECOND,COUNTERBEG2,COUNTEREND2,COUNTERBEG3,COUNTEREND3,SEX,FORMULA1,FORMULA2,FORMULA3)
          VALUES (:CONDITIONID,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL,0,NULL,NULL,NULL,NULL,0,NULL,NULL,0,NULL,NULL,NULL,NULL,0,'','','');

          INSERT INTO ACTDISC (ID,CODE,GRPACTDISCID,NAME,CONDITIONID,DISCRATEID,ACTSCRIPTID,PRIORITY)
          VALUES (GEN_ID(GID, 1), 1, :GRPACTDISCID,:WARENAME,:CONDITIONID,:TDISCRATEID, NULL,0);
        END
        TDISCRATEID = NULL;
      END
      ELSE
      BEGIN
        EXECUTE STATEMENT 'SELECT FIRST 1 A.ID ' ||
                              'FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                              'D.ID = A.DISCRATEID AND D.KIND = 2 '||
                              'WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                              '      A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
        INTO TACTDISCOBJID;
        GRPACTDISCID = NULL;
      END

      IF (TACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                  -1, :TDISCRATEID, NULL, :GRPACTDISCID);
      ELSE
        UPDATE ACTDISCOBJ SET
           DISCRATEID = :TDISCRATEID,
           GRPACTDISCID = :GRPACTDISCID
        WHERE ID = :TACTDISCOBJID;
    END
END
^

/* Alter (APPPEND_SUPERMAG_DISC) */
ALTER PROCEDURE APPPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IGRPACTDISCCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IGRPACTDISCCODE
    INTO GRPACTDISCID;

    IF (GRPACTDISCID IS NULL) THEN
    BEGIN
      GRPACTDISCID = GEN_ID(GID, 1);
      INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
      VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
    END

    IF (IWAREID > 0) THEN
    BEGIN
      SELECT ID
      FROM ACTDISCOBJ
      WHERE WAREID = :IWAREID AND GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1
      INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), :IWAREID, -1, -1, -1, :GRPACTDISCID);
    END
    ELSE
    BEGIN
      SELECT ID
      FROM ACTDISCOBJ
      WHERE GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1 AND WAREID = -1
      INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), -1, -1, -1, -1, :GRPACTDISCID);
    END
  END
  ELSE
    GRPACTDISCID = IGRPACTDISCID;

  IF (IAPPENDTYPE = 0) THEN   -- DiscCli
    BEGIN
      WHERECLAUSE = '';

      IF (ICARDPREFIXBEG IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG = '''|| :ICARDPREFIXBEG ||'''';

      IF (ICARDPREFIXEND IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND = '''|| :ICARDPREFIXEND ||'''';

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.CONDITIONID
                          FROM CONDITION C LEFT JOIN ACTDISC A ON
                                           C.ID = A.CONDITIONID
                          WHERE A.GRPACTDISCID = '|| :GRPACTDISCID ||' AND
                                C.SUMMBEG IS NULL AND C.TIMEBEG IS NULL '|| WHERECLAUSE ||'
                          PLAN JOIN (C INDEX (IDX_C_CARDPRBEG,IDX_C_CARDPREND),A INDEX (FK_AD_CONDITION,FK_AD_GRPACTDISC))'
      INTO :ACTDISCID, :CONDITIONID;
    END
  ELSE
    IF (IAPPENDTYPE = 1) THEN   -- CliClass

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                       C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
            C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
            C.QUANTITYBEG IS NULL
      INTO ACTDISCID, CONDITIONID;

    ELSE
      IF (IAPPENDTYPE = 2) THEN   -- DiscSumm
        BEGIN

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.SUMMBEG = :ISUMMBEG AND
                C.TIMEBEG = :ITIMEBEG AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

          IF (IDELETECURRENT = 1) THEN
            IF (ACTDISCID IS NULL) THEN
              EXIT;
            ELSE
              BEGIN
                DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                EXIT;
              END
        END
      ELSE
        IF (IAPPENDTYPE = 3) THEN   -- DiscCard

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.QUANTITYBEG = :IQUANTITYBEG    AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

        ELSE
          IF (IAPPENDTYPE = 4) THEN   -- CliSumm

            SELECT FIRST 1 A.ID, A.CONDITIONID
            FROM CONDITION C LEFT JOIN ACTDISC A ON
                             C.ID = A.CONDITIONID
            WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                  C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                  C.SUMMBEG = :ISUMMBEG             AND
                  C.TIMEBEG IS NULL
            INTO ACTDISCID, CONDITIONID;

          ELSE
            IF (IAPPENDTYPE = 5) THEN  -- PluDisc  ClasDisc

              SELECT FIRST 1 A.ID, A.CONDITIONID
              FROM CONDITION C LEFT JOIN ACTDISC A ON
                               C.ID = A.CONDITIONID
              WHERE A.GRPACTDISCID  = :GRPACTDISCID
              INTO ACTDISCID, CONDITIONID;

            ELSE
              IF (IAPPENDTYPE = 6) THEN  -- DiscSum 
                BEGIN

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                        C.SUMMRECBEG = :ISUMMRECBEG      AND
                        C.TIMEBEG = :ITIMEBEG            AND
                        C.CARDPREFIXBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                  IF (IDELETECURRENT = 1) THEN
                    IF (ACTDISCID IS NULL) THEN
                      EXIT;
                    ELSE
                    BEGIN
                      DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                      EXIT;
                    END
                END
              ELSE
                IF (IAPPENDTYPE = 7) THEN  -- CliSum 

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                        C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                        C.SUMMRECBEG = :ISUMMRECBEG       AND
                        C.TIMEBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                ELSE
                  BEGIN
                    ERRORCODE = 90; --  IAPPENDTYPE
                    EXIT;
                  END

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, NULL, NULL, NULL, NULL, NULL, NULL,
                                    :IQUANTITYBEG, :IQUANTITYEND,  NULL, NULL, NULL, NULL,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,  NULL, NULL,
                                    :ITIMEBEG, :ITIMEEND, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, NULL, NULL,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      IF (ICODE IS NULL) THEN
        SELECT NULLTONUM(MAX(CODE)) + 1
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        INTO ICODE;

      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (GEN_ID(GID, 1), :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
       NAME = :INAME,
       CONDITIONID = :CONDITIONID,
       DISCRATEID = :DISCRATEID,
       DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (CANCELSTORED) */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 RETURNS(TRANZCOUNT INTEGER)
 AS
DECLARE VARIABLE IDTRANZ INTEGER;
DECLARE VARIABLE TRANZCOUNTREF INTEGER;
DECLARE VARIABLE WARECODE INTEGER;
DECLARE VARIABLE WAREMARK VARCHAR(100);
DECLARE VARIABLE TRANZTYPE INTEGER;
DECLARE VARIABLE QUANTITY INTEGER;
DECLARE VARIABLE ASPSCHEMECODE INTEGER;
DECLARE VARIABLE ASPSCHEMEID INTEGER;
DECLARE VARIABLE ASPVAL1 INTEGER;
DECLARE VARIABLE ASPVAL2 INTEGER;
DECLARE VARIABLE ASPVAL3 INTEGER;
DECLARE VARIABLE ASPVAL4 INTEGER;
DECLARE VARIABLE ASPVAL5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
DECLARE VARIABLE CHQTRANZCOUNT INTEGER;
BEGIN
  FOR
    SELECT ID, TRANZCOUNT, CHQTRANZCOUNT
    FROM TRANZT
    WHERE POSNUMBER = :APOSNUMBER AND TRANZTYPE=54 AND
      (TRANZCOUNT NOT IN (SELECT TRANZCOUNTREF
                          FROM TRANZT
                          WHERE POSNUMBER = :APOSNUMBER AND TRANZTYPE = 57))
    INTO IDTRANZ, TRANZCOUNTREF, :CHQTRANZCOUNT
    DO
    BEGIN
      FOR  /*    11  12, -    */
        SELECT MIN(WARECODE), MIN(WAREMARK), MIN(TRANZTYPE), SUM(QUANTITY) AS QUANTITY,
        MIN(ASPECTSCHEME), MIN(ASPECTVALUE1) AS ASP1, MIN(ASPECTVALUE2) AS ASP2, MIN(ASPECTVALUE3) AS ASP3, MIN(ASPECTVALUE4) AS ASP4, MIN(ASPECTVALUE5) AS ASP5
        FROM TRANZT T
        LEFT JOIN SPRT S ON S.CODE = T.WARECODE
        WHERE POSNUMBER = :APOSNUMBER
        AND (TRANZTYPE IN (11,12))
        AND CHQTRANZCOUNT = :CHQTRANZCOUNT
        GROUP BY TRANZCOUNT
      INTO WARECODE, WAREMARK, TRANZTYPE, QUANTITY, ASPSCHEMECODE, ASPVAL1, ASPVAL2, ASPVAL3, ASPVAL4, ASPVAL5
      DO
      BEGIN
        WAREID = NULL;
        FLAGS = NULL;
        IF (AWARECODETOMARK = 0) THEN /*  ID     */
        BEGIN
          SELECT ID, FLAGS
          FROM SPRT
          WHERE CODE = :WARECODE
          INTO :WAREID, :FLAGS;
        END
        ELSE
        BEGIN
          SELECT FIRST 1 ID, FLAGS
          FROM SPRT
          WHERE MARK = :WAREMARK
          INTO :WAREID, :FLAGS;
        END

        IF (:ACONTROLSALEREMAIN = 1 OR :ACONTROLSALEREMAIN = 2 AND :FLAGS/64 <> (:FLAGS/32)/2.0) THEN  /*          ,  - */
        BEGIN
          ASPSCHEMEID = NULL;
          SELECT ID
          FROM ASPSCHM
          WHERE CODE = :ASPSCHEMECODE
          INTO :ASPSCHEMEID;

          REMAINID = NULL;
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL1 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 1)) AND
          R.ASPECTVALUE2ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL2 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 2)) AND
          R.ASPECTVALUE3ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL3 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 3)) AND
          R.ASPECTVALUE4ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL4 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 4)) AND
          R.ASPECTVALUE5ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL5 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 5)) AND
          R.WAREID = :WAREID AND
          R.REMAIN IS NOT NULL
          INTO
          REMAINID;

          IF (:REMAINID IS NULL) THEN
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = 0 AND
          R.ASPECTVALUE2ID = 0 AND
          R.ASPECTVALUE3ID = 0 AND
          R.ASPECTVALUE4ID = 0 AND
          R.ASPECTVALUE5ID = 0 AND
          R.WAREID = :WAREID
          INTO
          REMAINID;

          IF (:REMAINID IS NOT NULL) THEN
          INSERT INTO REMAIND (
           ID, REMAINID, DELTA)
          VALUES (
           GEN_ID(GREMAIND, 1), :REMAINID, -:QUANTITY);
        END
      END

      SELECT MAX(TRANZCOUNT) + 1
      FROM TRANZT
      WHERE POSNUMBER = :APOSNUMBER
      INTO TRANZCOUNT;
      IF (TRANZCOUNT IS NULL) THEN
        TRANZCOUNT = 1;

      INSERT INTO TRANZT (
        ID, ASPECTSCHEME, ASPECTVALUE1, ASPECTVALUE2, ASPECTVALUE3,
        ASPECTVALUE4, ASPECTVALUE5, CHEQUENUMBER, CHEQUETYPE,
        CURRENCY, ECRNUMBER, ECRSESSION, EDUCATION,
        IDENTIF, IMID, INFO, INFOSTR, ISRET, POSID,
        POSNUMB, POSNUMBER, PRICE, PRICEWD, PRNONECR,
        QUANTITY, RESTORED, SELLER, SUMM, SUMMDISCPOS,
        SUMMDISCREC, SUMMWD, TRANZCOUNT, TRANZCOUNTREF,
        TRANZDATE, TRANZHOUR, TRANZTIME, TRANZTYPE,
        WARECODE, WAREMARK, SAVED, CHQTRANZCOUNT)
      SELECT GEN_ID(GTRANZT, 1), T.ASPECTSCHEME, T.ASPECTVALUE1, T.ASPECTVALUE2, T.ASPECTVALUE3,
        T.ASPECTVALUE4, T.ASPECTVALUE5, T.CHEQUENUMBER, T.CHEQUETYPE,
        T.CURRENCY, T.ECRNUMBER, T.ECRSESSION, T.EDUCATION,
        T.IDENTIF, T.IMID, T.INFO, T.INFOSTR, T.ISRET, T.POSID,
        T.POSNUMB, :APOSNUMBER, T.PRICE, T.PRICEWD, T.PRNONECR,
        T.QUANTITY, T.RESTORED, :ASELLERID, T.SUMM, T.SUMMDISCPOS,
        T.SUMMDISCREC, T.SUMMWD, :TRANZCOUNT, :TRANZCOUNTREF,
        :ATRANZDATE, :ATRANZHOUR, :ATRANZTIME, 57,
        T.WARECODE, T.WAREMARK, :ASAVED, 0
      FROM TRANZT T
      WHERE T.ID = :IDTRANZ;

      DELETE FROM COUNTERD WHERE CHEQUEIDENT = :IDTRANZ;
    END
END
^

ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
DECLARE VARIABLE CARD VARCHAR(255);
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
      AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
      AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (INDATERANGE1(:REGDATE,
                  AC.REGDATECOND,
                  AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                  AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:MEMDATE,
                  AC.MEMDATECOND,
                  AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                  AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:BIRTHDATE,
                  AC.BIRTHDATECOND,
                  AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                  AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

      (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
      (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
      (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)
    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    DO
      SUSPEND;

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    FOR
      SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
        AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
        AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
      WHERE
        ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
        (INDATERANGE1(:REGDATE,
                    AC.REGDATECOND,
                    AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                    AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:MEMDATE,
                    AC.MEMDATECOND,
                    AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                    AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:BIRTHDATE,
                    AC.BIRTHDATECOND,
                    AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                    AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

        (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
        (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
        (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
     PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
     ORDER BY GD.CODE, AD.PRIORITY
     INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
     DO
        SUSPEND;

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  PRIORITY = 0;
  WAREID = NULL;
  FORMULA1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  FORMULA2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  FORMULA3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTSCRIPT ACS ON ACS.ID = A.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
  INTO DATA, CODE
  DO
    SUSPEND;

END
^

/* Alter (GET_ACTSCRIPT) */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
BEGIN
  ID = 1;

  FOR
    SELECT  CODE, DATA, NULLTONUM(GRPCODE), NULLTONUM(PRIORITY), WAREID,
      SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,
      CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    FROM GET_ACTSCRIPT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
      :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,:IWEEKDAY,
      :IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,:ICARD,
      :ICARDLEN,:IANYCARD,:ICARDSTATE,:IACTEVENT,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY, CODE
    INTO CODE, DATA, GRPCODE, PRIORITY,WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END
END
^

ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3, AR.CODE,
      (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID), AR.WAREID
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (INDATERANGE1(:REGDATE,
                  AC.REGDATECOND,
                  AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                  AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:MEMDATE,
                  AC.MEMDATECOND,
                  AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                  AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

      (INDATERANGE1(:BIRTHDATE,
                  AC.BIRTHDATECOND,
                  AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                  AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

      (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
      (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
      (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)

    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,DISCRATECODE,CARD, DISCRATEWAREID
    DO
      SUSPEND;

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    FOR
      SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
        QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID,AR.BEGVAL,AR.ENDVAL,
        AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3,AR.CODE, AR.WAREID
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
      WHERE
        (INDATERANGE1(:REGDATE,
                    AC.REGDATECOND,
                    AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                    AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:MEMDATE,
                    AC.MEMDATECOND,
                    AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                    AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0) AND

        (INDATERANGE1(:BIRTHDATE,
                    AC.BIRTHDATECOND,
                    AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                    AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0) AND

        (AC.REGDATEBEG IS NULL OR AC.REGDATEBEG <= :REGDATE) AND
        (AC.MEMDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :MEMDATE) AND
        (AC.BIRTHDATEBEG IS NULL OR AC.BIRTHDATEBEG <= :BIRTHDATE) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND

        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
      ORDER BY GD.CODE, AD.PRIORITY
      INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,DISCRATECODE, DISCRATEWAREID
      DO
        SUSPEND;

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  VAL = NULL;
  WAREID = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;
  "TYPE" = NULL;
  TEXT = NULL;
  CODE = NULL;
  CARDPREFIXBEG = NULL;
  CARDPREFIXEND = NULL;
  DEPENDOTHERPOS = NULL;
  BEGVAL = NULL;
  ENDVAL = NULL;
  FORMULA1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  FORMULA2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  FORMULA3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  PRIORITY = 0;
  CARD = NULL;

  FOR
    SELECT AR.VAL, AR.WAREID, AR."TYPE", AR.NAME, AR.TEXT,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AR.CODE, (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID)
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN DISCRATE AR ON AR.ID = A.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
--    PLAN SORT (JOIN (JOIN (AR NATURAL,A INDEX (IDX_ACTDISCOBJ2,FK_ADO_DISCRATE))))
  INTO VAL, DISCRATEWAREID,"TYPE",NAME, TEXT,PARENTID, BEGVAL, ENDVAL, DISCRATECODE, CARD
  DO
    SUSPEND;
END
^

/* Alter (GET_DISCOUNT) */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
BEGIN
  ID = 1;

  FOR
    SELECT NULLTONUM(GRPCODE), VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
           "TYPE", NAME, TEXT,
           CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, NULLTONUM(PRIORITY), PARENTID, BEGVAL, ENDVAL,
           FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
    FROM GET_DISCOUNT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
          :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,
          :IWEEKDAY,:IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,
          :ICARD,:ICARDLEN,:IANYCARD,:ICARDSTATE,:IDESTINATION,
          :IKIND,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID, "TYPE", NAME, TEXT,
         CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, PRIORITY, PARENTID, BEGVAL, ENDVAL,
         FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END

END
^

/* Create trigger... */
CREATE TRIGGER INS_BEF_CCARDCOUNTER0 FOR CCARDCOUNTER
ACTIVE BEFORE INSERT POSITION 0 
AS
BEGIN
  IF (EXISTS(SELECT 1 FROM CLIENTCOUNTER CC WHERE CC.COUNTERID = NEW.COUNTERID)) THEN
    EXCEPTION E_CNT_CLIENT_EXISTS;
END
^

CREATE TRIGGER INS_BEF_CLIENTCOUNTER0 FOR CLIENTCOUNTER
ACTIVE BEFORE INSERT POSITION 0 
AS
BEGIN
  IF (EXISTS(SELECT 1 FROM CCARDCOUNTER CC WHERE CC.COUNTERID = NEW.COUNTERID)) THEN
    EXCEPTION E_CNT_CCARD_EXISTS;
END
^

CREATE TRIGGER UPD_BEF_CCARDCOUNTER0 FOR CCARDCOUNTER
ACTIVE BEFORE UPDATE POSITION 0 
AS
BEGIN
  IF (EXISTS(SELECT 1 FROM CLIENTCOUNTER CC WHERE CC.COUNTERID = NEW.COUNTERID)) THEN
    EXCEPTION E_CNT_CLIENT_EXISTS;
END
^

CREATE TRIGGER UPD_BEF_CLIENTCOUNTER0 FOR CLIENTCOUNTER
ACTIVE BEFORE UPDATE POSITION 0 
AS
BEGIN
  IF (EXISTS(SELECT 1 FROM CCARDCOUNTER CC WHERE CC.COUNTERID = NEW.COUNTERID)) THEN
    EXCEPTION E_CNT_CCARD_EXISTS;
END
^


SET TERM ; ^

ALTER TABLE CONDITION ALTER COLUMN ID POSITION 1;

ALTER TABLE CONDITION ALTER COLUMN TIMEBEG POSITION 2;

ALTER TABLE CONDITION ALTER COLUMN TIMEEND POSITION 3;

ALTER TABLE CONDITION ALTER COLUMN DATEBEG POSITION 4;

ALTER TABLE CONDITION ALTER COLUMN DATEEND POSITION 5;

ALTER TABLE CONDITION ALTER COLUMN DAYBEG POSITION 6;

ALTER TABLE CONDITION ALTER COLUMN DAYEND POSITION 7;

ALTER TABLE CONDITION ALTER COLUMN QUANTITYBEG POSITION 8;

ALTER TABLE CONDITION ALTER COLUMN QUANTITYEND POSITION 9;

ALTER TABLE CONDITION ALTER COLUMN SUMMBEG POSITION 10;

ALTER TABLE CONDITION ALTER COLUMN SUMMEND POSITION 11;

ALTER TABLE CONDITION ALTER COLUMN SUMMRECBEG POSITION 12;

ALTER TABLE CONDITION ALTER COLUMN SUMMRECEND POSITION 13;

ALTER TABLE CONDITION ALTER COLUMN CARDPREFIXBEG POSITION 14;

ALTER TABLE CONDITION ALTER COLUMN CARDPREFIXEND POSITION 15;

ALTER TABLE CONDITION ALTER COLUMN QUANTITYRECBEG POSITION 16;

ALTER TABLE CONDITION ALTER COLUMN QUANTITYRECEND POSITION 17;

ALTER TABLE CONDITION ALTER COLUMN PRICEBEG POSITION 18;

ALTER TABLE CONDITION ALTER COLUMN PRICEEND POSITION 19;

ALTER TABLE CONDITION ALTER COLUMN WAREID POSITION 20;

ALTER TABLE CONDITION ALTER COLUMN SUMMWAREBEG POSITION 21;

ALTER TABLE CONDITION ALTER COLUMN SUMMWAREEND POSITION 22;

ALTER TABLE CONDITION ALTER COLUMN QUANTITYWAREEND POSITION 23;

ALTER TABLE CONDITION ALTER COLUMN QUANTITYWAREBEG POSITION 24;

ALTER TABLE CONDITION ALTER COLUMN CARDSTATE POSITION 25;

ALTER TABLE CONDITION ALTER COLUMN CARDLENBEG POSITION 26;

ALTER TABLE CONDITION ALTER COLUMN CARDLENEND POSITION 27;

ALTER TABLE CONDITION ALTER COLUMN MEMDAYBEG POSITION 28;

ALTER TABLE CONDITION ALTER COLUMN MEMDAYEND POSITION 29;

ALTER TABLE CONDITION ALTER COLUMN MEMMONTHBEG POSITION 30;

ALTER TABLE CONDITION ALTER COLUMN MEMMONTHEND POSITION 31;

ALTER TABLE CONDITION ALTER COLUMN MEMYEARBEG POSITION 32;

ALTER TABLE CONDITION ALTER COLUMN MEMYEAREND POSITION 33;

ALTER TABLE CONDITION ALTER COLUMN REGDAYBEG POSITION 34;

ALTER TABLE CONDITION ALTER COLUMN REGDAYEND POSITION 35;

ALTER TABLE CONDITION ALTER COLUMN REGMONTHBEG POSITION 36;

ALTER TABLE CONDITION ALTER COLUMN REGMONTHEND POSITION 37;

ALTER TABLE CONDITION ALTER COLUMN REGYEARBEG POSITION 38;

ALTER TABLE CONDITION ALTER COLUMN REGYEAREND POSITION 39;

ALTER TABLE CONDITION ALTER COLUMN COUNTERBEG1 POSITION 40;

ALTER TABLE CONDITION ALTER COLUMN COUNTEREND1 POSITION 41;

ALTER TABLE CONDITION ALTER COLUMN BIRTHDAYBEG POSITION 42;

ALTER TABLE CONDITION ALTER COLUMN BIRTHDAYEND POSITION 43;

ALTER TABLE CONDITION ALTER COLUMN BIRTHMONTHBEG POSITION 44;

ALTER TABLE CONDITION ALTER COLUMN BIRTHMONTHEND POSITION 45;

ALTER TABLE CONDITION ALTER COLUMN BIRTHYEARBEG POSITION 46;

ALTER TABLE CONDITION ALTER COLUMN BIRTHYEAREND POSITION 47;

ALTER TABLE CONDITION ALTER COLUMN REGDATECOND POSITION 48;

ALTER TABLE CONDITION ALTER COLUMN REGDATEBEG POSITION 49;

ALTER TABLE CONDITION ALTER COLUMN REGDATEEND POSITION 50;

ALTER TABLE CONDITION ALTER COLUMN MEMDATEBEG POSITION 51;

ALTER TABLE CONDITION ALTER COLUMN MEMDATEEND POSITION 52;

ALTER TABLE CONDITION ALTER COLUMN MEMDATECOND POSITION 53;

ALTER TABLE CONDITION ALTER COLUMN BIRTHDATEBEG POSITION 54;

ALTER TABLE CONDITION ALTER COLUMN BIRTHDATEEND POSITION 55;

ALTER TABLE CONDITION ALTER COLUMN BIRTHDATECOND POSITION 56;

ALTER TABLE CONDITION ALTER COLUMN COUNTERBEG2 POSITION 57;

ALTER TABLE CONDITION ALTER COLUMN COUNTEREND2 POSITION 58;

ALTER TABLE CONDITION ALTER COLUMN COUNTERBEG3 POSITION 59;

ALTER TABLE CONDITION ALTER COLUMN COUNTEREND3 POSITION 60;

ALTER TABLE CONDITION ALTER COLUMN SEX POSITION 61;

ALTER TABLE CONDITION ALTER COLUMN FORMULA1 POSITION 62;

ALTER TABLE CONDITION ALTER COLUMN FORMULA2 POSITION 63;

ALTER TABLE CONDITION ALTER COLUMN FORMULA3 POSITION 64;

ALTER TABLE TRANZT ALTER COLUMN ID POSITION 1;

ALTER TABLE TRANZT ALTER COLUMN TRANZCOUNT POSITION 2;

ALTER TABLE TRANZT ALTER COLUMN TRANZDATE POSITION 3;

ALTER TABLE TRANZT ALTER COLUMN TRANZTIME POSITION 4;

ALTER TABLE TRANZT ALTER COLUMN TRANZHOUR POSITION 5;

ALTER TABLE TRANZT ALTER COLUMN TRANZTYPE POSITION 6;

ALTER TABLE TRANZT ALTER COLUMN POSNUMBER POSITION 7;

ALTER TABLE TRANZT ALTER COLUMN CHEQUENUMBER POSITION 8;

ALTER TABLE TRANZT ALTER COLUMN SELLER POSITION 9;

ALTER TABLE TRANZT ALTER COLUMN WARECODE POSITION 10;

ALTER TABLE TRANZT ALTER COLUMN WAREMARK POSITION 11;

ALTER TABLE TRANZT ALTER COLUMN ASPECTSCHEME POSITION 12;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE1 POSITION 13;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE2 POSITION 14;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE3 POSITION 15;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE4 POSITION 16;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE5 POSITION 17;

ALTER TABLE TRANZT ALTER COLUMN PRICE POSITION 18;

ALTER TABLE TRANZT ALTER COLUMN QUANTITY POSITION 19;

ALTER TABLE TRANZT ALTER COLUMN SUMM POSITION 20;

ALTER TABLE TRANZT ALTER COLUMN PRICEWD POSITION 21;

ALTER TABLE TRANZT ALTER COLUMN SUMMWD POSITION 22;

ALTER TABLE TRANZT ALTER COLUMN CHEQUETYPE POSITION 23;

ALTER TABLE TRANZT ALTER COLUMN ISRET POSITION 24;

ALTER TABLE TRANZT ALTER COLUMN IMID POSITION 25;

ALTER TABLE TRANZT ALTER COLUMN ECRSESSION POSITION 26;

ALTER TABLE TRANZT ALTER COLUMN INFO POSITION 27;

ALTER TABLE TRANZT ALTER COLUMN INFOSTR POSITION 28;

ALTER TABLE TRANZT ALTER COLUMN CURRENCY POSITION 29;

ALTER TABLE TRANZT ALTER COLUMN TRANZCOUNTREF POSITION 30;

ALTER TABLE TRANZT ALTER COLUMN PRNONECR POSITION 31;

ALTER TABLE TRANZT ALTER COLUMN ECRNUMBER POSITION 32;

ALTER TABLE TRANZT ALTER COLUMN POSID POSITION 33;

ALTER TABLE TRANZT ALTER COLUMN POSNUMB POSITION 34;

ALTER TABLE TRANZT ALTER COLUMN EDUCATION POSITION 35;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCPOS POSITION 36;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCREC POSITION 37;

ALTER TABLE TRANZT ALTER COLUMN IDENTIF POSITION 38;

ALTER TABLE TRANZT ALTER COLUMN COMMENTCODE POSITION 39;

ALTER TABLE TRANZT ALTER COLUMN DOCKINDCODE POSITION 40;

ALTER TABLE TRANZT ALTER COLUMN RESTORED POSITION 41;

ALTER TABLE TRANZT ALTER COLUMN SAVED POSITION 42;

ALTER TABLE TRANZT ALTER COLUMN CHQTRANZCOUNT POSITION 43;

ALTER TABLE TRANZT ALTER COLUMN COUNTFILLS POSITION 44;

ALTER TABLE TRANZT ALTER COLUMN COUNTPRINTS POSITION 45;

/* TEXT BLOCK END */

/* Convert 4.5.1 */

ALTER TABLE DOCKIND ADD ASKCOMMENT FLAG;

UPDATE DOCKIND SET ASKCOMMENT = 1;

SET TERM ^ ;

ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG NUMERIC(15,2),
IPRICEEND NUMERIC(15,2),
IQUANTITYBEG NUMERIC(15,2),
IQUANTITYEND NUMERIC(15,2),
IQUANTITYRECBEG NUMERIC(15,2),
IQUANTITYRECEND NUMERIC(15,2),
IQUANTITYWAREBEG NUMERIC(15,2),
IQUANTITYWAREEND NUMERIC(15,2),
ISUMMBEG NUMERIC(15,2),
ISUMMEND NUMERIC(15,2),
ISUMMRECBEG NUMERIC(15,2),
ISUMMRECEND NUMERIC(15,2),
ISUMMWAREBEG NUMERIC(15,2),
ISUMMWAREEND NUMERIC(15,2),
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :IGRPACTDISCCODE
  INTO GRPACTDISCID;

  IF (GRPACTDISCID IS NULL) THEN
   BEGIN
      ERRORCODE = 1;
      EXIT;
    END

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :GRPACTDISCID
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, :IDATEBEG, :IDATEEND,
                                    :IDAYBEG, :IDAYEND, :IPRICEBEG, :IPRICEEND,
                                    :IQUANTITYBEG, :IQUANTITYEND,
                                    :IQUANTITYRECBEG, :IQUANTITYRECEND,
                                    :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,
                                    :ISUMMWAREBEG, :ISUMMWAREEND, :ITIMEBEG, :ITIMEEND,
                                    :IWARECODE, :IWARECODETOMARK)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (IDISCRATEPARENTCODE IS NOT NULL) THEN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEPARENTCODE AND ISFOLDER > 0
      INTO IDISCRATEPARENTID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, '', 0,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPENDDEFAULTGRPDISC) */
ALTER PROCEDURE APPENDDEFAULTGRPDISC(ITYPE INTEGER,
ICODE INTEGER,
IWARE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE NEWID INTEGER;
DECLARE VARIABLE ADOID INTEGER;
DECLARE VARIABLE SETTING VARCHAR(100);
DECLARE VARIABLE TEMPID INTEGER;
DECLARE VARIABLE TEMPNAME VARCHAR(100);
BEGIN

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :ICODE
  INTO  NEWID;

  IF (NEWID IS NULL) THEN
    BEGIN
      ERRORCODE = 1; /*   */
      EXIT;
    END

  IF (ITYPE = 1) THEN
    SETTING = 'InternalDefaultSchmRecID';
  ELSE
    IF (IWARE = 0) THEN
      SETTING = 'InternalDefaultSchmFreeID';
    ELSE
      SETTING = 'InternalDefaultSchmCodeID';

  IF (ITYPE = 1)  THEN
    FOR SELECT VAL, NAME
    FROM SETTINGS
    WHERE ((NAME = 'InternalDefaultSchmFreeID') OR (NAME = 'InternalDefaultSchmCodeID')) AND
          (VAL = :NEWID)
    INTO TEMPID, TEMPNAME
    DO
      BEGIN
        DELETE FROM ACTDISCOBJ
        WHERE CLIENTID = -1 AND WAREID <= 0 AND CARDID = -1 AND
              PAYMENTID = -1 AND GRPACTDISCID = :TEMPID;

        EXECUTE PROCEDURE MERGE_SETTING(TEMPNAME, 0);
      END
  ELSE
    FOR SELECT VAL
    FROM SETTINGS
    WHERE (NAME = 'InternalDefaultSchmRecID') AND (VAL = :NEWID)
    INTO TEMPID
    DO
      BEGIN
         DELETE FROM ACTDISCOBJ
            WHERE CLIENTID = -1 AND WAREID <= 0 AND CARDID = -1 AND
                  PAYMENTID = -1 AND GRPACTDISCID = :TEMPID;

         EXECUTE PROCEDURE MERGE_SETTING('InternalDefaultSchmRecID', 0);
      END

  UPDATE ACTDISCOBJ SET
    GRPACTDISCID = :NEWID
  WHERE
    CLIENTID = -1 AND WAREID = :IWARE AND CARDID = -1 AND
    PAYMENTID = -1 AND GRPACTDISCID = (select val from settings where name = :SETTING);

  SELECT FIRST 1 ID
  FROM ACTDISCOBJ
  WHERE CLIENTID = -1 AND WAREID = :IWARE AND
        CARDID = -1 AND PAYMENTID = -1 AND GRPACTDISCID = :NEWID
  INTO ADOID;

  IF (ADOID IS NULL) THEN
    INSERT INTO ACTDISCOBJ (ID, WAREID, CLIENTID, PAYMENTID, CARDID, GRPACTDISCID)
    VALUES (GEN_ID(GID, 1), :IWARE, -1, -1, -1, :NEWID);

  UPDATE DISCRATE DR SET
      DR.DESTINATION = :ITYPE
  WHERE DR.ID IN (select AD.DISCRATEID from ACTDISC AD where AD.GRPACTDISCID = :NEWID);

  EXECUTE PROCEDURE MERGE_SETTING(SETTING, NEWID);

END
^

SET TERM ; ^

ALTER TABLE DOCKIND ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCKIND ALTER COLUMN CODE POSITION 2;

ALTER TABLE DOCKIND ALTER COLUMN NAME POSITION 3;

ALTER TABLE DOCKIND ALTER COLUMN TEXT POSITION 4;

ALTER TABLE DOCKIND ALTER COLUMN IDENTIF POSITION 5;

ALTER TABLE DOCKIND ALTER COLUMN ECRRECEIPTTYPE POSITION 6;

ALTER TABLE DOCKIND ALTER COLUMN PRINTONRCP POSITION 7;

ALTER TABLE DOCKIND ALTER COLUMN REMAINOPERATION POSITION 8;

ALTER TABLE DOCKIND ALTER COLUMN ASKCOMMENT POSITION 9;

/* TEXT BLOCK END */

/* Convert 4.5.2 */

ALTER TABLE SPRT ADD ECRDEPARTMENT FINT;

/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE APPENDWAREPARAMS(ICODE VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IASPECTSCHEMECODE INTEGER,
IASPECTTYPE INTEGER,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IPRICELABEL INTEGER,
IDELETED INTEGER,
IWARECODETOMARK INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^


/* Alter Procedure... */
/* empty dependent procedure body */
/* Clear: APPENDWARE for: APPEND_WARE_DISC */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter (APPEND_WARE_DISC) */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TID INTEGER;
BEGIN

    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, '  ', '  ',
                                     :IDISCTYPE, :IDISCVALUE, NULL, NULL, '', NULL,
                                     0, 2, 0, NULL, NULL)
          RETURNING_VALUES ERRORCODE, TDISCRATEID;

    SELECT FIRST 1 A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL
    INTO TACTDISCOBJID;

    IF (TACTDISCOBJID IS NULL) THEN
      INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                               ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                               PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
      VALUES   (GEN_ID(GID, 1), :IWAREID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                -1, :TDISCRATEID, NULL, 0);
    ELSE
      BEGIN
        UPDATE ACTDISCOBJ SET
           DISCRATEID = :TDISCRATEID
        WHERE ID = :TACTDISCOBJID;

        FOR SELECT A.ID
        FROM ACTDISCOBJ A JOIN DISCRATE D ON
                        D.ID = A.DISCRATEID AND D.KIND = 2
        WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
              A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
              A.ASPECTVALUE1ID IS NULL AND
              A.ASPECTVALUE2ID IS NULL AND
              A.ASPECTVALUE3ID IS NULL AND
              A.ASPECTVALUE4ID IS NULL AND
              A.ASPECTVALUE5ID IS NULL AND
              A.ID <> :TACTDISCOBJID
        INTO TID
        DO
          DELETE FROM ACTDISCOBJ WHERE ID = :TID;
      END
END
^

/* empty dependent procedure body */
/* Clear: APPEND_WARE_DISC for: APPENDDISCRATE */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* empty dependent procedure body */
/* Clear: APPENDACTDISC for: APPENDDISCRATE */
ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG NUMERIC(15,2),
IPRICEEND NUMERIC(15,2),
IQUANTITYBEG NUMERIC(15,2),
IQUANTITYEND NUMERIC(15,2),
IQUANTITYRECBEG NUMERIC(15,2),
IQUANTITYRECEND NUMERIC(15,2),
IQUANTITYWAREBEG NUMERIC(15,2),
IQUANTITYWAREEND NUMERIC(15,2),
ISUMMBEG NUMERIC(15,2),
ISUMMEND NUMERIC(15,2),
ISUMMRECBEG NUMERIC(15,2),
ISUMMRECEND NUMERIC(15,2),
ISUMMWAREBEG NUMERIC(15,2),
ISUMMWAREEND NUMERIC(15,2),
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* empty dependent procedure body */
/* Clear: APPENDCCARDDISCS for: APPENDDISCRATE */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* empty dependent procedure body */
/* Clear: APPENDFIXDISCS for: APPENDDISCRATE */
ALTER PROCEDURE APPENDFIXDISCS(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IPREFIX VARCHAR(40),
IVAL VARCHAR(100),
ITYPE INTEGER,
IDATERANGEBEG DATE,
IDATERANGEEND DATE,
IDESTINATION INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* empty dependent procedure body */
/* Clear: APPENDREMAIN for: APPENDDISCRATE */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* empty dependent procedure body */
/* Clear: APPPEND_SUPERMAG_DISC for: APPENDDISCRATE */
ALTER PROCEDURE APPPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter (APPENDDISCRATE) */
ALTER PROCEDURE APPENDDISCRATE(IPARENTID INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
IBEGVAL VARCHAR(100),
IENDVAL VARCHAR(100),
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
IISFOLDER INTEGER,
IDISCCOLLOPER INTEGER,
IGRPACTDISCID INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
DECLARE VARIABLE DISCRATECODE INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DISTINATION INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
BEGIN

  ERRORCODE = 0;
  WHERECLAUSE = '';

  IF (IVAL = '') THEN
    IVAL = '0';

  IF (IWARECODE <> '') THEN
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID
      FROM SPRT
      WHERE CODE = :IWARECODE
      INTO WAREID;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID
      FROM SPRT
      WHERE MARK = :IWARECODE
      INTO WAREID;
    END

    IF (WAREID IS NULL) THEN
    BEGIN
      ERRORCODE = 16;
      EXIT;
    END
  END

  SELECT FIRST 1 D.ID
  FROM DISCRATE D LEFT JOIN ACTDISC A ON
                  D.ID = A.DISCRATEID
  WHERE D.PARENTID = :IPARENTID AND D.VAL =  :IVAL  AND
        D."TYPE" = :ITYPE       AND D.NAME =  :INAME  AND
        D.KIND = :IKIND         AND D.DESTINATION = :IDESTINATION
  INTO ID;

  IF (ID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);

    SELECT NULLTONUM(MAX(CODE)) + 1
    FROM DISCRATE
    WHERE CODE < 100000000
    INTO DISCRATECODE;

    DISTINATION = IDESTINATION;
    IF (DISTINATION IS NULL) THEN
      IF (IGRPACTDISCID IS NULL) THEN
        DISTINATION = 0;
      ELSE
        BEGIN
          SELECT FIRST 1 D.DESTINATION
          FROM ACTDISC A LEFT JOIN DISCRATE D ON
                         D.ID = A.DISCRATEID
          WHERE A.GRPACTDISCID = :IGRPACTDISCID
          INTO DISTINATION;

          IF (DISTINATION IS NULL) THEN
            DISTINATION = 0;
        END

    INSERT INTO DISCRATE (ID, PARENTID, CODE, NAME, TEXT,
                          VAL, BEGVAL, ENDVAL,
                          WAREID, "TYPE", DESTINATION, KIND,
                          ISFOLDER, DISCCOLLOPER)
    VALUES (:ID, :IPARENTID, :DISCRATECODE, :INAME, :ITEXT,
            :IVAL, :IBEGVAL, :IENDVAL, :WAREID, :ITYPE, :DISTINATION, :IKIND,
            :IISFOLDER, :IDISCCOLLOPER);
  END
END
^

/* Alter (APPENDFIXDISCS) */
ALTER PROCEDURE APPENDFIXDISCS(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IPREFIX VARCHAR(40),
IVAL VARCHAR(100),
ITYPE INTEGER,
IDATERANGEBEG DATE,
IDATERANGEEND DATE,
IDESTINATION INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN

  ERRORCODE = 0;

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :IGRPACTDISCID
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL,
                                    :IPREFIX, :IPREFIX,
                                    0, :IDATERANGEBEG, :IDATERANGEEND,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME , :ITEXT, :ITYPE,
                                   :IVAL, NULL, NULL, '', 0, :IDESTINATION,
                                   1, 0, NULL, :IGRPACTDISCID)
        RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :IGRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPENDREMAIN) */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE WARENAME VARCHAR(100);
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCCODE INTEGER;
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
      BEGIN
        IF (ASPCODE = 1)  THEN
          IF (IASPV1 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
            INTO AD1;
          ELSE
          BEGIN
            ERRORCODE = 10;
            EXIT;
          END

        IF (ASPCODE = 2)  THEN
          IF (IASPV2 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
            INTO AD2;
          ELSE
          BEGIN
            ERRORCODE = 11;
            EXIT;
          END

        IF (ASPCODE = 3)  THEN
          IF (IASPV3 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
            INTO AD3;
          ELSE
          BEGIN
            ERRORCODE = 12;
            EXIT;
          END

        IF (ASPCODE = 4)  THEN
          IF (IASPV4 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
            INTO AD4;
          ELSE
          BEGIN
            ERRORCODE = 13;
            EXIT;
          END

        IF (ASPCODE = 5)  THEN
          IF (IASPV5 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
            INTO AD5;
          ELSE
          BEGIN
            ERRORCODE = 14;
            EXIT;
          END
      END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR
(AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, REMAIN, PRICE,
       DELETED)
    VALUES
      (GEN_ID(GID, 1), :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5, :IREMAIN,
      :IPRICE, :IDELETED);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE = 1) THEN
      IF (NOT :IREMAIN IS NULL) THEN
        UPDATE REMAIN SET
          REMAIN = REMAIN + :IREMAIN,
          PRICE = :IPRICE,
          DELETED = :IDELETED
        WHERE ID = :REMAINID;
      ELSE
        UPDATE REMAIN SET
          PRICE = :IPRICE,
          DELETED = :IDELETED
        WHERE ID = :REMAINID;
    ELSE
      UPDATE REMAIN SET
        REMAIN = :IREMAIN,
        PRICE = :IPRICE,
        DELETED = :IDELETED
      WHERE ID = :REMAINID;
    IF ((IADDREPLACE = 2) AND (NOT :IREMAIN IS NULL)) THEN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID;
  END

  IF (IDISCOUNTVALUE <> '0' AND IDISCOUNTVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       0, 2, 0, NULL, NULL)
            RETURNING_VALUES ERRORCODE, TDISCRATEID;

      WHERECLAUSE = '';

      IF (AD1 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
      ELSE
      BEGIN
        AD1 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID IS NULL ';
      END

      IF (AD2 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
      ELSE
      BEGIN
        AD2 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID IS NULL ';
      END

      IF (AD3 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
      ELSE
      BEGIN
        AD3 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID IS NULL ';
      END

      IF (AD4 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
      ELSE
      BEGIN
        AD4 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID IS NULL ';
      END

     IF (AD5 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
      ELSE
      BEGIN
        AD5 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID IS NULL ';
      END

      IF (IUSEGRPACTDISC <> 0) THEN
      BEGIN

        SELECT ID
        FROM GRPACTDISC
        WHERE CODE = :IGRPACTDISCCODE
        INTO :GRPACTDISCID;

        IF (GRPACTDISCID IS NULL) THEN
        BEGIN
          GRPACTDISCID = GEN_ID(GID, 1);
          INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
          VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
        END

        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID ' ||
                          ' FROM ACTDISCOBJ A JOIN GRPACTDISC G ON ' ||
                                          ' G.ID = A.GRPACTDISCID AND G.ID = '|| :GRPACTDISCID ||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '      A.PAYMENTID = -1 AND A.CARDID = -1 '|| WHERECLAUSE
        INTO TACTDISCOBJID;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, NULL, NULL, :GRPACTDISCID);

        SELECT FIRST 1 A.ID, A.CONDITIONID
        FROM CONDITION C LEFT JOIN ACTDISC A ON
                         C.ID = A.CONDITIONID
        WHERE A.GRPACTDISCID  = :GRPACTDISCID
        INTO ACTDISCID, CONDITIONID;

        EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL,
                                          NULL, NULL,  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  NULL, NULL,
                                          NULL, NULL, NULL, NULL)
        RETURNING_VALUES ERRORCODE, CONDITIONID;

       IF (ACTDISCID IS NULL) THEN
       BEGIN
         SELECT NULLTONUM(MAX(CODE)) + 1
         FROM ACTDISC
         WHERE GRPACTDISCID  = :GRPACTDISCID
         INTO ACTDISCCODE;

         INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                              CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
         VALUES     (GEN_ID(GID, 1), :ACTDISCCODE, :GRPACTDISCID, :WARENAME,
                    :CONDITIONID, :TDISCRATEID, NULL, 0, :IDELETEDACTDISC);
       END
       ELSE
         UPDATE ACTDISC SET
            NAME = :WARENAME,
            CONDITIONID = :CONDITIONID,
            DISCRATEID = :TDISCRATEID,
            DELETED = :IDELETEDACTDISC
         WHERE ID = :ACTDISCID;
      END
      ELSE
      BEGIN
        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID ' ||
                          ' FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                          ' D.ID = A.DISCRATEID AND D.KIND = 2 '||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '       A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
        INTO TACTDISCOBJID;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, :TDISCRATEID, NULL, NULL);
        ELSE
          UPDATE ACTDISCOBJ SET
             DISCRATEID = :TDISCRATEID
          WHERE ID = :TACTDISCOBJID;
      END
    END
END
^

/* Alter (APPENDWARE) */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
DECLARE VARIABLE TISWARE INTEGER;
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TDELETED INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE HIERLEVEL INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE BARC VARCHAR(40);
BEGIN
  ERRORCODE = 0;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      IF (IEXCHANGEFORMAT <> 1) THEN
        BEGIN
          ERRORCODE = 8;
          EXIT;
        END
      ELSE
        IFIRSTASPECTVALUE = 0;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  HIERLEVEL = 0;
  IF (IPARENTCODE <> '') then
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (CODE = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (MARK = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
  END
  ELSE
    PARENTID = 0;
  HIERLEVEL = HIERLEVEL + 1;

  IF (IISWARE <> 1) THEN
    BEGIN
      IISWARE = -2147483647 + HIERLEVEL;
    END

  IF ((PARENTID IS NULL) OR (TISWARE > 0)) THEN
  BEGIN
    ERRORCODE = 2;
    EXIT;
  END

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  IF (IWARECODETOMARK = 0) THEN
  begin
    SELECT ID
    FROM SPRT
    WHERE CODE = :ICODE
    INTO TID;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, DELETED
    FROM SPRT
    WHERE MARK = :IMARK
    INTO TID, TDELETED;
  END

  IF (TID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO SPRT (ID, PARENTID, CODE, MARK, NAME, TEXT, HIERLEVEL,
      MINPRICE, ECRDEVID, TAXGROUPID, RCPPRNDEVID,
      ASPECTSCHEMEID, PRICELABELID,
      MAXDISCOUNT, ISWARE, PRICE, FLAGS, LIFE, SERIES,
      CERTIFICAT, SCALELPDEVID, SCALELPWARECODE, ASPECTTYPE, QUANTITYPREC,
      SCALELPLOADED, PRICELBPRINTED, DELETED, DESCRIPTION, PICTURE, REWARDTYPE, REWARDVAL,
      ECRDEPARTMENT)
    VALUES (:ID, :PARENTID, :ICODE, :IMARK, :INAME, :ITEXT, :HIERLEVEL,
      :IMINPRICE, :ECRDEVID, :TAXGROUPID, :RCPPRNDEVID,
      :ASPECTSCHEMEID, :PRICELABELID,
      :IMAXDISCOUNT, :IISWARE, :IPRICE, :IFLAGS, :ILIFE, :ISERIES,
      :ICERTIFICAT, :SCALELPDEVID, :ISCALELPWARECODE, :IASPECTTYPE, :IQUANTITYPREC,
      :ISCALELPLOADED, :IPRICELBPRINTED, :IDELETED, :IDESCRIPTION, :IPICTURE, :IREWARDTYPE, :IREWARDVAL,
      :IECRDEPARTMENT);
    INCREMENTCODE = 1;
  END
  ELSE
  BEGIN
    ID = TID;
    IF (TDELETED = IDELETED) THEN
      UPDATE SPRT SET
        ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
        ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
        CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
                                           PRICELABELID = :PRICELABELID,
        DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
        DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
        ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
        ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
        FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
        HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
        ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
        LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
        MARK = :IMARK,                     SERIES = :ISERIES,
        MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
        MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
        NAME = :INAME
      WHERE ID = :ID;
    ELSE
      BEGIN
        UPDATE SPRT SET
          ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
          ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
          CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
          CODE = :ICODE,                     PRICELABELID = :PRICELABELID,
          DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
          DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
          ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
          ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
          FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
          HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
          ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
          LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
          MARK = :IMARK,                     SERIES = :ISERIES,
          MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
          MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
          NAME = :INAME
        WHERE ID = :ID;
        INCREMENTCODE = 1;
      END
  END

  IF (IISWARE = 1) THEN
  BEGIN
    EXECUTE PROCEDURE APPENDREMAINBYWAREID (:ID, :IFIRSTASPECTVALUE, :ASPECTSCHEMEID, :IREMAIN, :IDELETEDREMAIN, :IDELETEDASPECT, :IADDREPLACE)
      RETURNING_VALUES ERRORCODE;

    IF (ERRORCODE > 0) THEN
      EXIT;

    WHILE (IBARCODES <> '') DO
    BEGIN
      BARC = EXTRACTSTR(IBARCODES, ',');

      EXECUTE PROCEDURE APPENDBARCODEBYWAREID (:BARC, :ID, 0, 0, 0, 0, 0, null, 0, :IDELETEDBARCODE)
        RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;

      IBARCODES = PCOPY(IBARCODES, LEN(BARC) + 1, LEN(IBARCODES) - LEN(BARC) - 1);
    END
  END

  IF (IDISCOUNTVALUE <> '0' AND IDISCOUNTVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPEND_WARE_DISC(:ID, :IDISCOUNTTYPE, :IDISCOUNTVALUE, :IDISCRATEPARENTID)
            RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;
    END

  IF (TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :ID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :ID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
END
^

/* Alter (APPPEND_SUPERMAG_DISC) */
ALTER PROCEDURE APPPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IGRPACTDISCCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IGRPACTDISCCODE
    INTO GRPACTDISCID;

    IF (GRPACTDISCID IS NULL) THEN
    BEGIN
      GRPACTDISCID = GEN_ID(GID, 1);
      INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
      VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
    END

    IF (IWAREID > 0) THEN
    BEGIN
      SELECT ID
      FROM ACTDISCOBJ
      WHERE WAREID = :IWAREID AND GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1
      INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), :IWAREID, -1, -1, -1, :GRPACTDISCID);
    END
    ELSE
    BEGIN
      SELECT ID
      FROM ACTDISCOBJ
      WHERE GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1 AND WAREID = -1
      INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), -1, -1, -1, -1, :GRPACTDISCID);
    END
  END
  ELSE
    GRPACTDISCID = IGRPACTDISCID;

  IF (IAPPENDTYPE = 0) THEN   -- DiscCli
    BEGIN
      WHERECLAUSE = '';

      IF (ICARDPREFIXBEG IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG = '''|| :ICARDPREFIXBEG ||'''';

      IF (ICARDPREFIXEND IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND = '''|| :ICARDPREFIXEND ||'''';

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.CONDITIONID
                          FROM CONDITION C LEFT JOIN ACTDISC A ON
                                           C.ID = A.CONDITIONID
                          WHERE A.GRPACTDISCID = '|| :GRPACTDISCID ||' AND
                                C.SUMMBEG IS NULL AND C.TIMEBEG IS NULL '|| WHERECLAUSE ||'
                          PLAN JOIN (C INDEX (IDX_C_CARDPRBEG,IDX_C_CARDPREND),A INDEX (FK_AD_CONDITION,FK_AD_GRPACTDISC))'
      INTO :ACTDISCID, :CONDITIONID;
    END
  ELSE
    IF (IAPPENDTYPE = 1) THEN   -- CliClass

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                       C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
            C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
            C.QUANTITYBEG IS NULL
      INTO ACTDISCID, CONDITIONID;

    ELSE
      IF (IAPPENDTYPE = 2) THEN   -- DiscSumm
        BEGIN

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.SUMMBEG = :ISUMMBEG AND
                C.TIMEBEG = :ITIMEBEG AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

          IF (IDELETECURRENT = 1) THEN
            IF (ACTDISCID IS NULL) THEN
              EXIT;
            ELSE
              BEGIN
                DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                EXIT;
              END
        END
      ELSE
        IF (IAPPENDTYPE = 3) THEN   -- DiscCard

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.QUANTITYBEG = :IQUANTITYBEG    AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

        ELSE
          IF (IAPPENDTYPE = 4) THEN   -- CliSumm

            SELECT FIRST 1 A.ID, A.CONDITIONID
            FROM CONDITION C LEFT JOIN ACTDISC A ON
                             C.ID = A.CONDITIONID
            WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                  C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                  C.SUMMBEG = :ISUMMBEG             AND
                  C.TIMEBEG IS NULL
            INTO ACTDISCID, CONDITIONID;

          ELSE
            IF (IAPPENDTYPE = 5) THEN  -- PluDisc  ClasDisc

              SELECT FIRST 1 A.ID, A.CONDITIONID
              FROM CONDITION C LEFT JOIN ACTDISC A ON
                               C.ID = A.CONDITIONID
              WHERE A.GRPACTDISCID  = :GRPACTDISCID
              INTO ACTDISCID, CONDITIONID;

            ELSE
              IF (IAPPENDTYPE = 6) THEN  -- DiscSum 
                BEGIN

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                        C.SUMMRECBEG = :ISUMMRECBEG      AND
                        C.TIMEBEG = :ITIMEBEG            AND
                        C.CARDPREFIXBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                  IF (IDELETECURRENT = 1) THEN
                    IF (ACTDISCID IS NULL) THEN
                      EXIT;
                    ELSE
                    BEGIN
                      DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                      EXIT;
                    END
                END
              ELSE
                IF (IAPPENDTYPE = 7) THEN  -- CliSum 

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                        C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                        C.SUMMRECBEG = :ISUMMRECBEG       AND
                        C.TIMEBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                ELSE
                  BEGIN
                    ERRORCODE = 90; --  IAPPENDTYPE
                    EXIT;
                  END

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, NULL, NULL, NULL, NULL, NULL, NULL,
                                    :IQUANTITYBEG, :IQUANTITYEND,  NULL, NULL, NULL, NULL,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,  NULL, NULL,
                                    :ITIMEBEG, :ITIMEEND, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, NULL, NULL,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      IF (ICODE IS NULL) THEN
        SELECT NULLTONUM(MAX(CODE)) + 1
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        INTO ICODE;

      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (GEN_ID(GID, 1), :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
       NAME = :INAME,
       CONDITIONID = :CONDITIONID,
       DISCRATEID = :DISCRATEID,
       DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Restore proc. body: APPEND_WARE_DISC */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TID INTEGER;
BEGIN

    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, '  ', '  ',
                                     :IDISCTYPE, :IDISCVALUE, NULL, NULL, '', NULL,
                                     0, 2, 0, NULL, NULL)
          RETURNING_VALUES ERRORCODE, TDISCRATEID;

    SELECT FIRST 1 A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL
    INTO TACTDISCOBJID;

    IF (TACTDISCOBJID IS NULL) THEN
      INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                               ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                               PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
      VALUES   (GEN_ID(GID, 1), :IWAREID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                -1, :TDISCRATEID, NULL, 0);
    ELSE
      BEGIN
        UPDATE ACTDISCOBJ SET
           DISCRATEID = :TDISCRATEID
        WHERE ID = :TACTDISCOBJID;

        FOR SELECT A.ID
        FROM ACTDISCOBJ A JOIN DISCRATE D ON
                        D.ID = A.DISCRATEID AND D.KIND = 2
        WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
              A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
              A.ASPECTVALUE1ID IS NULL AND
              A.ASPECTVALUE2ID IS NULL AND
              A.ASPECTVALUE3ID IS NULL AND
              A.ASPECTVALUE4ID IS NULL AND
              A.ASPECTVALUE5ID IS NULL AND
              A.ID <> :TACTDISCOBJID
        INTO TID
        DO
          DELETE FROM ACTDISCOBJ WHERE ID = :TID;
      END
END
^

/* Restore proc. body: APPENDACTDISC */
ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG NUMERIC(15,2),
IPRICEEND NUMERIC(15,2),
IQUANTITYBEG NUMERIC(15,2),
IQUANTITYEND NUMERIC(15,2),
IQUANTITYRECBEG NUMERIC(15,2),
IQUANTITYRECEND NUMERIC(15,2),
IQUANTITYWAREBEG NUMERIC(15,2),
IQUANTITYWAREEND NUMERIC(15,2),
ISUMMBEG NUMERIC(15,2),
ISUMMEND NUMERIC(15,2),
ISUMMRECBEG NUMERIC(15,2),
ISUMMRECEND NUMERIC(15,2),
ISUMMWAREBEG NUMERIC(15,2),
ISUMMWAREEND NUMERIC(15,2),
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :IGRPACTDISCCODE
  INTO GRPACTDISCID;

  IF (GRPACTDISCID IS NULL) THEN
   BEGIN
      ERRORCODE = 1;
      EXIT;
    END

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :GRPACTDISCID
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, :IDATEBEG, :IDATEEND,
                                    :IDAYBEG, :IDAYEND, :IPRICEBEG, :IPRICEEND,
                                    :IQUANTITYBEG, :IQUANTITYEND,
                                    :IQUANTITYRECBEG, :IQUANTITYRECEND,
                                    :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,
                                    :ISUMMWAREBEG, :ISUMMWAREEND, :ITIMEBEG, :ITIMEEND,
                                    :IWARECODE, :IWARECODETOMARK)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (IDISCRATEPARENTCODE IS NOT NULL) THEN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEPARENTCODE AND ISFOLDER > 0
      INTO IDISCRATEPARENTID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, '', 0,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Restore proc. body: APPENDCCARDDISCS */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), -1, -1, :CARDID, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID)
      RETURNING_VALUES ERRORCODE;
END
^

/* Restore proc. body: APPENDWAREPARAMS */
ALTER PROCEDURE APPENDWAREPARAMS(ICODE VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IASPECTSCHEMECODE INTEGER,
IASPECTTYPE INTEGER,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IPRICELABEL INTEGER,
IDELETED INTEGER,
IWARECODETOMARK INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
BEGIN

  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID
    FROM SPRT
    WHERE CODE = :ICODE AND DELETED = :IDELETED
    INTO TID;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID
    FROM SPRT
    WHERE MARK = :ICODE AND DELETED = :IDELETED
    INTO TID;
  END

  IF (TID IS NULL) THEN
    EXIT;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      ERRORCODE = 8;
      EXIT;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  UPDATE SPRT SET
      ASPECTSCHEMEID = :ASPECTSCHEMEID,
      ASPECTTYPE = :IASPECTTYPE,
      ECRDEVID = :ECRDEVID,
      TAXGROUPID = :TAXGROUPID,
      SCALELPDEVID = :SCALELPDEVID,
      SCALELPWARECODE = :ISCALELPWARECODE,
      RCPPRNDEVID = :RCPPRNDEVID,
      PRICELABELID = :PRICELABELID
  WHERE ID = :TID;

  IF (TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :TID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :TID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
END
^

/* Alter Procedure... */
/* Alter (APPEND_WARE_DISC) */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TID INTEGER;
BEGIN

    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, '  ', '  ',
                                     :IDISCTYPE, :IDISCVALUE, NULL, NULL, '', NULL,
                                     0, 2, 0, NULL, NULL)
          RETURNING_VALUES ERRORCODE, TDISCRATEID;

    SELECT FIRST 1 A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL
    INTO TACTDISCOBJID;

    IF (TACTDISCOBJID IS NULL) THEN
      INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                               ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                               PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
      VALUES   (GEN_ID(GID, 1), :IWAREID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                -1, :TDISCRATEID, NULL, 0);
    ELSE
      BEGIN
        UPDATE ACTDISCOBJ SET
           DISCRATEID = :TDISCRATEID
        WHERE ID = :TACTDISCOBJID;

        FOR SELECT A.ID
        FROM ACTDISCOBJ A JOIN DISCRATE D ON
                        D.ID = A.DISCRATEID AND D.KIND = 2
        WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
              A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
              A.ASPECTVALUE1ID IS NULL AND
              A.ASPECTVALUE2ID IS NULL AND
              A.ASPECTVALUE3ID IS NULL AND
              A.ASPECTVALUE4ID IS NULL AND
              A.ASPECTVALUE5ID IS NULL AND
              A.ID <> :TACTDISCOBJID
        INTO TID
        DO
          DELETE FROM ACTDISCOBJ WHERE ID = :TID;
      END
END
^

/* Alter (APPENDACTDISC) */
ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG NUMERIC(15,2),
IPRICEEND NUMERIC(15,2),
IQUANTITYBEG NUMERIC(15,2),
IQUANTITYEND NUMERIC(15,2),
IQUANTITYRECBEG NUMERIC(15,2),
IQUANTITYRECEND NUMERIC(15,2),
IQUANTITYWAREBEG NUMERIC(15,2),
IQUANTITYWAREEND NUMERIC(15,2),
ISUMMBEG NUMERIC(15,2),
ISUMMEND NUMERIC(15,2),
ISUMMRECBEG NUMERIC(15,2),
ISUMMRECEND NUMERIC(15,2),
ISUMMWAREBEG NUMERIC(15,2),
ISUMMWAREEND NUMERIC(15,2),
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :IGRPACTDISCCODE
  INTO GRPACTDISCID;

  IF (GRPACTDISCID IS NULL) THEN
   BEGIN
      ERRORCODE = 1;
      EXIT;
    END

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :GRPACTDISCID
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, :IDATEBEG, :IDATEEND,
                                    :IDAYBEG, :IDAYEND, :IPRICEBEG, :IPRICEEND,
                                    :IQUANTITYBEG, :IQUANTITYEND,
                                    :IQUANTITYRECBEG, :IQUANTITYRECEND,
                                    :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,
                                    :ISUMMWAREBEG, :ISUMMWAREEND, :ITIMEBEG, :ITIMEEND,
                                    :IWARECODE, :IWARECODETOMARK)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (IDISCRATEPARENTCODE IS NOT NULL) THEN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEPARENTCODE AND ISFOLDER > 0
      INTO IDISCRATEPARENTID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, '', 0,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), -1, -1, :CARDID, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID)
      RETURNING_VALUES ERRORCODE;
END
^

SET TERM ; ^

ALTER TABLE SPRT ALTER COLUMN ID POSITION 1;

ALTER TABLE SPRT ALTER COLUMN CODE POSITION 2;

ALTER TABLE SPRT ALTER COLUMN MARK POSITION 3;

ALTER TABLE SPRT ALTER COLUMN PARENTID POSITION 4;

ALTER TABLE SPRT ALTER COLUMN NAME POSITION 5;

ALTER TABLE SPRT ALTER COLUMN TEXT POSITION 6;

ALTER TABLE SPRT ALTER COLUMN PRICE POSITION 7;

ALTER TABLE SPRT ALTER COLUMN MINPRICE POSITION 8;

ALTER TABLE SPRT ALTER COLUMN MAXDISCOUNT POSITION 9;

ALTER TABLE SPRT ALTER COLUMN ASPECTSCHEMEID POSITION 10;

ALTER TABLE SPRT ALTER COLUMN ISWARE POSITION 11;

ALTER TABLE SPRT ALTER COLUMN HIERLEVEL POSITION 12;

ALTER TABLE SPRT ALTER COLUMN LIFE POSITION 13;

ALTER TABLE SPRT ALTER COLUMN FLAGS POSITION 14;

ALTER TABLE SPRT ALTER COLUMN SERIES POSITION 15;

ALTER TABLE SPRT ALTER COLUMN CERTIFICAT POSITION 16;

ALTER TABLE SPRT ALTER COLUMN ECRDEVID POSITION 17;

ALTER TABLE SPRT ALTER COLUMN TAXGROUPID POSITION 18;

ALTER TABLE SPRT ALTER COLUMN SCALELPDEVID POSITION 19;

ALTER TABLE SPRT ALTER COLUMN SCALELPLOADED POSITION 20;

ALTER TABLE SPRT ALTER COLUMN SCALELPWARECODE POSITION 21;

ALTER TABLE SPRT ALTER COLUMN ASPECTTYPE POSITION 22;

ALTER TABLE SPRT ALTER COLUMN RCPPRNDEVID POSITION 23;

ALTER TABLE SPRT ALTER COLUMN PICTURE POSITION 24;

ALTER TABLE SPRT ALTER COLUMN DESCRIPTION POSITION 25;

ALTER TABLE SPRT ALTER COLUMN QUANTITYPREC POSITION 26;

ALTER TABLE SPRT ALTER COLUMN PRICELABELID POSITION 27;

ALTER TABLE SPRT ALTER COLUMN DELETED POSITION 28;

ALTER TABLE SPRT ALTER COLUMN PRICELBPRINTED POSITION 29;

ALTER TABLE SPRT ALTER COLUMN REWARDTYPE POSITION 30;

ALTER TABLE SPRT ALTER COLUMN REWARDVAL POSITION 31;

ALTER TABLE SPRT ALTER COLUMN ECRDEPARTMENT POSITION 32;

/* TEXT BLOCK END */

/* Convert 4.6.0 */

CREATE TABLE DOCUMENT(ID FID NOT NULL,
DOCKINDID RREF,
CHEQUENUMBER FINT,
OPENDATE FDATE,
OPENTIME FTIME,
OPENUSERID FINT,
CLOSEDATE FDATE,
CLOSETIME FTIME,
CLOSEUSERID FINT,
DOCUMENTID FINT,
CLIENTID FINT,
STATE FINT NOT NULL,
EDUCATION FLAG,
RMKID RREF,
SUMM FNUM15_2,
SUMMWD FNUM15_2,
ECRSESSION FINT,
CHEQUETYPE FINT,
ORDERIDENTIF FVARCHAR40,
COMMENTCODE FINT,
ASPECTSCHEME FINT,
ASPECTVALUE1 FINT,
ASPECTVALUE2 FINT,
ASPECTVALUE3 FINT,
ASPECTVALUE4 FINT,
ASPECTVALUE5 FINT,
HALLPLACEID FREF,
SAVED FLAG,
INNERDOCORDER FID,
PRECHEQUE FLAG,
OPENRMKID FINT NOT NULL,
OPENSESSION FINT NOT NULL,
OPENDOCNUMBER FINT NOT NULL);

RECONNECT;

ALTER TABLE DOCUMENT ADD CONSTRAINT PK_DOCUMENT PRIMARY KEY (ID);

RECONNECT;

CREATE GENERATOR GDOCORDER;

SET TERM ^ ;

CREATE TRIGGER INS_BEF_DOCUMENT FOR DOCUMENT
ACTIVE BEFORE INSERT POSITION 0 
AS
begin
    NEW.INNERDOCORDER = GEN_ID(GDOCORDER, 1);
end
^

CREATE TRIGGER UPD_BEF_DOCUMENT FOR DOCUMENT
ACTIVE BEFORE UPDATE POSITION 0 
AS
begin
  IF (NEW.CLOSEDATE <> OLD.closedate OR OLD.CLOSETIME <> NEW.CLOSETIME) THEN
    NEW.INNERDOCORDER = GEN_ID(GDOCORDER, 1);
end
^

SET TERM ; ^

ALTER TABLE TRANZT ADD DOCUMENTID RREF;

ALTER TABLE TRANZT ADD BARCODE FVARCHAR40;

ALTER TABLE TRANZT ADD FACTOR FNUM15_3;

ALTER TABLE TRAUTH ADD DOCUMENTID FREF;

RECONNECT;

CREATE GENERATOR GDOC;

SELECT GEN_ID(GDOC,
  GEN_ID(GDOC, 0) + IIF( GEN_ID(GTRANZT, 0) >= GEN_ID(GTRAUTH, 0), GEN_ID(GTRANZT, 0), GEN_ID(GTRAUTH, 0)))
FROM RDB$DATABASE;


UPDATE TRANZT SET DOCUMENTID = 0;
COMMIT;
UPDATE TRAUTH SET DOCUMENTID = 0;
COMMIT;

UPDATE TRANZT SET
  BARCODE = IDENTIF,
  FACTOR = INFO / 1000
WHERE TRANZTYPE = 11;

COMMIT;

UPDATE TRANZT T SET
  DOCUMENTID =
    CASE
--      WHEN TRANZTYPE IN (63, 64) THEN GEN_ID(GDOC, 0) + 1
        WHEN TRANZTYPE IN (42, 60, 61, 62, 63, 64) THEN GEN_ID(GDOC, 1)
        WHEN TRANZTYPE = 57 THEN COALESCE((SELECT DOCUMENTID FROM TRANZT WHERE T.POSNUMBER = POSNUMBER AND TRANZCOUNT = T.TRANZCOUNTREF), GEN_ID(GDOC, 0))
        ELSE GEN_ID(GDOC, 0)
    END
ORDER BY POSNUMBER, TRANZCOUNT;

COMMIT;

UPDATE TRAUTH TA SET DOCUMENTID =
  (SELECT DOCUMENTID FROM TRANZT T WHERE T.PRICEWD = TA.TRANZCOUNT AND T.TRANZTYPE IN (40, 41) AND T.POSNUMBER = TA.POSNUMBER);
COMMIT;

UPDATE TRAUTH SET
  DOCUMENTID = GEN_ID(GDOC, 1)
WHERE OPERATIONTYPE = 255
ORDER BY POSNUMBER, TRANZCOUNT;

COMMIT;

INSERT INTO DOCKIND (ID, CODE, NAME, TEXT, ECRRECEIPTTYPE, REMAINOPERATION, ASKCOMMENT)
SELECT GEN_ID(GID, 1),
  IIF(NULLTOINT(MAX(T.DOCKINDCODE)) >= NULLTOINT(MAX(DK.CODE)), NULLTOINT(MAX(T.DOCKINDCODE)), NULLTOINT(MAX(DK.CODE)))  + 1,
  ' ', ' ', 8, 0, 0 FROM DOCKIND DK LEFT JOIN TRANZT T ON T.DOCKINDCODE = DK.CODE
  WHERE (T.TRANZTYPE IS NULL) OR (T.TRANZTYPE = 42);

INSERT INTO DOCKIND (ID, CODE, NAME, TEXT, ECRRECEIPTTYPE, REMAINOPERATION, ASKCOMMENT)
SELECT GEN_ID(GID, 1), MAX(CODE) + 1, 'X-', 'X-', 9, 0, 0 FROM DOCKIND;

INSERT INTO DOCKIND (ID, CODE, NAME, TEXT, ECRRECEIPTTYPE, REMAINOPERATION, ASKCOMMENT)
SELECT GEN_ID(GID, 1), MAX(CODE) + 1, 'Z-', 'Z-', 10, 0, 0 FROM DOCKIND;

INSERT INTO DOCKIND (ID, CODE, NAME, TEXT, ECRRECEIPTTYPE, REMAINOPERATION, ASKCOMMENT)
SELECT GEN_ID(GID, 1), MAX(CODE) + 1, '  ', '  ', 11, 0, 0 FROM DOCKIND;

COMMIT;

INSERT INTO DOCUMENT (
    ID,
    DOCKINDID,
    CHEQUENUMBER,
    OPENDATE,
    OPENTIME,
    OPENUSERID,
    CLOSEDATE,
    CLOSETIME,
    CLOSEUSERID,
    DOCUMENTID,
    CLIENTID,
    STATE,
    EDUCATION,
    RMKID,
    SUMM,
    SUMMWD,
    ECRSESSION,
    CHEQUETYPE,
    ORDERIDENTIF,
    COMMENTCODE,
    ASPECTSCHEME,
    ASPECTVALUE1,
    ASPECTVALUE2,
    ASPECTVALUE3,
    ASPECTVALUE4,
    ASPECTVALUE5,
    HALLPLACEID,
    SAVED,
    PRECHEQUE,
    OPENRMKID,
    OPENSESSION,
    OPENDOCNUMBER)
SELECT
  T.DOCUMENTID,
  COALESCE(CASE
             WHEN T.TRANZTYPE IN (50, 51, 54, 55, 56, 58) THEN DK.ID
             WHEN T.TRANZTYPE = 60 THEN (SELECT ID FROM DOCKIND WHERE ECRRECEIPTTYPE = 9)
             WHEN T.TRANZTYPE IN (61, 63) THEN (SELECT ID FROM DOCKIND WHERE ECRRECEIPTTYPE = 10)
             WHEN T.TRANZTYPE IN (62, 64) THEN (SELECT ID FROM DOCKIND WHERE ECRRECEIPTTYPE = 8)
           END, 0),
  T.CHEQUENUMBER,
  T.TRANZDATE,
  T.TRANZTIME,
  U.ID,
  T.TRANZDATE,
  T.TRANZTIME,
  U.ID,
  TREF.DOCUMENTID,
  C.ID,
  CASE
    WHEN T.TRANZTYPE IN (50, 51, 55, 58, 60, 61, 62, 63, 64) THEN 1
    WHEN T.TRANZTYPE = 56 THEN 2
    WHEN T.TRANZTYPE = 54 THEN 3
  END,
  T.EDUCATION,
  COALESCE(R.ID, 0),
  T.SUMM,
  T.SUMMWD,
  T.ECRSESSION,
  T.CHEQUETYPE,
  T.IDENTIF,
  T.COMMENTCODE,
  T.ASPECTSCHEME,
  T.ASPECTVALUE1,
  T.ASPECTVALUE2,
  T.ASPECTVALUE3,
  T.ASPECTVALUE4,
  T.ASPECTVALUE5,
  NULL,
  T.SAVED,
  0,
  COALESCE(R.ID, 0),
  T.ECRSESSION,
  T.CHEQUENUMBER

FROM TRANZT T
LEFT JOIN DOCKIND DK ON DK.CODE = T.DOCKINDCODE
LEFT JOIN "USER" U ON U.CODE = T.SELLER 
LEFT JOIN RMK R ON R.CODE = T.POSNUMBER 
LEFT JOIN CLIENT C ON C.CODE = T.PRICEWD
LEFT JOIN TRANZT TREF ON TREF.TRANZCOUNT = T.TRANZCOUNTREF AND TREF.POSNUMBER = T.POSNUMBER
WHERE T.TRANZTYPE IN (50, 51, 54, 55, 56, 58, 60, 61, 62, 63, 64)
UNION
SELECT
  TA.DOCUMENTID,
  (SELECT ID FROM DOCKIND WHERE ECRRECEIPTTYPE = 11),
  TA.ECRCHEQUENUMBER,
  TA.TRANZDATE,
  TA.TRANZTIME,
  NULL,
  TA.TRANZDATE,
  TA.TRANZTIME,
  NULL,
  NULL,
  NULL,
  1,
  0,
  COALESCE(R.ID, 0),
  0,
  0,
  TA.ECRSESSIONNUMBER,
  11,
  NULL,
  0,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL,
  NULL,
  0,
  1,
  COALESCE(R.ID, 0),
  TA.ECRSESSIONNUMBER,
  TA.ECRCHEQUENUMBER

FROM TRAUTH TA
LEFT JOIN RMK R ON TA.POSNUMBER = R.CODE
WHERE TA.OPERATIONTYPE = 255
ORDER BY 1;

COMMIT;

ALTER TABLE REPORTFILTER DROP CONSTRAINT UNQ_REPORTFILTER;

RECONNECT;

ALTER TABLE IMTABLE DROP CONSTRAINT PRI_IMTABLE;

/* Alter Procedure (Before Drop)... */
SET TERM ^ ;

ALTER PROCEDURE GETNREPORT RETURNS(ID INTEGER)
 AS
 BEGIN EXIT; END
^

ALTER PROCEDURE GETTRANZAUTHID RETURNS(ID INTEGER)
 AS
 BEGIN EXIT; END
^

ALTER PROCEDURE GETTRANZTID RETURNS(ID INTEGER)
 AS
 BEGIN EXIT; END
^

/* Drop Procedure... */
SET TERM ; ^

DROP PROCEDURE GETNREPORT;

DROP PROCEDURE GETTRANZAUTHID;

DROP PROCEDURE GETTRANZTID;

DROP PROCEDURE SENDDATACNGEVENT;


/* Drop Index... */
RECONNECT;

/* Drop: IDX_CHEQNUM (TIdxData) */
DROP INDEX IDX_CHEQNUM;

RECONNECT;

/* Drop: IDX_ECRSESS (TIdxData) */
DROP INDEX IDX_ECRSESS;

RECONNECT;

/* Drop: IDX_POSN_TRZT (TIdxData) */
DROP INDEX IDX_POSN_TRZT;

RECONNECT;

/* Drop: IDX_SAV_POSN_TRZT (TIdxData) */
DROP INDEX IDX_SAV_POSN_TRZT;

RECONNECT;

/* Drop: IDX_TRAUTH_PN_TRC (TIdxData) */
DROP INDEX IDX_TRAUTH_PN_TRC;

RECONNECT;

/* Drop: IND_CNTD1 (TIdxData) */
DROP INDEX IND_CNTD1;


/* Create Table... */

CREATE TABLE HALL(ID FID NOT NULL,
CODE FRINT,
NAME FVARCHAR100,
TEXT FVARCHAR100,
DATA FBLOB1024,
HALLPLACEINFO FBLOBTEXT);


CREATE TABLE HALLPLACE(ID FID NOT NULL,
CODE FRINT,
NAME FVARCHAR100,
TEXT FVARCHAR100,
HALLID RREF,
STATE FINT);



ALTER TABLE COUNTER ADD DATECREATE FDATETIME;

ALTER TABLE COUNTERD ADD DOCUMENTID FREF;

ALTER TABLE PROFILE ADD BASE FLAG NOT NULL;

ALTER TABLE REMAIND ADD DOCUMENTID FREF;

ALTER TABLE REPORTFILTER ADD RMKID FINT NOT NULL;

ALTER TABLE REPORTFILTER ADD MININNERDOCORDER FINT NOT NULL;

ALTER TABLE REPORTFILTER ADD MAXINNERDOCORDER FINT NOT NULL;

ALTER TABLE RMK ADD HALLID FREF;

ALTER TABLE RMK ADD AUTOREGUSERID FINT;

ALTER TABLE "USER" ADD SKIPMODE FINT;

/* Alter Field (Null / Not Null)... */
UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = NULL WHERE RDB$FIELD_NAME='TRANZCOUNT' AND RDB$RELATION_NAME='TRANZT';


/* Drop table-fields... */
/* Empty CANCELSTORED for drop COUNTERD(CHEQUEIDENT) */
SET TERM ^ ;

ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 RETURNS(TRANZCOUNT INTEGER)
 AS
 BEGIN EXIT; END
^

SET TERM ; ^

ALTER TABLE COUNTERD DROP CHEQUEIDENT;

ALTER TABLE REPORTFILTER DROP NPOS;

ALTER TABLE REPORTFILTER DROP MINTRANZCOUNT;

ALTER TABLE REPORTFILTER DROP MAXTRANZCOUNT;

/* Empty INSTRANZCOPY for drop TRANZT(CHEQUENUMBER) */
SET TERM ^ ;

ALTER PROCEDURE INSTRANZCOPY(AIDTRANZ INTEGER,
ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
ATRANZTYPE INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ATRANZCOUNTREF INTEGER)
 RETURNS(TRANZCOUNT INTEGER)
 AS
 BEGIN EXIT; END
^

SET TERM ; ^

ALTER TABLE WINREPORTS DROP ASKDIAPASON;


RECONNECT;

/* Drop tables... */
DROP TABLE IMTABLE;


/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE VARCHAR(20),
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IWARECODETOMARK INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE CLEAR_ALL_GARBAGE AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_TRANZCOUNT(ARMKID INTEGER)
 RETURNS(TRANZCOUNT INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GETHALLPLACES(AHALLID INTEGER)
 RETURNS(ID INTEGER,
CODE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
STATE INTEGER,
DOCCOUNT INTEGER,
OPENTIME TIME,
TOTALSUMM FLOAT,
USERNAME VARCHAR(100),
CLIENTNAME VARCHAR(100))
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE SENDEVENT(AEVENT VARCHAR(50))
 AS
 BEGIN EXIT; END
^


/* Create index... */
SET TERM ; ^

CREATE DESC INDEX IDX_DOCUMENT_CHEQUENUMBER ON DOCUMENT(CHEQUENUMBER);

CREATE DESC INDEX IDX_DOCUMENT_ECRSESSION ON DOCUMENT(ECRSESSION);

CREATE DESC INDEX IDX_DOCUMENT_OPEN_NUMBSESSRMKID ON DOCUMENT(OPENRMKID, OPENSESSION, OPENDOCNUMBER);

CREATE INDEX IDX_DOCUMENT_SAVED_ID ON DOCUMENT(SAVED, ID);

CREATE INDEX IDX_POSN_TRZT_ASC ON TRANZT(POSNUMBER, TRANZCOUNT);

CREATE DESC INDEX IDX_POSN_TRZT_DESC ON TRANZT(POSNUMBER, TRANZCOUNT);


/* Alter index (Drop, Create)... */
RECONNECT;

/* Drop: TRANZT_TYPE (TIdxData) */
DROP INDEX TRANZT_TYPE;

CREATE INDEX TRANZT_TYPE ON TRANZT(TRANZTYPE, DOCUMENTID);

/* Create Exception... */
CREATE EXCEPTION E_TRY_CREATE_DUP_DOCKIND '        ';

/* Create Primary Key... */

ALTER TABLE HALL ADD CONSTRAINT PK_HALL PRIMARY KEY (ID);

ALTER TABLE HALLPLACE ADD CONSTRAINT PK_HALLPLACE PRIMARY KEY (ID);

/* Create Unique... */
ALTER TABLE HALL ADD CONSTRAINT UNQ_HALL_CODE UNIQUE (CODE);

ALTER TABLE HALLPLACE ADD CONSTRAINT UNQ_HALLPLACE_CODE UNIQUE (HALLID, CODE);

ALTER TABLE REPORTFILTER ADD CONSTRAINT UNQ_REPORTFILTER UNIQUE (NREPORT, RMKID);

/* Create Foreign Key... */
RECONNECT;

ALTER TABLE COUNTERD ADD CONSTRAINT FK_CNTD_DOCUMENT FOREIGN KEY (DOCUMENTID) REFERENCES DOCUMENT (ID) ON DELETE SET NULL;

ALTER TABLE DOCUMENT ADD CONSTRAINT FK_DOCUMENT_HALLPLACE FOREIGN KEY (HALLPLACEID) REFERENCES HALLPLACE (ID) ON DELETE SET NULL;

ALTER TABLE HALLPLACE ADD CONSTRAINT FK_HALLPLACE_HALL FOREIGN KEY (HALLID) REFERENCES HALL (ID) ON DELETE CASCADE;

ALTER TABLE REMAIND ADD CONSTRAINT FK_REMAIND_DOCUMENT FOREIGN KEY (DOCUMENTID) REFERENCES DOCUMENT (ID) ON DELETE SET NULL;

ALTER TABLE RMK ADD CONSTRAINT FK_RMK_HALL FOREIGN KEY (HALLID) REFERENCES HALL (ID);

ALTER TABLE SECURITY ADD CONSTRAINT FK_SECURITY_PROFILE FOREIGN KEY (PROFILEID) REFERENCES PROFILE (ID) ON DELETE CASCADE;

ALTER TABLE TRANZT ADD CONSTRAINT FK_TRANZT_DOCUMENT FOREIGN KEY (DOCUMENTID) REFERENCES DOCUMENT (ID) ON DELETE CASCADE;

ALTER TABLE TRAUTH ADD CONSTRAINT FK_TRAUTH_DOCUMENT FOREIGN KEY (DOCUMENTID) REFERENCES DOCUMENT (ID) ON DELETE CASCADE; 

/* Alter Procedure... */
/* empty dependent procedure body */
/* Clear: APPENDCCARDDISCS for: APPENDCOUNTERBYTYPE */
SET TERM ^ ;

ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter (APPENDCOUNTERBYTYPE) */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
declare variable countertypeid integer;
declare variable counterid integer;
declare variable cid integer;
declare variable countercode integer;
BEGIN

  SELECT ID
  FROM COUNTERTYPE
  WHERE :ICOUNTERTYPE = CODE
  INTO :COUNTERTYPEID;

  IF (:COUNTERTYPEID IS NULL) THEN
  BEGIN
    ERRORCODE = 28;
    EXIT;
  END
  ELSE
  BEGIN
    CID = NULL;
    FOR
      SELECT C.ID
      FROM COUNTER C
      JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
      JOIN CCARDCOUNTER CC ON CC.COUNTERID = C.ID
      WHERE CT.CODE = :ICOUNTERTYPE  AND CC.CCARDID = :ICARDID
      INTO :COUNTERID
    DO
    BEGIN
      IF (CID IS NULL) THEN
      BEGIN
        DELETE FROM COUNTERD
        WHERE COUNTERID = :COUNTERID;
      END

      CID = 0;

      UPDATE COUNTER SET
        VAL = :ICOUNTERVAL,
        DATECREATE = CURRENT_DATE + CURRENT_TIME
      WHERE ID = :COUNTERID;
    END

    IF (:CID IS NULL) THEN
    BEGIN
      COUNTERID = GEN_ID(GID, 1);

      SELECT MAX(CODE)
      FROM COUNTER
      WHERE :COUNTERTYPEID = COUNTERTYPEID
      INTO :COUNTERCODE;

      IF (:COUNTERCODE IS NULL) THEN
        COUNTERCODE = 0;

      INSERT INTO COUNTER(ID, CODE, VAL, COUNTERTYPEID)
      VALUES (:COUNTERID, :COUNTERCODE + 1, :ICOUNTERVAL, :COUNTERTYPEID);

      INSERT INTO CCARDCOUNTER(CCARDID, COUNTERID)
      VALUES (:ICARDID, :COUNTERID);
    END

  END
END
^

/* Alter (APPENDGESTCLIENT) */
ALTER PROCEDURE APPENDGESTCLIENT(ICARD VARCHAR(100),
ITYPE INTEGER,
IVALUE VARCHAR(100),
INAME VARCHAR(100),
IGRPACTDISC INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE DRNAME VARCHAR(30);
DECLARE VARIABLE OLDDISCRATEVAL DOUBLE PRECISION;
DECLARE VARIABLE OLDDISCRATETYPE INTEGER;
DECLARE VARIABLE CARDLEN INTEGER;
BEGIN

  SELECT FIRST 1 AD.ID, AD.DISCRATEID, DR.VAL, DR."TYPE"
  FROM ACTDISC AD
    JOIN CONDITION C ON AD.CONDITIONID = C.ID
    JOIN DISCRATE DR ON DR.ID = AD.DISCRATEID
  WHERE (C.CARDPREFIXBEG = ADDRIGHT(:ICARD, 1, 40)) AND (C.CARDPREFIXEND = ADDRIGHT(:ICARD, 255, 40))
  INTO ACTDISCID, DISCRATEID, OLDDISCRATEVAL, OLDDISCRATETYPE;

  IF (DISCRATEID IS NULL) THEN
  BEGIN
    DISCRATEID = GEN_ID(GID, 1);
    IF (ITYPE = 0) THEN DRNAME = '-'||IVALUE||'%';
    IF (ITYPE = 1) THEN  DRNAME = '-'||IVALUE;
    IF (ITYPE = 2) THEN  DRNAME = '+'||IVALUE||'%';
    IF (ITYPE = 3) THEN  DRNAME = '+'||IVALUE;
    
    INSERT INTO DISCRATE (ID, CODE, NAME, PARENTID, ISFOLDER, "TYPE", VAL, DESTINATION, KIND)
    SELECT :DISCRATEID, NULLTOINT(MAX(CODE)) + 1, :DRNAME, 0, 0, :ITYPE, :IVALUE, 1, 2 FROM DISCRATE;

    IF (ACTDISCID IS NULL) THEN
    BEGIN
      CARDLEN = LEN(ICARD);
      CONDITIONID = GEN_ID(GID, 1);
      INSERT INTO CONDITION (ID, CARDPREFIXBEG, CARDPREFIXEND, CARDSTATE, CARDLENBEG, CARDLENEND, SEX)
      VALUES (:CONDITIONID,  :ICARD,  :ICARD, 1, :CARDLEN, :CARDLEN, 0);

      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, NAME, GRPACTDISCID, PRIORITY, DISCRATEID, CONDITIONID)
        SELECT :ACTDISCID, NULLTOINT(MAX(CODE)) + 1, :INAME, :IGRPACTDISC, 0, :DISCRATEID, :CONDITIONID
        FROM ACTDISC;
    END
  END
  ELSE
  BEGIN
    IF ((OLDDISCRATEVAL <> IVALUE) OR (OLDDISCRATETYPE <> :ITYPE))  THEN
    BEGIN
      IF (ITYPE = 0) THEN DRNAME = '-'||IVALUE||'%';
      IF (ITYPE = 1) THEN  DRNAME = '-'||IVALUE;
      IF (ITYPE = 2) THEN  DRNAME = '+'||IVALUE||'%';
      IF (ITYPE = 3) THEN  DRNAME = '+'||IVALUE;
      UPDATE DISCRATE SET VAL = :IVALUE, NAME = :DRNAME, "TYPE" = :ITYPE WHERE ID = :DISCRATEID;
    END
  END
END
^

/* Alter (APPENDGRPACTDISC) */
ALTER PROCEDURE APPENDGRPACTDISC(ICODE INTEGER,
INAME VARCHAR(100),
IACTV INTEGER,
IDISCCOLLOPER INTEGER,
IDEPENDOTHERPOS INTEGER,
IDISCRATEGRPCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
DECLARE VARIABLE GRPDISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
DECLARE VARIABLE DESTINATION INTEGER;
DECLARE VARIABLE WAREID INTEGER;
BEGIN

  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :ICODE
  INTO ID;

  IF (ID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO GRPACTDISC
      (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
    VALUES
      (:ID, :ICODE, :INAME, :IACTV, :IDEPENDOTHERPOS, :IDELETED);
  END
  ELSE
  UPDATE GRPACTDISC SET
    CODE = :ICODE,
    NAME = :INAME,
    ACTV = :IACTV,
    DEPENDOTHERPOS = :IDEPENDOTHERPOS,
    DELETED = :IDELETED
  WHERE ID = :ID;

  IF (IDISCRATEGRPCODE IS NOT NULL) THEN
  BEGIN
    SELECT ID
    FROM DISCRATE
    WHERE CODE = :IDISCRATEGRPCODE
    INTO GRPDISCRATEID;

    IF (GRPDISCRATEID IS NULL) THEN
      INSERT INTO DISCRATE (ID, PARENTID, CODE, NAME, TEXT,
                            ISFOLDER, DISCCOLLOPER)
      VALUES (GEN_ID(GID, 1), :IDISCRATEPARENTID, :IDISCRATEGRPCODE, :INAME, :INAME,
                            1, :IDISCCOLLOPER);
    ELSE
    UPDATE DISCRATE SET
      PARENTID = :IDISCRATEPARENTID,
      CODE = :IDISCRATEGRPCODE,
      NAME = :INAME,
      TEXT = :INAME,
      ISFOLDER = 1,
      DISCCOLLOPER = :IDISCCOLLOPER
    WHERE ID = :GRPDISCRATEID;
  END

  IF (IDESTINATION = 0) THEN
  BEGIN
    DESTINATION = IDESTINATION;
    WAREID = -1;
    SELECT COUNT(ID)
    FROM ACTDISCOBJ
    WHERE GRPACTDISCID = :ID AND WAREID <> 0
    INTO ACTDISCOBJID;
  END

  IF (IDESTINATION = 1) THEN
  BEGIN
    DESTINATION = IDESTINATION;
    WAREID = -1;
    SELECT COUNT(ID)
    FROM ACTDISCOBJ
    WHERE GRPACTDISCID = :ID AND WAREID = -1
    INTO ACTDISCOBJID;
  END

  IF (IDESTINATION = 2) THEN
  BEGIN
    DESTINATION = 0;
    WAREID = 0;
    SELECT COUNT(ID)
    FROM ACTDISCOBJ
    WHERE GRPACTDISCID = :ID AND WAREID = 0
    INTO ACTDISCOBJID;
  END

  IF (ACTDISCOBJID = 0) THEN
    INSERT INTO ACTDISCOBJ (ID, CLIENTID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID,
                            ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID, PAYMENTID,
                            DISCRATEID, ACTSCRIPTID, GRPACTDISCID, CARDID)
    VALUES (GEN_ID(GID, 1), -1, :WAREID, NULL, NULL, NULL, NULL, NULL, -1, NULL, NULL, :ID, -1);

  UPDATE DISCRATE DR SET
    DR.DESTINATION = :DESTINATION
  WHERE DR.ID IN (SELECT AD.DISCRATEID FROM ACTDISC AD WHERE AD.GRPACTDISCID = :ID);
END
^

/* Alter (APPENDUSER) */
ALTER PROCEDURE APPENDUSER(ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IPROFILECODE INTEGER,
IPSWRD VARCHAR(50),
ICARD VARCHAR(255),
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
declare variable profileid integer;
declare variable id integer;
declare variable base integer;
BEGIN
  ERRORCODE = 0;

  SELECT ID, BASE
  FROM PROFILE
  WHERE CODE = :IPROFILECODE
  INTO PROFILEID, :BASE;

  IF (PROFILEID IS NULL) THEN
    BEGIN
      ERRORCODE = 22;
      EXIT;
    END

  SELECT ID
  FROM "USER"
  WHERE CODE = :ICODE
  INTO ID;

  IF (ID IS NULL) THEN
    BEGIN
      IF (:BASE = 1) THEN
      BEGIN
        ERRORCODE = 30;
        EXIT;
      END
      INSERT INTO "USER"
           (ID, CODE, NAME, TEXT, PROFILEID, PSWRD, CARD, DELETED)
      VALUES
           (GEN_ID(GID, 1), :ICODE, :INAME, :ITEXT, :PROFILEID, :IPSWRD, :ICARD, :IDELETED);
    END
  ELSE
    BEGIN
      BASE = NULL;
      SELECT P.BASE
      FROM PROFILE P
      JOIN "USER" U ON U.PROFILEID = P.ID
      WHERE U.ID = :ID
      INTO :BASE;

      IF (:BASE = 1) THEN
      BEGIN
        ERRORCODE = 31;
        EXIT;
      END
      UPDATE "USER"
      SET
        NAME = :INAME, 
        TEXT = :ITEXT,
        PROFILEID = :PROFILEID,
        PSWRD = :IPSWRD,
        CARD = :ICARD,
        DELETED = :IDELETED
      WHERE
        ID = :ID;
    END
END
^

/* Alter (CANCELSTORED) */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 AS
DECLARE VARIABLE TRANZCOUNT INTEGER;
DECLARE VARIABLE RMKID INTEGER;
DECLARE VARIABLE DOCID INTEGER;
DECLARE VARIABLE WARECODE INTEGER;
DECLARE VARIABLE WAREMARK VARCHAR(100);
DECLARE VARIABLE TRANZTYPE INTEGER;
DECLARE VARIABLE QUANTITY INTEGER;
DECLARE VARIABLE ASPSCHEMECODE INTEGER;
DECLARE VARIABLE ASPSCHEMEID INTEGER;
DECLARE VARIABLE ASPVAL1 INTEGER;
DECLARE VARIABLE ASPVAL2 INTEGER;
DECLARE VARIABLE ASPVAL3 INTEGER;
DECLARE VARIABLE ASPVAL4 INTEGER;
DECLARE VARIABLE ASPVAL5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
DECLARE VARIABLE TRID INTEGER;
DECLARE VARIABLE USERCODE INTEGER;
DECLARE VARIABLE TMPID INTEGER;
BEGIN

  SELECT ID
  FROM RMK R
  WHERE R.CODE = :APOSNUMBER
  INTO RMKID;

  SELECT CODE
  FROM "USER"
  WHERE ID = :ASELLERID
  INTO USERCODE;

  EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES TRANZCOUNT;

  FOR
    SELECT ID
    FROM DOCUMENT D
    WHERE D.RMKID = :RMKID AND D.STATE = 3 AND NOT EXISTS(SELECT 1 FROM TRAUTH TR WHERE TR.DOCUMENTID = D.ID)
    INTO DOCID
    DO
    BEGIN
         --    11  12, -   
      FOR
        SELECT WARECODE, WAREMARK, TRANZTYPE, QUANTITY,
        ASPECTSCHEME, ASPECTVALUE1, ASPECTVALUE2, ASPECTVALUE3, ASPECTVALUE4, ASPECTVALUE5
        FROM TRANZT T
        LEFT JOIN SPRT S ON S.CODE = T.WARECODE
        WHERE TRANZTYPE IN (11,12) AND T.DOCUMENTID = :DOCID
      INTO WARECODE, WAREMARK, TRANZTYPE, QUANTITY, ASPSCHEMECODE, ASPVAL1, ASPVAL2, ASPVAL3, ASPVAL4, ASPVAL5
      DO
      BEGIN
        WAREID = NULL;
        FLAGS = NULL;
           --  ID    
        IF (AWARECODETOMARK = 0) THEN
        BEGIN
          SELECT ID, FLAGS
          FROM SPRT
          WHERE CODE = :WARECODE
          INTO WAREID, FLAGS;
        END
        ELSE
        BEGIN
          SELECT FIRST 1 ID, FLAGS
          FROM SPRT
          WHERE MARK = :WAREMARK
          INTO :WAREID, :FLAGS;
        END
        --          ,  -
        IF (:ACONTROLSALEREMAIN = 1 OR :ACONTROLSALEREMAIN = 2 AND :FLAGS/64 <> (:FLAGS/32)/2.0) THEN
        BEGIN
          ASPSCHEMEID = NULL;
          SELECT ID
          FROM ASPSCHM
          WHERE CODE = :ASPSCHEMECODE
          INTO :ASPSCHEMEID;

          REMAINID = NULL;
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL1 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 1)) AND
          R.ASPECTVALUE2ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL2 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 2)) AND
          R.ASPECTVALUE3ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL3 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 3)) AND
          R.ASPECTVALUE4ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL4 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 4)) AND
          R.ASPECTVALUE5ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL5 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 5)) AND
          R.WAREID = :WAREID AND
          R.REMAIN IS NOT NULL
          INTO
          REMAINID;

          IF (:REMAINID IS NULL) THEN
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = 0 AND
          R.ASPECTVALUE2ID = 0 AND
          R.ASPECTVALUE3ID = 0 AND
          R.ASPECTVALUE4ID = 0 AND
          R.ASPECTVALUE5ID = 0 AND
          R.WAREID = :WAREID
          INTO
          REMAINID;

          IF (:REMAINID IS NOT NULL) THEN
          INSERT INTO REMAIND (
           ID, REMAINID, DELTA, DOCUMENTID)
          VALUES (
           GEN_ID(GREMAIND, 1), :REMAINID, -:QUANTITY, :DOCID);
        END
      END

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID AND TRANZTYPE = 54
        INTO TMPID
        DO
          UPDATE TRANZT T SET
            TRANZDATE = :ATRANZDATE,
            TRANZHOUR = :ATRANZHOUR,
            TRANZTIME = :ATRANZTIME,
            TRANZTYPE = 57,
            T.SELLER = :USERCODE
          WHERE ID = :TMPID;

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID
        ORDER BY ID
        INTO TRID
        DO
        BEGIN
          UPDATE TRANZT SET
            TRANZCOUNT = :TRANZCOUNT
          WHERE ID = :TRID;
          TRANZCOUNT = TRANZCOUNT + 1;
        END

      DELETE FROM COUNTERD CD WHERE CD.DOCUMENTID = :DOCID;
      UPDATE DOCUMENT D SET
        STATE = 2,
        CLOSEDATE = :ATRANZDATE,
        CLOSETIME = :ATRANZTIME,
        CLOSEUSERID = :ASELLERID,
        SAVED = :ASAVED
      WHERE ID = :DOCID;
    END
END
^

/* Alter (CHANGEWAREAMOUNT) */
ALTER PROCEDURE CHANGEWAREAMOUNT(WAREID INTEGER,
DELTA DOUBLE PRECISION,
DOCUMENTID INTEGER)
 AS
DECLARE VARIABLE REMAINID INTEGER;
BEGIN
  SELECT R.ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    R.ASPECTVALUE1ID = 0 AND
    R.ASPECTVALUE2ID = 0 AND
    R.ASPECTVALUE3ID = 0 AND
    R.ASPECTVALUE4ID = 0 AND
    R.ASPECTVALUE5ID = 0
  INTO :REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
      REMAINID = GEN_ID(GID, 1);
      INSERT INTO REMAIN
      (ID, WAREID, REMAIN, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID)
      VALUES
      (:REMAINID, :WAREID, 0, 0, 0, 0, 0, 0);
  END

  INSERT INTO REMAIND (ID, DELTA, REMAINID, DOCUMENTID)
  VALUES
  (GEN_ID(GREMAIND, 1), :DELTA, :REMAINID, :DOCUMENTID);
END
^

/* empty dependent procedure body */
/* Clear: GET_ACTSCRIPT for: GET_ACTSCRIPT_CUSTOM */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN EXIT; END
^

/* Alter (GET_ACTSCRIPT_CUSTOM) */
ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
DECLARE VARIABLE CARD VARCHAR(255);
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
      AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
      AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND

      (
       NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                       AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:REGDATE,
                     AC.REGDATECOND,
                     AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                     AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

      (
       NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                       AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:MEMDATE,
                     AC.MEMDATECOND,
                     AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                     AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
      (
       NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                         AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:BIRTHDATE,
                     AC.BIRTHDATECOND,
                     AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                     AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

      (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
      (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
      (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
      (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
      (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
      (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)
    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    DO
      SUSPEND;

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    FOR
      SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
        AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
        AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
      WHERE
        ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND

        (
         NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                         AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:REGDATE,
                       AC.REGDATECOND,
                       AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                       AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

        (
         NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                         AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:MEMDATE,
                       AC.MEMDATECOND,
                       AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                       AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
        (
         NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                           AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:BIRTHDATE,
                       AC.BIRTHDATECOND,
                       AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                       AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

        (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
        (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
        (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
        (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
        (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
        (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
     PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
     ORDER BY GD.CODE, AD.PRIORITY
     INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
     DO
        SUSPEND;

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  PRIORITY = 0;
  WAREID = NULL;
  FORMULA1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  FORMULA2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  FORMULA3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTSCRIPT ACS ON ACS.ID = A.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
  INTO DATA, CODE
  DO
    SUSPEND;

END
^

/* empty dependent procedure body */
/* Clear: GET_DISCOUNT for: GET_DISCOUNT_CUSTOM */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN EXIT; END
^

/* Alter (GET_DISCOUNT_CUSTOM) */
ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3, AR.CODE,
      (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID), AR.WAREID
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (
       NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                       AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:REGDATE,
                     AC.REGDATECOND,
                     AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                     AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

      (
       NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                       AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:MEMDATE,
                     AC.MEMDATECOND,
                     AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                     AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
      (
       NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                         AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:BIRTHDATE,
                     AC.BIRTHDATECOND,
                     AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                     AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

      (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
      (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
      (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
      (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
      (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
      (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)

    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,DISCRATECODE,CARD, DISCRATEWAREID
    DO
      SUSPEND;

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    FOR
      SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
        QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID,AR.BEGVAL,AR.ENDVAL,
        AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3,AR.CODE, AR.WAREID
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
      WHERE
        (
         NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                         AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:REGDATE,
                       AC.REGDATECOND,
                       AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                       AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

        (
         NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                         AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:MEMDATE,
                       AC.MEMDATECOND,
                       AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                       AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
        (
         NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                           AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:BIRTHDATE,
                       AC.BIRTHDATECOND,
                       AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                       AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

        (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
        (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
        (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
        (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
        (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
        (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND

        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
      ORDER BY GD.CODE, AD.PRIORITY
      INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,DISCRATECODE, DISCRATEWAREID
      DO
        SUSPEND;

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  VAL = NULL;
  WAREID = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;
  "TYPE" = NULL;
  TEXT = NULL;
  CODE = NULL;
  CARDPREFIXBEG = NULL;
  CARDPREFIXEND = NULL;
  DEPENDOTHERPOS = NULL;
  BEGVAL = NULL;
  ENDVAL = NULL;
  FORMULA1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  FORMULA2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  FORMULA3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  PRIORITY = 0;
  CARD = NULL;

  FOR
    SELECT AR.VAL, AR.WAREID, AR."TYPE", AR.NAME, AR.TEXT,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AR.CODE, (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID)
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN DISCRATE AR ON AR.ID = A.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
--    PLAN SORT (JOIN (JOIN (AR NATURAL,A INDEX (IDX_ACTDISCOBJ2,FK_ADO_DISCRATE))))
  INTO VAL, DISCRATEWAREID,"TYPE",NAME, TEXT,PARENTID, BEGVAL, ENDVAL, DISCRATECODE, CARD
  DO
    SUSPEND;
END
^

/* Alter (GET_RMKDEVICE) */
ALTER PROCEDURE GET_RMKDEVICE(RMKID INTEGER,
DEVICEID INTEGER)
 RETURNS(RES INTEGER)
 AS
DECLARE VARIABLE ISFOLDER INTEGER;
BEGIN
  SELECT ISFOLDER
  FROM DEVICES D
  WHERE D.ID = :DEVICEID
  INTO ISFOLDER;

  IF (ISFOLDER = 1) THEN
    SELECT FIRST 1 RD.DEVICEID
    FROM RMKDEV RD JOIN DEVICES D ON D.ID = RD.DEVICEID
    WHERE D.PARENTID = :DEVICEID AND RD.RMKID = :RMKID
    ORDER BY D.CODE
    INTO RES;
    ELSE
      RES = DEVICEID;

  SUSPEND;
END
^

/* Alter (INSTRANZCOPY) */
ALTER PROCEDURE INSTRANZCOPY(AIDTRANZ INTEGER,
ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
ATRANZTYPE INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ATRANZCOUNTREF INTEGER)
 RETURNS(TRANZCOUNT INTEGER)
 AS
BEGIN
/*
  SELECT MAX(TRANZCOUNT) + 1
  FROM TRANZT
  WHERE POSNUMBER = :APOSNUMBER
  INTO TRANZCOUNT;
  IF (TRANZCOUNT IS NULL) THEN
    TRANZCOUNT = 1;

  INSERT INTO TRANZT (
    ID, ASPECTSCHEME, ASPECTVALUE1, ASPECTVALUE2, ASPECTVALUE3,
    ASPECTVALUE4, ASPECTVALUE5, CHEQUENUMBER, CHEQUETYPE,
    CURRENCY, ECRNUMBER, ECRSESSION, EDUCATION,
    IDENTIF, IMID, INFO, INFOSTR, ISRET, POSID,
    POSNUMB, POSNUMBER, PRICE, PRICEWD, PRNONECR,
    QUANTITY, RESTORED, SELLER, SUMM, SUMMDISCPOS,
    SUMMDISCREC, SUMMWD, TRANZCOUNT, TRANZCOUNTREF,
    TRANZDATE, TRANZHOUR, TRANZTIME, TRANZTYPE,
    WARECODE, WAREMARK)
  SELECT GEN_ID(GTRANZT, 1), T.ASPECTSCHEME, T.ASPECTVALUE1, T.ASPECTVALUE2, T.ASPECTVALUE3,
    T.ASPECTVALUE4, T.ASPECTVALUE5, T.CHEQUENUMBER, T.CHEQUETYPE,
    T.CURRENCY, T.ECRNUMBER, T.ECRSESSION, T.EDUCATION,
    T.IDENTIF, T.IMID, T.INFO, T.INFOSTR, T.ISRET, T.POSID,
    T.POSNUMB, :APOSNUMBER, T.PRICE, T.PRICEWD, T.PRNONECR,
    T.QUANTITY, T.RESTORED, :ASELLERID, T.SUMM, T.SUMMDISCPOS,
    T.SUMMDISCREC, T.SUMMWD, :TRANZCOUNT, :ATRANZCOUNTREF,
    :ATRANZDATE, :ATRANZHOUR, :ATRANZTIME, :ATRANZTYPE,
    T.WARECODE, T.WAREMARK
  FROM TRANZT T
  WHERE T.ID = :AIDTRANZ;
*/
END
^

/* Restore proc. body: APPENDCCARDDISCS */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), -1, -1, :CARDID, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID)
      RETURNING_VALUES ERRORCODE;
END
^

/* Restore proc. body: APPENDPILOT */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE VARCHAR(20),
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IWARECODETOMARK INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE SPRTCODE INTEGER;
DECLARE VARIABLE SPRTMARK VARCHAR(20);
DECLARE VARIABLE DORMANTVAR INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IWARECODETOMARK = 0) THEN
        BEGIN
          SPRTCODE = :ICODE;
          SPRTMARK = '';
        END
      ELSE
        BEGIN
          SPRTCODE = :ICODE;
          SPRTMARK = :ICODE;
        END

      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:SPRTCODE, NULL, :INAME, :INAME, :SPRTMARK, NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, :IWARECODETOMARK, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            DELETE FROM ACTDISCOBJ WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            IF (IWARECODETOMARK = 0) THEN
              BEGIN
                SELECT ID
                FROM SPRT
                WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
                INTO MAINID;
              END
            ELSE
              BEGIN
                SELECT FIRST 1 ID
                FROM SPRT
                WHERE MARK = :ICODE AND DELETED = :DELETEDSPRT
                INTO MAINID;
              END
            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    DELETE FROM ACTDISCOBJ WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:SPRTCODE, NULL, :INAME, :INAME, :SPRTMARK, NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, :IWARECODETOMARK, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:SPRTCODE, NULL, :INAME, :INAME, :SPRTMARK, NULL, NULL, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, :IWARECODETOMARK, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

/* Restore proc. body: CLEAR_ALL_GARBAGE */
ALTER PROCEDURE CLEAR_ALL_GARBAGE AS
DECLARE VARIABLE TABLENAME VARCHAR(31);
DECLARE VARIABLE RECCOUNT INTEGER;
begin
  FOR
    SELECT RDB$RELATION_NAME FROM RDB$RELATIONS WHERE RDB$SYSTEM_FLAG = 0
    INTO :TABLENAME
  DO
    EXECUTE STATEMENT 'SELECT COUNT(*) FROM "'||:TABLENAME ||'"'
    INTO :RECCOUNT;
end
^

/* Restore proc. body: GET_ACTSCRIPT */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
BEGIN
  ID = 1;

  FOR
    SELECT  CODE, DATA, NULLTONUM(GRPCODE), NULLTONUM(PRIORITY), WAREID,
      SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,
      CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    FROM GET_ACTSCRIPT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
      :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,:IWEEKDAY,
      :IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,:ICARD,
      :ICARDLEN,:IANYCARD,:ICARDSTATE,:IACTEVENT,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY, CODE
    INTO CODE, DATA, GRPCODE, PRIORITY,WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END
END
^

/* Restore proc. body: GET_DISCOUNT */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
BEGIN
  ID = 1;

  FOR
    SELECT NULLTONUM(GRPCODE), VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
           "TYPE", NAME, TEXT,
           CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, NULLTONUM(PRIORITY), PARENTID, BEGVAL, ENDVAL,
           FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
    FROM GET_DISCOUNT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
          :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,
          :IWEEKDAY,:IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,
          :ICARD,:ICARDLEN,:IANYCARD,:ICARDSTATE,:IDESTINATION,
          :IKIND,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID, "TYPE", NAME, TEXT,
         CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, PRIORITY, PARENTID, BEGVAL, ENDVAL,
         FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END

END
^

/* Restore proc. body: GET_TRANZCOUNT */
ALTER PROCEDURE GET_TRANZCOUNT(ARMKID INTEGER)
 RETURNS(TRANZCOUNT INTEGER)
 AS
DECLARE VARIABLE ACODE INTEGER;
BEGIN

  SELECT CODE
  FROM RMK
  WHERE ID = :ARMKID
  INTO ACODE;

  SELECT FIRST 1 NULLTONUM(TRANZCOUNT) + 1
  FROM TRANZT
  WHERE POSNUMBER = :ACODE
  ORDER BY POSNUMBER DESC, TRANZCOUNT DESC
  INTO TRANZCOUNT;

  IF (TRANZCOUNT IS NULL) THEN
    TRANZCOUNT = 1;
END
^

/* Restore proc. body: GETHALLPLACES */
ALTER PROCEDURE GETHALLPLACES(AHALLID INTEGER)
 RETURNS(ID INTEGER,
CODE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
STATE INTEGER,
DOCCOUNT INTEGER,
OPENTIME TIME,
TOTALSUMM FLOAT,
USERNAME VARCHAR(100),
CLIENTNAME VARCHAR(100))
 AS
BEGIN
  FOR SELECT ID, CODE, NAME, TEXT FROM HALLPLACE WHERE HALLID = :AHALLID
  ORDER BY CODE
  INTO :ID, :CODE, :NAME, :TEXT DO
  BEGIN
    SELECT COUNT(ID), SUM(SUMMWD) FROM DOCUMENT WHERE HALLPLACEID = :ID AND STATE IN (0, 3)
    INTO :DOCCOUNT, :TOTALSUMM;

    STATE = DOCCOUNT;

    OPENTIME = NULL;
    USERNAME = NULL;
    CLIENTNAME = NULL;

    IF (DOCCOUNT > 0) THEN
      SELECT FIRST 1 D.OPENTIME, U.NAME, C.NAME
      FROM DOCUMENT D JOIN "USER" U ON U.ID = D.OPENUSERID LEFT JOIN CLIENT C ON C.ID = D.CLIENTID
      WHERE D.HALLPLACEID = :ID AND D.STATE IN (0, 3)
      ORDER BY D.ID
      INTO :OPENTIME, :USERNAME, :CLIENTNAME;

    SUSPEND;
  END

END
^

/* Restore proc. body: SENDEVENT */
ALTER PROCEDURE SENDEVENT(AEVENT VARCHAR(50))
 AS
BEGIN
  POST_EVENT AEVENT;
END
^

/* Create trigger... */
CREATE TRIGGER DEL_AFT_DOCUMENT FOR DOCUMENT
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  POST_EVENT 'DOCUMENTCHANGED';
END
^

CREATE TRIGGER DEL_BEF_DOCUMENT FOR DOCUMENT
ACTIVE BEFORE DELETE POSITION 0 
AS
BEGIN
  IF (OLD.EDUCATION = 1) THEN
  BEGIN
    DELETE FROM REMAIND WHERE DOCUMENTID = OLD.ID;
    DELETE FROM COUNTERD WHERE DOCUMENTID = OLD.ID;
  END
END
^

CREATE TRIGGER INS_AFT_DOCUMENT FOR DOCUMENT
ACTIVE AFTER INSERT POSITION 0 
AS
begin
  POST_EVENT 'DOCUMENTCHANGED';
end
^

CREATE TRIGGER INS_BEF_COUNTER FOR COUNTER
ACTIVE BEFORE INSERT POSITION 0 
AS
begin
  NEW.DATECREATE = CURRENT_DATE + CURRENT_TIME;
end
^

CREATE TRIGGER INS_BEF_DOCKIND FOR DOCKIND
ACTIVE BEFORE INSERT POSITION 0 
AS
begin
  if (NEW.ECRRECEIPTTYPE IN (8, 9, 10)) then
  BEGIN
    IF (EXISTS(SELECT ID FROM DOCKIND WHERE ECRRECEIPTTYPE = NEW.ECRRECEIPTTYPE)) THEN
      EXCEPTION E_TRY_CREATE_DUP_DOCKIND;
  END
end
^

CREATE TRIGGER UPD_AFT_DOCUMENT FOR DOCUMENT
ACTIVE AFTER UPDATE POSITION 0 
AS
BEGIN
  IF ((OLD.STATE = NEW.STATE) AND (NULLTOINT(OLD.HALLPLACEID) = NULLTOINT(NEW.HALLPLACEID))) THEN EXIT;

  /*  .   */
  IF (NEW.STATE = 0) THEN
    DELETE FROM TRANZT WHERE DOCUMENTID = OLD.ID;

  POST_EVENT 'DOCUMENTCHANGED';

END
^

CREATE TRIGGER UPD_BEF_DOCKIND FOR DOCKIND
ACTIVE BEFORE UPDATE POSITION 0 
AS
BEGIN
  IF (NEW.ECRRECEIPTTYPE IN (8, 9, 10)) THEN
  BEGIN
    IF (EXISTS(SELECT ID FROM DOCKIND WHERE (ID <> NEW.ID) AND (ECRRECEIPTTYPE = NEW.ECRRECEIPTTYPE))) THEN
      EXCEPTION E_TRY_CREATE_DUP_DOCKIND;
  END
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_AFT_RMK0
AS
BEGIN
  INSERT INTO MONEYBOX (ID, CURRENCYID, RMKID, VAL)
  SELECT GEN_ID(GID, 1), C.ID, NEW.ID, 0
  FROM CURRENCY C;

END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_BEF_TRANZT0
AS
DECLARE VARIABLE DSTATE INTEGER;
DECLARE VARIABLE RMKID INTEGER;
BEGIN

  SELECT STATE FROM DOCUMENT WHERE ID = NEW.DOCUMENTID INTO :DSTATE;

  /*     */
  IF (DSTATE IN (1, 2)) THEN
  BEGIN
    SELECT RMKID
    FROM DOCUMENT D
    WHERE D.ID = NEW.DOCUMENTID
    INTO RMKID;
    EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES NEW.TRANZCOUNT;
  END

  IF (NEW.WAREMARK IS NULL) THEN
    NEW.WAREMARK = '';
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GDOC, 1);
END
^

/* Drop generator... */
SET TERM ; ^

DROP GENERATOR GNREPORT;

DROP GENERATOR GTRANZT;

DROP GENERATOR GTRAUTH;


/* Alter Procedure... */
/* Alter (APPENDCCARDDISCS) */
SET TERM ^ ;

ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), -1, -1, :CARDID, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID)
      RETURNING_VALUES ERRORCODE;
END
^

/* Alter (GET_ACTSCRIPT) */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
BEGIN
  ID = 1;

  FOR
    SELECT  CODE, DATA, NULLTONUM(GRPCODE), NULLTONUM(PRIORITY), WAREID,
      SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,
      CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    FROM GET_ACTSCRIPT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
      :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,:IWEEKDAY,
      :IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,:ICARD,
      :ICARDLEN,:IANYCARD,:ICARDSTATE,:IACTEVENT,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY, CODE
    INTO CODE, DATA, GRPCODE, PRIORITY,WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END
END
^

/* Alter (GET_DISCOUNT) */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
BEGIN
  ID = 1;

  FOR
    SELECT NULLTONUM(GRPCODE), VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
           "TYPE", NAME, TEXT,
           CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, NULLTONUM(PRIORITY), PARENTID, BEGVAL, ENDVAL,
           FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
    FROM GET_DISCOUNT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
          :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,
          :IWEEKDAY,:IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,
          :ICARD,:ICARDLEN,:IANYCARD,:ICARDSTATE,:IDESTINATION,
          :IKIND,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID, "TYPE", NAME, TEXT,
         CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, PRIORITY, PARENTID, BEGVAL, ENDVAL,
         FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END

END
^

SET TERM ; ^


RECONNECT;

ALTER TABLE TRAUTH DROP CONSTRAINT UNQ_TRAUTH;

RECONNECT;

ALTER TABLE TRANZT DROP CONSTRAINT UNQ_TRANZT;

RECONNECT;

ALTER TABLE TRANZT DROP CHEQUENUMBER;

ALTER TABLE TRANZT DROP CHEQUETYPE;

ALTER TABLE TRANZT DROP ISRET;

ALTER TABLE TRANZT DROP IMID;

ALTER TABLE TRANZT DROP ECRSESSION;

ALTER TABLE TRANZT DROP TRANZCOUNTREF;

ALTER TABLE TRANZT DROP EDUCATION;

ALTER TABLE TRANZT DROP IDENTIF;

ALTER TABLE TRANZT DROP DOCKINDCODE;

ALTER TABLE TRANZT DROP RESTORED;

ALTER TABLE TRANZT DROP SAVED;

ALTER TABLE TRANZT DROP CHQTRANZCOUNT;

ALTER TABLE TRAUTH DROP TRANZCOUNT;

ALTER TABLE TRAUTH DROP ECRCHEQUENUMBER;

ALTER TABLE TRAUTH DROP ECRSESSIONNUMBER;

ALTER TABLE TRAUTH DROP RESTORED;

ALTER TABLE TRAUTH DROP POSNUMBER;

RECONNECT;

/* Positioning */


ALTER TABLE COUNTER ALTER COLUMN ID POSITION 1;

ALTER TABLE COUNTER ALTER COLUMN CODE POSITION 2;

ALTER TABLE COUNTER ALTER COLUMN VAL POSITION 3;

ALTER TABLE COUNTER ALTER COLUMN COUNTERTYPEID POSITION 4;

ALTER TABLE COUNTER ALTER COLUMN DATECREATE POSITION 5;

ALTER TABLE COUNTERD ALTER COLUMN ID POSITION 1;

ALTER TABLE COUNTERD ALTER COLUMN COUNTERID POSITION 2;

ALTER TABLE COUNTERD ALTER COLUMN DELTA POSITION 3;

ALTER TABLE COUNTERD ALTER COLUMN DELTADATE POSITION 4;

ALTER TABLE COUNTERD ALTER COLUMN DOCUMENTID POSITION 5;

ALTER TABLE PROFILE ALTER COLUMN ID POSITION 1;

ALTER TABLE PROFILE ALTER COLUMN CODE POSITION 2;

ALTER TABLE PROFILE ALTER COLUMN NAME POSITION 3;

ALTER TABLE PROFILE ALTER COLUMN DELETED POSITION 4;

ALTER TABLE PROFILE ALTER COLUMN BASE POSITION 5;

ALTER TABLE REMAIND ALTER COLUMN ID POSITION 1;

ALTER TABLE REMAIND ALTER COLUMN REMAINID POSITION 2;

ALTER TABLE REMAIND ALTER COLUMN DELTA POSITION 3;

ALTER TABLE REMAIND ALTER COLUMN DOCUMENTID POSITION 4;

ALTER TABLE REPORTFILTER ALTER COLUMN ID POSITION 1;

ALTER TABLE REPORTFILTER ALTER COLUMN NREPORT POSITION 2;

ALTER TABLE REPORTFILTER ALTER COLUMN RMKID POSITION 3;

ALTER TABLE REPORTFILTER ALTER COLUMN MININNERDOCORDER POSITION 4;

ALTER TABLE REPORTFILTER ALTER COLUMN MAXINNERDOCORDER POSITION 5;

ALTER TABLE RMK ALTER COLUMN ID POSITION 1;

ALTER TABLE RMK ALTER COLUMN CODE POSITION 2;

ALTER TABLE RMK ALTER COLUMN NAME POSITION 3;

ALTER TABLE RMK ALTER COLUMN TEXT POSITION 4;

ALTER TABLE RMK ALTER COLUMN EDUCATIONMODE POSITION 5;

ALTER TABLE RMK ALTER COLUMN RMKVERSION POSITION 6;

ALTER TABLE RMK ALTER COLUMN HALLID POSITION 7;

ALTER TABLE RMK ALTER COLUMN AUTOREGUSERID POSITION 8;

ALTER TABLE TRANZT ALTER COLUMN ID POSITION 1;

ALTER TABLE TRANZT ALTER COLUMN DOCUMENTID POSITION 2;

ALTER TABLE TRANZT ALTER COLUMN TRANZCOUNT POSITION 3;

ALTER TABLE TRANZT ALTER COLUMN TRANZDATE POSITION 4;

ALTER TABLE TRANZT ALTER COLUMN TRANZTIME POSITION 5;

ALTER TABLE TRANZT ALTER COLUMN TRANZHOUR POSITION 6;

ALTER TABLE TRANZT ALTER COLUMN TRANZTYPE POSITION 7;

ALTER TABLE TRANZT ALTER COLUMN SELLER POSITION 8;

ALTER TABLE TRANZT ALTER COLUMN WARECODE POSITION 9;

ALTER TABLE TRANZT ALTER COLUMN WAREMARK POSITION 10;

ALTER TABLE TRANZT ALTER COLUMN ASPECTSCHEME POSITION 11;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE1 POSITION 12;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE2 POSITION 13;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE3 POSITION 14;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE4 POSITION 15;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE5 POSITION 16;

ALTER TABLE TRANZT ALTER COLUMN PRICE POSITION 17;

ALTER TABLE TRANZT ALTER COLUMN QUANTITY POSITION 18;

ALTER TABLE TRANZT ALTER COLUMN SUMM POSITION 19;

ALTER TABLE TRANZT ALTER COLUMN PRICEWD POSITION 20;

ALTER TABLE TRANZT ALTER COLUMN SUMMWD POSITION 21;

ALTER TABLE TRANZT ALTER COLUMN INFO POSITION 22;

ALTER TABLE TRANZT ALTER COLUMN INFOSTR POSITION 23;

ALTER TABLE TRANZT ALTER COLUMN BARCODE POSITION 24;

ALTER TABLE TRANZT ALTER COLUMN FACTOR POSITION 25;

ALTER TABLE TRANZT ALTER COLUMN CURRENCY POSITION 26;

ALTER TABLE TRANZT ALTER COLUMN PRNONECR POSITION 27;

ALTER TABLE TRANZT ALTER COLUMN ECRNUMBER POSITION 28;

ALTER TABLE TRANZT ALTER COLUMN POSID POSITION 29;

ALTER TABLE TRANZT ALTER COLUMN POSNUMB POSITION 30;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCPOS POSITION 31;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCREC POSITION 32;

ALTER TABLE TRANZT ALTER COLUMN COMMENTCODE POSITION 33;

ALTER TABLE TRANZT ALTER COLUMN COUNTFILLS POSITION 34;

ALTER TABLE TRANZT ALTER COLUMN COUNTPRINTS POSITION 35;

ALTER TABLE TRANZT ALTER COLUMN POSNUMBER POSITION 36;

ALTER TABLE TRAUTH ALTER COLUMN ID POSITION 1;

ALTER TABLE TRAUTH ALTER COLUMN DOCUMENTID POSITION 2;

ALTER TABLE TRAUTH ALTER COLUMN RMKOPERATIONTYPE POSITION 3;

ALTER TABLE TRAUTH ALTER COLUMN TERMINALID POSITION 4;

ALTER TABLE TRAUTH ALTER COLUMN TRANZTYPE POSITION 5;

ALTER TABLE TRAUTH ALTER COLUMN TRANZDATE POSITION 6;

ALTER TABLE TRAUTH ALTER COLUMN TRANZTIME POSITION 7;

ALTER TABLE TRAUTH ALTER COLUMN SLIPNUMBER POSITION 8;

ALTER TABLE TRAUTH ALTER COLUMN OPERATIONTYPE POSITION 9;

ALTER TABLE TRAUTH ALTER COLUMN AUTHORIZATIONTYPE POSITION 10;

ALTER TABLE TRAUTH ALTER COLUMN MSGNUMBER POSITION 11;

ALTER TABLE TRAUTH ALTER COLUMN CARDTYPE POSITION 12;

ALTER TABLE TRAUTH ALTER COLUMN AUTHCODE POSITION 13;

ALTER TABLE TRAUTH ALTER COLUMN CARDNUMBER POSITION 14;

ALTER TABLE TRAUTH ALTER COLUMN CARDEXPDATE POSITION 15;

ALTER TABLE TRAUTH ALTER COLUMN SUMM POSITION 16;

ALTER TABLE TRAUTH ALTER COLUMN REFERENCENUMBER POSITION 17;

ALTER TABLE TRAUTH ALTER COLUMN CANCELED POSITION 18;

ALTER TABLE TRAUTH ALTER COLUMN RESULTCODE POSITION 19;

ALTER TABLE TRAUTH ALTER COLUMN RESPONSECODE POSITION 20;

ALTER TABLE TRAUTH ALTER COLUMN SYSTEMNUMBER POSITION 21;

ALTER TABLE "USER" ALTER COLUMN ID POSITION 1;

ALTER TABLE "USER" ALTER COLUMN CODE POSITION 2;

ALTER TABLE "USER" ALTER COLUMN NAME POSITION 3;

ALTER TABLE "USER" ALTER COLUMN TEXT POSITION 4;

ALTER TABLE "USER" ALTER COLUMN PROFILEID POSITION 5;

ALTER TABLE "USER" ALTER COLUMN PSWRD POSITION 6;

ALTER TABLE "USER" ALTER COLUMN CARD POSITION 7;

ALTER TABLE "USER" ALTER COLUMN FINGER POSITION 8;

ALTER TABLE "USER" ALTER COLUMN DELETED POSITION 9;

ALTER TABLE "USER" ALTER COLUMN SKIPMODE POSITION 10;

ALTER TABLE WINREPORTS ALTER COLUMN ID POSITION 1;

ALTER TABLE WINREPORTS ALTER COLUMN CODE POSITION 2;

ALTER TABLE WINREPORTS ALTER COLUMN NAME POSITION 3;

ALTER TABLE WINREPORTS ALTER COLUMN VIEWREPORT POSITION 4;

/* Create(Add) Crant */
GRANT ALL ON DOCUMENT TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON HALL TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON HALLPLACE TO SYSDBA WITH GRANT OPTION;

UPDATE DOCUMENT D SET STATE = 2
WHERE EXISTS(SELECT ID FROM TRANZT WHERE DOCUMENTID = D.ID AND TRANZTYPE = 57);

COMMIT;

/* TEXT BLOCK END */

/* Convert 4.6.1 */

ALTER TABLE CLIENT ADD DELETED FLAG;

ALTER TABLE DOCUMENT ADD ISFISCAL FLAG;

/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^


/* Create Exception... */
SET TERM ; ^

CREATE EXCEPTION E_CANT_CHANGE_ISFOLDER '     (ISFOLDER).';


/*  Empty APPENDCCARDDISCS for APPENDCOUNTERBYTYPE(param list change)  */
SET TERM ^ ;

ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter empty procedure APPENDCOUNTERBYTYPE with new param-list */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER,
ICLIENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter Procedure... */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER,
ICLIENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE COUNTERTYPEID INTEGER;
DECLARE VARIABLE COUNTERID INTEGER;
DECLARE VARIABLE CID INTEGER;
DECLARE VARIABLE COUNTERCODE INTEGER;
BEGIN

  SELECT ID
  FROM COUNTERTYPE
  WHERE CODE = :ICOUNTERTYPE
  INTO :COUNTERTYPEID;

  IF (:COUNTERTYPEID IS NULL) THEN
  BEGIN
    ERRORCODE = 28;
    EXIT;
  END

  IF (ICARDID IS NOT NULL) THEN
  BEGIN
    CID = NULL;
    FOR
      SELECT C.ID
      FROM COUNTER C
      JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
      JOIN CCARDCOUNTER CC ON CC.COUNTERID = C.ID
      WHERE CT.CODE = :ICOUNTERTYPE  AND CC.CCARDID = :ICARDID
      INTO :COUNTERID
    DO
    BEGIN
      IF (CID IS NULL) THEN
      BEGIN
        DELETE FROM COUNTERD
        WHERE COUNTERID = :COUNTERID;

        UPDATE COUNTER SET
          VAL = :ICOUNTERVAL,
          DATECREATE = CURRENT_DATE + CURRENT_TIME
        WHERE ID = :COUNTERID;
      END
      CID = 0;
    END

    IF (:CID IS NULL) THEN
    BEGIN
      COUNTERID = GEN_ID(GID, 1);

      SELECT NULLTOINT(MAX(CODE)) + 1
      FROM COUNTER
      WHERE COUNTERTYPEID = :COUNTERTYPEID
      INTO :COUNTERCODE;

      INSERT INTO COUNTER(ID, CODE, VAL, COUNTERTYPEID)
      VALUES (:COUNTERID, :COUNTERCODE + 1, :ICOUNTERVAL, :COUNTERTYPEID);

      INSERT INTO CCARDCOUNTER(CCARDID, COUNTERID)
      VALUES (:ICARDID, :COUNTERID);
    END
  END
  ELSE
    IF (ICLIENTID IS NOT NULL) THEN
    BEGIN
      CID = NULL;
      FOR
        SELECT C.ID
        FROM COUNTER C
          JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
          JOIN CLIENTCOUNTER CC ON CC.COUNTERID = C.ID
        WHERE CT.CODE = :ICOUNTERTYPE  AND CC.CLIENTID = :ICLIENTID
        INTO :COUNTERID
      DO
      BEGIN
        IF (CID IS NULL) THEN
        BEGIN
          DELETE FROM COUNTERD
          WHERE COUNTERID = :COUNTERID;

          UPDATE COUNTER SET
            VAL = :ICOUNTERVAL,
            DATECREATE = CURRENT_DATE + CURRENT_TIME
          WHERE ID = :COUNTERID;
        END
        CID = 0;
      END

      IF (:CID IS NULL) THEN
      BEGIN
        COUNTERID = GEN_ID(GID, 1);

        SELECT NULLTOINT(MAX(CODE)) + 1
        FROM COUNTER
        WHERE COUNTERTYPEID = :COUNTERTYPEID
        INTO :COUNTERCODE;

        INSERT INTO COUNTER(ID, CODE, VAL, COUNTERTYPEID)
        VALUES (:COUNTERID, :COUNTERCODE, :ICOUNTERVAL, :COUNTERTYPEID);

        INSERT INTO CLIENTCOUNTER(CLIENTID, COUNTERID)
        VALUES (:ICLIENTID, :COUNTERID);
      END
    END
END
^

/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), -1, -1, :CARDID, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;
END
^

/* Alter (APPENDGRPACTDISC) */
ALTER PROCEDURE APPENDGRPACTDISC(ICODE INTEGER,
INAME VARCHAR(100),
IACTV INTEGER,
IDISCCOLLOPER INTEGER,
IDEPENDOTHERPOS INTEGER,
IDISCRATEGRPCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
declare variable grpdiscrateid integer;
BEGIN

  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :ICODE
  INTO ID;

  IF (ID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO GRPACTDISC
      (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
    VALUES
      (:ID, :ICODE, :INAME, :IACTV, :IDEPENDOTHERPOS, :IDELETED);
  END
  ELSE
  UPDATE GRPACTDISC SET
    CODE = :ICODE,
    NAME = :INAME,
    ACTV = :IACTV,
    DEPENDOTHERPOS = :IDEPENDOTHERPOS,
    DELETED = :IDELETED
  WHERE ID = :ID;

  IF (IDISCRATEGRPCODE IS NOT NULL) THEN
  BEGIN
    SELECT ID
    FROM DISCRATE
    WHERE CODE = :IDISCRATEGRPCODE
    INTO GRPDISCRATEID;

    IF (GRPDISCRATEID IS NULL) THEN
      INSERT INTO DISCRATE (ID, PARENTID, CODE, NAME, TEXT,
                            ISFOLDER, DISCCOLLOPER)
      VALUES (GEN_ID(GID, 1), :IDISCRATEPARENTID, :IDISCRATEGRPCODE, :INAME, :INAME,
                            1, :IDISCCOLLOPER);
    ELSE
    UPDATE DISCRATE SET
      PARENTID = :IDISCRATEPARENTID,
      CODE = :IDISCRATEGRPCODE,
      NAME = :INAME,
      TEXT = :INAME,
      ISFOLDER = 1,
      DISCCOLLOPER = :IDISCCOLLOPER
    WHERE ID = :GRPDISCRATEID;
  END
END
^

/* Restore proc. body: APPENDCLIENT */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,      CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE, BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,
                          WEB,     TELEPHONE, INN,      DOCUMENT, OKPO,  OKPD,     DELETED)

      VALUES (:CLIENTID, :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT,  :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE, :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,
              :IWEB,     :ITELEPHONE, :IINN,        :IDOCUMENT, :IOKPO, :IOKPD,     :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;
END
^

/* Create trigger... */
CREATE TRIGGER UPD_AFT_CLIENT FOR CLIENT
ACTIVE AFTER UPDATE POSITION 0 
AS
DECLARE VARIABLE TMPID INTEGER;
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
BEGIN
  IF (NEW.ISFOLDER = 0 AND OLD.ISFOLDER <> 0) THEN
  FOR
    SELECT CT.ID
    FROM COUNTERTYPE CT
    WHERE CT.AUTOCREATE = 2
    INTO TMPID1
    DO
    BEGIN
      TMPID2 = GEN_ID(GID, 1);
      INSERT INTO COUNTER (ID, CODE, VAL, COUNTERTYPEID) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), 0, :TMPID1);
      INSERT INTO CLIENTCOUNTER (COUNTERID, CLIENTID) VALUES (:TMPID2, NEW.ID);
    END
  ELSE
  IF (NEW.ISFOLDER <> 0 AND OLD.ISFOLDER = 0) THEN
  FOR
    SELECT CC.COUNTERID
    FROM CLIENTCOUNTER CC
    JOIN COUNTER CO ON CO.ID = CC.COUNTERID
    JOIN COUNTERTYPE CT ON CT.ID = CO.COUNTERTYPEID AND CT.AUTOCREATE = 2
    WHERE CC.CLIENTID = OLD.ID
    INTO TMPID
    DO
      DELETE FROM COUNTER WHERE ID = :TMPID;
END
^

CREATE TRIGGER UPD_BEF_CLIENT FOR CLIENT
ACTIVE BEFORE UPDATE POSITION 0 
AS
BEGIN
  IF ((OLD.ISFOLDER <> NEW.ISFOLDER) AND (OLD.DELETED >= NEW.DELETED)) THEN
    EXCEPTION E_CANT_CHANGE_ISFOLDER;
END
^


/* Alter Procedure... */
SET TERM ; ^

ALTER TABLE CLIENT ALTER COLUMN ID POSITION 1;

ALTER TABLE CLIENT ALTER COLUMN CODE POSITION 2;

ALTER TABLE CLIENT ALTER COLUMN PARENTID POSITION 3;

ALTER TABLE CLIENT ALTER COLUMN NAME POSITION 4;

ALTER TABLE CLIENT ALTER COLUMN TEXT POSITION 5;

ALTER TABLE CLIENT ALTER COLUMN ISFOLDER POSITION 6;

ALTER TABLE CLIENT ALTER COLUMN DESCRIPTION POSITION 7;

ALTER TABLE CLIENT ALTER COLUMN SEX POSITION 8;

ALTER TABLE CLIENT ALTER COLUMN MEMDATE POSITION 9;

ALTER TABLE CLIENT ALTER COLUMN BIRTHDATE POSITION 10;

ALTER TABLE CLIENT ALTER COLUMN REGDATE POSITION 11;

ALTER TABLE CLIENT ALTER COLUMN ZIPCODE POSITION 12;

ALTER TABLE CLIENT ALTER COLUMN CITY POSITION 13;

ALTER TABLE CLIENT ALTER COLUMN ADDRESS POSITION 14;

ALTER TABLE CLIENT ALTER COLUMN EMAIL POSITION 15;

ALTER TABLE CLIENT ALTER COLUMN WEB POSITION 16;

ALTER TABLE CLIENT ALTER COLUMN TELEPHONE POSITION 17;

ALTER TABLE CLIENT ALTER COLUMN INN POSITION 18;

ALTER TABLE CLIENT ALTER COLUMN DOCUMENT POSITION 19;

ALTER TABLE CLIENT ALTER COLUMN OKPO POSITION 20;

ALTER TABLE CLIENT ALTER COLUMN OKPD POSITION 21;

ALTER TABLE CLIENT ALTER COLUMN DELETED POSITION 22;

ALTER TABLE DOCUMENT ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCUMENT ALTER COLUMN DOCKINDID POSITION 2;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUENUMBER POSITION 3;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDATE POSITION 4;

ALTER TABLE DOCUMENT ALTER COLUMN OPENTIME POSITION 5;

ALTER TABLE DOCUMENT ALTER COLUMN OPENUSERID POSITION 6;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEDATE POSITION 7;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSETIME POSITION 8;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEUSERID POSITION 9;

ALTER TABLE DOCUMENT ALTER COLUMN DOCUMENTID POSITION 10;

ALTER TABLE DOCUMENT ALTER COLUMN CLIENTID POSITION 11;

ALTER TABLE DOCUMENT ALTER COLUMN STATE POSITION 12;

ALTER TABLE DOCUMENT ALTER COLUMN EDUCATION POSITION 13;

ALTER TABLE DOCUMENT ALTER COLUMN RMKID POSITION 14;

ALTER TABLE DOCUMENT ALTER COLUMN SUMM POSITION 15;

ALTER TABLE DOCUMENT ALTER COLUMN SUMMWD POSITION 16;

ALTER TABLE DOCUMENT ALTER COLUMN ECRSESSION POSITION 17;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUETYPE POSITION 18;

ALTER TABLE DOCUMENT ALTER COLUMN ORDERIDENTIF POSITION 19;

ALTER TABLE DOCUMENT ALTER COLUMN COMMENTCODE POSITION 20;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTSCHEME POSITION 21;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE1 POSITION 22;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE2 POSITION 23;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE3 POSITION 24;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE4 POSITION 25;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE5 POSITION 26;

ALTER TABLE DOCUMENT ALTER COLUMN HALLPLACEID POSITION 27;

ALTER TABLE DOCUMENT ALTER COLUMN SAVED POSITION 28;

ALTER TABLE DOCUMENT ALTER COLUMN INNERDOCORDER POSITION 29;

ALTER TABLE DOCUMENT ALTER COLUMN PRECHEQUE POSITION 30;

ALTER TABLE DOCUMENT ALTER COLUMN OPENRMKID POSITION 31;

ALTER TABLE DOCUMENT ALTER COLUMN OPENSESSION POSITION 32;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDOCNUMBER POSITION 33;

ALTER TABLE DOCUMENT ALTER COLUMN ISFISCAL POSITION 34;

UPDATE DOCUMENT SET ISFISCAL = 1;

UPDATE DOCUMENT SET ISFISCAL = 0 WHERE CHEQUETYPE IN (6,7);

/* TEXT BLOCK END */

/* Convert 4.6.2 */
UPDATE CONDITION SET SEX = 0 WHERE SEX IS NULL;

UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = 1 WHERE RDB$FIELD_NAME='SEX' AND RDB$RELATION_NAME='CONDITION';

SET TERM ^ ;

ALTER PROCEDURE APPENDWAREPARAMS(ICODE VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IASPECTSCHEMECODE INTEGER,
IASPECTTYPE INTEGER,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IPRICELABEL INTEGER,
IDELETED INTEGER,
IWARECODETOMARK INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE UPDATESTR VARCHAR(255);
BEGIN

  ERRORCODE = 0;
  UPDATESTR = '';

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID
    FROM SPRT
    WHERE CODE = :ICODE AND DELETED = :IDELETED
    INTO TID;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID
    FROM SPRT
    WHERE MARK = :ICODE AND DELETED = :IDELETED
    INTO TID;
  END

  IF (TID IS NULL) THEN
    EXIT;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      ERRORCODE = 8;
      EXIT;
    END
  END
  ELSE ASPECTSCHEMEID = 0;

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
     PRICELABELID = NULL;

  UPDATE SPRT SET
      ASPECTSCHEMEID =  CASE WHEN (:IASPECTSCHEMECODE IS NULL) THEN ASPECTSCHEMEID  ELSE :ASPECTSCHEMEID   END,
      ASPECTTYPE =      CASE WHEN (:IASPECTTYPE IS NULL)       THEN ASPECTTYPE      ELSE :IASPECTTYPE      END,
      ECRDEVID =        CASE WHEN (:IECRDEVCODE IS NULL)       THEN ECRDEVID        ELSE :ECRDEVID         END,
      TAXGROUPID =      CASE WHEN (:ITAXGROUPCODE IS NULL)     THEN TAXGROUPID      ELSE :TAXGROUPID       END,
      SCALELPDEVID =    CASE WHEN (:ISCALELPDEVCODE IS NULL)   THEN SCALELPDEVID    ELSE :SCALELPDEVID     END,
      SCALELPWARECODE = CASE WHEN (:ISCALELPWARECODE IS NULL)  THEN SCALELPWARECODE ELSE :ISCALELPWARECODE END,
      RCPPRNDEVID =     CASE WHEN (:IRCPPRNDEVCODE IS NULL)    THEN RCPPRNDEVID     ELSE :RCPPRNDEVID      END,
      PRICELABELID =    CASE WHEN (:IPRICELABEL IS NULL)       THEN PRICELABELID    ELSE :PRICELABELID     END
  WHERE ID = :TID;       

  IF (TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :TID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :TID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
  ELSE
    IF (IINTDISCSCHMCODE IS NOT NULL) THEN
      DELETE FROM ACTDISCOBJ
      WHERE WAREID = :TID AND CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1 AND DISCRATEID IS NULL AND GRPACTDISCID > 0;
END
^
/* TEXT BLOCK END */

/* Convert 4.7.0 */
ALTER TABLE SETTINGS DROP CONSTRAINT UNQ_SET_NAME;

RECONNECT;

ALTER TABLE REPORTFILTER DROP CONSTRAINT UNQ_REPORTFILTER;

RECONNECT;

ALTER TABLE HALL DROP CONSTRAINT UNQ_HALL_CODE;

RECONNECT;

ALTER TABLE DEVICES DROP CONSTRAINT UNQ_DEVICES_CODE;

RECONNECT;

ALTER TABLE CLIENT DROP CONSTRAINT UNQ_CLIENT_CODE;

RECONNECT;

ALTER TABLE CCARD DROP CONSTRAINT UNQ_CCARD_VAL;

RECONNECT;

ALTER TABLE CCARD DROP CONSTRAINT UNQ_CCARD;

RECONNECT;

ALTER TABLE REPORTFILTER DROP CONSTRAINT PK_REPORTFILTER;

RECONNECT;

ALTER TABLE CLIENTCOUNTER DROP CONSTRAINT PK_CLIENTCOUNTER;

RECONNECT;

ALTER TABLE CLIENTCARD DROP CONSTRAINT PK_CLIENTCARD;

RECONNECT;

ALTER TABLE CCARDCOUNTER DROP CONSTRAINT PK_CCARDCOUNTER;

/* Create Domains... */
CREATE DOMAIN FID64 AS NUMERIC(18) NOT NULL;

CREATE DOMAIN FINT64 AS NUMERIC(18);

CREATE DOMAIN FREF64 AS NUMERIC(18);

CREATE DOMAIN FRINT64 AS NUMERIC(18);

CREATE DOMAIN RREF64 AS NUMERIC(18) NOT NULL;

/* Alter Procedure (Before Drop)... */
SET TERM ^ ;

ALTER PROCEDURE APPPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

ALTER PROCEDURE DEL_MARKED AS
 BEGIN EXIT; END
^

ALTER PROCEDURE DEL_MARKED_EX(C_WARE INTEGER,
C_BARCODE INTEGER)
 AS
 BEGIN EXIT; END
^


/* Drop Procedure... */
SET TERM ; ^

DROP PROCEDURE APPPEND_SUPERMAG_DISC;

DROP PROCEDURE DEL_MARKED;

DROP PROCEDURE DEL_MARKED_EX;


/* Drop Trigger... */
DROP TRIGGER INS_AFT_CURRENCY0;

DROP TRIGGER INS_AFT_RMK0;

DROP TRIGGER UPD_BEF_CLIENT;


/* Drop Exception... */
/* Drop: E_CANT_CHANGE_ISFOLDER (TExcData) */
DROP EXCEPTION E_CANT_CHANGE_ISFOLDER;


/* Create Table... */
CREATE TABLE CUSTOMDB(BDOCODE FRINT,
VERSIONFRONTOL FVARCHAR100,
ACTV FINT,
DBIDENT FINT);


CREATE TABLE DELQUEUE(TABLEID INTEGER,
RECID FID64,
CHNG FINT64);


CREATE TABLE IDCOR(IDINT FRINT64 NOT NULL,
IDEXT FRINT64 NOT NULL,
TABLEID FINT NOT NULL);


CREATE TABLE SYNCBASE(ID FID,
CODE FRINT,
NAME FVARCHAR100,
PARENTID RREF,
BDOPATH FVARCHAR255,
BDONAME FVARCHAR40,
BDOUSER FVARCHAR100,
BDOPSWRD FVARCHAR100,
SYNCSRVNAME FVARCHAR100,
SYNCSRVID FREF,
SYNCINTERVAL FINT,
SYNCRESUMEINTERVAL FINT);


CREATE TABLE SYNCSRV(ID FINT NOT NULL,
NAME FVARCHAR100,
STATE FINT,
OWNERBDO FINT);


CREATE TABLE SYNCTABLE(ID FID NOT NULL,
CATEG INTEGER NOT NULL,
SYNCBASEID RREF,
SYNCKIND INTEGER NOT NULL);


CREATE TABLE TBLINFO(ID FID,
TABLENAME FRVARCHAR100,
CHNGVAL FINT64,
IDVAL FINT,
SECTION FINT NOT NULL);


CREATE TABLE TBLLOADINFO(ID FID,
TABLENAME FRVARCHAR100,
CHNGVAL FINT64,
IDVAL FINT,
SYNCBASEID RREF,
ERRINFO FVARCHAR255,
BDOCHNGVAL FINT64,
BDOERRINFO FVARCHAR255,
SECTION FINT NOT NULL,
SYNCCATEG FINT,
LASTCHANGE FDATETIME,
CUROPER FINT);



ALTER TABLE ACTDISC ADD CHNG FINT64;

ALTER TABLE ACTDISC ADD BDOCODE FINT;

ALTER TABLE ACTDISC ADD OWNERBDO FINT;

ALTER TABLE ACTDISC ADD INSCHNG FINT64;

ALTER TABLE ACTDISCOBJ ADD CHNG FINT64;

ALTER TABLE ACTDISCOBJ ADD BDOCODE FINT;

ALTER TABLE ACTDISCOBJ ADD CODE FINT;

/* MAN */

CREATE GENERATOR GTMP;

UPDATE ACTDISCOBJ SET CODE = GEN_ID(GTMP, 1);
COMMIT;

DROP GENERATOR GTMP;

/* MAN */

ALTER TABLE ACTDISCOBJ ADD OWNERBDO FINT;

ALTER TABLE ACTDISCOBJ ADD INSCHNG FINT64;

ALTER TABLE ACTSCRIPT ADD CHNG FINT64;

ALTER TABLE ACTSCRIPT ADD BDOCODE FINT;

ALTER TABLE ACTSCRIPT ADD OWNERBDO FINT;

ALTER TABLE ANALOG ADD BDOCODE FINT;

ALTER TABLE ANALOG ADD CHNG FINT64;

ALTER TABLE ANALOG ADD OWNERBDO FINT;

ALTER TABLE ASPECT ADD CHNG FINT64;

ALTER TABLE ASPECT ADD BDOCODE FINT;

ALTER TABLE ASPECT ADD OWNERBDO FINT;

ALTER TABLE ASPECT ADD INSCHNG FINT64;

ALTER TABLE ASPSCHM ADD CHNG FINT64;

ALTER TABLE ASPSCHM ADD BDOCODE FINT;

ALTER TABLE ASPSCHM ADD OWNERBDO FINT;

ALTER TABLE ASPSCHM ADD INSCHNG FINT64;

ALTER TABLE ASPVALUE ADD CHNG FINT64;

ALTER TABLE ASPVALUE ADD BDOCODE FINT;

ALTER TABLE ASPVALUE ADD OWNERBDO FINT;

ALTER TABLE ASPVALUE ADD INSCHNG FINT64;

ALTER TABLE BARCODE ADD CHNG FINT64;

ALTER TABLE BARCODE ADD BDOCODE FINT;

ALTER TABLE BARCODE ADD OWNERBDO FINT;

ALTER TABLE BARCODE ADD INSCHNG FINT64;

ALTER TABLE CARD ADD BDOCODE FINT;

ALTER TABLE CARD ADD CHNG FINT64;

ALTER TABLE CARD ADD OWNERBDO FINT;

ALTER TABLE CARDGROUP ADD BDOCODE FINT;

ALTER TABLE CARDGROUP ADD CHNG FINT64;

ALTER TABLE CARDGROUP ADD OWNERBDO FINT;

ALTER TABLE CCARD ADD CHNG FINT64;

ALTER TABLE CCARD ADD BDOCODE FINT;

ALTER TABLE CCARD ADD OWNERBDO FINT;

ALTER TABLE CCARD ADD INSCHNG FINT64;

ALTER TABLE CCARDCOUNTER ADD ID FID NOT NULL;

/* MAN */ UPDATE CCARDCOUNTER SET ID = GEN_ID(GID, 1);

ALTER TABLE CCARDCOUNTER ADD CHNG FINT64;

ALTER TABLE CCARDCOUNTER ADD BDOCODE FINT;

ALTER TABLE CCARDCOUNTER ADD OWNERBDO FINT;

ALTER TABLE CLIENT ADD CHNG FINT64;

ALTER TABLE CLIENT ADD BDOCODE FINT;

ALTER TABLE CLIENT ADD OWNERBDO FINT;

ALTER TABLE CLIENT ADD INSCHNG FINT64;

ALTER TABLE CLIENTCARD ADD ID FID NOT NULL;

/* MAN */ UPDATE CLIENTCARD SET ID = GEN_ID(GID, 1);

ALTER TABLE CLIENTCARD ADD CHNG FINT64;

ALTER TABLE CLIENTCARD ADD BDOCODE FINT;

ALTER TABLE CLIENTCARD ADD OWNERBDO FINT;

ALTER TABLE CLIENTCOUNTER ADD ID FID NOT NULL;

/* MAN */ UPDATE CLIENTCOUNTER SET ID = GEN_ID(GID, 1);

ALTER TABLE CLIENTCOUNTER ADD CHNG FINT64;

ALTER TABLE CLIENTCOUNTER ADD BDOCODE FINT;

ALTER TABLE CLIENTCOUNTER ADD OWNERBDO FINT;

ALTER TABLE COMMENT ADD BDOCODE FINT;

ALTER TABLE COMMENT ADD CHNG FINT64;

ALTER TABLE COMMENT ADD OWNERBDO FINT;

ALTER TABLE COUNTER ADD CHNG FINT64;

ALTER TABLE COUNTER ADD BDOCODE FINT;

ALTER TABLE COUNTER ADD OWNERBDO FINT;

ALTER TABLE COUNTER ADD INSCHNG FINT64;

ALTER TABLE COUNTERD ADD CHNG FINT64;

ALTER TABLE COUNTERD ADD BDOCODE FINT;

ALTER TABLE COUNTERD ADD DTYPE FINT NOT NULL;

/* MAN */
UPDATE COUNTERD SET DTYPE = 0;
COMMIT;
INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, DTYPE)
SELECT GEN_ID(GCOUNTERD, 1), ID, VAL, CAST(DATECREATE AS DATE), 1
FROM COUNTER;
COMMIT;
/* MAN */

ALTER TABLE COUNTERD ADD OWNERBDO FINT;

ALTER TABLE COUNTERTYPE ADD CHNG FINT64;

ALTER TABLE COUNTERTYPE ADD BDOCODE FINT;

ALTER TABLE COUNTERTYPE ADD OWNERBDO FINT;

ALTER TABLE CURRENCY ADD BDOCODE FINT;

ALTER TABLE CURRENCY ADD CHNG FINT64;

ALTER TABLE CURRENCY ADD OWNERBDO FINT;

ALTER TABLE DENOMIN ADD BDOCODE FINT;

ALTER TABLE DENOMIN ADD CHNG FINT64;

ALTER TABLE DENOMIN ADD OWNERBDO FINT;

ALTER TABLE DEVICES ADD BDOCODE FINT;

ALTER TABLE DEVICES ADD CHNG FINT64;

ALTER TABLE DEVICES ADD OWNERBDO FINT;

ALTER TABLE DISCRATE ADD CHNG FINT64;

ALTER TABLE DISCRATE ADD BDOCODE FINT;

ALTER TABLE DISCRATE ADD OWNERBDO FINT;

ALTER TABLE DOCKIND ADD BDOCODE FINT;

ALTER TABLE DOCKIND ADD CHNG FINT64;

ALTER TABLE DOCKIND ADD OWNERBDO FINT;

ALTER TABLE DOCKINDRECTMPL ADD BDOCODE FINT;

ALTER TABLE DOCKINDRECTMPL ADD CHNG FINT64;

ALTER TABLE DOCKINDRECTMPL ADD OWNERBDO FINT;

ALTER TABLE DOCKINDTMPL ADD BDOCODE FINT;

ALTER TABLE DOCKINDTMPL ADD CHNG FINT64;

ALTER TABLE DOCKINDTMPL ADD OWNERBDO FINT;

ALTER TABLE DOCTEMPLATE ADD BDOCODE FINT;

ALTER TABLE DOCTEMPLATE ADD CHNG FINT64;

ALTER TABLE DOCTEMPLATE ADD OWNERBDO FINT;

ALTER TABLE DOCUMENT ADD CHNG FINT64;

ALTER TABLE DOCUMENT ADD BDOCODE FINT;

ALTER TABLE DOCUMENT ADD OWNERBDO FINT;

ALTER TABLE DOCUMENT ADD NSHOP FINT NOT NULL;

ALTER TABLE GRPACTDISC ADD CHNG FINT64;

ALTER TABLE GRPACTDISC ADD BDOCODE FINT;

ALTER TABLE GRPACTDISC ADD OWNERBDO FINT;

ALTER TABLE GRPCCARD ADD CHNG FINT64;

ALTER TABLE GRPCCARD ADD BDOCODE FINT;

ALTER TABLE GRPCCARD ADD OWNERBDO FINT;

ALTER TABLE HALL ADD DELETED FLAG;

ALTER TABLE HALL ADD BDOCODE FINT;

ALTER TABLE HALL ADD CHNG FINT64;

ALTER TABLE HALL ADD OWNERBDO FINT;

ALTER TABLE HALLPLACE ADD CHNG FINT64;

ALTER TABLE HALLPLACE ADD BDOCODE FINT;

ALTER TABLE HALLPLACE ADD OWNERBDO FINT;

ALTER TABLE INPDEVFLT ADD BDOCODE FINT;

ALTER TABLE INPDEVFLT ADD CHNG FINT64;

ALTER TABLE INPDEVFLT ADD OWNERBDO FINT;

ALTER TABLE INTBARCS ADD BDOCODE FINT;

ALTER TABLE INTBARCS ADD CHNG FINT64;

ALTER TABLE INTBARCS ADD OWNERBDO FINT;

ALTER TABLE KEYBLAYT ADD BDOCODE FINT;

ALTER TABLE KEYBLAYT ADD CHNG FINT64;

ALTER TABLE KEYBLAYT ADD OWNERBDO FINT;

ALTER TABLE KEYBMAP ADD BDOCODE FINT;

ALTER TABLE KEYBMAP ADD CHNG FINT64;

ALTER TABLE KEYBMAP ADD OWNERBDO FINT;

ALTER TABLE KEYBMAPF ADD BDOCODE FINT;

ALTER TABLE KEYBMAPF ADD CHNG FINT64;

ALTER TABLE KEYBMAPF ADD OWNERBDO FINT;

ALTER TABLE KEYBMODE ADD BDOCODE FINT;

ALTER TABLE KEYBMODE ADD CHNG FINT64;

ALTER TABLE KEYBMODE ADD OWNERBDO FINT;

ALTER TABLE MONEYBOX ADD BDOCODE FINT;

ALTER TABLE MONEYBOX ADD OWNERBDO FINT;

ALTER TABLE MONEYBOX ADD CHNG FINT64;

ALTER TABLE PAYMENT ADD BDOCODE FINT;

ALTER TABLE PAYMENT ADD CHNG FINT64;

ALTER TABLE PAYMENT ADD OWNERBDO FINT;

ALTER TABLE PRICELABEL ADD CHNG FINT64;

ALTER TABLE PRICELABEL ADD BDOCODE FINT;

ALTER TABLE PRICELABEL ADD OWNERBDO FINT;

ALTER TABLE PRICELABEL ADD PREVIEW FINT;

ALTER TABLE PROFILE ADD BDOCODE FINT;

ALTER TABLE PROFILE ADD CHNG FINT64;

ALTER TABLE PROFILE ADD OWNERBDO FINT;

ALTER TABLE PROP ADD BDOCODE FINT;

ALTER TABLE PROP ADD OWNERBDO FINT;

ALTER TABLE PROPVALUE ADD BDOCODE FINT;

ALTER TABLE PROPVALUE ADD OWNERBDO FINT;

ALTER TABLE RECTEMPLATE ADD BDOCODE FINT;

ALTER TABLE RECTEMPLATE ADD CHNG FINT64;

ALTER TABLE RECTEMPLATE ADD OWNERBDO FINT;

ALTER TABLE REMAIN ADD CHNG FINT64;

ALTER TABLE REMAIN ADD BDOCODE FINT;

ALTER TABLE REMAIN ADD USEREMAIN FLAG;

ALTER TABLE REMAIN ADD OWNERBDO FINT;

ALTER TABLE REMAIN ADD INSCHNG FINT64;

ALTER TABLE REMAIND ADD CHNG FINT64;

ALTER TABLE REMAIND ADD BDOCODE FINT;

ALTER TABLE REMAIND ADD DTYPE FINT NOT NULL;

/* MAN */
UPDATE REMAIND SET DTYPE = 0;
COMMIT;
INSERT INTO REMAIND (ID, REMAINID, DELTA, DTYPE)
SELECT GEN_ID(GREMAIND, 1), ID, -REMAIN, 1
FROM REMAIN WHERE NOT REMAIN IS NULL;
UPDATE REMAIN SET USEREMAIN = 0 WHERE REMAIN IS NULL;
UPDATE REMAIN SET USEREMAIN = 1 WHERE NOT REMAIN IS NULL;


COMMIT;
/* MAN */

ALTER TABLE REMAIND ADD OWNERBDO FINT;

ALTER TABLE RMK ADD BDOCODE FINT;

ALTER TABLE RMK ADD CHNG FINT64;

ALTER TABLE RMK ADD OWNERBDO FINT;

ALTER TABLE RMKDEV ADD BDOCODE FINT;

ALTER TABLE RMKDEV ADD CHNG FINT64;

ALTER TABLE RMKDEV ADD OWNERBDO FINT;

ALTER TABLE SECURITY ADD BDOCODE FINT;

ALTER TABLE SECURITY ADD CHNG FINT64;

ALTER TABLE SECURITY ADD OWNERBDO FINT;

ALTER TABLE SETTINGS ADD CHNG FINT64;

ALTER TABLE SETTINGS ADD BDOCODE FINT;

ALTER TABLE SETTINGS ADD SYNCCATEG FINT NOT NULL;

ALTER TABLE SETTINGS ADD OWNERBDO FINT NOT NULL;

ALTER TABLE SPRT ADD CHNG FINT64;

ALTER TABLE SPRT ADD BDOCODE FINT;

ALTER TABLE SPRT ADD OWNERBDO FINT;

ALTER TABLE SPRT ADD INSCHNG FINT64;

ALTER TABLE SPRTPROP ADD BDOCODE FINT;

ALTER TABLE SPRTPROP ADD OWNERBDO FINT;

ALTER TABLE TAXGROUP ADD BDOCODE FINT;

ALTER TABLE TAXGROUP ADD CHNG FINT64;

ALTER TABLE TAXGROUP ADD OWNERBDO FINT;

ALTER TABLE TAXGRPRT ADD BDOCODE FINT;

ALTER TABLE TAXGRPRT ADD CHNG FINT64;

ALTER TABLE TAXGRPRT ADD OWNERBDO FINT;

ALTER TABLE TAXRATE ADD BDOCODE FINT;

ALTER TABLE TAXRATE ADD CHNG FINT64;

ALTER TABLE TAXRATE ADD OWNERBDO FINT;

ALTER TABLE TOUCHLAYT ADD BDOCODE FINT;

ALTER TABLE TOUCHLAYT ADD CHNG FINT64;

ALTER TABLE TOUCHLAYT ADD OWNERBDO FINT;

ALTER TABLE TRANZT ADD BDOCODE FINT;

ALTER TABLE TRANZT ADD OWNERBDO FINT;

ALTER TABLE TRAUTH ADD BDOCODE FINT;

ALTER TABLE TRAUTH ADD OWNERBDO FINT;

ALTER TABLE "USER" ADD BDOCODE FINT;

ALTER TABLE "USER" ADD CHNG FINT64;

ALTER TABLE "USER" ADD OWNERBDO FINT;

ALTER TABLE WINREPORTS ADD BDOCODE FINT;

ALTER TABLE WINREPORTS ADD CHNG FINT64;

ALTER TABLE WINREPORTS ADD OWNERBDO FINT;

ALTER TABLE WINREPORTS ADD PREVIEW FINT;

/* Empty APPENDCOUNTERBYTYPE for drop COUNTER(CODE) */
SET TERM ^ ;

ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER,
ICLIENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

SET TERM ; ^

RECONNECT;

ALTER TABLE COUNTER DROP CONSTRAINT UNQ_COUNTER_CODE;

SET TERM ^ ;

ALTER TRIGGER IND_AFT_COUNTERTYPE
 AS Declare variable I integer;
BEGIN I = 0; END
^

ALTER TRIGGER INS_AFT_CCARD
 AS Declare variable I integer;
BEGIN I = 0; END
^

ALTER TRIGGER INS_AFT_CLIENT
 AS Declare variable I integer;
BEGIN I = 0; END
^

ALTER TRIGGER UPD_AFT_CLIENT
 AS Declare variable I integer;
BEGIN I = 0; END
^

ALTER TRIGGER UPD_AFT_COUNTERTYPE
 AS Declare variable I integer;
BEGIN I = 0; END
^

SET TERM ; ^

ALTER TABLE COUNTER ALTER COLUMN CODE TYPE FRINT64;

RECONNECT;

ALTER TABLE COUNTERD DROP CONSTRAINT PK_COUNTERD;

ALTER TABLE COUNTERD ALTER COLUMN ID TYPE FID64;

ALTER TABLE COUNTERD DROP CONSTRAINT FK_CNTD_DOCUMENT;

/* Empty CANCELSTORED for drop COUNTERD(DOCUMENTID) */
SET TERM ^ ;

ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 AS
 BEGIN EXIT; END
^

ALTER TRIGGER DEL_BEF_DOCUMENT
 AS Declare variable I integer;
BEGIN I = 0; END
^

SET TERM ; ^

ALTER TABLE COUNTERD ALTER COLUMN DOCUMENTID TYPE FREF64;

RECONNECT;

ALTER TABLE REMAIND DROP CONSTRAINT FK_REMAIND_DOCUMENT;

ALTER TABLE TRANZT DROP CONSTRAINT FK_TRANZT_DOCUMENT;

ALTER TABLE TRAUTH DROP CONSTRAINT FK_TRAUTH_DOCUMENT;

ALTER TABLE DOCUMENT DROP CONSTRAINT PK_DOCUMENT;

/* Empty GETHALLPLACES for drop DOCUMENT(ID) */
SET TERM ^ ;

ALTER PROCEDURE GETHALLPLACES(AHALLID INTEGER)
 RETURNS(ID INTEGER,
CODE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
STATE INTEGER,
DOCCOUNT INTEGER,
OPENTIME TIME,
TOTALSUMM FLOAT,
USERNAME VARCHAR(100),
CLIENTNAME VARCHAR(100))
 AS
 BEGIN EXIT; END
^

SET TERM ; ^

RECONNECT;

/* Drop: IDX_DOCUMENT_SAVED_ID (TIdxData) */
DROP INDEX IDX_DOCUMENT_SAVED_ID;

SET TERM ^ ;

ALTER TRIGGER INS_BEF_TRANZT0
 AS Declare variable I integer;
BEGIN I = 0; END
^

ALTER TRIGGER UPD_AFT_DOCUMENT
 AS Declare variable I integer;
BEGIN I = 0; END
^

SET TERM ; ^

ALTER TABLE DOCUMENT ALTER COLUMN ID TYPE FID64;

ALTER TABLE DOCUMENT ALTER COLUMN DOCUMENTID TYPE FINT64;

RECONNECT;

ALTER TABLE REMAIND DROP CONSTRAINT PK_REMAIND;

/* Empty CHANGEWAREAMOUNT for drop REMAIND(ID) */
SET TERM ^ ;

ALTER PROCEDURE CHANGEWAREAMOUNT(WAREID INTEGER,
DELTA DOUBLE PRECISION,
DOCUMENTID INTEGER)
 AS
 BEGIN EXIT; END
^

SET TERM ; ^

ALTER TABLE REMAIND ALTER COLUMN ID TYPE FID64;

/* Empty APPENDREMAIN for drop REMAIND(REMAINID) */
SET TERM ^ ;

ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* Empty APPENDREMAINBYWAREID for drop REMAIND(REMAINID) */
ALTER PROCEDURE APPENDREMAINBYWAREID(IWAREID INTEGER,
IASPV1 INTEGER,
IASPECTSCHEMEID INTEGER,
IREMAIN DOUBLE PRECISION,
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IADDREPLACE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* Empty UPDATE_ALL_REMAIN for drop REMAIND(REMAINID) */
ALTER PROCEDURE UPDATE_ALL_REMAIN AS
 BEGIN EXIT; END
^

SET TERM ; ^

RECONNECT;

/* Drop: IND_REMAIND_REMID (TIdxData) */
DROP INDEX IND_REMAIND_REMID;

SET TERM ^ ;

ALTER TRIGGER DEL_BEF_REMAIN0
 AS Declare variable I integer;
BEGIN I = 0; END
^

SET TERM ; ^

ALTER TABLE REMAIND ALTER COLUMN REMAINID TYPE FREF;

ALTER TABLE REMAIND ALTER COLUMN DOCUMENTID TYPE FREF64;

/* Alter Field (Null / Not Null)... */
UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = 1 WHERE RDB$FIELD_NAME='NAME' AND RDB$RELATION_NAME='SETTINGS';

RECONNECT;

ALTER TABLE TRANZT DROP CONSTRAINT PRI_TRANZT;

ALTER TABLE TRANZT ALTER COLUMN ID TYPE FID64;

RECONNECT;

/* Drop: TRANZT_TYPE (TIdxData) */
DROP INDEX TRANZT_TYPE;

ALTER TABLE TRANZT ALTER COLUMN DOCUMENTID TYPE RREF64;

RECONNECT;

ALTER TABLE TRAUTH DROP CONSTRAINT PRI_TRAUTH;

ALTER TABLE TRAUTH ALTER COLUMN ID TYPE FID64;

ALTER TABLE TRAUTH ALTER COLUMN DOCUMENTID TYPE FREF64;


/* Drop table-fields... */
ALTER TABLE COUNTER DROP VAL;

/* Empty SET_WAREREMAIN for drop REMAIN(REMAIN) */
SET TERM ^ ;

ALTER PROCEDURE SET_WAREREMAIN(WAREID INTEGER,
REMAIN DOUBLE PRECISION,
ISRPL INTEGER)
 AS
 BEGIN EXIT; END
^

SET TERM ; ^

ALTER TABLE REMAIN DROP REMAIN;


RECONNECT;

/* Drop tables... */
DROP TABLE REPORTFILTER;


/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE APPEND_DELQUEUE(ITABLEID INTEGER,
IRECID NUMERIC(18))
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE APPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_BDO_SYNC_STATE(ISYNCBASEID INTEGER)
 RETURNS(UNSYNCTBL VARCHAR(100))
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_BDO_SYNCINFO(ISYNCBASEID INTEGER)
 RETURNS(TABLENAME VARCHAR(100),
QUELENGTH VARCHAR(20),
ERROR VARCHAR(255),
SYNCCATEG INTEGER,
ISUPDIRECTION INTEGER,
CUROPER INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_CLIENT_CHILDREN(INPUTGROUP_ID INTEGER)
 RETURNS(OID INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_CLIENT_HIER(SYNCBASEID INTEGER,
CHNGEND NUMERIC(18),
PARENTID INTEGER,
UPPERHIER INTEGER,
ISC2L INTEGER)
 RETURNS(ID INTEGER,
HIER INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_DEVICES_CHILDREN(INPUTGROUP_ID INTEGER)
 RETURNS(OID INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_DEVICES_HIER(SYNCBASEID INTEGER,
CHNGEND NUMERIC(18),
PARENTID INTEGER,
UPPERHIER INTEGER,
ISC2L INTEGER)
 RETURNS(ID INTEGER,
HIER INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_DISCRATE_CHILDREN(INPUTGROUP_ID INTEGER)
 RETURNS(OID INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_DISCRATE_HIER(SYNCBASEID INTEGER,
CHNGEND NUMERIC(18),
PARENTID INTEGER,
UPPERHIER INTEGER,
ISC2L INTEGER)
 RETURNS(ID INTEGER,
HIER INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_OWNERBDO_BYSYNCBASECATEG(ICATEG INTEGER,
ISYNCBASECODE INTEGER)
 RETURNS(OWNERBDOCODE INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_SPRT_CHILDREN(INPUTGROUP_ID INTEGER)
 RETURNS(OID INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_SYNCBASE_ADDRECORD(ICODE INTEGER,
ICATEG INTEGER)
 RETURNS(ID INTEGER,
SYNCKIND INTEGER,
CODE INTEGER,
NAME VARCHAR(100))
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_SYNCBASE_CHILDREN(INPUTGROUP_ID INTEGER)
 RETURNS(OID INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_SYNCBASE_PARENTS(ID_SYNCBASE INTEGER,
IN_NUM INTEGER,
ID_SYNCBASE_FINAL INTEGER = NULL)
 RETURNS(ID_PARENT INTEGER,
NUM INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_WARE_CHILDREN(INPUTGROUP_ID INTEGER)
 RETURNS(OID INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE GET_WARE_HIER(SYNCBASEID INTEGER,
CHNGEND NUMERIC(18),
PARENTID INTEGER,
UPPERHIER INTEGER,
ISC2L INTEGER)
 RETURNS(ID INTEGER,
HIER INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE MERGE_IDCOR(ATABLEID INTEGER,
AIDEXT NUMERIC(18),
AIDINT NUMERIC(18))
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE MERGE_SECURITY(IPROFILEID INTEGER,
ISECURITY INTEGER,
ISECURITYVALUE INTEGER,
IBDOCODE INTEGER,
IOWNERBDO INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE MERGE_SYNCTABLE(ICATEG INTEGER,
ISYNCBASEID INTEGER,
ISYNCKIND INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE MERGE_TBLINFO(ATABLENAME VARCHAR(100),
ASECTION INTEGER,
ACHNGVAL INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE MERGE_TBLLOADINFO(ASYNCBASEID INTEGER,
ATABLENAME VARCHAR(100),
ASECTION INTEGER,
ACHNGVAL INTEGER,
AERRINFO VARCHAR(255),
ASYNCCATEG INTEGER,
CUROPER INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE SYNC_CASHBOXDEV(ICONTROLTYPE INTEGER,
IDEVICEID INTEGER,
IOAMONEYIN INTEGER,
IOAMONEYOUT INTEGER,
IOAPAYMENT INTEGER,
IOAREG INTEGER,
IOAZREPORT INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE SYNC_CONDITION(IACTDISCID INTEGER,
IBIRTHDATEBEG DATE,
IBIRTHDATECOND INTEGER,
IBIRTHDATEEND DATE,
IBIRTHDAYBEG INTEGER,
IBIRTHDAYEND INTEGER,
IBIRTHMONTHBEG INTEGER,
IBIRTHMONTHEND INTEGER,
IBIRTHYEARBEG INTEGER,
IBIRTHYEAREND INTEGER,
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ICOUNTERBEG1 DOUBLE PRECISION,
ICOUNTERBEG2 DOUBLE PRECISION,
ICOUNTERBEG3 DOUBLE PRECISION,
ICOUNTEREND1 DOUBLE PRECISION,
ICOUNTEREND2 DOUBLE PRECISION,
ICOUNTEREND3 DOUBLE PRECISION,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IFORMULA1 VARCHAR(100),
IFORMULA2 VARCHAR(100),
IFORMULA3 VARCHAR(100),
IMEMDATEBEG DATE,
IMEMDATECOND INTEGER,
IMEMDATEEND DATE,
IMEMDAYBEG INTEGER,
IMEMDAYEND INTEGER,
IMEMMONTHBEG INTEGER,
IMEMMONTHEND INTEGER,
IMEMYEARBEG INTEGER,
IMEMYEAREND INTEGER,
IPRICEBEG DOUBLE PRECISION,
IPRICEEND DOUBLE PRECISION,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IQUANTITYRECBEG DOUBLE PRECISION,
IQUANTITYRECEND DOUBLE PRECISION,
IQUANTITYWAREBEG DOUBLE PRECISION,
IQUANTITYWAREEND DOUBLE PRECISION,
IREGDATEBEG DATE,
IREGDATECOND INTEGER,
IREGDATEEND DATE,
IREGDAYBEG INTEGER,
IREGDAYEND INTEGER,
IREGMONTHBEG INTEGER,
IREGMONTHEND INTEGER,
IREGYEARBEG INTEGER,
IREGYEAREND INTEGER,
ISEX INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
ISUMMWAREBEG DOUBLE PRECISION,
ISUMMWAREEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IWAREID INTEGER)
 RETURNS(CONDITIONID INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE SYNC_PAYCARDDEV(ICAPDISC INTEGER,
ICAPGKH INTEGER,
ICAPINTPAY INTEGER,
ICAPMOBILE INTEGER,
ICAPPAY INTEGER,
IDEVICEID INTEGER,
ISLIPCOUNT INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE SYNC_RCPPRNDEV(IBEEPCOUNT INTEGER,
IDEVICEID INTEGER,
IFONTINDEX INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE SYNC_TERMDEV(IDEVICEID INTEGER,
IFORM INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE TABLECATEG RETURNS(TABLENAME VARCHAR(100),
TABLEID INTEGER,
CATEG INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE UPDATE_DBIDENT_GLOBAL(UPDATE_BDOCODE INTEGER)
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE UPDATEMONEYBOX(RMKID INTEGER,
CURRENCYID INTEGER,
VAL DOUBLE PRECISION,
PREC DOUBLE PRECISION)
 AS
 BEGIN EXIT; END
^


/* Create index... */
SET TERM ; ^

CREATE INDEX IDX_ACTDISCCND ON ACTDISC(CONDITIONID, GRPACTDISCID);

CREATE INDEX IDX_DOCUMENT_SAVED_ID ON DOCUMENT(SAVED, ID);

CREATE INDEX IND_REMAIND_REMID ON REMAIND(REMAINID);

CREATE INDEX TRANZT_TYPE ON TRANZT(TRANZTYPE, DOCUMENTID);

CREATE UNIQUE INDEX UNQ_IDCOR_TABLEID_IDEXT ON IDCOR(TABLEID, IDEXT);

CREATE UNIQUE INDEX UNQ_IDCOR_TABLEID_IDINT ON IDCOR(TABLEID, IDINT);


/* Create generator... */
CREATE GENERATOR GCHNG;


/* Create Exception... */
CREATE EXCEPTION E_AMBIGUOUS_SETTING '       ';

CREATE EXCEPTION E_CANCEL ' ';

CREATE EXCEPTION E_INTERSECT_SYNHRO_KIND '   ';

CREATE EXCEPTION E_NOT_FOUND '  ';

CREATE EXCEPTION E_SYNCBASE_STRUCT_CORRUPT '    ';


/* Create Primary Key... */
ALTER TABLE ANALOG ADD CONSTRAINT PK_ANALOG PRIMARY KEY (ID);

ALTER TABLE CCARDCOUNTER ADD CONSTRAINT PK_CCARDCOUNTER PRIMARY KEY (ID);

ALTER TABLE CLIENTCARD ADD CONSTRAINT PK_CLIENTCARD PRIMARY KEY (ID);

ALTER TABLE CLIENTCOUNTER ADD CONSTRAINT PK_CLIENTCOUNTER PRIMARY KEY (ID);

ALTER TABLE COUNTERD ADD CONSTRAINT PK_COUNTERD PRIMARY KEY (ID);

ALTER TABLE DOCUMENT ADD CONSTRAINT PK_DOCUMENT PRIMARY KEY (ID);

ALTER TABLE REMAIND ADD CONSTRAINT PK_REMAIND PRIMARY KEY (ID);

ALTER TABLE SYNCBASE ADD CONSTRAINT PK_SYNCBASE PRIMARY KEY (ID);

ALTER TABLE SYNCSRV ADD CONSTRAINT PK_SYNCSRV PRIMARY KEY (ID);

ALTER TABLE SYNCTABLE ADD CONSTRAINT PK_SYNCTABLE PRIMARY KEY (ID);

ALTER TABLE TBLINFO ADD CONSTRAINT PK_TBLINFO PRIMARY KEY (ID);

ALTER TABLE TBLLOADINFO ADD CONSTRAINT PK_TBLLOADINFO PRIMARY KEY (ID);

ALTER TABLE TRANZT ADD CONSTRAINT PRI_TRANZT PRIMARY KEY (ID);

ALTER TABLE TRAUTH ADD CONSTRAINT PRI_TRAUTH PRIMARY KEY (ID);

/* Create Unique... */
ALTER TABLE ACTDISCOBJ ADD CONSTRAINT UNQ_ACTDISCOBJ_CODE UNIQUE (CODE);

ALTER TABLE CCARD ADD CONSTRAINT UNQ_CCARD UNIQUE (CODE, GRPCCARDID, DELETED);

ALTER TABLE CCARD ADD CONSTRAINT UNQ_CCARD_VAL UNIQUE (VAL, DELETED);

ALTER TABLE CCARDCOUNTER ADD CONSTRAINT UNQ_CCARDCOUNTER UNIQUE (CCARDID, COUNTERID);

ALTER TABLE CLIENT ADD CONSTRAINT UNQ_CLIENT_CODE UNIQUE (CODE, DELETED);

ALTER TABLE CLIENTCARD ADD CONSTRAINT UNQ_CLIENTCARD UNIQUE (CLIENTID, CCARDID);

ALTER TABLE CLIENTCOUNTER ADD CONSTRAINT UNQ_CLIENTCOUNTER UNIQUE (CLIENTID, COUNTERID);

ALTER TABLE COUNTER ADD CONSTRAINT UNQ_COUNTER_CODE UNIQUE (CODE, COUNTERTYPEID);

ALTER TABLE DEVICES ADD CONSTRAINT UNQ_DEVICES_CODE UNIQUE (CODE, TYPEDEV);

ALTER TABLE HALL ADD CONSTRAINT UNQ_HALL_CODE UNIQUE (CODE, DELETED);

ALTER TABLE SETTINGS ADD CONSTRAINT UNQ_SET_NAME UNIQUE (NAME, OWNERBDO);

ALTER TABLE SYNCBASE ADD CONSTRAINT UNQ_SYNCBASE UNIQUE (CODE);

ALTER TABLE SYNCTABLE ADD CONSTRAINT UNQ_SYNCTABLE_CATEG UNIQUE (CATEG, SYNCBASEID);

ALTER TABLE TBLINFO ADD CONSTRAINT UNQ_TBLINFO_NAME_SEC UNIQUE (TABLENAME, SECTION)
USING INDEX UNQ_TBLINFO_NAME_SEC_CHNG;

ALTER TABLE TBLLOADINFO ADD CONSTRAINT UNQ_TBLLOADINFO_SB_TBL_SEC UNIQUE (SYNCBASEID, TABLENAME, SECTION)
USING INDEX UNQ_TBLLOADINFO_SB_TBL_SEC_CHNG;

/* Create Foreign Key... */
RECONNECT;

ALTER TABLE COUNTERD ADD CONSTRAINT FK_CNTD_DOCUMENT FOREIGN KEY (DOCUMENTID) REFERENCES DOCUMENT (ID) ON DELETE SET NULL;

/* MAN */
DELETE FROM KEYBMAPF KF WHERE NOT EXISTS(SELECT 1 FROM KEYBMAP WHERE ID = KF.KEYBMAPID);
COMMIT;
/* MAN */

ALTER TABLE KEYBMAPF ADD CONSTRAINT FK_KEYBMAPF_KEYBMAP FOREIGN KEY (KEYBMAPID) REFERENCES KEYBMAP (ID) ON DELETE CASCADE;

/* MAN */
UPDATE REMAIND R SET DOCUMENTID = (SELECT ID FROM DOCUMENT WHERE ID = R.DOCUMENTID);
COMMIT;
/* MAN */

ALTER TABLE REMAIND ADD CONSTRAINT FK_REMAIND_DOCUMENT FOREIGN KEY (DOCUMENTID) REFERENCES DOCUMENT (ID) ON DELETE SET NULL;

ALTER TABLE SYNCTABLE ADD CONSTRAINT FK_SYNCTABLE_SYNCBASE FOREIGN KEY (SYNCBASEID) REFERENCES SYNCBASE (ID) ON DELETE CASCADE;

ALTER TABLE TBLLOADINFO ADD CONSTRAINT FK_TBLLOADINFO_SYNCB FOREIGN KEY (SYNCBASEID) REFERENCES SYNCBASE (ID) ON DELETE CASCADE;

ALTER TABLE TRANZT ADD CONSTRAINT FK_TRANZT_DOCUMENT FOREIGN KEY (DOCUMENTID) REFERENCES DOCUMENT (ID) ON DELETE CASCADE;

ALTER TABLE TRAUTH ADD CONSTRAINT FK_TRAUTH_DOCUMENT FOREIGN KEY (DOCUMENTID) REFERENCES DOCUMENT (ID) ON DELETE CASCADE;

/*  Empty APPENDPILOT for APPENDWARE(param list change)  */
SET TERM ^ ;

ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE VARCHAR(20),
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IWARECODETOMARK INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/*  Empty APPENDDEFAULTGRPDISC for MERGE_SETTING(param list change)  */
ALTER PROCEDURE APPENDDEFAULTGRPDISC(ITYPE INTEGER,
ICODE INTEGER,
IWARE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter empty procedure APPENDWARE with new param-list */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter empty procedure MERGE_SETTING with new param-list */
ALTER PROCEDURE MERGE_SETTING(ANAME VARCHAR(100),
AVAL VARCHAR(255),
ABDOCODE INTEGER,
AOWNERBDO INTEGER,
ASYNCCATEG INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter Procedure... */
/* empty dependent procedure body */
/* Clear: APPENDCCARDDISCS for: APPENDCOUNTERBYTYPE */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* empty dependent procedure body */
/* Clear: APPENDCLIENT for: APPENDCOUNTERBYTYPE */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter (APPENDCOUNTERBYTYPE) */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER,
ICLIENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE COUNTERTYPEID INTEGER;
DECLARE VARIABLE COUNTERID INTEGER;
DECLARE VARIABLE CID INTEGER;
DECLARE VARIABLE COUNTERCODE INTEGER;
DECLARE VARIABLE AOWNERBDO INTEGER;
BEGIN

  SELECT ID
  FROM COUNTERTYPE
  WHERE CODE = :ICOUNTERTYPE
  INTO :COUNTERTYPEID;

  SELECT BDOCODE FROM CUSTOMDB INTO AOWNERBDO;

  IF (:COUNTERTYPEID IS NULL) THEN
  BEGIN
    ERRORCODE = 28;
    EXIT;
  END

  IF (ICARDID IS NOT NULL) THEN
  BEGIN
    CID = NULL;
    FOR
      SELECT C.ID
      FROM COUNTER C
      JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
      JOIN CCARDCOUNTER CC ON CC.COUNTERID = C.ID
      WHERE CT.CODE = :ICOUNTERTYPE  AND CC.CCARDID = :ICARDID
      INTO :COUNTERID
    DO
    BEGIN
      INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, DTYPE)
      VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, (select -sum(DELTA) from COUNTERD where counterid = :COUNTERID and DTYPE = 1), CURRENT_DATE, :AOWNERBDO, 1);

      INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, DTYPE)
      VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, (select -sum(DELTA) from COUNTERD where counterid = :COUNTERID and DTYPE <> 1), CURRENT_DATE, :AOWNERBDO, 2);

      IF (CID IS NULL) THEN
      BEGIN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :AOWNERBDO, 1);

        UPDATE COUNTER SET
          DATECREATE = CURRENT_DATE + CURRENT_TIME
        WHERE ID = :COUNTERID;
      END
      CID = 0;
    END

    IF (:CID IS NULL) THEN
    BEGIN
      COUNTERID = GEN_ID(GID, 1);

      SELECT NULLTOINT(MAX(CODE)) + 1
      FROM COUNTER
      WHERE COUNTERTYPEID = :COUNTERTYPEID
      INTO :COUNTERCODE;

      INSERT INTO COUNTER(ID, CODE, COUNTERTYPEID)
      VALUES (:COUNTERID, :COUNTERCODE + 1, :COUNTERTYPEID);

      INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, DTYPE)
      VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :AOWNERBDO, 1);

      INSERT INTO CCARDCOUNTER(ID, CCARDID, COUNTERID)
      VALUES (GEN_ID(GID, 1), :ICARDID, :COUNTERID);
    END
  END
  ELSE
    IF (ICLIENTID IS NOT NULL) THEN
    BEGIN
      CID = NULL;
      FOR
        SELECT C.ID
        FROM COUNTER C
          JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
          JOIN CLIENTCOUNTER CC ON CC.COUNTERID = C.ID
        WHERE CT.CODE = :ICOUNTERTYPE  AND CC.CLIENTID = :ICLIENTID
        INTO :COUNTERID
      DO
      BEGIN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, (select -sum(DELTA) from COUNTERD where COUNTERID = :COUNTERID and DTYPE = 1), CURRENT_DATE, :AOWNERBDO, 1);

        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, (select -sum(DELTA) from COUNTERD where COUNTERID = :COUNTERID and DTYPE <> 1), CURRENT_DATE, :AOWNERBDO, 2);

        IF (CID IS NULL) THEN
        BEGIN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :AOWNERBDO, 1);

          UPDATE COUNTER SET
            DATECREATE = CURRENT_DATE + CURRENT_TIME
          WHERE ID = :COUNTERID;
        END
        CID = 0;
      END

      IF (:CID IS NULL) THEN
      BEGIN
        COUNTERID = GEN_ID(GID, 1);

        SELECT NULLTOINT(MAX(CODE)) + 1
        FROM COUNTER
        WHERE COUNTERTYPEID = :COUNTERTYPEID
        INTO :COUNTERCODE;

        INSERT INTO COUNTER(ID, CODE, COUNTERTYPEID)
        VALUES (:COUNTERID, :COUNTERCODE, :COUNTERTYPEID);

        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :AOWNERBDO, 1);

        INSERT INTO CLIENTCOUNTER(ID, CLIENTID, COUNTERID)
        VALUES (GEN_ID(GID, 1), :ICLIENTID, :COUNTERID);
      END
    END
END
^

ALTER PROCEDURE MERGE_SETTING(ANAME VARCHAR(100),
AVAL VARCHAR(255),
ABDOCODE INTEGER,
AOWNERBDO INTEGER,
ASYNCCATEG INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  IF (AOWNERBDO IS NULL) THEN
    SELECT BDOCODE FROM CUSTOMDB INTO AOWNERBDO;

  SELECT ID
  FROM SETTINGS
  WHERE NAME = :ANAME AND OWNERBDO = :AOWNERBDO
  INTO  ID;

  IF (ID IS NULL) THEN
    INSERT INTO SETTINGS
    (ID, NAME, VAL, BDOCODE, OWNERBDO, SYNCCATEG)
    VALUES
    (GEN_ID(GID, 1), :ANAME, :AVAL, :ABDOCODE, :AOWNERBDO, :ASYNCCATEG);
    ELSE
      UPDATE SETTINGS SET
        VAL = :AVAL,
        BDOCODE = :ABDOCODE,
        SYNCCATEG = :ASYNCCATEG
      WHERE  ID = :ID;
END
^

/* Alter (APPENDDEFAULTGRPDISC) */
ALTER PROCEDURE APPENDDEFAULTGRPDISC(ITYPE INTEGER,
ICODE INTEGER,
IWARE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE NEWID INTEGER;
DECLARE VARIABLE ADOID INTEGER;
DECLARE VARIABLE SETTING VARCHAR(100);
DECLARE VARIABLE TEMPID INTEGER;
DECLARE VARIABLE TEMPNAME VARCHAR(100);
BEGIN

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :ICODE
  INTO  NEWID;

  IF (NEWID IS NULL) THEN
    BEGIN
      ERRORCODE = 1; /*   */
      EXIT;
    END

  IF (ITYPE = 1) THEN
    SETTING = 'InternalDefaultSchmRecID';
  ELSE
    IF (IWARE = 0) THEN
      SETTING = 'InternalDefaultSchmFreeID';
    ELSE
      SETTING = 'InternalDefaultSchmCodeID';

  IF (ITYPE = 1)  THEN
    FOR SELECT VAL, NAME
    FROM SETTINGS
    WHERE ((NAME = 'InternalDefaultSchmFreeID') OR (NAME = 'InternalDefaultSchmCodeID')) AND
          (VAL = :NEWID) AND (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB))
    INTO TEMPID, TEMPNAME
    DO
      BEGIN
        DELETE FROM ACTDISCOBJ
        WHERE CLIENTID = -1 AND WAREID <= 0 AND CARDID = -1 AND
              PAYMENTID = -1 AND GRPACTDISCID = :TEMPID;

        EXECUTE PROCEDURE MERGE_SETTING(TEMPNAME, 0, NULL, NULL, 9);
      END
  ELSE
    FOR SELECT VAL
    FROM SETTINGS
    WHERE (NAME = 'InternalDefaultSchmRecID') AND (VAL = :NEWID) AND (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB))
    INTO TEMPID
    DO
      BEGIN
         DELETE FROM ACTDISCOBJ
            WHERE CLIENTID = -1 AND WAREID <= 0 AND CARDID = -1 AND
                  PAYMENTID = -1 AND GRPACTDISCID = :TEMPID;

         EXECUTE PROCEDURE MERGE_SETTING('InternalDefaultSchmRecID', 0, NULL, NULL, 9);
      END

  UPDATE ACTDISCOBJ SET
    GRPACTDISCID = :NEWID
  WHERE
    CLIENTID = -1 AND WAREID = :IWARE AND CARDID = -1 AND
    PAYMENTID = -1 AND GRPACTDISCID = (select val from settings where (name = :SETTING) and (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB)));

  SELECT FIRST 1 ID
  FROM ACTDISCOBJ
  WHERE CLIENTID = -1 AND WAREID = :IWARE AND
        CARDID = -1 AND PAYMENTID = -1 AND GRPACTDISCID = :NEWID
  INTO ADOID;

  IF (ADOID IS NULL) THEN
    INSERT INTO ACTDISCOBJ (ID, WAREID, CLIENTID, PAYMENTID, CARDID, GRPACTDISCID)
    VALUES (GEN_ID(GID, 1), :IWARE, -1, -1, -1, :NEWID);

  UPDATE DISCRATE DR SET
      DR.DESTINATION = :ITYPE
  WHERE DR.ID IN (select AD.DISCRATEID from ACTDISC AD where AD.GRPACTDISCID = :NEWID);

  EXECUTE PROCEDURE MERGE_SETTING(SETTING, NEWID, NULL, NULL, 9);

END
^

/* Alter (APPENDGRPACTDISC) */
ALTER PROCEDURE APPENDGRPACTDISC(ICODE INTEGER,
INAME VARCHAR(100),
IACTV INTEGER,
IDISCCOLLOPER INTEGER,
IDEPENDOTHERPOS INTEGER,
IDISCRATEGRPCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
DECLARE VARIABLE GRPDISCRATEID INTEGER;
BEGIN

  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :ICODE
  INTO ID;

  IF (ID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO GRPACTDISC
      (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
    VALUES
      (:ID, :ICODE, :INAME, :IACTV, :IDEPENDOTHERPOS, :IDELETED);
  END
  ELSE
  UPDATE GRPACTDISC SET
    CODE = :ICODE,
    NAME = :INAME,
    ACTV = :IACTV,
    DEPENDOTHERPOS = :IDEPENDOTHERPOS,
    DELETED = :IDELETED
  WHERE ID = :ID;

  IF (IDISCRATEGRPCODE IS NOT NULL) THEN
  BEGIN
    SELECT ID
    FROM DISCRATE
    WHERE CODE = :IDISCRATEGRPCODE
    INTO GRPDISCRATEID;

    IF (GRPDISCRATEID IS NULL) THEN
      INSERT INTO DISCRATE (ID, PARENTID, CODE, NAME, TEXT,
                            ISFOLDER, DISCCOLLOPER)
      VALUES (GEN_ID(GID, 1), :IDISCRATEPARENTID, :IDISCRATEGRPCODE, :INAME, :INAME,
                            1, :IDISCCOLLOPER);
    ELSE
    UPDATE DISCRATE SET
      PARENTID = :IDISCRATEPARENTID,
      CODE = :IDISCRATEGRPCODE,
      NAME = :INAME,
      TEXT = :INAME,
      ISFOLDER = 1,
      DISCCOLLOPER = :IDISCCOLLOPER
    WHERE ID = :GRPDISCRATEID;
  END
END
^

ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
DECLARE VARIABLE TISWARE INTEGER;
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TDELETED INTEGER;
DECLARE VARIABLE TDELETEDISWARE INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE HIERLEVEL INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE BARC VARCHAR(40);
BEGIN
  ERRORCODE = 0;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      IF (IEXCHANGEFORMAT <> 1) THEN
        BEGIN
          ERRORCODE = 8;
          EXIT;
        END
      ELSE
        IFIRSTASPECTVALUE = 0;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  HIERLEVEL = 0;
  IF (IPARENTCODE <> '') then
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (CODE = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (MARK = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
  END
  ELSE
    PARENTID = 0;
  HIERLEVEL = HIERLEVEL + 1;

  IF (IISWARE <> 1) THEN
    BEGIN
      IISWARE = -2147483647 + HIERLEVEL;
    END

  IF ((PARENTID IS NULL) OR (TISWARE > 0)) THEN
  BEGIN
    ERRORCODE = 2;
    EXIT;
  END

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  TISWARE = NULL;

  IF (IWARECODETOMARK = 0) THEN
  begin
    SELECT ID, ISWARE, DELETED
    FROM SPRT
    WHERE CODE = :ICODE
    INTO TID, TISWARE, TDELETEDISWARE;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, DELETED, ISWARE, DELETED
    FROM SPRT
    WHERE MARK = :IMARK
    INTO TID, TDELETED, TISWARE, TDELETEDISWARE;
  END

  IF ((((TISWARE > 0) AND (IISWARE <= 0)) OR
       ((TISWARE <= 0) AND (IISWARE > 0))) AND (TDELETEDISWARE >= IDELETED)) then
    EXCEPTION E_CANT_CHANGE_ISWARE;

  IF (TID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO SPRT (ID, PARENTID, CODE, MARK, NAME, TEXT, HIERLEVEL,
      MINPRICE, ECRDEVID, TAXGROUPID, RCPPRNDEVID,
      ASPECTSCHEMEID, PRICELABELID,
      MAXDISCOUNT, ISWARE, PRICE, FLAGS, LIFE, SERIES,
      CERTIFICAT, SCALELPDEVID, SCALELPWARECODE, ASPECTTYPE, QUANTITYPREC,
      SCALELPLOADED, PRICELBPRINTED, DELETED, DESCRIPTION, PICTURE, REWARDTYPE, REWARDVAL,
      ECRDEPARTMENT)
    VALUES (:ID, :PARENTID, :ICODE, :IMARK, :INAME, :ITEXT, :HIERLEVEL,
      :IMINPRICE, :ECRDEVID, :TAXGROUPID, :RCPPRNDEVID,
      :ASPECTSCHEMEID, :PRICELABELID,
      :IMAXDISCOUNT, :IISWARE, :IPRICE, :IFLAGS, :ILIFE, :ISERIES,
      :ICERTIFICAT, :SCALELPDEVID, :ISCALELPWARECODE, :IASPECTTYPE, :IQUANTITYPREC,
      :ISCALELPLOADED, :IPRICELBPRINTED, :IDELETED, :IDESCRIPTION, :IPICTURE, :IREWARDTYPE, :IREWARDVAL,
      :IECRDEPARTMENT);
    INCREMENTCODE = 1;
  END
  ELSE
  BEGIN
    ID = TID;
    IF (TDELETED = IDELETED) THEN
      UPDATE SPRT SET
        ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
        ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
        CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
                                           PRICELABELID = :PRICELABELID,
        DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
        DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
        ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
        ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
        FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
        HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
        ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
        LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
        MARK = :IMARK,                     SERIES = :ISERIES,
        MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
        MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
        NAME = :INAME
      WHERE ID = :ID;
    ELSE
      BEGIN
        UPDATE SPRT SET
          ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
          ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
          CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
          CODE = :ICODE,                     PRICELABELID = :PRICELABELID,
          DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
          DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
          ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
          ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
          FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
          HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
          ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
          LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
          MARK = :IMARK,                     SERIES = :ISERIES,
          MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
          MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
          NAME = :INAME
        WHERE ID = :ID;
        INCREMENTCODE = 1;
      END
  END

  IF (IISWARE = 1) THEN
  BEGIN
    EXECUTE PROCEDURE APPENDREMAINBYWAREID (:ID, :IFIRSTASPECTVALUE, :ASPECTSCHEMEID, :IREMAIN, :IDELETEDREMAIN, :IDELETEDASPECT, :IADDREPLACE)
      RETURNING_VALUES ERRORCODE;

    IF (ERRORCODE > 0) THEN
      EXIT;

    WHILE (IBARCODES <> '') DO
    BEGIN
      BARC = EXTRACTSTR(IBARCODES, ',');

      EXECUTE PROCEDURE APPENDBARCODEBYWAREID (:BARC, :ID, 0, 0, 0, 0, 0, :IFACTOR, 0, :IDELETEDBARCODE)
        RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;

      IBARCODES = PCOPY(IBARCODES, LEN(BARC) + 1, LEN(IBARCODES) - LEN(BARC) - 1);
    END
  END

  IF (IDISCOUNTVALUE <> '0' AND IDISCOUNTVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPEND_WARE_DISC(:ID, :IDISCOUNTTYPE, :IDISCOUNTVALUE, :IDISCRATEPARENTID)
            RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;
    END

  IF (TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :ID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :ID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
END
^

/* Alter (APPENDPILOT) */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE VARCHAR(20),
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IWARECODETOMARK INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
declare variable mainid integer;
declare variable sprtcode integer;
declare variable sprtmark varchar(20);
declare variable dormantvar integer;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IWARECODETOMARK = 0) THEN
        BEGIN
          SPRTCODE = :ICODE;
          SPRTMARK = '';
        END
      ELSE
        BEGIN
          SPRTCODE = :ICODE;
          SPRTMARK = :ICODE;
        END

      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:SPRTCODE, NULL, :INAME, :INAME, :SPRTMARK, NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, :IWARECODETOMARK, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            DELETE FROM ACTDISCOBJ WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            IF (IWARECODETOMARK = 0) THEN
              BEGIN
                SELECT ID
                FROM SPRT
                WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
                INTO MAINID;
              END
            ELSE
              BEGIN
                SELECT FIRST 1 ID
                FROM SPRT
                WHERE MARK = :ICODE AND DELETED = :DELETEDSPRT
                INTO MAINID;
              END
            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    DELETE FROM ACTDISCOBJ WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:SPRTCODE, NULL, :INAME, :INAME, :SPRTMARK, NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, :IWARECODETOMARK, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:SPRTCODE, NULL, :INAME, :INAME, :SPRTMARK, NULL, NULL, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, :IWARECODETOMARK, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

/* Alter (APPENDREMAIN) */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE WARENAME VARCHAR(100);
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCCODE INTEGER;
DECLARE VARIABLE USEREMAIN INTEGER;
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
      BEGIN
        IF (ASPCODE = 1)  THEN
          IF (IASPV1 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
            INTO AD1;
          ELSE
          BEGIN
            ERRORCODE = 10;
            EXIT;
          END

        IF (ASPCODE = 2)  THEN
          IF (IASPV2 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
            INTO AD2;
          ELSE
          BEGIN
            ERRORCODE = 11;
            EXIT;
          END

        IF (ASPCODE = 3)  THEN
          IF (IASPV3 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
            INTO AD3;
          ELSE
          BEGIN
            ERRORCODE = 12;
            EXIT;
          END

        IF (ASPCODE = 4)  THEN
          IF (IASPV4 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
            INTO AD4;
          ELSE
          BEGIN
            ERRORCODE = 13;
            EXIT;
          END

        IF (ASPCODE = 5)  THEN
          IF (IASPV5 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
            INTO AD5;
          ELSE
          BEGIN
            ERRORCODE = 14;
            EXIT;
          END
      END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR
(AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    REMAINID = GEN_ID(GID, 1);

    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, PRICE,
       DELETED, USEREMAIN)
    VALUES
      (:REMAINID, :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5,
      :IPRICE, :IDELETED, :USEREMAIN);

    IF (NOT :IREMAIN IS NULL) THEN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE <> 1) THEN
    BEGIN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 1;

      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;
    END

    UPDATE REMAIN SET
      PRICE = :IPRICE,
      DELETED = :IDELETED
    WHERE ID = :REMAINID;

    IF (NOT :IREMAIN IS NULL) THEN
    BEGIN
      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
     END

    IF (IADDREPLACE = 2) THEN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 0;
  END

  IF (NOT IDISCOUNTVALUE IS NULL AND IDISCOUNTVALUE <> '0' AND IDISCOUNTVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       0, 2, 0, NULL, NULL)
            RETURNING_VALUES ERRORCODE, TDISCRATEID;

      WHERECLAUSE = '';

      IF (AD1 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
      ELSE
      BEGIN
        AD1 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID IS NULL ';
      END

      IF (AD2 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
      ELSE
      BEGIN
        AD2 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID IS NULL ';
      END

      IF (AD3 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
      ELSE
      BEGIN
        AD3 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID IS NULL ';
      END

      IF (AD4 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
      ELSE
      BEGIN
        AD4 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID IS NULL ';
      END

     IF (AD5 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
      ELSE
      BEGIN
        AD5 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID IS NULL ';
      END

      IF (IUSEGRPACTDISC <> 0) THEN
      BEGIN

        SELECT ID
        FROM GRPACTDISC
        WHERE CODE = :IGRPACTDISCCODE
        INTO :GRPACTDISCID;

        IF (GRPACTDISCID IS NULL) THEN
        BEGIN
          GRPACTDISCID = GEN_ID(GID, 1);
          INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
          VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
        END

        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID ' ||
                          ' FROM ACTDISCOBJ A JOIN GRPACTDISC G ON ' ||
                                          ' G.ID = A.GRPACTDISCID AND G.ID = '|| :GRPACTDISCID ||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '      A.PAYMENTID = -1 AND A.CARDID = -1 '|| WHERECLAUSE
        INTO TACTDISCOBJID;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, NULL, NULL, :GRPACTDISCID);

        SELECT FIRST 1 A.ID, A.CONDITIONID
        FROM CONDITION C LEFT JOIN ACTDISC A ON
                         C.ID = A.CONDITIONID
        WHERE A.GRPACTDISCID  = :GRPACTDISCID
        INTO ACTDISCID, CONDITIONID;

        EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL,
                                          NULL, NULL,  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  NULL, NULL,
                                          NULL, NULL, NULL, NULL)
        RETURNING_VALUES ERRORCODE, CONDITIONID;

       IF (ACTDISCID IS NULL) THEN
       BEGIN
         SELECT NULLTONUM(MAX(CODE)) + 1
         FROM ACTDISC
         WHERE GRPACTDISCID  = :GRPACTDISCID
         INTO ACTDISCCODE;

         INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                              CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
         VALUES     (GEN_ID(GID, 1), :ACTDISCCODE, :GRPACTDISCID, :WARENAME,
                    :CONDITIONID, :TDISCRATEID, NULL, 0, :IDELETEDACTDISC);
       END
       ELSE
         UPDATE ACTDISC SET
            NAME = :WARENAME,
            CONDITIONID = :CONDITIONID,
            DISCRATEID = :TDISCRATEID,
            DELETED = :IDELETEDACTDISC
         WHERE ID = :ACTDISCID;
      END
      ELSE
      BEGIN
        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID ' ||
                          ' FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                          ' D.ID = A.DISCRATEID AND D.KIND = 2 '||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '       A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
        INTO TACTDISCOBJID;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, :TDISCRATEID, NULL, NULL);
        ELSE
          UPDATE ACTDISCOBJ SET
             DISCRATEID = :TDISCRATEID
          WHERE ID = :TACTDISCOBJID;
      END
    END
END
^

/* Alter (APPENDREMAINBYWAREID) */
ALTER PROCEDURE APPENDREMAINBYWAREID(IWAREID INTEGER,
IASPV1 INTEGER,
IASPECTSCHEMEID INTEGER,
IREMAIN DOUBLE PRECISION,
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IADDREPLACE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE USEREMAIN INTEGER;
BEGIN
  ERRORCODE = 0;

  AD1 = 0;

  IF ((IASPECTSCHEMEID > 0) AND (IASPV1 > 0)) THEN
    BEGIN
      FOR
        SELECT ID, CODE
        FROM ASPECT A
        WHERE A.ASPECTSCHEMEID = :IASPECTSCHEMEID AND DELETED =
:IDELETEDASPECT
        INTO ASPID, ASPCODE
        DO
          BEGIN
            IF (ASPCODE > 1) THEN
              BEGIN
                ERRORCODE = 15;
                EXIT;
              END
            SELECT ID
            FROM ASPVALUE AV
            WHERE AV.CODE = :IASPV1 AND AV.ASPECTID = :ASPID
            INTO AD1;
            IF (AD1 = 0) THEN
              BEGIN
                ERRORCODE = 10;
                EXIT;
              END
          END
       IF (ASPID IS NULL) THEN
        BEGIN
          ERRORCODE = 9;
          EXIT;
        END
    END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :IWAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = 0 AND
    ASPECTVALUE3ID = 0 AND
    ASPECTVALUE4ID = 0 AND
    ASPECTVALUE5ID = 0
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
    BEGIN
      REMAINID = GEN_ID(GID, 1);
      INSERT INTO REMAIN
        (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
ASPECTVALUE4ID, ASPECTVALUE5ID, DELETED, USEREMAIN)
      VALUES
        (:REMAINID, :IWAREID, :AD1, 0, 0, 0, 0, :IDELETED, :USEREMAIN);

      IF (NOT :IREMAIN IS NULL) THEN
        INSERT INTO REMAIND
          (ID, REMAINID, DELTA, DTYPE)
        VALUES
          (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
    END
  ELSE
    BEGIN
      IF (IADDREPLACE <> 1) THEN
      BEGIN
        DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 1;

        UPDATE REMAIN SET
          USEREMAIN = :USEREMAIN
        WHERE ID = :REMAINID;
      END

      UPDATE REMAIN SET
        DELETED = :IDELETED
      WHERE ID = :REMAINID;

      IF (NOT :IREMAIN IS NULL) THEN
      BEGIN
        UPDATE REMAIN SET
          USEREMAIN = :USEREMAIN
        WHERE ID = :REMAINID;

        INSERT INTO REMAIND
          (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
        VALUES
          (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
      END

      IF (IADDREPLACE = 2) THEN
        DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 0;
    END
END
^

/* Alter (CANCELSTORED) */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 AS
DECLARE VARIABLE TRANZCOUNT INTEGER;
DECLARE VARIABLE RMKID INTEGER;
DECLARE VARIABLE DOCID NUMERIC(18,0);
DECLARE VARIABLE WARECODE INTEGER;
DECLARE VARIABLE WAREMARK VARCHAR(100);
DECLARE VARIABLE TRANZTYPE INTEGER;
DECLARE VARIABLE QUANTITY INTEGER;
DECLARE VARIABLE ASPSCHEMECODE INTEGER;
DECLARE VARIABLE ASPSCHEMEID INTEGER;
DECLARE VARIABLE ASPVAL1 INTEGER;
DECLARE VARIABLE ASPVAL2 INTEGER;
DECLARE VARIABLE ASPVAL3 INTEGER;
DECLARE VARIABLE ASPVAL4 INTEGER;
DECLARE VARIABLE ASPVAL5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
DECLARE VARIABLE TRID NUMERIC(18,0);
DECLARE VARIABLE USERCODE INTEGER;
DECLARE VARIABLE TMPID NUMERIC(18,0);
BEGIN
  SELECT ID
  FROM RMK R
  WHERE R.CODE = :APOSNUMBER
  INTO RMKID;

  SELECT CODE
  FROM "USER"
  WHERE ID = :ASELLERID
  INTO USERCODE;

  EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES TRANZCOUNT;

  FOR
    SELECT ID
    FROM DOCUMENT D
    WHERE D.RMKID = :RMKID AND D.STATE = 3 AND NOT EXISTS(SELECT 1 FROM TRAUTH TR WHERE TR.DOCUMENTID = D.ID)
    INTO DOCID
    DO
    BEGIN
         --    11  12, -   
      FOR
        SELECT WARECODE, WAREMARK, TRANZTYPE, QUANTITY,
        ASPECTSCHEME, ASPECTVALUE1, ASPECTVALUE2, ASPECTVALUE3, ASPECTVALUE4, ASPECTVALUE5
        FROM TRANZT T
        LEFT JOIN SPRT S ON S.CODE = T.WARECODE
        WHERE TRANZTYPE IN (11,12) AND T.DOCUMENTID = :DOCID
      INTO WARECODE, WAREMARK, TRANZTYPE, QUANTITY, ASPSCHEMECODE, ASPVAL1, ASPVAL2, ASPVAL3, ASPVAL4, ASPVAL5
      DO
      BEGIN
        WAREID = NULL;
        FLAGS = NULL;
           --  ID    
        IF (AWARECODETOMARK = 0) THEN
        BEGIN
          SELECT ID, FLAGS
          FROM SPRT
          WHERE CODE = :WARECODE
          INTO WAREID, FLAGS;
        END
        ELSE
        BEGIN
          SELECT FIRST 1 ID, FLAGS
          FROM SPRT
          WHERE MARK = :WAREMARK
          INTO :WAREID, :FLAGS;
        END
        --          ,  -
        IF (:ACONTROLSALEREMAIN = 1 OR :ACONTROLSALEREMAIN = 2 AND :FLAGS/64 <> (:FLAGS/32)/2.0) THEN
        BEGIN
          ASPSCHEMEID = NULL;
          SELECT ID
          FROM ASPSCHM
          WHERE CODE = :ASPSCHEMECODE
          INTO :ASPSCHEMEID;

          REMAINID = NULL;
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL1 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 1)) AND
          R.ASPECTVALUE2ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL2 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 2)) AND
          R.ASPECTVALUE3ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL3 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 3)) AND
          R.ASPECTVALUE4ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL4 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 4)) AND
          R.ASPECTVALUE5ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL5 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 5)) AND
          R.WAREID = :WAREID AND
          R.USEREMAIN = 1
          INTO
          REMAINID;

          IF (:REMAINID IS NULL) THEN
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = 0 AND
          R.ASPECTVALUE2ID = 0 AND
          R.ASPECTVALUE3ID = 0 AND
          R.ASPECTVALUE4ID = 0 AND
          R.ASPECTVALUE5ID = 0 AND
          R.WAREID = :WAREID
          INTO
          REMAINID;

          IF (:REMAINID IS NOT NULL) THEN
          INSERT INTO REMAIND (
           ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
          VALUES (
           GEN_ID(GREMAIND, 1), :REMAINID, -:QUANTITY, :DOCID, 0);
        END
      END

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID AND TRANZTYPE = 54
        INTO TMPID
        DO
          UPDATE TRANZT T SET
            TRANZDATE = :ATRANZDATE,
            TRANZHOUR = :ATRANZHOUR,
            TRANZTIME = :ATRANZTIME,
            TRANZTYPE = 56,
            T.SELLER = :USERCODE
          WHERE ID = :TMPID;

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID
        ORDER BY ID
        INTO TRID
        DO
        BEGIN
          UPDATE TRANZT SET
            TRANZCOUNT = :TRANZCOUNT
          WHERE ID = :TRID;
          TRANZCOUNT = TRANZCOUNT + 1;
        END

      DELETE FROM COUNTERD CD WHERE CD.DOCUMENTID = :DOCID;
      UPDATE DOCUMENT D SET
        STATE = 2,
        CLOSEDATE = :ATRANZDATE,
        CLOSETIME = :ATRANZTIME,
        CLOSEUSERID = :ASELLERID,
        SAVED = :ASAVED
      WHERE ID = :DOCID;
    END
END
^

/* Alter (CHANGEWAREAMOUNT) */
ALTER PROCEDURE CHANGEWAREAMOUNT(WAREID INTEGER,
DELTA DOUBLE PRECISION,
DOCUMENTID NUMERIC(18))
 AS
DECLARE VARIABLE REMAINID INTEGER;
BEGIN
  SELECT R.ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    R.ASPECTVALUE1ID = 0 AND
    R.ASPECTVALUE2ID = 0 AND
    R.ASPECTVALUE3ID = 0 AND
    R.ASPECTVALUE4ID = 0 AND
    R.ASPECTVALUE5ID = 0
  INTO :REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
      REMAINID = GEN_ID(GID, 1);
      INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID)
      VALUES
      (:REMAINID, :WAREID, 0, 0, 0, 0, 0);
  END

  INSERT INTO REMAIND (ID, DELTA, REMAINID, DOCUMENTID, DTYPE)
  VALUES
  (GEN_ID(GREMAIND, 1), :DELTA, :REMAINID, :DOCUMENTID, 0);
END
^

/* empty dependent procedure body */
/* Clear: GET_ACTSCRIPT for: GET_ACTSCRIPT_CUSTOM */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN EXIT; END
^

/* Alter (GET_ACTSCRIPT_CUSTOM) */
ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
DECLARE VARIABLE CARD VARCHAR(255);
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
      AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
      AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND

      (
       NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                       AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:REGDATE,
                     AC.REGDATECOND,
                     AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                     AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

      (
       NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                       AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:MEMDATE,
                     AC.MEMDATECOND,
                     AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                     AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
      (
       NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                         AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:BIRTHDATE,
                     AC.BIRTHDATECOND,
                     AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                     AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

      (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
      (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
      (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
      (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
      (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
      (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)
    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC)))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    DO
      SUSPEND;

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    FOR
      SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
        AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
        AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL AND CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
      WHERE
        ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND

        (
         NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                         AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:REGDATE,
                       AC.REGDATECOND,
                       AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                       AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

        (
         NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                         AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:MEMDATE,
                       AC.MEMDATECOND,
                       AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                       AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
        (
         NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                           AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:BIRTHDATE,
                       AC.BIRTHDATECOND,
                       AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                       AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

        (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
        (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
        (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
        (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
        (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
        (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
     PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC)))
     ORDER BY GD.CODE, AD.PRIORITY
     INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
     DO
        SUSPEND;

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  PRIORITY = 0;
  WAREID = NULL;
  FORMULA1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  FORMULA2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  FORMULA3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTSCRIPT ACS ON ACS.ID = A.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
  INTO DATA, CODE
  DO
    SUSPEND;

END
^

/* empty dependent procedure body */
/* Clear: GET_DISCOUNT for: GET_DISCOUNT_CUSTOM */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN EXIT; END
^

/* Alter (GET_DISCOUNT_CUSTOM) */
ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3, AR.CODE,
      (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID), AR.WAREID
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (
       NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                       AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:REGDATE,
                     AC.REGDATECOND,
                     AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                     AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

      (
       NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                       AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:MEMDATE,
                     AC.MEMDATECOND,
                     AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                     AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
      (
       NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                         AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:BIRTHDATE,
                     AC.BIRTHDATECOND,
                     AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                     AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

      (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
      (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
      (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
      (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
      (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
      (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)

      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC)))
-- OLD    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,DISCRATECODE,CARD, DISCRATEWAREID
    DO
      SUSPEND;

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = PCOPY(ICARD, 0, 40);
    CARDLEN = EXTRACTSTR(:ICARDLEN, ',');

    FOR
      SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
        QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID,AR.BEGVAL,AR.ENDVAL,
        AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3,AR.CODE, AR.WAREID
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL AND CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
      WHERE
        (
         NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                         AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:REGDATE,
                       AC.REGDATECOND,
                       AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                       AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

        (
         NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                         AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:MEMDATE,
                       AC.MEMDATECOND,
                       AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                       AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
        (
         NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                           AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:BIRTHDATE,
                       AC.BIRTHDATECOND,
                       AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                       AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

        (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
        (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
        (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
        (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
        (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
        (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND

        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC)))
-- OLD      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
      ORDER BY GD.CODE, AD.PRIORITY
      INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,DISCRATECODE, DISCRATEWAREID
      DO
        SUSPEND;

   ICARD = PCOPY(ICARD, 40, LEN(ICARD) - 40);
   ICARDLEN = PCOPY(ICARDLEN, LEN(CARDLEN) + 1, LEN(ICARDLEN) - LEN(CARDLEN) - 1);
  END

  GRPCODE = NULL;
  VAL = NULL;
  WAREID = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;
  "TYPE" = NULL;
  TEXT = NULL;
  CODE = NULL;
  CARDPREFIXBEG = NULL;
  CARDPREFIXEND = NULL;
  DEPENDOTHERPOS = NULL;
  BEGVAL = NULL;
  ENDVAL = NULL;
  FORMULA1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  FORMULA2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  FORMULA3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  PRIORITY = 0;
  CARD = NULL;

  FOR
    SELECT AR.VAL, AR.WAREID, AR."TYPE", AR.NAME, AR.TEXT,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AR.CODE, (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID)
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN DISCRATE AR ON AR.ID = A.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
--    PLAN SORT (JOIN (JOIN (AR NATURAL,A INDEX (IDX_ACTDISCOBJ2,FK_ADO_DISCRATE))))
  INTO VAL, DISCRATEWAREID,"TYPE",NAME, TEXT,PARENTID, BEGVAL, ENDVAL, DISCRATECODE, CARD
  DO
    SUSPEND;
END
^

/* Alter (GET_TRANZCOUNT) */
ALTER PROCEDURE GET_TRANZCOUNT(ARMKID INTEGER)
 RETURNS(TRANZCOUNT INTEGER)
 AS
DECLARE VARIABLE ACODE INTEGER;
BEGIN

  SELECT CODE
  FROM RMK
  WHERE ID = :ARMKID
  INTO ACODE;

  SELECT FIRST 1 NULLTONUM(TRANZCOUNT) + 1
  FROM TRANZT
  WHERE POSNUMBER = :ACODE
  ORDER BY POSNUMBER DESC, TRANZCOUNT DESC
  INTO TRANZCOUNT;

END
^

/* Alter (GETHALLPLACES) */
ALTER PROCEDURE GETHALLPLACES(AHALLID INTEGER)
 RETURNS(ID INTEGER,
CODE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
STATE INTEGER,
DOCCOUNT INTEGER,
OPENTIME TIME,
TOTALSUMM FLOAT,
USERNAME VARCHAR(100),
CLIENTNAME VARCHAR(100))
 AS
BEGIN
  FOR SELECT ID, CODE, NAME, TEXT FROM HALLPLACE WHERE HALLID = :AHALLID
  ORDER BY CODE
  INTO :ID, :CODE, :NAME, :TEXT DO
  BEGIN
    SELECT COUNT(ID), SUM(SUMMWD) FROM DOCUMENT WHERE HALLPLACEID = :ID AND STATE IN (0, 3)
    INTO :DOCCOUNT, :TOTALSUMM;

    STATE = DOCCOUNT;

    OPENTIME = NULL;
    USERNAME = NULL;
    CLIENTNAME = NULL;

    IF (DOCCOUNT > 0) THEN
      SELECT FIRST 1 D.OPENTIME, U.NAME, C.NAME
      FROM DOCUMENT D JOIN "USER" U ON U.ID = D.OPENUSERID LEFT JOIN CLIENT C ON C.ID = D.CLIENTID
      WHERE D.HALLPLACEID = :ID AND D.STATE IN (0, 3)
      ORDER BY D.ID
      INTO :OPENTIME, :USERNAME, :CLIENTNAME;

    SUSPEND;
  END

END
^

/* Alter (SET_WAREREMAIN) */
ALTER PROCEDURE SET_WAREREMAIN(WAREID INTEGER,
REMAIN DOUBLE PRECISION,
ISRPL INTEGER,
BDOCODE INTEGER)
 AS
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE NEWREMAINID INTEGER;
DECLARE VARIABLE OLDREMAIN DOUBLE PRECISION;
BEGIN
  SELECT R.ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    R.ASPECTVALUE1ID = 0 AND
    R.ASPECTVALUE2ID = 0 AND
    R.ASPECTVALUE3ID = 0 AND
    R.ASPECTVALUE4ID = 0 AND
    R.ASPECTVALUE5ID = 0
  INTO :REMAINID;

  IF (NOT REMAINID IS NULL) THEN
  BEGIN
    UPDATE REMAIN SET
      DELETED = 0
    WHERE ID = :REMAINID;

    SELECT NULLTONUM(SUM(DELTA))
    FROM REMAIND RD
    WHERE
      RD.REMAINID = :REMAINID AND
      DTYPE = 1
    INTO :OLDREMAIN;

    IF (ISRPL <> 0) THEN
    BEGIN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES                                   
        (GEN_ID(GREMAIND, 1), :REMAINID, - :OLDREMAIN - :REMAIN, NULL, 1);
    END
    ELSE
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, :OLDREMAIN - :REMAIN, NULL, 1);
  END
    ELSE
    BEGIN
      NEWREMAINID = GEN_ID(GID, 1);
      INSERT INTO REMAIN
        (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID, BDOCODE)
      VALUES
        (:NEWREMAINID, :WAREID, 0, 0, 0, 0, 0, :BDOCODE);

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :NEWREMAINID, - :REMAIN, NULL, 1);
    END
END
^

/* Alter (UPDATE_ALL_REMAIN) */
ALTER PROCEDURE UPDATE_ALL_REMAIN AS
DECLARE VARIABLE IREMAINID INTEGER;
DECLARE VARIABLE IDELTA DOUBLE PRECISION;
BEGIN
  FOR
    SELECT REMAINID, SUM(DELTA)
    FROM REMAIND
    GROUP BY REMAINID
    INTO :IREMAINID, :IDELTA
  DO
  BEGIN
    DELETE FROM REMAIND WHERE REMAINID = :IREMAINID;
    INSERT INTO REMAIND (ID, DELTA, DTYPE, REMAINID) VALUES (GEN_ID(GREMAIND, 1), :IDELTA, 1, :IREMAINID);
  END

/*  UPDATE REMAIN R SET
    R.REMAIN = R.REMAIN - NULLTONUM((SELECT SUM(DELTA) FROM REMAIND RD WHERE RD.REMAINID = R.ID));
  DELETE FROM REMAIND;
  INSERT INTO REMAIND (ID, DELTA, DOCLEAR) VALUES (GEN_ID(GREMAIND, 1), 0, 2);*/
END
^

/* Restore proc. body: APPEND_DELQUEUE */
ALTER PROCEDURE APPEND_DELQUEUE(ITABLEID INTEGER,
IRECID NUMERIC(18))
 AS
BEGIN
  INSERT INTO DELQUEUE (TABLEID, RECID)
  VALUES (:ITABLEID, :IRECID);
END
^

/* Restore proc. body: APPEND_SUPERMAG_DISC */
ALTER PROCEDURE APPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IGRPACTDISCCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IGRPACTDISCCODE
    INTO GRPACTDISCID;

    IF (GRPACTDISCID IS NULL) THEN
    BEGIN
      GRPACTDISCID = GEN_ID(GID, 1);
      INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
      VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
    END

    IF (IWAREID > 0) THEN
    BEGIN
      SELECT ID
      FROM ACTDISCOBJ
      WHERE WAREID = :IWAREID AND GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1
      INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), :IWAREID, -1, -1, -1, :GRPACTDISCID);
    END
    ELSE
    BEGIN
      SELECT ID
      FROM ACTDISCOBJ
      WHERE GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1 AND WAREID = -1
      INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), -1, -1, -1, -1, :GRPACTDISCID);
    END
  END
  ELSE
    GRPACTDISCID = IGRPACTDISCID;

  IF (IAPPENDTYPE = 0) THEN   -- DiscCli
    BEGIN
      WHERECLAUSE = '';

      IF (ICARDPREFIXBEG IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG = '''|| :ICARDPREFIXBEG ||'''';

      IF (ICARDPREFIXEND IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND = '''|| :ICARDPREFIXEND ||'''';

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.CONDITIONID
                          FROM CONDITION C LEFT JOIN ACTDISC A ON
                                           C.ID = A.CONDITIONID
                          WHERE A.GRPACTDISCID = '|| :GRPACTDISCID ||' AND
                                C.SUMMBEG IS NULL AND C.TIMEBEG IS NULL '|| WHERECLAUSE ||'
                          PLAN JOIN (C INDEX (IDX_C_CARDPRBEG,IDX_C_CARDPREND),A INDEX (FK_AD_CONDITION,FK_AD_GRPACTDISC))'
      INTO :ACTDISCID, :CONDITIONID;
    END
  ELSE
    IF (IAPPENDTYPE = 1) THEN   -- CliClass

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                       C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
            C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
            C.QUANTITYBEG IS NULL
      INTO ACTDISCID, CONDITIONID;

    ELSE
      IF (IAPPENDTYPE = 2) THEN   -- DiscSumm
        BEGIN

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.SUMMBEG = :ISUMMBEG AND
                C.TIMEBEG = :ITIMEBEG AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

          IF (IDELETECURRENT = 1) THEN
            IF (ACTDISCID IS NULL) THEN
              EXIT;
            ELSE
              BEGIN
                DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                EXIT;
              END
        END
      ELSE
        IF (IAPPENDTYPE = 3) THEN   -- DiscCard

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.QUANTITYBEG = :IQUANTITYBEG    AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

        ELSE
          IF (IAPPENDTYPE = 4) THEN   -- CliSumm

            SELECT FIRST 1 A.ID, A.CONDITIONID
            FROM CONDITION C LEFT JOIN ACTDISC A ON
                             C.ID = A.CONDITIONID
            WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                  C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                  C.SUMMBEG = :ISUMMBEG             AND
                  C.TIMEBEG IS NULL
            INTO ACTDISCID, CONDITIONID;

          ELSE
            IF (IAPPENDTYPE = 5) THEN  -- PluDisc  ClasDisc

              SELECT FIRST 1 A.ID, A.CONDITIONID
              FROM CONDITION C LEFT JOIN ACTDISC A ON
                               C.ID = A.CONDITIONID
              WHERE A.GRPACTDISCID  = :GRPACTDISCID
              INTO ACTDISCID, CONDITIONID;

            ELSE
              IF (IAPPENDTYPE = 6) THEN  -- DiscSum 
                BEGIN

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                        C.SUMMRECBEG = :ISUMMRECBEG      AND
                        C.TIMEBEG = :ITIMEBEG            AND
                        C.CARDPREFIXBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                  IF (IDELETECURRENT = 1) THEN
                    IF (ACTDISCID IS NULL) THEN
                      EXIT;
                    ELSE
                    BEGIN
                      DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                      EXIT;
                    END
                END
              ELSE
                IF (IAPPENDTYPE = 7) THEN  -- CliSum 

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                        C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                        C.SUMMRECBEG = :ISUMMRECBEG       AND
                        C.TIMEBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                ELSE
                  BEGIN
                    ERRORCODE = 90; --  IAPPENDTYPE
                    EXIT;
                  END

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, NULL, NULL, NULL, NULL, NULL, NULL,
                                    :IQUANTITYBEG, :IQUANTITYEND,  NULL, NULL, NULL, NULL,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,  NULL, NULL,
                                    :ITIMEBEG, :ITIMEEND, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, NULL, NULL,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      IF (ICODE IS NULL) THEN
        SELECT NULLTONUM(MAX(CODE)) + 1
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        INTO ICODE;

      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (GEN_ID(GID, 1), :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
       NAME = :INAME,
       CONDITIONID = :CONDITIONID,
       DISCRATEID = :DISCRATEID,
       DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Restore proc. body: APPENDCCARDDISCS */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), -1, -1, :CARDID, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;
END
^

/* Restore proc. body: APPENDCLIENT */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,      CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE, BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,
                          WEB,     TELEPHONE, INN,      DOCUMENT, OKPO,  OKPD,     DELETED)

      VALUES (:CLIENTID, :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT,  :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE, :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,
              :IWEB,     :ITELEPHONE, :IINN,        :IDOCUMENT, :IOKPO, :IOKPD,     :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;
END
^

/* Restore proc. body: GET_ACTSCRIPT */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
BEGIN
  ID = 1;

  FOR
    SELECT  CODE, DATA, NULLTONUM(GRPCODE), NULLTONUM(PRIORITY), WAREID,
      SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,
      CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    FROM GET_ACTSCRIPT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
      :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,:IWEEKDAY,
      :IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,:ICARD,
      :ICARDLEN,:IANYCARD,:ICARDSTATE,:IACTEVENT,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY, CODE
    INTO CODE, DATA, GRPCODE, PRIORITY,WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END
END
^

/* Restore proc. body: GET_BDO_SYNC_STATE */
ALTER PROCEDURE GET_BDO_SYNC_STATE(ISYNCBASEID INTEGER)
 RETURNS(UNSYNCTBL VARCHAR(100))
 AS
DECLARE VARIABLE TCHNG NUMERIC(18,0);
DECLARE VARIABLE MCHNG NUMERIC(18,0);
BEGIN
  FOR SELECT TI.TABLENAME, TI.CHNGVAL
  FROM TBLLOADINFO TI
    JOIN RDB$RELATIONS RR ON
      RR.RDB$SYSTEM_FLAG = 0 AND RR.RDB$RELATION_NAME = TI.TABLENAME
  WHERE TI.SYNCBASEID = :ISYNCBASEID AND NOT(TI.CHNGVAL IS NULL)
  INTO UNSYNCTBL, MCHNG
  DO
  BEGIN
    IF (EXISTS(SELECT 1 FROM RDB$RELATION_FIELDS WHERE TRIM(RDB$RELATION_NAME) = TRIM(:UNSYNCTBL) AND TRIM(RDB$FIELD_NAME) = 'SYNBASEGRPID')) THEN
    BEGIN
      EXECUTE STATEMENT 'SELECT MAX(CHNG) FROM "' || UNSYNCTBL || '" T ' ||
                        'JOIN SYNBASESYNCGRP SBSG ON SBSG.SYNCBASEGRPID=T.SYNBASEGRPID ' ||
                        'JOIN SYNCBASE SB ON SB.ID = SBSG.SYNCBASEID '||
                        'WHERE SB.ID = ' || CAST(ISYNCBASEID AS VARCHAR(100))
      INTO TCHNG;
      IF (TCHNG > MCHNG) THEN
        SUSPEND;
    END
  END
END
^

/* Restore proc. body: GET_BDO_SYNCINFO */
ALTER PROCEDURE GET_BDO_SYNCINFO(ISYNCBASEID INTEGER)
 RETURNS(TABLENAME VARCHAR(100),
QUELENGTH VARCHAR(20),
ERROR VARCHAR(255),
SYNCCATEG INTEGER,
ISUPDIRECTION INTEGER,
CUROPER INTEGER)
 AS
DECLARE VARIABLE CURCHNGVAL INTEGER;
DECLARE VARIABLE ERRINFO VARCHAR(255);
DECLARE VARIABLE BDOERRINFO VARCHAR(255);
DECLARE VARIABLE QUEUELENGTH INTEGER;
DECLARE VARIABLE SYNCKIND INTEGER;
DECLARE VARIABLE BDOCODE INTEGER;
BEGIN
  SELECT BDOCODE FROM CUSTOMDB INTO BDOCODE;
  IF ((BDOCODE IS NULL) OR (BDOCODE = 0)) THEN EXIT;
  FOR
    SELECT
      CASE
        WHEN TRIM(TC.TABLENAME) LIKE '%USER%' THEN '"USER"'
        ELSE TC.TABLENAME
      END,
      NULLTONUM(T.CHNGVAL) AS CHNGVAL,
      T.ERRINFO,
      T.BDOERRINFO,
      TC.CATEG,
      ST.SYNCKIND,
      T.CUROPER
    FROM SYNCBASE SB
      JOIN SYNCTABLE ST ON ST.SYNCBASEID = SB.PARENTID AND ST.SYNCKIND <> 0
      JOIN TABLECATEG TC ON TC.CATEG = ST.CATEG
      LEFT JOIN TBLLOADINFO T ON T.SYNCBASEID = SB.ID AND T.TABLENAME = TC.TABLENAME
    WHERE
      SB.ID = :ISYNCBASEID AND
      EXISTS(SELECT 1 FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = TC.TABLENAME AND RDB$FIELD_NAME = 'OWNERBDO')

    INTO TABLENAME, CURCHNGVAL, ERRINFO, BDOERRINFO, SYNCCATEG, SYNCKIND, CUROPER
    DO
    BEGIN
      EXECUTE STATEMENT
      'SELECT COUNT(CHNG) FROM '||TABLENAME||' T '||
        IIF(SYNCKIND = 1, 'JOIN SYNCBASE SB ON T.OWNERBDO = SB.CODE ' ||
                          'WHERE SB.ID = ' || CAST(ISYNCBASEID AS VARCHAR(100)) || ' AND CHNG > ',
                          'WHERE CHNG > ') ||
        CAST(COALESCE(CURCHNGVAL, 0) AS VARCHAR(100))
      INTO QUEUELENGTH;
      ISUPDIRECTION = 1; QUELENGTH = ''; ERROR = BDOERRINFO;
      SUSPEND;
      ISUPDIRECTION = 2; QUELENGTH = QUEUELENGTH; ERROR = ERRINFO;
      SUSPEND;
    END
END
^

/* Restore proc. body: GET_CLIENT_CHILDREN */
ALTER PROCEDURE GET_CLIENT_CHILDREN(INPUTGROUP_ID INTEGER)
 RETURNS(OID INTEGER)
 AS
DECLARE VARIABLE AISFOLDER INTEGER;
BEGIN
  FOR
  SELECT ID, ISFOLDER FROM CLIENT
  WHERE PARENTID = :INPUTGROUP_ID
  ORDER BY ISFOLDER DESC, CODE
  INTO OID, AISFOLDER
    DO
    BEGIN
      BEGIN
        SUSPEND;
        IF (AISFOLDER = 1) THEN
          FOR
          SELECT OID FROM GET_CLIENT_CHILDREN(:OID)
          INTO OID
            DO
              SUSPEND;
      END
  END
END
^

/* Restore proc. body: GET_CLIENT_HIER */
ALTER PROCEDURE GET_CLIENT_HIER(SYNCBASEID INTEGER,
CHNGEND NUMERIC(18),
PARENTID INTEGER,
UPPERHIER INTEGER,
ISC2L INTEGER)
 RETURNS(ID INTEGER,
HIER INTEGER)
 AS
DECLARE VARIABLE AISFOLDER INTEGER;
DECLARE VARIABLE ACHNG INTEGER;
DECLARE VARIABLE CHNGBEG NUMERIC(18,0);
BEGIN

  IF (ISC2L = 1) THEN
    SELECT CHNGVAL
    FROM TBLLOADINFO TI
    WHERE TI.TABLENAME = 'CLIENT' AND TI.SYNCBASEID =:SYNCBASEID AND TI.SECTION = :UPPERHIER
    INTO CHNGBEG;
  ELSE
    SELECT CHNGVAL
    FROM TBLINFO TI
    WHERE TI.TABLENAME = 'CLIENT' AND TI.SECTION = :UPPERHIER
    INTO CHNGBEG;

  IF (CHNGBEG IS NULL) THEN
    CHNGBEG = 0;

  FOR SELECT ID, ISFOLDER, CHNG FROM CLIENT
  WHERE PARENTID = :PARENTID
  INTO ID, AISFOLDER, ACHNG DO
  BEGIN
    HIER = UPPERHIER;
    IF ((ACHNG > CHNGBEG) AND (ACHNG <= CHNGEND)) THEN
      SUSPEND;
    IF (AISFOLDER = 1) THEN
      FOR SELECT ID, HIER FROM GET_CLIENT_HIER(:SYNCBASEID, :CHNGEND, :ID, :HIER + 1, :ISC2L) INTO ID, HIER DO
        SUSPEND;
  END
END
^

/* Restore proc. body: GET_DEVICES_CHILDREN */
ALTER PROCEDURE GET_DEVICES_CHILDREN(INPUTGROUP_ID INTEGER)
 RETURNS(OID INTEGER)
 AS
DECLARE VARIABLE AISFOLDER INTEGER;
BEGIN
  FOR
  SELECT ID, ISFOLDER FROM DEVICES
  WHERE PARENTID = :INPUTGROUP_ID
  ORDER BY ISFOLDER DESC, CODE
  INTO OID, AISFOLDER
    DO
    BEGIN
      BEGIN
        SUSPEND;
        IF (AISFOLDER = 1) THEN
          FOR
          SELECT OID FROM GET_DEVICES_CHILDREN(:OID)
          INTO OID
            DO
              SUSPEND;
      END
  END
END
^

/* Restore proc. body: GET_DEVICES_HIER */
ALTER PROCEDURE GET_DEVICES_HIER(SYNCBASEID INTEGER,
CHNGEND NUMERIC(18),
PARENTID INTEGER,
UPPERHIER INTEGER,
ISC2L INTEGER)
 RETURNS(ID INTEGER,
HIER INTEGER)
 AS
DECLARE VARIABLE AISFOLDER INTEGER;
DECLARE VARIABLE ACHNG INTEGER;
DECLARE VARIABLE CHNGBEG NUMERIC(18,0);
BEGIN

  IF (ISC2L = 1) THEN
    SELECT CHNGVAL
    FROM TBLLOADINFO TI
    WHERE TI.TABLENAME = 'DEVICES' AND TI.SYNCBASEID =:SYNCBASEID AND TI.SECTION = :UPPERHIER
    INTO CHNGBEG;
  ELSE
    SELECT CHNGVAL
    FROM TBLINFO TI
    WHERE TI.TABLENAME = 'DEVICES' AND TI.SECTION = :UPPERHIER
    INTO CHNGBEG;

  IF (CHNGBEG IS NULL) THEN
    CHNGBEG = 0;

  FOR SELECT ID, ISFOLDER, CHNG FROM DEVICES
  WHERE PARENTID = :PARENTID
  INTO ID, AISFOLDER, ACHNG DO
  BEGIN
    HIER = UPPERHIER;
    IF ((ACHNG > CHNGBEG) AND (ACHNG <= CHNGEND)) THEN
      SUSPEND;
    IF (AISFOLDER = 1) THEN
      FOR SELECT ID, HIER FROM GET_DEVICES_HIER(:SYNCBASEID, :CHNGEND, :ID, :HIER + 1, :ISC2L) INTO ID, HIER DO
        SUSPEND;
  END
END
^

/* Restore proc. body: GET_DISCOUNT */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
BEGIN
  ID = 1;

  FOR
    SELECT NULLTONUM(GRPCODE), VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
           "TYPE", NAME, TEXT,
           CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, NULLTONUM(PRIORITY), PARENTID, BEGVAL, ENDVAL,
           FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
    FROM GET_DISCOUNT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
          :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,
          :IWEEKDAY,:IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,
          :ICARD,:ICARDLEN,:IANYCARD,:ICARDSTATE,:IDESTINATION,
          :IKIND,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID, "TYPE", NAME, TEXT,
         CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, PRIORITY, PARENTID, BEGVAL, ENDVAL,
         FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END

END
^

/* Restore proc. body: GET_DISCRATE_CHILDREN */
ALTER PROCEDURE GET_DISCRATE_CHILDREN(INPUTGROUP_ID INTEGER)
 RETURNS(OID INTEGER)
 AS
DECLARE VARIABLE AISFOLDER INTEGER;
BEGIN
  FOR
  SELECT ID, ISFOLDER FROM DISCRATE
  WHERE PARENTID = :INPUTGROUP_ID
  ORDER BY ISFOLDER DESC, CODE
  INTO OID, AISFOLDER
    DO
    BEGIN
      BEGIN
        SUSPEND;
        IF (AISFOLDER = 1) THEN
          FOR
          SELECT OID FROM GET_DISCRATE_CHILDREN(:OID)
          INTO OID
            DO
              SUSPEND;
      END
  END
END
^

/* Restore proc. body: GET_DISCRATE_HIER */
ALTER PROCEDURE GET_DISCRATE_HIER(SYNCBASEID INTEGER,
CHNGEND NUMERIC(18),
PARENTID INTEGER,
UPPERHIER INTEGER,
ISC2L INTEGER)
 RETURNS(ID INTEGER,
HIER INTEGER)
 AS
DECLARE VARIABLE AISFOLDER INTEGER;
DECLARE VARIABLE ACHNG INTEGER;
DECLARE VARIABLE CHNGBEG NUMERIC(18,0);
BEGIN

  IF (ISC2L = 1) THEN
    SELECT CHNGVAL
    FROM TBLLOADINFO TI
    WHERE TI.TABLENAME = 'CLIENT' AND TI.SYNCBASEID =:SYNCBASEID AND TI.SECTION = :UPPERHIER
    INTO CHNGBEG;
  ELSE
    SELECT CHNGVAL
    FROM TBLINFO TI
    WHERE TI.TABLENAME = 'CLIENT' AND TI.SECTION = :UPPERHIER
    INTO CHNGBEG;

  IF (CHNGBEG IS NULL) THEN
    CHNGBEG = 0;

  FOR SELECT ID, ISFOLDER, CHNG FROM DISCRATE
  WHERE PARENTID = :PARENTID
  INTO ID, AISFOLDER, ACHNG DO
  BEGIN
    HIER = UPPERHIER;
    IF ((ACHNG > CHNGBEG) AND (ACHNG <= CHNGEND)) THEN
      SUSPEND;
    IF (AISFOLDER = 1) THEN
      FOR SELECT ID, HIER FROM GET_DISCRATE_HIER(:SYNCBASEID, :CHNGEND, :ID, :HIER + 1, :ISC2L) INTO ID, HIER DO
        SUSPEND;
  END
END
^

/* Restore proc. body: GET_OWNERBDO_BYSYNCBASECATEG */
ALTER PROCEDURE GET_OWNERBDO_BYSYNCBASECATEG(ICATEG INTEGER,
ISYNCBASECODE INTEGER)
 RETURNS(OWNERBDOCODE INTEGER)
 AS
DECLARE VARIABLE DBID INTEGER;
DECLARE VARIABLE DBCODE INTEGER;
DECLARE VARIABLE ASYNCBASEID INTEGER;
DECLARE VARIABLE TMPID INTEGER;
DECLARE VARIABLE ASYNCKIND INTEGER;
DECLARE VARIABLE ACODE INTEGER;
BEGIN
  SELECT ID
  FROM SYNCBASE
  WHERE CODE = :ISYNCBASECODE
  INTO :ASYNCBASEID;

  SELECT CT.BDOCODE, SB.ID
  FROM CUSTOMDB CT
    JOIN SYNCBASE SB ON SB.CODE = CT.BDOCODE
  INTO DBCODE, DBID;

  FOR SELECT SB.CODE, ST.SYNCKIND, SB.ID
  FROM GET_SYNCBASE_PARENTS(:ASYNCBASEID, 0) G
    JOIN SYNCBASE SB ON
      SB.ID = G.ID_PARENT
    JOIN SYNCTABLE ST ON
      ST.SYNCBASEID = SB.PARENTID
  WHERE ST.CATEG = :ICATEG
  ORDER BY G.NUM
  INTO ACODE, ASYNCKIND, TMPID
  DO
    IF (ACODE = DBCODE) THEN
      EXIT;
    ELSE
      IF ((ASYNCKIND = 1) AND (NOT EXISTS(SELECT 1
                                          FROM GET_SYNCBASE_PARENTS(:TMPID, 0, :DBID) G
                                            JOIN SYNCBASE SB ON
                                              SB.ID = G.ID_PARENT
                                            JOIN SYNCTABLE ST ON
                                              ST.SYNCBASEID = SB.PARENTID AND ST.SYNCKIND = 0
                                          WHERE ST.CATEG = :ICATEG))) THEN
      BEGIN
        OWNERBDOCODE = ACODE;
        SUSPEND;
        EXIT;
      END
END
^

/* Restore proc. body: GET_SPRT_CHILDREN */
ALTER PROCEDURE GET_SPRT_CHILDREN(INPUTGROUP_ID INTEGER)
 RETURNS(OID INTEGER)
 AS
DECLARE VARIABLE AISWARE INTEGER;
BEGIN
  FOR
  SELECT ID, ISWARE FROM SPRT
  WHERE PARENTID = :INPUTGROUP_ID
  ORDER BY ISWARE, CODE
  INTO OID, AISWARE
    DO
    BEGIN
      BEGIN
        SUSPEND;
        IF (AISWARE < 0) THEN
          FOR
          SELECT OID FROM GET_SPRT_CHILDREN(:OID)
          INTO OID
            DO
              SUSPEND;
      END
  END
END
^

/* Restore proc. body: GET_SYNCBASE_ADDRECORD */
ALTER PROCEDURE GET_SYNCBASE_ADDRECORD(ICODE INTEGER,
ICATEG INTEGER)
 RETURNS(ID INTEGER,
SYNCKIND INTEGER,
CODE INTEGER,
NAME VARCHAR(100))
 AS
DECLARE VARIABLE BOTTOM INTEGER;
DECLARE VARIABLE IID INTEGER;
BEGIN
  SELECT ID FROM SYNCBASE
  WHERE CODE = :ICODE
  INTO IID;

  FOR
    SELECT SB.ID, ST.SYNCKIND, SB.NAME, SB.CODE, (SELECT COUNT(*) FROM SYNCBASE WHERE PARENTID = SB.ID) AS BOTTOM
    FROM SYNCBASE SB
    JOIN SYNCTABLE ST ON ST.SYNCBASEID = SB.ID AND ST.CATEG = :ICATEG
    WHERE SB.PARENTID = :IID
    INTO ID, SYNCKIND, NAME, CODE, BOTTOM
  DO
  BEGIN
    IF (:SYNCKIND = 1 AND :BOTTOM <> 0) THEN
      EXECUTE PROCEDURE GET_SYNCBASE_ADDRECORD (CODE, SYNCKIND) RETURNING_VALUES :ID, :SYNCKIND, :NAME, :CODE;

    IF (:SYNCKIND = 1 AND :BOTTOM = 0) THEN
      SUSPEND;

    IF (:SYNCKIND = 2) THEN
      SUSPEND;
  END
END
^

/* Restore proc. body: GET_SYNCBASE_CHILDREN */
ALTER PROCEDURE GET_SYNCBASE_CHILDREN(INPUTGROUP_ID INTEGER)
 RETURNS(OID INTEGER)
 AS
BEGIN
  FOR
  SELECT ID FROM SYNCBASE
  WHERE ID = :INPUTGROUP_ID
  INTO OID
  DO
    SUSPEND;

  FOR
  SELECT ID FROM SYNCBASE
  WHERE PARENTID = CASE WHEN :INPUTGROUP_ID < 0 THEN (-:INPUTGROUP_ID) ELSE :INPUTGROUP_ID END
  ORDER BY CODE
  INTO OID
    DO
    BEGIN
      BEGIN
        SUSPEND;
        FOR
        SELECT OID FROM GET_SYNCBASE_CHILDREN(-:OID)
        INTO OID
          DO
            SUSPEND;
      END
  END
END
^

/* Restore proc. body: GET_SYNCBASE_PARENTS */
ALTER PROCEDURE GET_SYNCBASE_PARENTS(ID_SYNCBASE INTEGER,
IN_NUM INTEGER,
ID_SYNCBASE_FINAL INTEGER = NULL)
 RETURNS(ID_PARENT INTEGER,
NUM INTEGER)
 AS
DECLARE VARIABLE TMP_NUM INTEGER;
BEGIN
  IF (ID_SYNCBASE_FINAL IS NULL) THEN
    ID_SYNCBASE_FINAL = 0;

  IF ((ID_SYNCBASE <> 0) AND (ID_SYNCBASE <> ID_SYNCBASE_FINAL)) THEN
  BEGIN

    SELECT PARENTID
    FROM   SYNCBASE
    WHERE  ID = :ID_SYNCBASE
    INTO   ID_PARENT;

    IF (ID_PARENT = ID_SYNCBASE) THEN
      EXCEPTION E_SYNCBASE_STRUCT_CORRUPT;

    IF (ID_PARENT <> 0) THEN
    BEGIN
      TMP_NUM = IN_NUM + 1;
      FOR
        SELECT ID_PARENT, NUM
        FROM   GET_SYNCBASE_PARENTS(:ID_PARENT, :TMP_NUM, :ID_SYNCBASE_FINAL)
        INTO   ID_PARENT, NUM
        DO
          SUSPEND;
    END

    NUM = IN_NUM;
    ID_PARENT = ID_SYNCBASE;
    SUSPEND;
  END
END
^

/* Restore proc. body: GET_WARE_CHILDREN */
ALTER PROCEDURE GET_WARE_CHILDREN(INPUTGROUP_ID INTEGER)
 RETURNS(OID INTEGER)
 AS
DECLARE VARIABLE AISWARE INTEGER;
BEGIN
  FOR
  SELECT ID, ISWARE FROM SPRT
  WHERE PARENTID = :INPUTGROUP_ID
  ORDER BY ISWARE, CODE
  INTO OID, AISWARE
    DO
    BEGIN
      BEGIN
        SUSPEND;
        IF (AISWARE < 0) THEN
          FOR
          SELECT OID FROM GET_WARE_CHILDREN(:OID)
          INTO OID
            DO
              SUSPEND;
      END
  END
END
^

/* Restore proc. body: GET_WARE_HIER */
ALTER PROCEDURE GET_WARE_HIER(SYNCBASEID INTEGER,
CHNGEND NUMERIC(18),
PARENTID INTEGER,
UPPERHIER INTEGER,
ISC2L INTEGER)
 RETURNS(ID INTEGER,
HIER INTEGER)
 AS
DECLARE VARIABLE AISWARE INTEGER;
DECLARE VARIABLE ACHNG INTEGER;
DECLARE VARIABLE CHNGBEG NUMERIC(18,0);
BEGIN

  IF (ISC2L = 1) THEN
    SELECT CHNGVAL
    FROM TBLLOADINFO TI
    WHERE TI.TABLENAME = 'SPRT' AND TI.SYNCBASEID =:SYNCBASEID AND TI.SECTION = :UPPERHIER
    INTO CHNGBEG;
  ELSE
    SELECT CHNGVAL
    FROM TBLINFO TI
    WHERE TI.TABLENAME = 'SPRT' AND TI.SECTION = :UPPERHIER
    INTO CHNGBEG;

  IF (CHNGBEG IS NULL) THEN
    CHNGBEG = 0;

  FOR
  SELECT ID, ISWARE, CHNG FROM SPRT
  WHERE PARENTID = :PARENTID
  INTO ID, AISWARE, ACHNG DO
  BEGIN
    HIER = UPPERHIER;
    IF ((ACHNG > CHNGBEG) AND (ACHNG <= CHNGEND)) THEN
      SUSPEND;
    IF (AISWARE <> 1) THEN
      FOR SELECT ID, HIER FROM GET_WARE_HIER(:SYNCBASEID, :CHNGEND, :ID, :HIER + 1, :ISC2L) INTO ID, HIER DO
        SUSPEND;
  END
END
^

/* Restore proc. body: MERGE_IDCOR */
ALTER PROCEDURE MERGE_IDCOR(ATABLEID INTEGER,
AIDEXT NUMERIC(18),
AIDINT NUMERIC(18))
 AS
BEGIN
  DELETE FROM IDCOR
  WHERE TABLEID = :ATABLEID AND
  ((IDEXT = :AIDEXT) OR (IDINT = :AIDINT));

  INSERT INTO IDCOR (IDINT, IDEXT, TABLEID)
  VALUES (:AIDINT, :AIDEXT, :ATABLEID);
END
^

/* Restore proc. body: MERGE_SECURITY */
ALTER PROCEDURE MERGE_SECURITY(IPROFILEID INTEGER,
ISECURITY INTEGER,
ISECURITYVALUE INTEGER,
IBDOCODE INTEGER,
IOWNERBDO INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE SECURITYVALUE INTEGER;
DECLARE VARIABLE OWNERBDO INTEGER;
DECLARE VARIABLE BDOCODE INTEGER;
BEGIN
  SELECT ID, SECURITYVALUE, COALESCE(OWNERBDO, 0), COALESCE(BDOCODE, 0) FROM SECURITY
  WHERE PROFILEID = :IPROFILEID AND SECURITY = :ISECURITY
  INTO ID, SECURITYVALUE, OWNERBDO, BDOCODE;

  IF (ID IS NULL) THEN
    INSERT INTO SECURITY (ID, PROFILEID, SECURITY, SECURITYVALUE, BDOCODE, OWNERBDO)
    VALUES(GEN_ID(GID, 1), :IPROFILEID,  :ISECURITY, :ISECURITYVALUE, :IBDOCODE, :IOWNERBDO);
  ELSE IF ((SECURITYVALUE <> ISECURITYVALUE) OR
           (OWNERBDO <> COALESCE(IOWNERBDO, 0)) OR
           (BDOCODE <> COALESCE(IBDOCODE, 0))) THEN
    UPDATE SECURITY SET
      SECURITYVALUE = :ISECURITYVALUE,
      OWNERBDO = :IOWNERBDO,
      BDOCODE = :IBDOCODE
    WHERE
      ID = :ID;
END
^

/* Restore proc. body: MERGE_SYNCTABLE */
ALTER PROCEDURE MERGE_SYNCTABLE(ICATEG INTEGER,
ISYNCBASEID INTEGER,
ISYNCKIND INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  SELECT ID
  FROM SYNCTABLE
  WHERE CATEG = :ICATEG AND SYNCBASEID = :ISYNCBASEID
  INTO  ID;

  IF (ID IS NULL) THEN
    INSERT INTO SYNCTABLE
      (ID, CATEG, SYNCBASEID, SYNCKIND)
    VALUES
      (GEN_ID(GID, 1), :ICATEG, :ISYNCBASEID, :ISYNCKIND);
    ELSE
      UPDATE SYNCTABLE SET
        CATEG = :ICATEG,
        SYNCBASEID = :ISYNCBASEID,
        SYNCKIND = :ISYNCKIND
      WHERE  ID = :ID;
END
^

/* Restore proc. body: MERGE_TBLINFO */
ALTER PROCEDURE MERGE_TBLINFO(ATABLENAME VARCHAR(100),
ASECTION INTEGER,
ACHNGVAL INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  IF (ASECTION IS NULL) THEN ASECTION = 0;
  SELECT FIRST 1 ID FROM TBLINFO
  WHERE TABLENAME = :ATABLENAME AND ((SECTION = :ASECTION) OR (:ASECTION = -1))
  INTO :ID;

  IF (ID IS NULL) THEN
    INSERT INTO TBLINFO (ID, TABLENAME, CHNGVAL, SECTION)
    VALUES (GEN_ID(GID, 1), :ATABLENAME, :ACHNGVAL, IIF(:ASECTION = -1, 0, :ASECTION));
  ELSE
    UPDATE TBLINFO SET
      CHNGVAL = :ACHNGVAL
    WHERE (ID = :ID) OR (:ASECTION = -1 AND TABLENAME = :ATABLENAME);
END
^

/* Restore proc. body: MERGE_TBLLOADINFO */
ALTER PROCEDURE MERGE_TBLLOADINFO(ASYNCBASEID INTEGER,
ATABLENAME VARCHAR(100),
ASECTION INTEGER,
ACHNGVAL INTEGER,
AERRINFO VARCHAR(255),
ASYNCCATEG INTEGER,
CUROPER INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  UPDATE TBLLOADINFO SET CUROPER = NULL WHERE SYNCBASEID = :ASYNCBASEID AND CUROPER IS NOT NULL;

  SELECT FIRST 1 ID FROM TBLLOADINFO
  WHERE SYNCBASEID = :ASYNCBASEID AND TABLENAME = :ATABLENAME AND
        ((SECTION = :ASECTION) OR (:ASECTION = -1))
  INTO :ID;

  IF (ID IS NULL) THEN
    INSERT INTO TBLLOADINFO (ID, TABLENAME, CHNGVAL, SYNCBASEID, SECTION, ERRINFO, SYNCCATEG, LASTCHANGE, CUROPER)
    VALUES (GEN_ID(GID, 1), :ATABLENAME, IIF(:ACHNGVAL = -1, 0, :ACHNGVAL), :ASYNCBASEID, IIF(:ASECTION = -1, 0, :ASECTION), :AERRINFO, :ASYNCCATEG, CURRENT_TIMESTAMP, :CUROPER);
  ELSE
    UPDATE TBLLOADINFO SET
      CHNGVAL = IIF(:ACHNGVAL = -1, CHNGVAL, :ACHNGVAL),
      ERRINFO = :AERRINFO,
      LASTCHANGE = CURRENT_TIMESTAMP,
      CUROPER = :CUROPER
    WHERE (ID = :ID) OR (:ASECTION = -1 AND SYNCBASEID = :ASYNCBASEID AND TABLENAME = :ATABLENAME) ;
END
^

/* Restore proc. body: SYNC_CASHBOXDEV */
ALTER PROCEDURE SYNC_CASHBOXDEV(ICONTROLTYPE INTEGER,
IDEVICEID INTEGER,
IOAMONEYIN INTEGER,
IOAMONEYOUT INTEGER,
IOAPAYMENT INTEGER,
IOAREG INTEGER,
IOAZREPORT INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  SELECT FIRST 1 ID FROM CASHBOXDEV
  WHERE
    DEVICEID = :IDEVICEID
  INTO ID;
  IF (ID IS NULL) THEN
    INSERT INTO CASHBOXDEV
     (
      CONTROLTYPE,
      DEVICEID,
      ID,
      OAMONEYIN,
      OAMONEYOUT,
      OAPAYMENT,
      OAREG,
      OAZREPORT
      )
    VALUES(
      :ICONTROLTYPE,
      :IDEVICEID,
      GEN_ID(GID, 1),
      :IOAMONEYIN,
      :IOAMONEYOUT,
      :IOAPAYMENT,
      :IOAREG,
      :IOAZREPORT);
  ELSE
    UPDATE CASHBOXDEV SET
      CONTROLTYPE = :ICONTROLTYPE,
      OAMONEYIN = :IOAMONEYIN,
      OAMONEYOUT = :IOAMONEYOUT,
      OAPAYMENT = :IOAPAYMENT,
      OAREG = :IOAREG,
      OAZREPORT = :IOAZREPORT
    WHERE 
      ID = :ID;
END
^

/* Restore proc. body: SYNC_CONDITION */
ALTER PROCEDURE SYNC_CONDITION(IACTDISCID INTEGER,
IBIRTHDATEBEG DATE,
IBIRTHDATECOND INTEGER,
IBIRTHDATEEND DATE,
IBIRTHDAYBEG INTEGER,
IBIRTHDAYEND INTEGER,
IBIRTHMONTHBEG INTEGER,
IBIRTHMONTHEND INTEGER,
IBIRTHYEARBEG INTEGER,
IBIRTHYEAREND INTEGER,
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ICOUNTERBEG1 DOUBLE PRECISION,
ICOUNTERBEG2 DOUBLE PRECISION,
ICOUNTERBEG3 DOUBLE PRECISION,
ICOUNTEREND1 DOUBLE PRECISION,
ICOUNTEREND2 DOUBLE PRECISION,
ICOUNTEREND3 DOUBLE PRECISION,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IFORMULA1 VARCHAR(100),
IFORMULA2 VARCHAR(100),
IFORMULA3 VARCHAR(100),
IMEMDATEBEG DATE,
IMEMDATECOND INTEGER,
IMEMDATEEND DATE,
IMEMDAYBEG INTEGER,
IMEMDAYEND INTEGER,
IMEMMONTHBEG INTEGER,
IMEMMONTHEND INTEGER,
IMEMYEARBEG INTEGER,
IMEMYEAREND INTEGER,
IPRICEBEG DOUBLE PRECISION,
IPRICEEND DOUBLE PRECISION,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IQUANTITYRECBEG DOUBLE PRECISION,
IQUANTITYRECEND DOUBLE PRECISION,
IQUANTITYWAREBEG DOUBLE PRECISION,
IQUANTITYWAREEND DOUBLE PRECISION,
IREGDATEBEG DATE,
IREGDATECOND INTEGER,
IREGDATEEND DATE,
IREGDAYBEG INTEGER,
IREGDAYEND INTEGER,
IREGMONTHBEG INTEGER,
IREGMONTHEND INTEGER,
IREGYEARBEG INTEGER,
IREGYEAREND INTEGER,
ISEX INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
ISUMMWAREBEG DOUBLE PRECISION,
ISUMMWAREEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IWAREID INTEGER)
 RETURNS(CONDITIONID INTEGER)
 AS
BEGIN
  SELECT CONDITIONID FROM ACTDISC
  WHERE ID = :IACTDISCID
  INTO :CONDITIONID;
  IF (CONDITIONID IS NULL) THEN
  BEGIN
    SELECT GEN_ID(GID, 1) FROM RDB$DATABASE INTO :CONDITIONID;

    INSERT INTO CONDITION
     (
      BIRTHDATEBEG,
      BIRTHDATECOND,
      BIRTHDATEEND,
      BIRTHDAYBEG,
      BIRTHDAYEND,
      BIRTHMONTHBEG,
      BIRTHMONTHEND,
      BIRTHYEARBEG,
      BIRTHYEAREND,
      CARDLENBEG,
      CARDLENEND,
      CARDPREFIXBEG,
      CARDPREFIXEND,
      CARDSTATE,
      COUNTERBEG1,
      COUNTERBEG2,
      COUNTERBEG3,
      COUNTEREND1,
      COUNTEREND2,
      COUNTEREND3,
      DATEBEG,
      DATEEND,
      DAYBEG,
      DAYEND,
      FORMULA1,
      FORMULA2,
      FORMULA3,
      ID,
      MEMDATEBEG,
      MEMDATECOND,
      MEMDATEEND,
      MEMDAYBEG,
      MEMDAYEND,
      MEMMONTHBEG,
      MEMMONTHEND,
      MEMYEARBEG,
      MEMYEAREND,
      PRICEBEG,
      PRICEEND,
      QUANTITYBEG,
      QUANTITYEND,
      QUANTITYRECBEG,
      QUANTITYRECEND,
      QUANTITYWAREBEG,
      QUANTITYWAREEND,
      REGDATEBEG,
      REGDATECOND,
      REGDATEEND,
      REGDAYBEG,
      REGDAYEND,
      REGMONTHBEG,
      REGMONTHEND,
      REGYEARBEG,
      REGYEAREND,
      SEX,
      SUMMBEG,
      SUMMEND,
      SUMMRECBEG,
      SUMMRECEND,
      SUMMWAREBEG,
      SUMMWAREEND,
      TIMEBEG,
      TIMEEND,
      WAREID
      )
    VALUES(
      :IBIRTHDATEBEG,
      :IBIRTHDATECOND,
      :IBIRTHDATEEND,
      :IBIRTHDAYBEG,
      :IBIRTHDAYEND,
      :IBIRTHMONTHBEG,
      :IBIRTHMONTHEND,
      :IBIRTHYEARBEG,
      :IBIRTHYEAREND,
      :ICARDLENBEG,
      :ICARDLENEND,
      :ICARDPREFIXBEG,
      :ICARDPREFIXEND,
      :ICARDSTATE,
      :ICOUNTERBEG1,
      :ICOUNTERBEG2,
      :ICOUNTERBEG3,
      :ICOUNTEREND1,
      :ICOUNTEREND2,
      :ICOUNTEREND3,
      :IDATEBEG,
      :IDATEEND,
      :IDAYBEG,
      :IDAYEND,
      :IFORMULA1,
      :IFORMULA2,
      :IFORMULA3,
      :CONDITIONID,
      :IMEMDATEBEG,
      :IMEMDATECOND,
      :IMEMDATEEND,
      :IMEMDAYBEG,
      :IMEMDAYEND,
      :IMEMMONTHBEG,
      :IMEMMONTHEND,
      :IMEMYEARBEG,
      :IMEMYEAREND,
      :IPRICEBEG,
      :IPRICEEND,
      :IQUANTITYBEG,
      :IQUANTITYEND,
      :IQUANTITYRECBEG,
      :IQUANTITYRECEND,
      :IQUANTITYWAREBEG,
      :IQUANTITYWAREEND,
      :IREGDATEBEG,
      :IREGDATECOND,
      :IREGDATEEND,
      :IREGDAYBEG,
      :IREGDAYEND,
      :IREGMONTHBEG,
      :IREGMONTHEND,
      :IREGYEARBEG,
      :IREGYEAREND,
      :ISEX,
      :ISUMMBEG,
      :ISUMMEND,
      :ISUMMRECBEG,
      :ISUMMRECEND,
      :ISUMMWAREBEG,
      :ISUMMWAREEND,
      :ITIMEBEG,
      :ITIMEEND,
      :IWAREID
    );
  END
  ELSE
    UPDATE CONDITION SET
      BIRTHDATEBEG = :IBIRTHDATEBEG,
      BIRTHDATECOND = :IBIRTHDATECOND,
      BIRTHDATEEND = :IBIRTHDATEEND,
      BIRTHDAYBEG = :IBIRTHDAYBEG,
      BIRTHDAYEND = :IBIRTHDAYEND,
      BIRTHMONTHBEG = :IBIRTHMONTHBEG,
      BIRTHMONTHEND = :IBIRTHMONTHEND,
      BIRTHYEARBEG = :IBIRTHYEARBEG,
      BIRTHYEAREND = :IBIRTHYEAREND,
      CARDLENBEG = :ICARDLENBEG,
      CARDLENEND = :ICARDLENEND,
      CARDPREFIXBEG = :ICARDPREFIXBEG,
      CARDPREFIXEND = :ICARDPREFIXEND,
      CARDSTATE = :ICARDSTATE,
      COUNTERBEG1 = :ICOUNTERBEG1,
      COUNTERBEG2 = :ICOUNTERBEG2,
      COUNTERBEG3 = :ICOUNTERBEG3,
      COUNTEREND1 = :ICOUNTEREND1,
      COUNTEREND2 = :ICOUNTEREND2,
      COUNTEREND3 = :ICOUNTEREND3,
      DATEBEG = :IDATEBEG,
      DATEEND = :IDATEEND,
      DAYBEG = :IDAYBEG,
      DAYEND = :IDAYEND,
      FORMULA1 = :IFORMULA1,
      FORMULA2 = :IFORMULA2,
      FORMULA3 = :IFORMULA3,
      MEMDATEBEG = :IMEMDATEBEG,
      MEMDATECOND = :IMEMDATECOND,
      MEMDATEEND = :IMEMDATEEND,
      MEMDAYBEG = :IMEMDAYBEG,
      MEMDAYEND = :IMEMDAYEND,
      MEMMONTHBEG = :IMEMMONTHBEG,
      MEMMONTHEND = :IMEMMONTHEND,
      MEMYEARBEG = :IMEMYEARBEG,
      MEMYEAREND = :IMEMYEAREND,
      PRICEBEG = :IPRICEBEG,
      PRICEEND = :IPRICEEND,
      QUANTITYBEG = :IQUANTITYBEG,
      QUANTITYEND = :IQUANTITYEND,
      QUANTITYRECBEG = :IQUANTITYRECBEG,
      QUANTITYRECEND = :IQUANTITYRECEND,
      QUANTITYWAREBEG = :IQUANTITYWAREBEG,
      QUANTITYWAREEND = :IQUANTITYWAREEND,
      REGDATEBEG = :IREGDATEBEG,
      REGDATECOND = :IREGDATECOND,
      REGDATEEND = :IREGDATEEND,
      REGDAYBEG = :IREGDAYBEG,
      REGDAYEND = :IREGDAYEND,
      REGMONTHBEG = :IREGMONTHBEG,
      REGMONTHEND = :IREGMONTHEND,
      REGYEARBEG = :IREGYEARBEG,
      REGYEAREND = :IREGYEAREND,
      SEX = :ISEX,
      SUMMBEG = :ISUMMBEG,
      SUMMEND = :ISUMMEND,
      SUMMRECBEG = :ISUMMRECBEG,
      SUMMRECEND = :ISUMMRECEND,
      SUMMWAREBEG = :ISUMMWAREBEG,
      SUMMWAREEND = :ISUMMWAREEND,
      TIMEBEG = :ITIMEBEG,
      TIMEEND = :ITIMEEND,
      WAREID = :IWAREID
    WHERE 
      ID = :CONDITIONID;
END
^

/* Restore proc. body: SYNC_PAYCARDDEV */
ALTER PROCEDURE SYNC_PAYCARDDEV(ICAPDISC INTEGER,
ICAPGKH INTEGER,
ICAPINTPAY INTEGER,
ICAPMOBILE INTEGER,
ICAPPAY INTEGER,
IDEVICEID INTEGER,
ISLIPCOUNT INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  SELECT FIRST 1 ID FROM PAYCARDDEV
  WHERE
    DEVICEID = :IDEVICEID
  INTO ID;
  IF (ID IS NULL) THEN
    INSERT INTO PAYCARDDEV
     (
      CAPDISC,
      CAPGKH,
      CAPINTPAY,
      CAPMOBILE,
      CAPPAY,
      DEVICEID,
      ID,
      SLIPCOUNT
      )
    VALUES(
      :ICAPDISC,
      :ICAPGKH,
      :ICAPINTPAY,
      :ICAPMOBILE,
      :ICAPPAY,
      :IDEVICEID,
      GEN_ID(GID, 1),
      :ISLIPCOUNT
    );
  ELSE
    UPDATE PAYCARDDEV SET
      CAPDISC = :ICAPDISC,
      CAPGKH = :ICAPGKH,
      CAPINTPAY = :ICAPINTPAY,
      CAPMOBILE = :ICAPMOBILE,
      CAPPAY = :ICAPPAY,
      DEVICEID = :IDEVICEID,
      SLIPCOUNT = :ISLIPCOUNT
    WHERE 
      ID = :ID;
END
^

/* Restore proc. body: SYNC_RCPPRNDEV */
ALTER PROCEDURE SYNC_RCPPRNDEV(IBEEPCOUNT INTEGER,
IDEVICEID INTEGER,
IFONTINDEX INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  SELECT FIRST 1 ID FROM RCPPRNDEV
  WHERE
    DEVICEID = :IDEVICEID
  INTO ID;
  IF (ID IS NULL) THEN
    INSERT INTO RCPPRNDEV
     (
      BEEPCOUNT,
      DEVICEID,
      FONTINDEX,
      ID
      )
    VALUES(
      :IBEEPCOUNT,
      :IDEVICEID,
      :IFONTINDEX,
      GEN_ID(GID, 1)
    );
  ELSE
    UPDATE RCPPRNDEV SET
      BEEPCOUNT = :IBEEPCOUNT,
      DEVICEID = :IDEVICEID,
      FONTINDEX = :IFONTINDEX
    WHERE 
      ID = :ID;
END
^

/* Restore proc. body: SYNC_TERMDEV */
ALTER PROCEDURE SYNC_TERMDEV(IDEVICEID INTEGER,
IFORM INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  SELECT FIRST 1 ID FROM TERMDEV
  WHERE
    DEVICEID = :IDEVICEID
  INTO ID;
  IF (ID IS NULL) THEN
    INSERT INTO TERMDEV
     (
      DEVICEID,
      FORM,
      ID
      )
    VALUES(
      :IDEVICEID,
      :IFORM,
      GEN_ID(GID, 1)
    );
  ELSE
    UPDATE TERMDEV SET
      DEVICEID = :IDEVICEID,
      FORM = :IFORM
    WHERE 
      ID = :ID;
END
^

/* Restore proc. body: TABLECATEG */
ALTER PROCEDURE TABLECATEG RETURNS(TABLENAME VARCHAR(100),
TABLEID INTEGER,
CATEG INTEGER)
 AS
BEGIN
/*       untSyncTypeDef ()!!!! */

  TABLENAME = 'WINREPORTS'; TABLEID = 0; CATEG = 17;
  SUSPEND;
  TABLENAME = 'KEYBLAYT'; TABLEID = 1; CATEG = 22;
  SUSPEND;
  TABLENAME = 'TOUCHLAYT'; TABLEID = 2; CATEG = 21;
  SUSPEND;
  TABLENAME = 'SETTINGS_SCR'; TABLEID = 3; CATEG = 21;
  SUSPEND;
  TABLENAME = 'CARDGROUP'; TABLEID = 4; CATEG = 14;
  SUSPEND;
  TABLENAME = 'CARD'; TABLEID = 5; CATEG = 14;
  SUSPEND;
  TABLENAME = 'RECTEMPLATE'; TABLEID = 6; CATEG = 15;
  SUSPEND;
  TABLENAME = 'DOCTEMPLATE'; TABLEID = 7; CATEG = 15;
  SUSPEND;
  TABLENAME = 'DOCKIND'; TABLEID = 8; CATEG = 15;
  SUSPEND;
  TABLENAME = 'DOCKINDRECTMPL'; TABLEID = 9; CATEG = 15;
  SUSPEND;
  TABLENAME = 'DOCKINDTMPL'; TABLEID = 10; CATEG = 15;
  SUSPEND;
  TABLENAME = 'SETTINGS_DOC'; TABLEID = 11; CATEG = 15;
  SUSPEND;
  TABLENAME = 'PROFILE'; TABLEID = 12; CATEG = 23;
  SUSPEND;
  TABLENAME = 'SECURITY'; TABLEID = 13; CATEG = 23;
  SUSPEND;
  TABLENAME = '"USER"'; TABLEID = 14; CATEG = 23;
  SUSPEND;
  TABLENAME = 'SETTINGS_USR'; TABLEID = 64; CATEG = 23;
  SUSPEND;
  TABLENAME = 'TAXRATE'; TABLEID = 15; CATEG = 7;
  SUSPEND;
  TABLENAME = 'TAXGROUP'; TABLEID = 16; CATEG = 7;
  SUSPEND;
  TABLENAME = 'TAXGRPRT'; TABLEID = 17; CATEG = 7;
  SUSPEND;
  TABLENAME = 'SETTINGS_TAX'; TABLEID = 18; CATEG = 7;
  SUSPEND;
  TABLENAME = 'KEYBMODE'; TABLEID = 19; CATEG = 22;
  SUSPEND;
  TABLENAME = 'KEYBMAP'; TABLEID = 20; CATEG = 22;
  SUSPEND;
  TABLENAME = 'KEYBMAPF'; TABLEID = 21; CATEG = 22;
  SUSPEND;
  TABLENAME = 'INPDEVFLT'; TABLEID = 22; CATEG = 2;
  SUSPEND;
  TABLENAME = 'DENOMIN'; TABLEID = 23; CATEG = 13;
  SUSPEND;
  TABLENAME = 'COMMENT'; TABLEID = 24; CATEG = 16;
  SUSPEND;
  TABLENAME = 'HALL'; TABLEID = 25; CATEG = 19;
  SUSPEND;
  TABLENAME = 'HALLPLACE'; TABLEID = 26; CATEG = 19;
  SUSPEND;
  TABLENAME = 'RMK'; TABLEID = 27; CATEG = 2;
  SUSPEND;
  TABLENAME = 'CURRENCY'; TABLEID = 28; CATEG = 12;
  SUSPEND;
  TABLENAME = 'MONEYBOX'; TABLEID = 63; CATEG = 2;
  SUSPEND;
  TABLENAME = 'SETTINGS_CUR'; TABLEID = 29; CATEG = 12;
  SUSPEND;
  TABLENAME = 'DEVICES'; TABLEID = 30; CATEG = 2;
  SUSPEND;
  TABLENAME = 'RMKDEV'; TABLEID = 31; CATEG = 2;
  SUSPEND;
  TABLENAME = 'SETTINGS_DEV'; TABLEID = 32; CATEG = 2;
  SUSPEND;
  TABLENAME = 'INTBARCS'; TABLEID = 33; CATEG = 4;
  SUSPEND;
  TABLENAME = 'ASPSCHM'; TABLEID = 34; CATEG = 6;
  SUSPEND;
  TABLENAME = 'ASPECT'; TABLEID = 35; CATEG = 6;
  SUSPEND;
  TABLENAME = 'ASPVALUE'; TABLEID = 36; CATEG = 6;
  SUSPEND;
  TABLENAME = 'SETTINGS_ASP'; TABLEID = 37; CATEG = 6;
  SUSPEND;
  TABLENAME = 'PRICELABEL'; TABLEID = 38; CATEG = 18;
  SUSPEND;
  TABLENAME = 'SETTINGS_PRL'; TABLEID = 39; CATEG = 18;
  SUSPEND;
  TABLENAME = 'SPRT'; TABLEID = 40; CATEG = 4;
  SUSPEND;
  TABLENAME = 'ANALOG'; TABLEID = 41; CATEG = 4;
  SUSPEND;
  TABLENAME = 'REMAIN'; TABLEID = 42; CATEG = 4;
  SUSPEND;
  TABLENAME = 'BARCODE'; TABLEID = 43; CATEG = 4;
  SUSPEND;
  TABLENAME = 'PAYMENT'; TABLEID = 44; CATEG = 11;
  SUSPEND;
  TABLENAME = 'SETTINGS_PAY'; TABLEID = 45; CATEG = 11;
  SUSPEND;
  TABLENAME = 'GRPCCARD'; TABLEID = 46; CATEG = 8;
  SUSPEND;
  TABLENAME = 'CCARD'; TABLEID = 47; CATEG = 8;
  SUSPEND;
  TABLENAME = 'CLIENT'; TABLEID = 48; CATEG = 8;
  SUSPEND;
  TABLENAME = 'CLIENTCARD'; TABLEID = 49; CATEG = 8;
  SUSPEND;
  TABLENAME = 'COUNTERTYPE'; TABLEID = 50; CATEG = 10;
  SUSPEND;
  TABLENAME = 'COUNTER'; TABLEID = 51; CATEG = 10;
  SUSPEND;
  TABLENAME = 'CCARDCOUNTER'; TABLEID = 52; CATEG = 10;
  SUSPEND;
  TABLENAME = 'CLIENTCOUNTER'; TABLEID = 53; CATEG = 10;
  SUSPEND;
  TABLENAME = 'DISCRATE'; TABLEID = 54; CATEG = 9;
  SUSPEND;
  TABLENAME = 'ACTSCRIPT'; TABLEID = 55; CATEG = 9;
  SUSPEND;
  TABLENAME = 'GRPACTDISC'; TABLEID = 56; CATEG = 9;
  SUSPEND;
  TABLENAME = 'ACTDISC'; TABLEID = 57; CATEG = 9;
  SUSPEND;
  TABLENAME = 'ACTDISCOBJ'; TABLEID = 58; CATEG = 9;
  SUSPEND;
  TABLENAME = 'DOCUMENT'; TABLEID = 59; CATEG = 20;
  SUSPEND;
  TABLENAME = 'COUNTERD'; TABLEID = 60; CATEG = 10;
  SUSPEND;
  TABLENAME = 'REMAIND'; TABLEID = 61; CATEG = 5;
  SUSPEND;
  TABLENAME = 'SETTINGS'; TABLEID = 62; CATEG = 3;
  SUSPEND;
  TABLENAME = 'SETTINGS_EXH'; TABLEID = 65; CATEG = 1;
  SUSPEND;
END
^

/* Restore proc. body: UPDATE_DBIDENT_GLOBAL */
ALTER PROCEDURE UPDATE_DBIDENT_GLOBAL(UPDATE_BDOCODE INTEGER)
 AS
DECLARE VARIABLE TABLENAME VARCHAR(100);
DECLARE VARIABLE INSCHNGEXST INTEGER;
DECLARE VARIABLE DBIDENT INTEGER;
DECLARE VARIABLE VAR_BDOCODE INTEGER;
BEGIN
  SELECT DBIDENT, BDOCODE FROM CUSTOMDB INTO :DBIDENT, :VAR_BDOCODE;
  FOR
    SELECT
      R.RDB$RELATION_NAME,
      (SELECT FIRST 1 1 FROM RDB$RELATION_FIELDS
       WHERE RDB$RELATION_NAME = R.RDB$RELATION_NAME AND
       TRIM(RDB$FIELD_NAME) = 'INSCHNG')

    FROM RDB$RELATIONS R
    WHERE
      R.RDB$SYSTEM_FLAG = 0 AND
      R.RDB$VIEW_SOURCE IS NULL AND
      EXISTS(SELECT 1 FROM RDB$RELATION_FIELDS
             WHERE RDB$RELATION_NAME = R.RDB$RELATION_NAME AND
                   TRIM(RDB$FIELD_NAME) = 'CHNG') AND
      EXISTS(SELECT 1 FROM RDB$RELATION_FIELDS
             WHERE RDB$RELATION_NAME = R.RDB$RELATION_NAME AND
                   TRIM(RDB$FIELD_NAME) = 'BDOCODE')
  INTO TABLENAME, INSCHNGEXST
  DO
  BEGIN
    EXECUTE STATEMENT 'UPDATE "' || TABLENAME || '" SET OWNERBDO = ' || CAST(VAR_BDOCODE AS VARCHAR(10))
      || IIF(UPDATE_BDOCODE > 0, ', BDOCODE = ' || CAST(DBIDENT AS VARCHAR(10)), ' ')
      || ', CHNG = 1'
      || IIF(INSCHNGEXST = 1, ', INSCHNG = 1', ' ');

  END

END
^

/* Restore proc. body: UPDATEMONEYBOX */
ALTER PROCEDURE UPDATEMONEYBOX(RMKID INTEGER,
CURRENCYID INTEGER,
VAL DOUBLE PRECISION,
PREC DOUBLE PRECISION)
 AS
DECLARE VARIABLE MBID INTEGER;
BEGIN
  SELECT ID
  FROM MONEYBOX M
  WHERE M.RMKID = :RMKID AND M.CURRENCYID = :CURRENCYID
  INTO MBID;

  IF (NOT MBID IS NULL) THEN
    UPDATE MONEYBOX SET VAL = EXROUND(VAL + :VAL, 0, :PREC) WHERE ID = :MBID;
  ELSE
    INSERT INTO MONEYBOX (ID, CURRENCYID, RMKID, VAL, OWNERBDO)
    SELECT GEN_ID(GID, 1), :CURRENCYID, R.ID, EXROUND(:VAL, 0, :PREC), OWNERBDO
    FROM RMK R
    WHERE R.ID = :RMKID;

END
^

/* Create trigger... */
CREATE TRIGGER CHNG_BEF_ACTDISC FOR ACTDISC
INACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_ACTDISCOBJ FOR ACTDISCOBJ
INACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_ACTSCRIPT FOR ACTSCRIPT
INACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_ANALOG FOR ANALOG
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_ASPECT FOR ASPECT
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_ASPSCHM FOR ASPSCHM
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_ASPVALUE FOR ASPVALUE
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_BARCODE FOR BARCODE
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_CARD FOR CARD
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_CARDGROUP FOR CARDGROUP
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_CCARD FOR CCARD
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_CCARDCOUNTER FOR CCARDCOUNTER
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_CLIENT FOR CLIENT
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_CLIENTCARD FOR CLIENTCARD
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_CLIENTCOUNTER FOR CLIENTCOUNTER
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_COMMENT FOR COMMENT
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_COUNTER FOR COUNTER
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_COUNTERD FOR COUNTERD
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_COUNTERTYPE FOR COUNTERTYPE
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_CURRENCY FOR CURRENCY
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_DELQUEUE FOR DELQUEUE
INACTIVE BEFORE INSERT POSITION 0
AS
BEGIN
  NEW.CHNG = GEN_ID(GCHNG, 1);
END
^

CREATE TRIGGER CHNG_BEF_DENOMIN FOR DENOMIN
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_DEVICES FOR DEVICES
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_DISCRATE FOR DISCRATE
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_DOCKIND FOR DOCKIND
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_DOCKINDRECTMPL FOR DOCKINDRECTMPL
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_DOCKINDTMPL FOR DOCKINDTMPL
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_DOCTEMPLATE FOR DOCTEMPLATE
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_DOCUMENT FOR DOCUMENT
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_GRPACTDISC FOR GRPACTDISC
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_GRPCCARD FOR GRPCCARD
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_HALL FOR HALL
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_HALLPLACE FOR HALLPLACE
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_INPDEVFLT FOR INPDEVFLT
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_INTBARCS FOR INTBARCS
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_KEYBLAYT FOR KEYBLAYT
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_KEYBMAP FOR KEYBMAP
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_KEYBMAPF FOR KEYBMAPF
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_KEYBMODE FOR KEYBMODE
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_MONEYBOX FOR MONEYBOX
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_PAYMENT FOR PAYMENT
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_PRICELABEL FOR PRICELABEL
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_PROFILE FOR PROFILE
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_RECTEMPLATE FOR RECTEMPLATE
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_REMAIN FOR REMAIN
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_REMAIND FOR REMAIND
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_RMK FOR RMK
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_RMKDEV FOR RMKDEV
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_SECURITY FOR SECURITY
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_SETTINGS FOR SETTINGS
INACTIVE BEFORE UPDATE POSITION 0
AS 
BEGIN
  IF ((NEW.VAL <> OLD.VAL) AND ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL))) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_SETTINGS_INS FOR SETTINGS
INACTIVE BEFORE INSERT POSITION 0
AS 
BEGIN
  IF (EXISTS(SELECT 1
             FROM SETTINGS S
             WHERE S.NAME = NEW.NAME AND
                  (SELECT FIRST 1 ST.SYNCKIND
                   FROM SYNCTABLE ST
                   JOIN SYNCBASE SB ON
                     SB.PARENTID = ST.SYNCBASEID
                   WHERE ST.CATEG = NEW.SYNCCATEG AND SB.CODE = NEW.OWNERBDO) <> 1)) THEN
    EXCEPTION E_AMBIGUOUS_SETTING;

  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_SPRT FOR SPRT
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_TAXGROUP FOR TAXGROUP
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_TAXGRPRT FOR TAXGRPRT
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_TAXRATE FOR TAXRATE
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_TOUCHLAYT FOR TOUCHLAYT
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_USER FOR "USER"
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_WINREPORTS FOR WINREPORTS
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER DEL_BEF_ASPECT FOR ASPECT
ACTIVE BEFORE DELETE POSITION 0 
AS
begin
  DELETE FROM REMAIN WHERE (ASPECTVALUE1ID <> 0
                         OR ASPECTVALUE2ID <> 0
                         OR ASPECTVALUE3ID <> 0
                         OR ASPECTVALUE4ID <> 0
                         OR ASPECTVALUE5ID <> 0)
                         AND WAREID IN (SELECT ID FROM SPRT WHERE (ASPECTSCHEMEID = OLD.ASPECTSCHEMEID));
end
^

CREATE TRIGGER DEL_BEF_ASPSCHM FOR ASPSCHM
ACTIVE BEFORE DELETE POSITION 0 
AS
begin
  DELETE FROM REMAIN WHERE (ASPECTVALUE1ID <> 0
                         OR ASPECTVALUE2ID <> 0
                         OR ASPECTVALUE3ID <> 0
                         OR ASPECTVALUE4ID <> 0
                         OR ASPECTVALUE5ID <> 0)
                         AND WAREID IN (SELECT ID FROM SPRT WHERE (ASPECTSCHEMEID = OLD.ID));
end
^

CREATE TRIGGER DEL_BEF_CUSTOMDB FOR CUSTOMDB
ACTIVE BEFORE DELETE POSITION 0 
AS
BEGIN
  EXCEPTION E_CANCEL;
END
^

CREATE TRIGGER DEL_BEF_SYNCBASE FOR SYNCBASE
ACTIVE BEFORE DELETE POSITION 0 
AS
BEGIN
  DELETE FROM SYNCBASE WHERE PARENTID = OLD.ID;

  DELETE FROM SETTINGS WHERE OWNERBDO = OLD.CODE;
END
^

CREATE TRIGGER INS_BEF_ACTDISCOBJ FOR ACTDISCOBJ
ACTIVE BEFORE INSERT POSITION 0 
AS
BEGIN
  IF (NEW.CODE IS NULL) THEN
    SELECT NULLTONUM(MAX(CODE)) + 1 FROM ACTDISCOBJ INTO NEW.CODE;
END
^

CREATE TRIGGER INS_BEF_COUNTERD FOR COUNTERD
ACTIVE BEFORE INSERT POSITION 0 
AS
BEGIN
  SELECT OWNERBDO FROM COUNTER WHERE ID = NEW.COUNTERID INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER INS_BEF_CUSTOMDB0 FOR CUSTOMDB
ACTIVE BEFORE INSERT POSITION 0 
AS
BEGIN
  IF (EXISTS(SELECT 1 FROM CUSTOMDB)) THEN
    EXCEPTION E_CANCEL;
END
^

CREATE TRIGGER INS_BEF_REMAIND FOR REMAIND
ACTIVE BEFORE INSERT POSITION 0 
AS
BEGIN
  SELECT OWNERBDO FROM REMAIN WHERE ID = NEW.REMAINID INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER INS_BEF_SYNCTABLE FOR SYNCTABLE
ACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS
BEGIN
  IF (NEW.SYNCKIND = 1) THEN
    FOR SELECT 1
    FROM SYNCTABLE ST
      JOIN SYNCBASE SB ON
        SB.ID = ST.SYNCBASEID
      JOIN GET_SYNCBASE_PARENTS(NEW.SYNCBASEID, 0) G ON
        G.ID_PARENT = SB.ID AND G.ID_PARENT <> NEW.SYNCBASEID
    WHERE ST.CATEG = NEW.CATEG AND ST.SYNCKIND = 2
    INTO NEW.SYNCKIND
    DO
      EXCEPTION E_INTERSECT_SYNHRO_KIND;
  ELSE
    IF (NEW.SYNCKIND = 2) THEN
      FOR SELECT 2
      FROM SYNCTABLE ST
        JOIN SYNCBASE SB ON
          SB.ID = ST.SYNCBASEID
        JOIN GET_SYNCBASE_CHILDREN(-NEW.SYNCBASEID) G ON
          G.OID = SB.ID
      WHERE ST.CATEG = NEW.CATEG AND ST.SYNCKIND = 1
      INTO NEW.SYNCKIND
      DO
        EXCEPTION E_INTERSECT_SYNHRO_KIND;
  IF (NEW.SYNCKIND <> OLD.SYNCKIND) THEN
  BEGIN
    UPDATE TBLLOADINFO SET CHNGVAL = 0
    WHERE TABLENAME IN (SELECT TABLENAME FROM TABLECATEG WHERE CATEG = NEW.CATEG);
    UPDATE TBLINFO SET CHNGVAL = 0
    WHERE TABLENAME IN (SELECT TABLENAME FROM TABLECATEG WHERE CATEG = NEW.CATEG);
  END
END
^

CREATE TRIGGER OWNBDO_ACTDISC FOR ACTDISC
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_ACTDISCOBJ FOR ACTDISCOBJ
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_ACTSCRIPT FOR ACTSCRIPT
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_ANALOG FOR ANALOG
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_ASPECT FOR ASPECT
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_ASPSCHM FOR ASPSCHM
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_ASPVALUE FOR ASPVALUE
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_BARCODE FOR BARCODE
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_CARD FOR CARD
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_CARDGROUP FOR CARDGROUP
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_CCARD FOR CCARD
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_CCARDCOUNTER FOR CCARDCOUNTER
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_CLIENT FOR CLIENT
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_CLIENTCARD FOR CLIENTCARD
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_CLIENTCOUNTER FOR CLIENTCOUNTER
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_COMMENT FOR COMMENT
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_COUNTER FOR COUNTER
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_COUNTERD FOR COUNTERD
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_COUNTERTYPE FOR COUNTERTYPE
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_CURRENCY FOR CURRENCY
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_DENOMIN FOR DENOMIN
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_DEVICES FOR DEVICES
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_DISCRATE FOR DISCRATE
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_DOCKIND FOR DOCKIND
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_DOCKINDRECTMPL FOR DOCKINDRECTMPL
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_DOCKINDTMPL FOR DOCKINDTMPL
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_DOCTEMPLATE FOR DOCTEMPLATE
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_DOCUMENT FOR DOCUMENT
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_GRPACTDISC FOR GRPACTDISC
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_GRPCCARD FOR GRPCCARD
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_HALL FOR HALL
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_HALLPLACE FOR HALLPLACE
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_INPDEVFLT FOR INPDEVFLT
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_INTBARCS FOR INTBARCS
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_KEYBLAYT FOR KEYBLAYT
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_KEYBMAP FOR KEYBMAP
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_KEYBMAPF FOR KEYBMAPF
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_KEYBMODE FOR KEYBMODE
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_MONEYBOX FOR MONEYBOX
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_PAYMENT FOR PAYMENT
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_PRICELABEL FOR PRICELABEL
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_PROFILE FOR PROFILE
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_RECTEMPLATE FOR RECTEMPLATE
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_REMAIN FOR REMAIN
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_REMAIND FOR REMAIND
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_RMK FOR RMK
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_RMKDEV FOR RMKDEV
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_SECURITY FOR SECURITY
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_SETTINGS FOR SETTINGS
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_SPRT FOR SPRT
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_SYNCSRV FOR SYNCSRV
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_TAXGROUP FOR TAXGROUP
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_TAXGRPRT FOR TAXGRPRT
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_TAXRATE FOR TAXRATE
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_TOUCHLAYT FOR TOUCHLAYT
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_TRANZT FOR TRANZT
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_TRAUTH FOR TRAUTH
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_USER FOR "USER"
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_WINREPORTS FOR WINREPORTS
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER SYNCDEL_ACTDISC FOR ACTDISC
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(57, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_ACTDISCOBJ FOR ACTDISCOBJ
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(58, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_ACTSCRIPT FOR ACTSCRIPT
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(55, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_ANALOG FOR ANALOG
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(41, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_ASPECT FOR ASPECT
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(35, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_ASPSCHM FOR ASPSCHM
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(34, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_ASPVALUE FOR ASPVALUE
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(36, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_BARCODE FOR BARCODE
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(43, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_CARD FOR CARD
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(5, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_CARDGROUP FOR CARDGROUP
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(4, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_CCARD FOR CCARD
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(47, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_CCARDCOUNTER FOR CCARDCOUNTER
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(52, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_CLIENT FOR CLIENT
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(48, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_CLIENTCARD FOR CLIENTCARD
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(49, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_CLIENTCOUNTER FOR CLIENTCOUNTER
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(53, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_COMMENT FOR COMMENT
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(24, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_COUNTER FOR COUNTER
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(51, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_COUNTERD FOR COUNTERD
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(60, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_COUNTERTYPE FOR COUNTERTYPE
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(50, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_CURRENCY FOR CURRENCY
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(28, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_DENOMIN FOR DENOMIN
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(23, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_DEVICES FOR DEVICES
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(30, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_DISCRATE FOR DISCRATE
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(54, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_DOCKIND FOR DOCKIND
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(8, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_DOCKINDRECTMPL FOR DOCKINDRECTMPL
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(9, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_DOCKINDTMPL FOR DOCKINDTMPL
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(10, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_DOCTEMPLATE FOR DOCTEMPLATE
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(7, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_DOCUMENT FOR DOCUMENT
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(59, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_GRPACTDISC FOR GRPACTDISC
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(56, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_GRPCCARD FOR GRPCCARD
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(46, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_HALL FOR HALL
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(25, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_HALLPLACE FOR HALLPLACE
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(26, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_INPDEVFLT FOR INPDEVFLT
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(22, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_INTBARCS FOR INTBARCS
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(33, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_KEYBLAYT FOR KEYBLAYT
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(1, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_KEYBMAP FOR KEYBMAP
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(20, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_KEYBMAPF FOR KEYBMAPF
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(21, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_KEYBMODE FOR KEYBMODE
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(19, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_MONEYBOX FOR MONEYBOX
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(63, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_PAYMENT FOR PAYMENT
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(44, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_PRICELABEL FOR PRICELABEL
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(38, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_PROFILE FOR PROFILE
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(12, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_RECTEMPLATE FOR RECTEMPLATE
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(6, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_REMAIN FOR REMAIN
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(42, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_REMAIND FOR REMAIND
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(61, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_RMK FOR RMK
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(27, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_RMKDEV FOR RMKDEV
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(31, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_SECURITY FOR SECURITY
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(13, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_SETTINGS FOR SETTINGS
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(62, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_SPRT FOR SPRT
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(40, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_TAXGROUP FOR TAXGROUP
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(16, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_TAXGRPRT FOR TAXGRPRT
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(17, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_TAXRATE FOR TAXRATE
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(15, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_TOUCHLAYT FOR TOUCHLAYT
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(2, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_USER FOR "USER"
ACTIVE AFTER DELETE POSITION 0 
AS 
BEGIN 
  EXECUTE PROCEDURE APPEND_DELQUEUE(14, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_WINREPORTS FOR WINREPORTS
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(0, OLD.ID);
END
^

CREATE TRIGGER UPD_AFT_SYNCTABLE FOR SYNCTABLE
ACTIVE AFTER UPDATE POSITION 0 
AS
BEGIN
  IF ((NEW.SYNCKIND <> OLD.SYNCKIND) AND (OLD.SYNCKIND = 1)) THEN
    DELETE FROM SETTINGS WHERE SYNCCATEG = NEW.CATEG AND OWNERBDO <> (SELECT BDOCODE FROM CUSTOMDB);
END
^

CREATE TRIGGER UPD_BEF_SYNCBASE FOR SYNCBASE
ACTIVE BEFORE UPDATE POSITION 0 
AS
BEGIN
  IF (NEW.CODE <> OLD.CODE) THEN
    UPDATE SETTINGS SET OWNERBDO = NEW.CODE WHERE OWNERBDO = OLD.CODE;
END
^


/* Alter exist trigger... */
ALTER TRIGGER DEL_BEF_DOCUMENT
AS
BEGIN
  IF (OLD.EDUCATION = 1) THEN
  BEGIN
    DELETE FROM REMAIND WHERE DOCUMENTID = OLD.ID;
    DELETE FROM COUNTERD WHERE DOCUMENTID = OLD.ID;
  END
END
^

/* Alter exist trigger... */
ALTER TRIGGER DEL_BEF_REMAIN0
AS
BEGIN
  DELETE FROM REMAIND RD WHERE RD.REMAINID = OLD.ID;
END
^

/* Alter exist trigger... */
ALTER TRIGGER IND_AFT_COUNTERTYPE
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
DECLARE VARIABLE TDBIDENT INTEGER;
BEGIN
  SELECT DBIDENT FROM CUSTOMDB INTO TDBIDENT;
  IF (TDBIDENT <> NEW.BDOCODE) THEN BEGIN END
  ELSE IF (NEW.AUTOCREATE = 1) THEN
    FOR
      SELECT ID
      FROM CCARD
      WHERE COALESCE(OWNERBDO, :TDBIDENT) = COALESCE(NEW.OWNERBDO, :TDBIDENT)
      INTO TMPID1
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, BDOCODE) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), NEW.ID, NEW.OWNERBDO, NEW.BDOCODE);
        INSERT INTO CCARDCOUNTER (ID, COUNTERID, CCARDID, OWNERBDO, BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, NEW.OWNERBDO, NEW.BDOCODE);
      END
  ELSE IF (NEW.AUTOCREATE = 2) THEN
    FOR
      SELECT ID
      FROM CLIENT
      WHERE COALESCE(OWNERBDO, :TDBIDENT) = COALESCE(NEW.OWNERBDO, :TDBIDENT)
      INTO TMPID1
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, BDOCODE) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), NEW.ID, NEW.OWNERBDO, NEW.BDOCODE);
        INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID, OWNERBDO, BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, NEW.OWNERBDO, NEW.BDOCODE);
      END
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_AFT_CCARD
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
DECLARE VARIABLE TDBIDENT INTEGER;
BEGIN
  SELECT DBIDENT FROM CUSTOMDB INTO TDBIDENT;
  IF (TDBIDENT = NEW.BDOCODE) THEN
    FOR
      SELECT CT.ID
      FROM COUNTERTYPE CT
      WHERE CT.AUTOCREATE = 1
      AND COALESCE(OWNERBDO, :TDBIDENT) = COALESCE(NEW.OWNERBDO, :TDBIDENT)
      INTO TMPID1
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), :TMPID1, NEW.OWNERBDO);
        INSERT INTO CCARDCOUNTER (ID, COUNTERID, CCARDID, OWNERBDO) VALUES (GEN_ID(GID, 1), :TMPID2, NEW.ID, NEW.OWNERBDO);
      END
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_AFT_CLIENT
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
DECLARE VARIABLE TDBIDENT INTEGER;
BEGIN
  SELECT DBIDENT FROM CUSTOMDB INTO TDBIDENT;
  IF ((NEW.ISFOLDER = 0) AND (NEW.BDOCODE = TDBIDENT)) THEN
  FOR
    SELECT CT.ID
    FROM COUNTERTYPE CT
    WHERE CT.AUTOCREATE = 2
    AND COALESCE(OWNERBDO, :TDBIDENT) = COALESCE(NEW.OWNERBDO, :TDBIDENT)
    INTO TMPID1
    DO
    BEGIN
      TMPID2 = GEN_ID(GID, 1);
      INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), :TMPID1, NEW.OWNERBDO);
      INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID, OWNERBDO) VALUES (GEN_ID(GID, 1), :TMPID2, NEW.ID, NEW.OWNERBDO);
    END
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_BEF_BARCODE0
AS
BEGIN
  IF (NEW.BARCODE IS NULL) THEN
    NEW.BARCODE = '';
  IF (NEW.ASPECTVALUE1ID IS NULL) THEN
    NEW.ASPECTVALUE1ID = 0;
  IF (NEW.ASPECTVALUE2ID IS NULL) THEN
    NEW.ASPECTVALUE2ID = 0;
  IF (NEW.ASPECTVALUE3ID IS NULL) THEN
    NEW.ASPECTVALUE3ID = 0;
  IF (NEW.ASPECTVALUE4ID IS NULL) THEN
    NEW.ASPECTVALUE4ID = 0;
  IF (NEW.ASPECTVALUE5ID IS NULL) THEN
    NEW.ASPECTVALUE5ID = 0;

END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_BEF_CCARDCOUNTER0
AS
BEGIN
  IF (EXISTS(SELECT 1 FROM CLIENTCOUNTER CC WHERE CC.COUNTERID = NEW.COUNTERID)) THEN
    EXCEPTION E_CNT_CLIENT_EXISTS;
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT OWNERBDO FROM COUNTER WHERE ID = NEW.COUNTERID INTO NEW.OWNERBDO;
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_BEF_CLIENTCOUNTER0
AS
BEGIN
  IF (EXISTS(SELECT 1 FROM CCARDCOUNTER CC WHERE CC.COUNTERID = NEW.COUNTERID)) THEN
    EXCEPTION E_CNT_CCARD_EXISTS;
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT OWNERBDO FROM COUNTER WHERE ID = NEW.COUNTERID INTO NEW.OWNERBDO;
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_BEF_GRPCCARD
AS
BEGIN
  IF (NOT NEW.CARDPREFIXBEG IS NULL) THEN
    NEW.CARDPREFIXBEG = ADDRIGHT(NEW.CARDPREFIXBEG, 1, 40);
  IF (NOT NEW.CARDPREFIXEND IS NULL) THEN
    NEW.CARDPREFIXEND = ADDRIGHT(NEW.CARDPREFIXEND, 255, 40);

END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_BEF_REMAIN0
AS
BEGIN
  IF (NEW.ASPECTVALUE1ID IS NULL) THEN
    NEW.ASPECTVALUE1ID = 0;
  IF (NEW.ASPECTVALUE2ID IS NULL) THEN
    NEW.ASPECTVALUE2ID = 0;
  IF (NEW.ASPECTVALUE3ID IS NULL) THEN
    NEW.ASPECTVALUE3ID = 0;
  IF (NEW.ASPECTVALUE4ID IS NULL) THEN
    NEW.ASPECTVALUE4ID = 0;
  IF (NEW.ASPECTVALUE5ID IS NULL) THEN
    NEW.ASPECTVALUE5ID = 0;
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT OWNERBDO FROM SPRT WHERE ID = NEW.WAREID INTO NEW.OWNERBDO;
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_BEF_TRANZT0
AS
DECLARE VARIABLE DSTATE INTEGER;
DECLARE VARIABLE RMKID INTEGER;
BEGIN

  SELECT STATE FROM DOCUMENT WHERE ID = NEW.DOCUMENTID INTO :DSTATE;

  /*     */
  IF (DSTATE IN (1, 2)) THEN
  BEGIN
    SELECT RMKID
    FROM DOCUMENT D
    WHERE D.ID = NEW.DOCUMENTID
    INTO RMKID;
    EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES NEW.TRANZCOUNT;
  END

  IF (NEW.WAREMARK IS NULL) THEN
    NEW.WAREMARK = '';
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GDOC, 1);
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_AFT_CLIENT
AS
DECLARE VARIABLE TMPID INTEGER;
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
BEGIN
  IF (NEW.ISFOLDER = 0 AND OLD.ISFOLDER <> 0) THEN
  FOR
    SELECT CT.ID
    FROM COUNTERTYPE CT
    WHERE CT.AUTOCREATE = 2
    INTO TMPID1
    DO
    BEGIN
      TMPID2 = GEN_ID(GID, 1);
      INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), :TMPID1);
      INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID) VALUES (GEN_ID(GID, 1), :TMPID2, NEW.ID);
    END
  ELSE
  IF (NEW.ISFOLDER <> 0 AND OLD.ISFOLDER = 0) THEN
  FOR
    SELECT CC.COUNTERID
    FROM CLIENTCOUNTER CC
    JOIN COUNTER CO ON CO.ID = CC.COUNTERID
    JOIN COUNTERTYPE CT ON CT.ID = CO.COUNTERTYPEID AND CT.AUTOCREATE = 2
    WHERE CC.CLIENTID = OLD.ID
    INTO TMPID
    DO
      DELETE FROM COUNTER WHERE ID = :TMPID;
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_AFT_COUNTERTYPE
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
BEGIN
/*  OLD.AUTOCREATE >= 0   -.   */
/*      ,     */
/*      . */
/*        -        "" */
  IF (OLD.AUTOCREATE >= 0 AND NEW.AUTOCREATE <> OLD.AUTOCREATE) THEN
  BEGIN
  IF (NEW.AUTOCREATE = 1) THEN
  BEGIN
    DELETE FROM COUNTER WHERE COUNTERTYPEID = NEW.ID;
    FOR
      SELECT ID
      FROM CCARD C
--      WHERE NOT EXISTS(SELECT 1 FROM CCARDCOUNTER CC JOIN COUNTER CN ON CN.ID = CC.COUNTERID
--        WHERE CC.CCARDID = C.ID AND CN.COUNTERTYPEID = NEW.ID)
      INTO TMPID1
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, BDOCODE) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), NEW.ID, NEW.OWNERBDO, NEW.BDOCODE);
        INSERT INTO CCARDCOUNTER (ID, COUNTERID, CCARDID, OWNERBDO, BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, NEW.OWNERBDO, NEW.BDOCODE);
      END
  END
  IF (NEW.AUTOCREATE = 2) THEN
  BEGIN
    DELETE FROM COUNTER WHERE COUNTERTYPEID = NEW.ID;
    FOR
      SELECT ID
      FROM CLIENT C
--      WHERE NOT EXISTS(SELECT 1 FROM CLIENTCOUNTER CC JOIN COUNTER CN ON CN.ID = CC.COUNTERID
--        WHERE CC.COUNTERID = C.ID AND CN.COUNTERTYPEID = NEW.ID)
      INTO TMPID1
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, BDOCODE) VALUES (:TMPID2, GEN_ID(GCNTCODE, 1), NEW.ID, NEW.OWNERBDO, NEW.BDOCODE);
        INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID, OWNERBDO, BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, NEW.OWNERBDO, NEW.BDOCODE);
      END
  END
  END
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_AFT_DOCUMENT
AS
BEGIN
  IF ((OLD.STATE = NEW.STATE) AND (NULLTOINT(OLD.HALLPLACEID) = NULLTOINT(NEW.HALLPLACEID))) THEN EXIT;

  /*  .   */
  IF ((OLD.STATE <> NEW.STATE) AND (NEW.STATE = 0)) THEN
    DELETE FROM TRANZT WHERE DOCUMENTID = OLD.ID;

  POST_EVENT 'DOCUMENTCHANGED';

END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_BEF_SPRT0
AS
BEGIN
  IF (NEW.NAME IS NULL) THEN
    NEW.NAME = '';
  IF (NEW.MARK IS NULL) THEN
    NEW.MARK = '';
  IF (NEW.SCALELPLOADED IS NULL) THEN
    NEW.SCALELPLOADED = 0;
  IF (NEW.PRICELBPRINTED IS NULL) THEN
    NEW.PRICELBPRINTED = 0;
  IF (NEW.DELETED > OLD.DELETED) THEN
    DELETE FROM REMAIN WHERE WAREID = OLD.ID;
END
^

/* Alter Procedure... */
/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), -1, -1, :CARDID, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;
END
^

/* Alter (APPENDCLIENT) */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,      CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE, BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,
                          WEB,     TELEPHONE, INN,      DOCUMENT, OKPO,  OKPD,     DELETED)

      VALUES (:CLIENTID, :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT,  :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE, :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,
              :IWEB,     :ITELEPHONE, :IINN,        :IDOCUMENT, :IOKPO, :IOKPD,     :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;
END
^

/* Alter (GET_ACTSCRIPT) */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
BEGIN
  ID = 1;

  FOR
    SELECT  CODE, DATA, NULLTONUM(GRPCODE), NULLTONUM(PRIORITY), WAREID,
      SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,
      CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    FROM GET_ACTSCRIPT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
      :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,:IWEEKDAY,
      :IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,:ICARD,
      :ICARDLEN,:IANYCARD,:ICARDSTATE,:IACTEVENT,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY, CODE
    INTO CODE, DATA, GRPCODE, PRIORITY,WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END
END
^

/* Alter (GET_DISCOUNT) */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
BEGIN
  ID = 1;

  FOR
    SELECT NULLTONUM(GRPCODE), VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
           "TYPE", NAME, TEXT,
           CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, NULLTONUM(PRIORITY), PARENTID, BEGVAL, ENDVAL,
           FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
    FROM GET_DISCOUNT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
          :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,
          :IWEEKDAY,:IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,
          :ICARD,:ICARDLEN,:IANYCARD,:ICARDSTATE,:IDESTINATION,
          :IKIND,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID, "TYPE", NAME, TEXT,
         CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, PRIORITY, PARENTID, BEGVAL, ENDVAL,
         FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END

END
^

SET TERM ; ^

ALTER TABLE ACTDISC ALTER COLUMN ID POSITION 1;

ALTER TABLE ACTDISC ALTER COLUMN CODE POSITION 2;

ALTER TABLE ACTDISC ALTER COLUMN GRPACTDISCID POSITION 3;

ALTER TABLE ACTDISC ALTER COLUMN NAME POSITION 4;

ALTER TABLE ACTDISC ALTER COLUMN DELETED POSITION 5;

ALTER TABLE ACTDISC ALTER COLUMN CONDITIONID POSITION 6;

ALTER TABLE ACTDISC ALTER COLUMN DISCRATEID POSITION 7;

ALTER TABLE ACTDISC ALTER COLUMN ACTSCRIPTID POSITION 8;

ALTER TABLE ACTDISC ALTER COLUMN PRIORITY POSITION 9;

ALTER TABLE ACTDISC ALTER COLUMN CHNG POSITION 10;

ALTER TABLE ACTDISC ALTER COLUMN BDOCODE POSITION 11;

ALTER TABLE ACTDISC ALTER COLUMN OWNERBDO POSITION 12;

ALTER TABLE ACTDISC ALTER COLUMN INSCHNG POSITION 13;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ID POSITION 1;

ALTER TABLE ACTDISCOBJ ALTER COLUMN CLIENTID POSITION 2;

ALTER TABLE ACTDISCOBJ ALTER COLUMN WAREID POSITION 3;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE1ID POSITION 4;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE2ID POSITION 5;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE3ID POSITION 6;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE4ID POSITION 7;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE5ID POSITION 8;

ALTER TABLE ACTDISCOBJ ALTER COLUMN PAYMENTID POSITION 9;

ALTER TABLE ACTDISCOBJ ALTER COLUMN DISCRATEID POSITION 10;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ACTSCRIPTID POSITION 11;

ALTER TABLE ACTDISCOBJ ALTER COLUMN GRPACTDISCID POSITION 12;

ALTER TABLE ACTDISCOBJ ALTER COLUMN CARDID POSITION 13;

ALTER TABLE ACTDISCOBJ ALTER COLUMN CHNG POSITION 14;

ALTER TABLE ACTDISCOBJ ALTER COLUMN BDOCODE POSITION 15;

ALTER TABLE ACTDISCOBJ ALTER COLUMN CODE POSITION 16;

ALTER TABLE ACTDISCOBJ ALTER COLUMN OWNERBDO POSITION 17;

ALTER TABLE ACTDISCOBJ ALTER COLUMN INSCHNG POSITION 18;

ALTER TABLE ACTSCRIPT ALTER COLUMN ID POSITION 1;

ALTER TABLE ACTSCRIPT ALTER COLUMN CODE POSITION 2;

ALTER TABLE ACTSCRIPT ALTER COLUMN NAME POSITION 3;

ALTER TABLE ACTSCRIPT ALTER COLUMN DATA POSITION 4;

ALTER TABLE ACTSCRIPT ALTER COLUMN ACTEVENT POSITION 5;

ALTER TABLE ACTSCRIPT ALTER COLUMN CHNG POSITION 6;

ALTER TABLE ACTSCRIPT ALTER COLUMN BDOCODE POSITION 7;

ALTER TABLE ACTSCRIPT ALTER COLUMN OWNERBDO POSITION 8;

ALTER TABLE ANALOG ALTER COLUMN ID POSITION 1;

ALTER TABLE ANALOG ALTER COLUMN CODE POSITION 2;

ALTER TABLE ANALOG ALTER COLUMN WAREID POSITION 3;

ALTER TABLE ANALOG ALTER COLUMN ANALOGID POSITION 4;

ALTER TABLE ANALOG ALTER COLUMN DELETED POSITION 5;

ALTER TABLE ANALOG ALTER COLUMN BDOCODE POSITION 6;

ALTER TABLE ANALOG ALTER COLUMN CHNG POSITION 7;

ALTER TABLE ANALOG ALTER COLUMN OWNERBDO POSITION 8;

ALTER TABLE ASPECT ALTER COLUMN ID POSITION 1;

ALTER TABLE ASPECT ALTER COLUMN ASPECTSCHEMEID POSITION 2;

ALTER TABLE ASPECT ALTER COLUMN CODE POSITION 3;

ALTER TABLE ASPECT ALTER COLUMN NAME POSITION 4;

ALTER TABLE ASPECT ALTER COLUMN TEXT POSITION 5;

ALTER TABLE ASPECT ALTER COLUMN DELETED POSITION 6;

ALTER TABLE ASPECT ALTER COLUMN CHNG POSITION 7;

ALTER TABLE ASPECT ALTER COLUMN BDOCODE POSITION 8;

ALTER TABLE ASPECT ALTER COLUMN OWNERBDO POSITION 9;

ALTER TABLE ASPECT ALTER COLUMN INSCHNG POSITION 10;

ALTER TABLE ASPSCHM ALTER COLUMN ID POSITION 1;

ALTER TABLE ASPSCHM ALTER COLUMN CODE POSITION 2;

ALTER TABLE ASPSCHM ALTER COLUMN NAME POSITION 3;

ALTER TABLE ASPSCHM ALTER COLUMN TEXT POSITION 4;

ALTER TABLE ASPSCHM ALTER COLUMN DELETED POSITION 5;

ALTER TABLE ASPSCHM ALTER COLUMN CHNG POSITION 6;

ALTER TABLE ASPSCHM ALTER COLUMN BDOCODE POSITION 7;

ALTER TABLE ASPSCHM ALTER COLUMN OWNERBDO POSITION 8;

ALTER TABLE ASPSCHM ALTER COLUMN INSCHNG POSITION 9;

ALTER TABLE ASPVALUE ALTER COLUMN ID POSITION 1;

ALTER TABLE ASPVALUE ALTER COLUMN CODE POSITION 2;

ALTER TABLE ASPVALUE ALTER COLUMN NAME POSITION 3;

ALTER TABLE ASPVALUE ALTER COLUMN TEXT POSITION 4;

ALTER TABLE ASPVALUE ALTER COLUMN ASPECTID POSITION 5;

ALTER TABLE ASPVALUE ALTER COLUMN ASPECTSCHEMEID POSITION 6;

ALTER TABLE ASPVALUE ALTER COLUMN CARD POSITION 7;

ALTER TABLE ASPVALUE ALTER COLUMN DELETED POSITION 8;

ALTER TABLE ASPVALUE ALTER COLUMN CHNG POSITION 9;

ALTER TABLE ASPVALUE ALTER COLUMN BDOCODE POSITION 10;

ALTER TABLE ASPVALUE ALTER COLUMN OWNERBDO POSITION 11;

ALTER TABLE ASPVALUE ALTER COLUMN INSCHNG POSITION 12;

ALTER TABLE BARCODE ALTER COLUMN ID POSITION 1;

ALTER TABLE BARCODE ALTER COLUMN WAREID POSITION 2;

ALTER TABLE BARCODE ALTER COLUMN BARCODE POSITION 3;

ALTER TABLE BARCODE ALTER COLUMN ASPECTVALUE1ID POSITION 4;

ALTER TABLE BARCODE ALTER COLUMN ASPECTVALUE2ID POSITION 5;

ALTER TABLE BARCODE ALTER COLUMN ASPECTVALUE3ID POSITION 6;

ALTER TABLE BARCODE ALTER COLUMN ASPECTVALUE4ID POSITION 7;

ALTER TABLE BARCODE ALTER COLUMN ASPECTVALUE5ID POSITION 8;

ALTER TABLE BARCODE ALTER COLUMN FACTOR POSITION 9;

ALTER TABLE BARCODE ALTER COLUMN DELETED POSITION 10;

ALTER TABLE BARCODE ALTER COLUMN CHNG POSITION 11;

ALTER TABLE BARCODE ALTER COLUMN BDOCODE POSITION 12;

ALTER TABLE BARCODE ALTER COLUMN OWNERBDO POSITION 13;

ALTER TABLE BARCODE ALTER COLUMN INSCHNG POSITION 14;

ALTER TABLE CARD ALTER COLUMN ID POSITION 1;

ALTER TABLE CARD ALTER COLUMN CARDGROUPID POSITION 2;

ALTER TABLE CARD ALTER COLUMN CODE POSITION 3;

ALTER TABLE CARD ALTER COLUMN NAME POSITION 4;

ALTER TABLE CARD ALTER COLUMN TEXT POSITION 5;

ALTER TABLE CARD ALTER COLUMN EXPDATEBEG POSITION 6;

ALTER TABLE CARD ALTER COLUMN EXPDATEEND POSITION 7;

ALTER TABLE CARD ALTER COLUMN CARDLENBEG POSITION 8;

ALTER TABLE CARD ALTER COLUMN CARDLENEND POSITION 9;

ALTER TABLE CARD ALTER COLUMN CARDPREFIXBEG POSITION 10;

ALTER TABLE CARD ALTER COLUMN CARDPREFIXEND POSITION 11;

ALTER TABLE CARD ALTER COLUMN NOMINAL POSITION 12;

ALTER TABLE CARD ALTER COLUMN STATE POSITION 13;

ALTER TABLE CARD ALTER COLUMN DELETED POSITION 14;

ALTER TABLE CARD ALTER COLUMN BDOCODE POSITION 15;

ALTER TABLE CARD ALTER COLUMN CHNG POSITION 16;

ALTER TABLE CARD ALTER COLUMN OWNERBDO POSITION 17;

ALTER TABLE CARDGROUP ALTER COLUMN ID POSITION 1;

ALTER TABLE CARDGROUP ALTER COLUMN CODE POSITION 2;

ALTER TABLE CARDGROUP ALTER COLUMN NAME POSITION 3;

ALTER TABLE CARDGROUP ALTER COLUMN TEXT POSITION 4;

ALTER TABLE CARDGROUP ALTER COLUMN ENTERTYPE POSITION 5;

ALTER TABLE CARDGROUP ALTER COLUMN DELETED POSITION 6;

ALTER TABLE CARDGROUP ALTER COLUMN BDOCODE POSITION 7;

ALTER TABLE CARDGROUP ALTER COLUMN CHNG POSITION 8;

ALTER TABLE CARDGROUP ALTER COLUMN OWNERBDO POSITION 9;

ALTER TABLE CCARD ALTER COLUMN ID POSITION 1;

ALTER TABLE CCARD ALTER COLUMN CODE POSITION 2;

ALTER TABLE CCARD ALTER COLUMN GRPCCARDID POSITION 3;

ALTER TABLE CCARD ALTER COLUMN VAL POSITION 4;

ALTER TABLE CCARD ALTER COLUMN EXPDATEBEG POSITION 5;

ALTER TABLE CCARD ALTER COLUMN EXPDATEEND POSITION 6;

ALTER TABLE CCARD ALTER COLUMN STATE POSITION 7;

ALTER TABLE CCARD ALTER COLUMN DELETED POSITION 8;

ALTER TABLE CCARD ALTER COLUMN CHNG POSITION 9;

ALTER TABLE CCARD ALTER COLUMN BDOCODE POSITION 10;

ALTER TABLE CCARD ALTER COLUMN OWNERBDO POSITION 11;

ALTER TABLE CCARD ALTER COLUMN INSCHNG POSITION 12;

ALTER TABLE CCARDCOUNTER ALTER COLUMN ID POSITION 1;

ALTER TABLE CCARDCOUNTER ALTER COLUMN CCARDID POSITION 2;

ALTER TABLE CCARDCOUNTER ALTER COLUMN COUNTERID POSITION 3;

ALTER TABLE CCARDCOUNTER ALTER COLUMN CHNG POSITION 4;

ALTER TABLE CCARDCOUNTER ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE CCARDCOUNTER ALTER COLUMN OWNERBDO POSITION 6;

ALTER TABLE CLIENT ALTER COLUMN ID POSITION 1;

ALTER TABLE CLIENT ALTER COLUMN CODE POSITION 2;

ALTER TABLE CLIENT ALTER COLUMN PARENTID POSITION 3;

ALTER TABLE CLIENT ALTER COLUMN NAME POSITION 4;

ALTER TABLE CLIENT ALTER COLUMN TEXT POSITION 5;

ALTER TABLE CLIENT ALTER COLUMN ISFOLDER POSITION 6;

ALTER TABLE CLIENT ALTER COLUMN DESCRIPTION POSITION 7;

ALTER TABLE CLIENT ALTER COLUMN SEX POSITION 8;

ALTER TABLE CLIENT ALTER COLUMN MEMDATE POSITION 9;

ALTER TABLE CLIENT ALTER COLUMN BIRTHDATE POSITION 10;

ALTER TABLE CLIENT ALTER COLUMN REGDATE POSITION 11;

ALTER TABLE CLIENT ALTER COLUMN ZIPCODE POSITION 12;

ALTER TABLE CLIENT ALTER COLUMN CITY POSITION 13;

ALTER TABLE CLIENT ALTER COLUMN ADDRESS POSITION 14;

ALTER TABLE CLIENT ALTER COLUMN EMAIL POSITION 15;

ALTER TABLE CLIENT ALTER COLUMN WEB POSITION 16;

ALTER TABLE CLIENT ALTER COLUMN TELEPHONE POSITION 17;

ALTER TABLE CLIENT ALTER COLUMN INN POSITION 18;

ALTER TABLE CLIENT ALTER COLUMN DOCUMENT POSITION 19;

ALTER TABLE CLIENT ALTER COLUMN OKPO POSITION 20;

ALTER TABLE CLIENT ALTER COLUMN OKPD POSITION 21;

ALTER TABLE CLIENT ALTER COLUMN CHNG POSITION 22;

ALTER TABLE CLIENT ALTER COLUMN DELETED POSITION 23;

ALTER TABLE CLIENT ALTER COLUMN BDOCODE POSITION 24;

ALTER TABLE CLIENT ALTER COLUMN OWNERBDO POSITION 25;

ALTER TABLE CLIENT ALTER COLUMN INSCHNG POSITION 26;

ALTER TABLE CLIENTCARD ALTER COLUMN ID POSITION 1;

ALTER TABLE CLIENTCARD ALTER COLUMN CLIENTID POSITION 2;

ALTER TABLE CLIENTCARD ALTER COLUMN CCARDID POSITION 3;

ALTER TABLE CLIENTCARD ALTER COLUMN CHNG POSITION 4;

ALTER TABLE CLIENTCARD ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE CLIENTCARD ALTER COLUMN OWNERBDO POSITION 6;

ALTER TABLE CLIENTCOUNTER ALTER COLUMN ID POSITION 1;

ALTER TABLE CLIENTCOUNTER ALTER COLUMN CLIENTID POSITION 2;

ALTER TABLE CLIENTCOUNTER ALTER COLUMN COUNTERID POSITION 3;

ALTER TABLE CLIENTCOUNTER ALTER COLUMN CHNG POSITION 4;

ALTER TABLE CLIENTCOUNTER ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE CLIENTCOUNTER ALTER COLUMN OWNERBDO POSITION 6;

ALTER TABLE COMMENT ALTER COLUMN ID POSITION 1;

ALTER TABLE COMMENT ALTER COLUMN CODE POSITION 2;

ALTER TABLE COMMENT ALTER COLUMN TEXT POSITION 3;

ALTER TABLE COMMENT ALTER COLUMN NAME POSITION 4;

ALTER TABLE COMMENT ALTER COLUMN DELETED POSITION 5;

ALTER TABLE COMMENT ALTER COLUMN BDOCODE POSITION 6;

ALTER TABLE COMMENT ALTER COLUMN CHNG POSITION 7;

ALTER TABLE COMMENT ALTER COLUMN OWNERBDO POSITION 8;

ALTER TABLE COUNTER ALTER COLUMN ID POSITION 1;

ALTER TABLE COUNTER ALTER COLUMN CODE POSITION 2;

ALTER TABLE COUNTER ALTER COLUMN COUNTERTYPEID POSITION 3;

ALTER TABLE COUNTER ALTER COLUMN DATECREATE POSITION 4;

ALTER TABLE COUNTER ALTER COLUMN CHNG POSITION 5;

ALTER TABLE COUNTER ALTER COLUMN BDOCODE POSITION 6;

ALTER TABLE COUNTER ALTER COLUMN OWNERBDO POSITION 7;

ALTER TABLE COUNTER ALTER COLUMN INSCHNG POSITION 8;

ALTER TABLE COUNTERD ALTER COLUMN ID POSITION 1;

ALTER TABLE COUNTERD ALTER COLUMN COUNTERID POSITION 2;

ALTER TABLE COUNTERD ALTER COLUMN DELTA POSITION 3;

ALTER TABLE COUNTERD ALTER COLUMN DELTADATE POSITION 4;

ALTER TABLE COUNTERD ALTER COLUMN DOCUMENTID POSITION 5;

ALTER TABLE COUNTERD ALTER COLUMN CHNG POSITION 6;

ALTER TABLE COUNTERD ALTER COLUMN BDOCODE POSITION 7;

ALTER TABLE COUNTERD ALTER COLUMN DTYPE POSITION 8;

ALTER TABLE COUNTERD ALTER COLUMN OWNERBDO POSITION 9;

ALTER TABLE COUNTERTYPE ALTER COLUMN ID POSITION 1;

ALTER TABLE COUNTERTYPE ALTER COLUMN CODE POSITION 2;

ALTER TABLE COUNTERTYPE ALTER COLUMN NAME POSITION 3;

ALTER TABLE COUNTERTYPE ALTER COLUMN AUTOCREATE POSITION 4;

ALTER TABLE COUNTERTYPE ALTER COLUMN COUNTERALG POSITION 5;

ALTER TABLE COUNTERTYPE ALTER COLUMN CHNG POSITION 6;

ALTER TABLE COUNTERTYPE ALTER COLUMN BDOCODE POSITION 7;

ALTER TABLE COUNTERTYPE ALTER COLUMN OWNERBDO POSITION 8;

ALTER TABLE CURRENCY ALTER COLUMN ID POSITION 1;

ALTER TABLE CURRENCY ALTER COLUMN CODE POSITION 2;

ALTER TABLE CURRENCY ALTER COLUMN NAME POSITION 3;

ALTER TABLE CURRENCY ALTER COLUMN TEXT POSITION 4;

ALTER TABLE CURRENCY ALTER COLUMN IDENT POSITION 5;

ALTER TABLE CURRENCY ALTER COLUMN RATEMUL POSITION 6;

ALTER TABLE CURRENCY ALTER COLUMN RATEDIV POSITION 7;

ALTER TABLE CURRENCY ALTER COLUMN CALCPREC POSITION 8;

ALTER TABLE CURRENCY ALTER COLUMN INFOPREC POSITION 9;

ALTER TABLE CURRENCY ALTER COLUMN INFODEC POSITION 10;

ALTER TABLE CURRENCY ALTER COLUMN DELETED POSITION 11;

ALTER TABLE CURRENCY ALTER COLUMN BDOCODE POSITION 12;

ALTER TABLE CURRENCY ALTER COLUMN CHNG POSITION 13;

ALTER TABLE CURRENCY ALTER COLUMN OWNERBDO POSITION 14;

ALTER TABLE DENOMIN ALTER COLUMN ID POSITION 1;

ALTER TABLE DENOMIN ALTER COLUMN CODE POSITION 2;

ALTER TABLE DENOMIN ALTER COLUMN NAME POSITION 3;

ALTER TABLE DENOMIN ALTER COLUMN TEXT POSITION 4;

ALTER TABLE DENOMIN ALTER COLUMN PRICE POSITION 5;

ALTER TABLE DENOMIN ALTER COLUMN DELETED POSITION 6;

ALTER TABLE DENOMIN ALTER COLUMN BDOCODE POSITION 7;

ALTER TABLE DENOMIN ALTER COLUMN CHNG POSITION 8;

ALTER TABLE DENOMIN ALTER COLUMN OWNERBDO POSITION 9;

ALTER TABLE DEVICES ALTER COLUMN ID POSITION 1;

ALTER TABLE DEVICES ALTER COLUMN CODE POSITION 2;

ALTER TABLE DEVICES ALTER COLUMN NAME POSITION 3;

ALTER TABLE DEVICES ALTER COLUMN TYPEDEV POSITION 4;

ALTER TABLE DEVICES ALTER COLUMN BUSY POSITION 5;

ALTER TABLE DEVICES ALTER COLUMN ISFOLDER POSITION 6;

ALTER TABLE DEVICES ALTER COLUMN PARENTID POSITION 7;

ALTER TABLE DEVICES ALTER COLUMN TEXT POSITION 8;

ALTER TABLE DEVICES ALTER COLUMN CONNECTIONSTRING POSITION 9;

ALTER TABLE DEVICES ALTER COLUMN CONNECTIONSTATE POSITION 10;

ALTER TABLE DEVICES ALTER COLUMN BDOCODE POSITION 11;

ALTER TABLE DEVICES ALTER COLUMN CHNG POSITION 12;

ALTER TABLE DEVICES ALTER COLUMN OWNERBDO POSITION 13;

ALTER TABLE DISCRATE ALTER COLUMN ID POSITION 1;

ALTER TABLE DISCRATE ALTER COLUMN PARENTID POSITION 2;

ALTER TABLE DISCRATE ALTER COLUMN CODE POSITION 3;

ALTER TABLE DISCRATE ALTER COLUMN NAME POSITION 4;

ALTER TABLE DISCRATE ALTER COLUMN TEXT POSITION 5;

ALTER TABLE DISCRATE ALTER COLUMN VAL POSITION 6;

ALTER TABLE DISCRATE ALTER COLUMN BEGVAL POSITION 7;

ALTER TABLE DISCRATE ALTER COLUMN ENDVAL POSITION 8;

ALTER TABLE DISCRATE ALTER COLUMN WAREID POSITION 9;

ALTER TABLE DISCRATE ALTER COLUMN TYPE POSITION 10;

ALTER TABLE DISCRATE ALTER COLUMN DESTINATION POSITION 11;

ALTER TABLE DISCRATE ALTER COLUMN KIND POSITION 12;

ALTER TABLE DISCRATE ALTER COLUMN ISFOLDER POSITION 13;

ALTER TABLE DISCRATE ALTER COLUMN DISCCOLLOPER POSITION 14;

ALTER TABLE DISCRATE ALTER COLUMN CHNG POSITION 15;

ALTER TABLE DISCRATE ALTER COLUMN BDOCODE POSITION 16;

ALTER TABLE DISCRATE ALTER COLUMN OWNERBDO POSITION 17;

ALTER TABLE DOCKIND ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCKIND ALTER COLUMN CODE POSITION 2;

ALTER TABLE DOCKIND ALTER COLUMN NAME POSITION 3;

ALTER TABLE DOCKIND ALTER COLUMN TEXT POSITION 4;

ALTER TABLE DOCKIND ALTER COLUMN IDENTIF POSITION 5;

ALTER TABLE DOCKIND ALTER COLUMN ECRRECEIPTTYPE POSITION 6;

ALTER TABLE DOCKIND ALTER COLUMN PRINTONRCP POSITION 7;

ALTER TABLE DOCKIND ALTER COLUMN REMAINOPERATION POSITION 8;

ALTER TABLE DOCKIND ALTER COLUMN ASKCOMMENT POSITION 9;

ALTER TABLE DOCKIND ALTER COLUMN BDOCODE POSITION 10;

ALTER TABLE DOCKIND ALTER COLUMN CHNG POSITION 11;

ALTER TABLE DOCKIND ALTER COLUMN OWNERBDO POSITION 12;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN CODE POSITION 2;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN DOCKINDID POSITION 3;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN RECTMPLID POSITION 4;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN COPYCOUNT POSITION 5;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN OPERATION POSITION 6;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN DOCORIENTATION POSITION 7;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN BDOCODE POSITION 8;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN CHNG POSITION 9;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN OWNERBDO POSITION 10;

ALTER TABLE DOCKINDTMPL ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCKINDTMPL ALTER COLUMN CODE POSITION 2;

ALTER TABLE DOCKINDTMPL ALTER COLUMN DOCKINDID POSITION 3;

ALTER TABLE DOCKINDTMPL ALTER COLUMN DOCTEMPLID POSITION 4;

ALTER TABLE DOCKINDTMPL ALTER COLUMN PREVIEW POSITION 5;

ALTER TABLE DOCKINDTMPL ALTER COLUMN COPYCOUNT POSITION 6;

ALTER TABLE DOCKINDTMPL ALTER COLUMN BDOCODE POSITION 7;

ALTER TABLE DOCKINDTMPL ALTER COLUMN CHNG POSITION 8;

ALTER TABLE DOCKINDTMPL ALTER COLUMN OWNERBDO POSITION 9;

ALTER TABLE DOCTEMPLATE ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCTEMPLATE ALTER COLUMN CODE POSITION 2;

ALTER TABLE DOCTEMPLATE ALTER COLUMN NAME POSITION 3;

ALTER TABLE DOCTEMPLATE ALTER COLUMN DATA POSITION 4;

ALTER TABLE DOCTEMPLATE ALTER COLUMN MINLINES POSITION 5;

ALTER TABLE DOCTEMPLATE ALTER COLUMN MAXLINES POSITION 6;

ALTER TABLE DOCTEMPLATE ALTER COLUMN BDOCODE POSITION 7;

ALTER TABLE DOCTEMPLATE ALTER COLUMN CHNG POSITION 8;

ALTER TABLE DOCTEMPLATE ALTER COLUMN OWNERBDO POSITION 9;

ALTER TABLE DOCUMENT ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCUMENT ALTER COLUMN DOCKINDID POSITION 2;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUENUMBER POSITION 3;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDATE POSITION 4;

ALTER TABLE DOCUMENT ALTER COLUMN OPENTIME POSITION 5;

ALTER TABLE DOCUMENT ALTER COLUMN OPENUSERID POSITION 6;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEDATE POSITION 7;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSETIME POSITION 8;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEUSERID POSITION 9;

ALTER TABLE DOCUMENT ALTER COLUMN DOCUMENTID POSITION 10;

ALTER TABLE DOCUMENT ALTER COLUMN CLIENTID POSITION 11;

ALTER TABLE DOCUMENT ALTER COLUMN STATE POSITION 12;

ALTER TABLE DOCUMENT ALTER COLUMN EDUCATION POSITION 13;

ALTER TABLE DOCUMENT ALTER COLUMN RMKID POSITION 14;

ALTER TABLE DOCUMENT ALTER COLUMN SUMM POSITION 15;

ALTER TABLE DOCUMENT ALTER COLUMN SUMMWD POSITION 16;

ALTER TABLE DOCUMENT ALTER COLUMN ECRSESSION POSITION 17;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUETYPE POSITION 18;

ALTER TABLE DOCUMENT ALTER COLUMN ORDERIDENTIF POSITION 19;

ALTER TABLE DOCUMENT ALTER COLUMN COMMENTCODE POSITION 20;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTSCHEME POSITION 21;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE1 POSITION 22;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE2 POSITION 23;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE3 POSITION 24;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE4 POSITION 25;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE5 POSITION 26;

ALTER TABLE DOCUMENT ALTER COLUMN HALLPLACEID POSITION 27;

ALTER TABLE DOCUMENT ALTER COLUMN SAVED POSITION 28;

ALTER TABLE DOCUMENT ALTER COLUMN INNERDOCORDER POSITION 29;

ALTER TABLE DOCUMENT ALTER COLUMN PRECHEQUE POSITION 30;

ALTER TABLE DOCUMENT ALTER COLUMN OPENRMKID POSITION 31;

ALTER TABLE DOCUMENT ALTER COLUMN OPENSESSION POSITION 32;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDOCNUMBER POSITION 33;

ALTER TABLE DOCUMENT ALTER COLUMN CHNG POSITION 34;

ALTER TABLE DOCUMENT ALTER COLUMN BDOCODE POSITION 35;

ALTER TABLE DOCUMENT ALTER COLUMN ISFISCAL POSITION 36;

ALTER TABLE DOCUMENT ALTER COLUMN OWNERBDO POSITION 37;

ALTER TABLE DOCUMENT ALTER COLUMN NSHOP POSITION 38;

ALTER TABLE GRPACTDISC ALTER COLUMN ID POSITION 1;

ALTER TABLE GRPACTDISC ALTER COLUMN CODE POSITION 2;

ALTER TABLE GRPACTDISC ALTER COLUMN NAME POSITION 3;

ALTER TABLE GRPACTDISC ALTER COLUMN ACTV POSITION 4;

ALTER TABLE GRPACTDISC ALTER COLUMN DEPENDOTHERPOS POSITION 5;

ALTER TABLE GRPACTDISC ALTER COLUMN DELETED POSITION 6;

ALTER TABLE GRPACTDISC ALTER COLUMN CHNG POSITION 7;

ALTER TABLE GRPACTDISC ALTER COLUMN BDOCODE POSITION 8;

ALTER TABLE GRPACTDISC ALTER COLUMN OWNERBDO POSITION 9;

ALTER TABLE GRPCCARD ALTER COLUMN ID POSITION 1;

ALTER TABLE GRPCCARD ALTER COLUMN CODE POSITION 2;

ALTER TABLE GRPCCARD ALTER COLUMN NAME POSITION 3;

ALTER TABLE GRPCCARD ALTER COLUMN TEXT POSITION 4;

ALTER TABLE GRPCCARD ALTER COLUMN AUTOREGCLIENT POSITION 5;

ALTER TABLE GRPCCARD ALTER COLUMN AUTOREGCARD POSITION 6;

ALTER TABLE GRPCCARD ALTER COLUMN CARDPREFIXBEG POSITION 7;

ALTER TABLE GRPCCARD ALTER COLUMN CARDPREFIXEND POSITION 8;

ALTER TABLE GRPCCARD ALTER COLUMN CARDLENBEG POSITION 9;

ALTER TABLE GRPCCARD ALTER COLUMN CARDLENEND POSITION 10;

ALTER TABLE GRPCCARD ALTER COLUMN ENTERMANUAL POSITION 11;

ALTER TABLE GRPCCARD ALTER COLUMN ENTERREADER POSITION 12;

ALTER TABLE GRPCCARD ALTER COLUMN ENTERVIS POSITION 13;

ALTER TABLE GRPCCARD ALTER COLUMN ENTERSCAN POSITION 14;

ALTER TABLE GRPCCARD ALTER COLUMN CHNG POSITION 15;

ALTER TABLE GRPCCARD ALTER COLUMN BDOCODE POSITION 16;

ALTER TABLE GRPCCARD ALTER COLUMN OWNERBDO POSITION 17;

ALTER TABLE HALL ALTER COLUMN ID POSITION 1;

ALTER TABLE HALL ALTER COLUMN CODE POSITION 2;

ALTER TABLE HALL ALTER COLUMN NAME POSITION 3;

ALTER TABLE HALL ALTER COLUMN TEXT POSITION 4;

ALTER TABLE HALL ALTER COLUMN DATA POSITION 5;

ALTER TABLE HALL ALTER COLUMN HALLPLACEINFO POSITION 6;

ALTER TABLE HALL ALTER COLUMN DELETED POSITION 7;

ALTER TABLE HALL ALTER COLUMN BDOCODE POSITION 8;

ALTER TABLE HALL ALTER COLUMN CHNG POSITION 9;

ALTER TABLE HALL ALTER COLUMN OWNERBDO POSITION 10;

ALTER TABLE HALLPLACE ALTER COLUMN ID POSITION 1;

ALTER TABLE HALLPLACE ALTER COLUMN CODE POSITION 2;

ALTER TABLE HALLPLACE ALTER COLUMN NAME POSITION 3;

ALTER TABLE HALLPLACE ALTER COLUMN TEXT POSITION 4;

ALTER TABLE HALLPLACE ALTER COLUMN HALLID POSITION 5;

ALTER TABLE HALLPLACE ALTER COLUMN STATE POSITION 6;

ALTER TABLE HALLPLACE ALTER COLUMN CHNG POSITION 7;

ALTER TABLE HALLPLACE ALTER COLUMN BDOCODE POSITION 8;

ALTER TABLE HALLPLACE ALTER COLUMN OWNERBDO POSITION 9;

ALTER TABLE INPDEVFLT ALTER COLUMN ID POSITION 1;

ALTER TABLE INPDEVFLT ALTER COLUMN CODE POSITION 2;

ALTER TABLE INPDEVFLT ALTER COLUMN NAME POSITION 3;

ALTER TABLE INPDEVFLT ALTER COLUMN PREFIXBEG POSITION 4;

ALTER TABLE INPDEVFLT ALTER COLUMN PREFIXEND POSITION 5;

ALTER TABLE INPDEVFLT ALTER COLUMN INPUTDEVTYPE POSITION 6;

ALTER TABLE INPDEVFLT ALTER COLUMN INPUTOBJTYPE POSITION 7;

ALTER TABLE INPDEVFLT ALTER COLUMN "LENGTH" POSITION 8;

ALTER TABLE INPDEVFLT ALTER COLUMN DATA POSITION 9;

ALTER TABLE INPDEVFLT ALTER COLUMN BDOCODE POSITION 10;

ALTER TABLE INPDEVFLT ALTER COLUMN CHNG POSITION 11;

ALTER TABLE INPDEVFLT ALTER COLUMN OWNERBDO POSITION 12;

ALTER TABLE INTBARCS ALTER COLUMN ID POSITION 1;

ALTER TABLE INTBARCS ALTER COLUMN CODE POSITION 2;

ALTER TABLE INTBARCS ALTER COLUMN NAME POSITION 3;

ALTER TABLE INTBARCS ALTER COLUMN PREFIXBEG POSITION 4;

ALTER TABLE INTBARCS ALTER COLUMN PREFIXEND POSITION 5;

ALTER TABLE INTBARCS ALTER COLUMN "LENGTH" POSITION 6;

ALTER TABLE INTBARCS ALTER COLUMN DATA POSITION 7;

ALTER TABLE INTBARCS ALTER COLUMN BDOCODE POSITION 8;

ALTER TABLE INTBARCS ALTER COLUMN CHNG POSITION 9;

ALTER TABLE INTBARCS ALTER COLUMN OWNERBDO POSITION 10;

ALTER TABLE KEYBLAYT ALTER COLUMN ID POSITION 1;

ALTER TABLE KEYBLAYT ALTER COLUMN CODE POSITION 2;

ALTER TABLE KEYBLAYT ALTER COLUMN NAME POSITION 3;

ALTER TABLE KEYBLAYT ALTER COLUMN DATA POSITION 4;

ALTER TABLE KEYBLAYT ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE KEYBLAYT ALTER COLUMN CHNG POSITION 6;

ALTER TABLE KEYBLAYT ALTER COLUMN OWNERBDO POSITION 7;

ALTER TABLE KEYBMAP ALTER COLUMN ID POSITION 1;

ALTER TABLE KEYBMAP ALTER COLUMN CODE POSITION 2;

ALTER TABLE KEYBMAP ALTER COLUMN NAME POSITION 3;

ALTER TABLE KEYBMAP ALTER COLUMN ACTV POSITION 4;

ALTER TABLE KEYBMAP ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE KEYBMAP ALTER COLUMN CHNG POSITION 6;

ALTER TABLE KEYBMAP ALTER COLUMN OWNERBDO POSITION 7;

ALTER TABLE KEYBMAPF ALTER COLUMN ID POSITION 1;

ALTER TABLE KEYBMAPF ALTER COLUMN CODE POSITION 2;

ALTER TABLE KEYBMAPF ALTER COLUMN KEYBMAPID POSITION 3;

ALTER TABLE KEYBMAPF ALTER COLUMN SHORTCUT POSITION 4;

ALTER TABLE KEYBMAPF ALTER COLUMN FUNCID POSITION 5;

ALTER TABLE KEYBMAPF ALTER COLUMN KEYBMODEID POSITION 6;

ALTER TABLE KEYBMAPF ALTER COLUMN CLRKEYBMODE POSITION 7;

ALTER TABLE KEYBMAPF ALTER COLUMN SHIFTEDKEY POSITION 8;

ALTER TABLE KEYBMAPF ALTER COLUMN FUNCDATA POSITION 9;

ALTER TABLE KEYBMAPF ALTER COLUMN BDOCODE POSITION 10;

ALTER TABLE KEYBMAPF ALTER COLUMN CHNG POSITION 11;

ALTER TABLE KEYBMAPF ALTER COLUMN OWNERBDO POSITION 12;

ALTER TABLE KEYBMODE ALTER COLUMN ID POSITION 1;

ALTER TABLE KEYBMODE ALTER COLUMN CODE POSITION 2;

ALTER TABLE KEYBMODE ALTER COLUMN NAME POSITION 3;

ALTER TABLE KEYBMODE ALTER COLUMN TEXT POSITION 4;

ALTER TABLE KEYBMODE ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE KEYBMODE ALTER COLUMN CHNG POSITION 6;

ALTER TABLE KEYBMODE ALTER COLUMN OWNERBDO POSITION 7;

ALTER TABLE MONEYBOX ALTER COLUMN ID POSITION 1;

ALTER TABLE MONEYBOX ALTER COLUMN RMKID POSITION 2;

ALTER TABLE MONEYBOX ALTER COLUMN CURRENCYID POSITION 3;

ALTER TABLE MONEYBOX ALTER COLUMN VAL POSITION 4;

ALTER TABLE MONEYBOX ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE MONEYBOX ALTER COLUMN OWNERBDO POSITION 6;

ALTER TABLE MONEYBOX ALTER COLUMN CHNG POSITION 7;

ALTER TABLE PAYMENT ALTER COLUMN ID POSITION 1;

ALTER TABLE PAYMENT ALTER COLUMN CODE POSITION 2;

ALTER TABLE PAYMENT ALTER COLUMN NAME POSITION 3;

ALTER TABLE PAYMENT ALTER COLUMN TEXT POSITION 4;

ALTER TABLE PAYMENT ALTER COLUMN DELIVERYENABLE POSITION 5;

ALTER TABLE PAYMENT ALTER COLUMN ECRPAYMENT POSITION 6;

ALTER TABLE PAYMENT ALTER COLUMN MODIFYMONEYBOX POSITION 7;

ALTER TABLE PAYMENT ALTER COLUMN OPERATION POSITION 8;

ALTER TABLE PAYMENT ALTER COLUMN PAYCARDDEVID POSITION 9;

ALTER TABLE PAYMENT ALTER COLUMN CARDGROUPID POSITION 10;

ALTER TABLE PAYMENT ALTER COLUMN ECRDEVID POSITION 11;

ALTER TABLE PAYMENT ALTER COLUMN DELETED POSITION 12;

ALTER TABLE PAYMENT ALTER COLUMN BDOCODE POSITION 13;

ALTER TABLE PAYMENT ALTER COLUMN CHNG POSITION 14;

ALTER TABLE PAYMENT ALTER COLUMN OWNERBDO POSITION 15;

ALTER TABLE PRICELABEL ALTER COLUMN ID POSITION 1;

ALTER TABLE PRICELABEL ALTER COLUMN CODE POSITION 2;

ALTER TABLE PRICELABEL ALTER COLUMN NAME POSITION 3;

ALTER TABLE PRICELABEL ALTER COLUMN DATA POSITION 4;

ALTER TABLE PRICELABEL ALTER COLUMN USEASPECT POSITION 5;

ALTER TABLE PRICELABEL ALTER COLUMN CHNG POSITION 6;

ALTER TABLE PRICELABEL ALTER COLUMN BDOCODE POSITION 7;

ALTER TABLE PRICELABEL ALTER COLUMN OWNERBDO POSITION 8;

ALTER TABLE PRICELABEL ALTER COLUMN PREVIEW POSITION 9;

ALTER TABLE PROFILE ALTER COLUMN ID POSITION 1;

ALTER TABLE PROFILE ALTER COLUMN CODE POSITION 2;

ALTER TABLE PROFILE ALTER COLUMN NAME POSITION 3;

ALTER TABLE PROFILE ALTER COLUMN DELETED POSITION 4;

ALTER TABLE PROFILE ALTER COLUMN BASE POSITION 5;

ALTER TABLE PROFILE ALTER COLUMN BDOCODE POSITION 6;

ALTER TABLE PROFILE ALTER COLUMN CHNG POSITION 7;

ALTER TABLE PROFILE ALTER COLUMN OWNERBDO POSITION 8;

ALTER TABLE PROP ALTER COLUMN ID POSITION 1;

ALTER TABLE PROP ALTER COLUMN CODE POSITION 2;

ALTER TABLE PROP ALTER COLUMN NAME POSITION 3;

ALTER TABLE PROP ALTER COLUMN TEXT POSITION 4;

ALTER TABLE PROP ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE PROP ALTER COLUMN OWNERBDO POSITION 6;

ALTER TABLE PROPVALUE ALTER COLUMN ID POSITION 1;

ALTER TABLE PROPVALUE ALTER COLUMN CODE POSITION 2;

ALTER TABLE PROPVALUE ALTER COLUMN NAME POSITION 3;

ALTER TABLE PROPVALUE ALTER COLUMN TEXT POSITION 4;

ALTER TABLE PROPVALUE ALTER COLUMN PROPID POSITION 5;

ALTER TABLE PROPVALUE ALTER COLUMN BDOCODE POSITION 6;

ALTER TABLE PROPVALUE ALTER COLUMN OWNERBDO POSITION 7;

ALTER TABLE RECTEMPLATE ALTER COLUMN ID POSITION 1;

ALTER TABLE RECTEMPLATE ALTER COLUMN CODE POSITION 2;

ALTER TABLE RECTEMPLATE ALTER COLUMN NAME POSITION 3;

ALTER TABLE RECTEMPLATE ALTER COLUMN DATA POSITION 4;

ALTER TABLE RECTEMPLATE ALTER COLUMN MASTERSETTINGS POSITION 5;

ALTER TABLE RECTEMPLATE ALTER COLUMN BDOCODE POSITION 6;

ALTER TABLE RECTEMPLATE ALTER COLUMN CHNG POSITION 7;

ALTER TABLE RECTEMPLATE ALTER COLUMN OWNERBDO POSITION 8;

ALTER TABLE REMAIN ALTER COLUMN ID POSITION 1;

ALTER TABLE REMAIN ALTER COLUMN WAREID POSITION 2;

ALTER TABLE REMAIN ALTER COLUMN ASPECTVALUE1ID POSITION 3;

ALTER TABLE REMAIN ALTER COLUMN ASPECTVALUE2ID POSITION 4;

ALTER TABLE REMAIN ALTER COLUMN ASPECTVALUE3ID POSITION 5;

ALTER TABLE REMAIN ALTER COLUMN ASPECTVALUE4ID POSITION 6;

ALTER TABLE REMAIN ALTER COLUMN ASPECTVALUE5ID POSITION 7;

ALTER TABLE REMAIN ALTER COLUMN PRICE POSITION 8;

ALTER TABLE REMAIN ALTER COLUMN DELETED POSITION 9;

ALTER TABLE REMAIN ALTER COLUMN CHNG POSITION 10;

ALTER TABLE REMAIN ALTER COLUMN BDOCODE POSITION 11;

ALTER TABLE REMAIN ALTER COLUMN USEREMAIN POSITION 12;

ALTER TABLE REMAIN ALTER COLUMN OWNERBDO POSITION 13;

ALTER TABLE REMAIN ALTER COLUMN INSCHNG POSITION 14;

ALTER TABLE REMAIND ALTER COLUMN ID POSITION 1;

ALTER TABLE REMAIND ALTER COLUMN REMAINID POSITION 2;

ALTER TABLE REMAIND ALTER COLUMN DELTA POSITION 3;

ALTER TABLE REMAIND ALTER COLUMN DOCUMENTID POSITION 4;

ALTER TABLE REMAIND ALTER COLUMN CHNG POSITION 5;

ALTER TABLE REMAIND ALTER COLUMN BDOCODE POSITION 6;

ALTER TABLE REMAIND ALTER COLUMN DTYPE POSITION 7;

ALTER TABLE REMAIND ALTER COLUMN OWNERBDO POSITION 8;

ALTER TABLE RMK ALTER COLUMN ID POSITION 1;

ALTER TABLE RMK ALTER COLUMN CODE POSITION 2;

ALTER TABLE RMK ALTER COLUMN NAME POSITION 3;

ALTER TABLE RMK ALTER COLUMN TEXT POSITION 4;

ALTER TABLE RMK ALTER COLUMN EDUCATIONMODE POSITION 5;

ALTER TABLE RMK ALTER COLUMN RMKVERSION POSITION 6;

ALTER TABLE RMK ALTER COLUMN HALLID POSITION 7;

ALTER TABLE RMK ALTER COLUMN AUTOREGUSERID POSITION 8;

ALTER TABLE RMK ALTER COLUMN BDOCODE POSITION 9;

ALTER TABLE RMK ALTER COLUMN CHNG POSITION 10;

ALTER TABLE RMK ALTER COLUMN OWNERBDO POSITION 11;

ALTER TABLE RMKDEV ALTER COLUMN ID POSITION 1;

ALTER TABLE RMKDEV ALTER COLUMN CODE POSITION 2;

ALTER TABLE RMKDEV ALTER COLUMN DEVICEID POSITION 3;

ALTER TABLE RMKDEV ALTER COLUMN RMKID POSITION 4;

ALTER TABLE RMKDEV ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE RMKDEV ALTER COLUMN CHNG POSITION 6;

ALTER TABLE RMKDEV ALTER COLUMN OWNERBDO POSITION 7;

ALTER TABLE SECURITY ALTER COLUMN ID POSITION 1;

ALTER TABLE SECURITY ALTER COLUMN PROFILEID POSITION 2;

ALTER TABLE SECURITY ALTER COLUMN SECURITY POSITION 3;

ALTER TABLE SECURITY ALTER COLUMN SECURITYVALUE POSITION 4;

ALTER TABLE SECURITY ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE SECURITY ALTER COLUMN CHNG POSITION 6;

ALTER TABLE SECURITY ALTER COLUMN OWNERBDO POSITION 7;

ALTER TABLE SETTINGS ALTER COLUMN ID POSITION 1;

ALTER TABLE SETTINGS ALTER COLUMN NAME POSITION 2;

ALTER TABLE SETTINGS ALTER COLUMN VAL POSITION 3;

ALTER TABLE SETTINGS ALTER COLUMN CHNG POSITION 4;

ALTER TABLE SETTINGS ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE SETTINGS ALTER COLUMN SYNCCATEG POSITION 6;

ALTER TABLE SETTINGS ALTER COLUMN OWNERBDO POSITION 7;

ALTER TABLE SPRT ALTER COLUMN ID POSITION 1;

ALTER TABLE SPRT ALTER COLUMN CODE POSITION 2;

ALTER TABLE SPRT ALTER COLUMN MARK POSITION 3;

ALTER TABLE SPRT ALTER COLUMN PARENTID POSITION 4;

ALTER TABLE SPRT ALTER COLUMN NAME POSITION 5;

ALTER TABLE SPRT ALTER COLUMN TEXT POSITION 6;

ALTER TABLE SPRT ALTER COLUMN PRICE POSITION 7;

ALTER TABLE SPRT ALTER COLUMN MINPRICE POSITION 8;

ALTER TABLE SPRT ALTER COLUMN MAXDISCOUNT POSITION 9;

ALTER TABLE SPRT ALTER COLUMN ASPECTSCHEMEID POSITION 10;

ALTER TABLE SPRT ALTER COLUMN ISWARE POSITION 11;

ALTER TABLE SPRT ALTER COLUMN HIERLEVEL POSITION 12;

ALTER TABLE SPRT ALTER COLUMN LIFE POSITION 13;

ALTER TABLE SPRT ALTER COLUMN FLAGS POSITION 14;

ALTER TABLE SPRT ALTER COLUMN SERIES POSITION 15;

ALTER TABLE SPRT ALTER COLUMN CERTIFICAT POSITION 16;

ALTER TABLE SPRT ALTER COLUMN ECRDEVID POSITION 17;

ALTER TABLE SPRT ALTER COLUMN TAXGROUPID POSITION 18;

ALTER TABLE SPRT ALTER COLUMN SCALELPDEVID POSITION 19;

ALTER TABLE SPRT ALTER COLUMN SCALELPLOADED POSITION 20;

ALTER TABLE SPRT ALTER COLUMN SCALELPWARECODE POSITION 21;

ALTER TABLE SPRT ALTER COLUMN ASPECTTYPE POSITION 22;

ALTER TABLE SPRT ALTER COLUMN RCPPRNDEVID POSITION 23;

ALTER TABLE SPRT ALTER COLUMN PICTURE POSITION 24;

ALTER TABLE SPRT ALTER COLUMN DESCRIPTION POSITION 25;

ALTER TABLE SPRT ALTER COLUMN QUANTITYPREC POSITION 26;

ALTER TABLE SPRT ALTER COLUMN PRICELABELID POSITION 27;

ALTER TABLE SPRT ALTER COLUMN DELETED POSITION 28;

ALTER TABLE SPRT ALTER COLUMN PRICELBPRINTED POSITION 29;

ALTER TABLE SPRT ALTER COLUMN REWARDTYPE POSITION 30;

ALTER TABLE SPRT ALTER COLUMN REWARDVAL POSITION 31;

ALTER TABLE SPRT ALTER COLUMN ECRDEPARTMENT POSITION 32;

ALTER TABLE SPRT ALTER COLUMN CHNG POSITION 33;

ALTER TABLE SPRT ALTER COLUMN BDOCODE POSITION 34;

ALTER TABLE SPRT ALTER COLUMN OWNERBDO POSITION 35;

ALTER TABLE SPRT ALTER COLUMN INSCHNG POSITION 36;

ALTER TABLE SPRTPROP ALTER COLUMN ID POSITION 1;

ALTER TABLE SPRTPROP ALTER COLUMN WAREID POSITION 2;

ALTER TABLE SPRTPROP ALTER COLUMN PROPID POSITION 3;

ALTER TABLE SPRTPROP ALTER COLUMN PROPVALUEID POSITION 4;

ALTER TABLE SPRTPROP ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE SPRTPROP ALTER COLUMN OWNERBDO POSITION 6;

ALTER TABLE TAXGROUP ALTER COLUMN ID POSITION 1;

ALTER TABLE TAXGROUP ALTER COLUMN CODE POSITION 2;

ALTER TABLE TAXGROUP ALTER COLUMN NAME POSITION 3;

ALTER TABLE TAXGROUP ALTER COLUMN TEXT POSITION 4;

ALTER TABLE TAXGROUP ALTER COLUMN DELETED POSITION 5;

ALTER TABLE TAXGROUP ALTER COLUMN BDOCODE POSITION 6;

ALTER TABLE TAXGROUP ALTER COLUMN CHNG POSITION 7;

ALTER TABLE TAXGROUP ALTER COLUMN OWNERBDO POSITION 8;

ALTER TABLE TAXGRPRT ALTER COLUMN ID POSITION 1;

ALTER TABLE TAXGRPRT ALTER COLUMN CODE POSITION 2;

ALTER TABLE TAXGRPRT ALTER COLUMN TAXGROUPID POSITION 3;

ALTER TABLE TAXGRPRT ALTER COLUMN TAXRATEID POSITION 4;

ALTER TABLE TAXGRPRT ALTER COLUMN CHANGEBASE POSITION 5;

ALTER TABLE TAXGRPRT ALTER COLUMN DELETED POSITION 6;

ALTER TABLE TAXGRPRT ALTER COLUMN BDOCODE POSITION 7;

ALTER TABLE TAXGRPRT ALTER COLUMN CHNG POSITION 8;

ALTER TABLE TAXGRPRT ALTER COLUMN OWNERBDO POSITION 9;

ALTER TABLE TAXRATE ALTER COLUMN ID POSITION 1;

ALTER TABLE TAXRATE ALTER COLUMN CODE POSITION 2;

ALTER TABLE TAXRATE ALTER COLUMN NAME POSITION 3;

ALTER TABLE TAXRATE ALTER COLUMN TEXT POSITION 4;

ALTER TABLE TAXRATE ALTER COLUMN TYPE POSITION 5;

ALTER TABLE TAXRATE ALTER COLUMN VAL POSITION 6;

ALTER TABLE TAXRATE ALTER COLUMN DELETED POSITION 7;

ALTER TABLE TAXRATE ALTER COLUMN BDOCODE POSITION 8;

ALTER TABLE TAXRATE ALTER COLUMN CHNG POSITION 9;

ALTER TABLE TAXRATE ALTER COLUMN OWNERBDO POSITION 10;

ALTER TABLE TOUCHLAYT ALTER COLUMN ID POSITION 1;

ALTER TABLE TOUCHLAYT ALTER COLUMN CODE POSITION 2;

ALTER TABLE TOUCHLAYT ALTER COLUMN NAME POSITION 3;

ALTER TABLE TOUCHLAYT ALTER COLUMN DATA POSITION 4;

ALTER TABLE TOUCHLAYT ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE TOUCHLAYT ALTER COLUMN CHNG POSITION 6;

ALTER TABLE TOUCHLAYT ALTER COLUMN OWNERBDO POSITION 7;

ALTER TABLE TRANZT ALTER COLUMN ID POSITION 1;

ALTER TABLE TRANZT ALTER COLUMN DOCUMENTID POSITION 2;

ALTER TABLE TRANZT ALTER COLUMN TRANZCOUNT POSITION 3;

ALTER TABLE TRANZT ALTER COLUMN TRANZDATE POSITION 4;

ALTER TABLE TRANZT ALTER COLUMN TRANZTIME POSITION 5;

ALTER TABLE TRANZT ALTER COLUMN TRANZHOUR POSITION 6;

ALTER TABLE TRANZT ALTER COLUMN TRANZTYPE POSITION 7;

ALTER TABLE TRANZT ALTER COLUMN SELLER POSITION 8;

ALTER TABLE TRANZT ALTER COLUMN WARECODE POSITION 9;

ALTER TABLE TRANZT ALTER COLUMN WAREMARK POSITION 10;

ALTER TABLE TRANZT ALTER COLUMN ASPECTSCHEME POSITION 11;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE1 POSITION 12;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE2 POSITION 13;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE3 POSITION 14;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE4 POSITION 15;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE5 POSITION 16;

ALTER TABLE TRANZT ALTER COLUMN PRICE POSITION 17;

ALTER TABLE TRANZT ALTER COLUMN QUANTITY POSITION 18;

ALTER TABLE TRANZT ALTER COLUMN SUMM POSITION 19;

ALTER TABLE TRANZT ALTER COLUMN PRICEWD POSITION 20;

ALTER TABLE TRANZT ALTER COLUMN SUMMWD POSITION 21;

ALTER TABLE TRANZT ALTER COLUMN INFO POSITION 22;

ALTER TABLE TRANZT ALTER COLUMN INFOSTR POSITION 23;

ALTER TABLE TRANZT ALTER COLUMN BARCODE POSITION 24;

ALTER TABLE TRANZT ALTER COLUMN FACTOR POSITION 25;

ALTER TABLE TRANZT ALTER COLUMN CURRENCY POSITION 26;

ALTER TABLE TRANZT ALTER COLUMN PRNONECR POSITION 27;

ALTER TABLE TRANZT ALTER COLUMN ECRNUMBER POSITION 28;

ALTER TABLE TRANZT ALTER COLUMN POSID POSITION 29;

ALTER TABLE TRANZT ALTER COLUMN POSNUMB POSITION 30;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCPOS POSITION 31;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCREC POSITION 32;

ALTER TABLE TRANZT ALTER COLUMN COMMENTCODE POSITION 33;

ALTER TABLE TRANZT ALTER COLUMN COUNTFILLS POSITION 34;

ALTER TABLE TRANZT ALTER COLUMN COUNTPRINTS POSITION 35;

ALTER TABLE TRANZT ALTER COLUMN POSNUMBER POSITION 36;

ALTER TABLE TRANZT ALTER COLUMN BDOCODE POSITION 37;

ALTER TABLE TRANZT ALTER COLUMN OWNERBDO POSITION 38;

ALTER TABLE TRAUTH ALTER COLUMN ID POSITION 1;

ALTER TABLE TRAUTH ALTER COLUMN DOCUMENTID POSITION 2;

ALTER TABLE TRAUTH ALTER COLUMN RMKOPERATIONTYPE POSITION 3;

ALTER TABLE TRAUTH ALTER COLUMN TERMINALID POSITION 4;

ALTER TABLE TRAUTH ALTER COLUMN TRANZTYPE POSITION 5;

ALTER TABLE TRAUTH ALTER COLUMN TRANZDATE POSITION 6;

ALTER TABLE TRAUTH ALTER COLUMN TRANZTIME POSITION 7;

ALTER TABLE TRAUTH ALTER COLUMN SLIPNUMBER POSITION 8;

ALTER TABLE TRAUTH ALTER COLUMN OPERATIONTYPE POSITION 9;

ALTER TABLE TRAUTH ALTER COLUMN AUTHORIZATIONTYPE POSITION 10;

ALTER TABLE TRAUTH ALTER COLUMN MSGNUMBER POSITION 11;

ALTER TABLE TRAUTH ALTER COLUMN CARDTYPE POSITION 12;

ALTER TABLE TRAUTH ALTER COLUMN AUTHCODE POSITION 13;

ALTER TABLE TRAUTH ALTER COLUMN CARDNUMBER POSITION 14;

ALTER TABLE TRAUTH ALTER COLUMN CARDEXPDATE POSITION 15;

ALTER TABLE TRAUTH ALTER COLUMN SUMM POSITION 16;

ALTER TABLE TRAUTH ALTER COLUMN REFERENCENUMBER POSITION 17;

ALTER TABLE TRAUTH ALTER COLUMN CANCELED POSITION 18;

ALTER TABLE TRAUTH ALTER COLUMN RESULTCODE POSITION 19;

ALTER TABLE TRAUTH ALTER COLUMN RESPONSECODE POSITION 20;

ALTER TABLE TRAUTH ALTER COLUMN SYSTEMNUMBER POSITION 21;

ALTER TABLE TRAUTH ALTER COLUMN BDOCODE POSITION 22;

ALTER TABLE TRAUTH ALTER COLUMN OWNERBDO POSITION 23;

ALTER TABLE "USER" ALTER COLUMN ID POSITION 1;

ALTER TABLE "USER" ALTER COLUMN CODE POSITION 2;

ALTER TABLE "USER" ALTER COLUMN NAME POSITION 3;

ALTER TABLE "USER" ALTER COLUMN TEXT POSITION 4;

ALTER TABLE "USER" ALTER COLUMN PROFILEID POSITION 5;

ALTER TABLE "USER" ALTER COLUMN PSWRD POSITION 6;

ALTER TABLE "USER" ALTER COLUMN CARD POSITION 7;

ALTER TABLE "USER" ALTER COLUMN FINGER POSITION 8;

ALTER TABLE "USER" ALTER COLUMN DELETED POSITION 9;

ALTER TABLE "USER" ALTER COLUMN SKIPMODE POSITION 10;

ALTER TABLE "USER" ALTER COLUMN BDOCODE POSITION 11;

ALTER TABLE "USER" ALTER COLUMN CHNG POSITION 12;

ALTER TABLE "USER" ALTER COLUMN OWNERBDO POSITION 13;

ALTER TABLE WINREPORTS ALTER COLUMN ID POSITION 1;

ALTER TABLE WINREPORTS ALTER COLUMN CODE POSITION 2;

ALTER TABLE WINREPORTS ALTER COLUMN NAME POSITION 3;

ALTER TABLE WINREPORTS ALTER COLUMN VIEWREPORT POSITION 4;

ALTER TABLE WINREPORTS ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE WINREPORTS ALTER COLUMN CHNG POSITION 6;

ALTER TABLE WINREPORTS ALTER COLUMN OWNERBDO POSITION 7;

ALTER TABLE WINREPORTS ALTER COLUMN PREVIEW POSITION 8;

/* DROP: -- GRANT EXECUTE ON PROCEDURE DEL_WARE TO PUBLIC */
REVOKE EXECUTE ON PROCEDURE DEL_WARE FROM PUBLIC;

/* Create(Add) Crant */
GRANT ALL ON ACTDISC TO SYNCSRV;

GRANT ALL ON ACTDISCOBJ TO SYNCSRV;

GRANT ALL ON ACTSCRIPT TO SYNCSRV;

GRANT ALL ON ANALOG TO SYNCSRV;

GRANT ALL ON ASPECT TO SYNCSRV;

GRANT ALL ON ASPSCHM TO SYNCSRV;

GRANT ALL ON ASPVALUE TO SYNCSRV;

GRANT ALL ON BARCODE TO SYNCSRV;

GRANT ALL ON CARD TO SYNCSRV;

GRANT ALL ON CARDGROUP TO SYNCSRV;

GRANT ALL ON CASHBOXDEV TO SYNCSRV;

GRANT ALL ON CCARD TO SYNCSRV;

GRANT ALL ON CCARDCOUNTER TO SYNCSRV;

GRANT ALL ON CLIENT TO SYNCSRV;

GRANT ALL ON CLIENTCARD TO SYNCSRV;

GRANT ALL ON CLIENTCOUNTER TO SYNCSRV;

GRANT ALL ON COMMENT TO SYNCSRV;

GRANT ALL ON CONDITION TO SYNCSRV;

GRANT ALL ON COUNTER TO SYNCSRV;

GRANT ALL ON COUNTERD TO SYNCSRV;

GRANT ALL ON COUNTERTYPE TO SYNCSRV;

GRANT ALL ON CURRENCY TO SYNCSRV;

GRANT ALL ON CUSTOMDB TO SYNCSRV;

GRANT ALL ON CUSTOMDB TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON DELQUEUE TO SYNCSRV;

GRANT ALL ON DELQUEUE TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON DENOMIN TO SYNCSRV;

GRANT ALL ON DEVICES TO SYNCSRV;

GRANT ALL ON DISCRATE TO SYNCSRV;

GRANT ALL ON DOCKIND TO SYNCSRV;

GRANT ALL ON DOCKINDRECTMPL TO SYNCSRV;

GRANT ALL ON DOCKINDTMPL TO SYNCSRV;

GRANT ALL ON DOCTEMPLATE TO SYNCSRV;

GRANT ALL ON DOCUMENT TO SYNCSRV;

GRANT ALL ON ECRDEV_V TO SYNCSRV;

GRANT ALL ON GRPACTDISC TO SYNCSRV;

GRANT ALL ON GRPCCARD TO SYNCSRV;

GRANT ALL ON HALL TO SYNCSRV;

GRANT ALL ON HALLPLACE TO SYNCSRV;

GRANT ALL ON IDCOR TO SYNCSRV;

GRANT ALL ON IDCOR TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON INPDEVFLT TO SYNCSRV;

GRANT ALL ON INTBARCS TO SYNCSRV;

GRANT ALL ON KEYBLAYT TO SYNCSRV;

GRANT ALL ON KEYBMAP TO SYNCSRV;

GRANT ALL ON KEYBMAPF TO SYNCSRV;

GRANT ALL ON KEYBMODE TO SYNCSRV;

GRANT ALL ON MONEYBOX TO SYNCSRV;

GRANT ALL ON PAYCARDDEV TO SYNCSRV;

GRANT ALL ON PAYCARDDEV_V TO SYNCSRV;

GRANT ALL ON PAYMENT TO SYNCSRV;

GRANT ALL ON PRICELABEL TO SYNCSRV;

GRANT ALL ON PROFILE TO SYNCSRV;

GRANT ALL ON PROP TO SYNCSRV;

GRANT ALL ON PROPVALUE TO SYNCSRV;

GRANT ALL ON RCPPRNDEV TO SYNCSRV;

GRANT ALL ON RCPPRNDEV_V TO SYNCSRV;

GRANT ALL ON RECTEMPLATE TO SYNCSRV;

GRANT ALL ON REMAIN TO SYNCSRV;

GRANT ALL ON REMAIND TO SYNCSRV;

GRANT ALL ON REPORTS TO SYNCSRV;

GRANT ALL ON RMK TO SYNCSRV;

GRANT ALL ON RMKDEV TO SYNCSRV;

GRANT ALL ON SCALELP_V TO SYNCSRV;

GRANT ALL ON SECURITY TO SYNCSRV;

GRANT ALL ON SETTINGS TO SYNCSRV;

GRANT ALL ON SPRT TO SYNCSRV;

GRANT ALL ON SPRTPROP TO SYNCSRV;

GRANT ALL ON SYNCBASE TO SYNCSRV;

GRANT ALL ON SYNCBASE TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON SYNCSRV TO SYNCSRV;

GRANT ALL ON SYNCSRV TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON SYNCTABLE TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON TAXGROUP TO SYNCSRV;

GRANT ALL ON TAXGRPRT TO SYNCSRV;

GRANT ALL ON TAXRATE TO SYNCSRV;

GRANT ALL ON TBLINFO TO SYNCSRV;

GRANT ALL ON TBLINFO TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON TBLLOADINFO TO SYNCSRV;

GRANT ALL ON TBLLOADINFO TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON TERMDEV TO SYNCSRV;

GRANT ALL ON TOUCHLAYT TO SYNCSRV;

GRANT ALL ON TRANZT TO SYNCSRV;

GRANT ALL ON TRAUTH TO SYNCSRV;

GRANT ALL ON "USER" TO SYNCSRV;

GRANT ALL ON WINREPORTS TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPEND_WARE_DISC TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDACTDISC TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDANALOG TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDASPECT TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDASPSCHM TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDASPVALUE TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDBARCODEBYWARECODE TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDBARCODEBYWAREID TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDCARD TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDCARDGROUP TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDCCARDDISCS TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDCLIENT TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDCOMMENT TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDCONDITION TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDCOUNTERBYTYPE TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDCURRENCY TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDDEFAULTGRPDISC TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDDENOMIN TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDDISCRATE TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDFIXDISCS TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDGESTCLIENT TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDGRPACTDISC TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDPAYMENT TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDPILOT TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDREMAIN TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDREMAINBYWAREID TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDTAXGROUP TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDTAXGRPRT TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDTAXRATE TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDUSER TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDWARE TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE APPENDWAREPARAMS TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE CANCELSTORED TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE CHANGEWAREAMOUNT TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE CLEAR_ALL_GARBAGE TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE DELETE_ASPECT TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_ACTSCRIPT TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_ACTSCRIPT_CUSTOM TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_ASPECTS TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_BDO_SYNC_STATE TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_CHILDREN TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_CLIENT_CHILDREN TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_CLIENT_PARENTS TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_CLIENT_PARENTS0 TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_DEVICES_CHILDREN TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_DEVICES_PARENTS TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_DISCOUNT TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_DISCOUNT_CUSTOM TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_DISCRATE_CHILDREN TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_DISCRATE_PARENTS TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_IDLIST TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_OPERDAY TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_RMKDEVICE TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_TRANZCOUNT TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_WARE_CHILDREN TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_WARE_PARENTS TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_WARE_PARENTS0 TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GET_WARES TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GETHALLPLACES TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GETID TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE GETREPORTID TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE INITDISCSUPERMAG TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE INSTRANZCOPY TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE IS_WARE_IN_GROUP TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE MERGE_SETTING TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE MERGE_TBLINFO TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE MERGE_TBLLOADINFO TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE SENDEVENT TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE SET_GID TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE SET_WAREREMAIN TO SYNCSRV;

GRANT EXECUTE ON PROCEDURE UPDATE_ALL_REMAIN TO SYNCSRV;

INSERT INTO CUSTOMDB(BDOCODE, VERSIONFRONTOL, ACTV, DBIDENT) VALUES (0, '4.7.0', 0, 0);
COMMIT;

/* TEXT BLOCK END */

/* Convert 4.7.1 */

ALTER TABLE COUNTER DROP CONSTRAINT UNQ_COUNTER_CODE;

RECONNECT;

ALTER TABLE ACTDISCOBJ DROP CONSTRAINT UNQ_ACTDISCOBJ_CODE;

/* Declare UDF */
DECLARE EXTERNAL FUNCTION ADDLEFT
CSTRING(255), INTEGER, INTEGER
RETURNS CSTRING(255) FREE_IT
ENTRY_POINT 'AddLeft' MODULE_NAME 'UDFAtol';


ALTER TABLE ACTDISCOBJ ADD DELETED FLAG NOT NULL;

UPDATE ACTDISCOBJ SET DELETED = 0;
COMMIT;

UPDATE RDB$RELATION_FIELDS SET RDB$Collation_ID =
(Select C.Rdb$Collation_ID from Rdb$Collations C
where C.Rdb$Collation_Name='WIN1251'
 and C.Rdb$Character_Set_ID = (select Rdb$Character_Set_ID from Rdb$character_Sets where Rdb$character_set_name = 'WIN1251'))
  WHERE RDB$FIELD_NAME='FORMULA1' AND RDB$RELATION_NAME='CONDITION';

UPDATE RDB$RELATION_FIELDS SET RDB$Collation_ID =
(Select C.Rdb$Collation_ID from Rdb$Collations C
where C.Rdb$Collation_Name='WIN1251'
 and C.Rdb$Character_Set_ID = (select Rdb$Character_Set_ID from Rdb$character_Sets where Rdb$character_set_name = 'WIN1251'))
  WHERE RDB$FIELD_NAME='FORMULA2' AND RDB$RELATION_NAME='CONDITION';

UPDATE RDB$RELATION_FIELDS SET RDB$Collation_ID =
(Select C.Rdb$Collation_ID from Rdb$Collations C
where C.Rdb$Collation_Name='WIN1251'
 and C.Rdb$Character_Set_ID = (select Rdb$Character_Set_ID from Rdb$character_Sets where Rdb$character_set_name = 'WIN1251'))
  WHERE RDB$FIELD_NAME='FORMULA3' AND RDB$RELATION_NAME='CONDITION';

UPDATE RDB$RELATION_FIELDS SET RDB$Collation_ID =
(Select C.Rdb$Collation_ID from Rdb$Collations C
where C.Rdb$Collation_Name='WIN1251'
 and C.Rdb$Character_Set_ID = (select Rdb$Character_Set_ID from Rdb$character_Sets where Rdb$character_set_name = 'WIN1251'))
  WHERE RDB$FIELD_NAME='VERSIONFRONTOL' AND RDB$RELATION_NAME='CUSTOMDB';

UPDATE RDB$RELATION_FIELDS SET RDB$Collation_ID =
(Select C.Rdb$Collation_ID from Rdb$Collations C
where C.Rdb$Collation_Name='WIN1251'
 and C.Rdb$Character_Set_ID = (select Rdb$Character_Set_ID from Rdb$character_Sets where Rdb$character_set_name = 'WIN1251'))
  WHERE RDB$FIELD_NAME='BDOPATH' AND RDB$RELATION_NAME='SYNCBASE';

UPDATE RDB$RELATION_FIELDS SET RDB$Collation_ID =
(Select C.Rdb$Collation_ID from Rdb$Collations C
where C.Rdb$Collation_Name='WIN1251'
 and C.Rdb$Character_Set_ID = (select Rdb$Character_Set_ID from Rdb$character_Sets where Rdb$character_set_name = 'WIN1251'))
  WHERE RDB$FIELD_NAME='BDONAME' AND RDB$RELATION_NAME='SYNCBASE';

UPDATE RDB$RELATION_FIELDS SET RDB$Collation_ID =
(Select C.Rdb$Collation_ID from Rdb$Collations C
where C.Rdb$Collation_Name='WIN1251'
 and C.Rdb$Character_Set_ID = (select Rdb$Character_Set_ID from Rdb$character_Sets where Rdb$character_set_name = 'WIN1251'))
  WHERE RDB$FIELD_NAME='BDOUSER' AND RDB$RELATION_NAME='SYNCBASE';

UPDATE RDB$RELATION_FIELDS SET RDB$Collation_ID =
(Select C.Rdb$Collation_ID from Rdb$Collations C
where C.Rdb$Collation_Name='WIN1251'
 and C.Rdb$Character_Set_ID = (select Rdb$Character_Set_ID from Rdb$character_Sets where Rdb$character_set_name = 'WIN1251'))
  WHERE RDB$FIELD_NAME='BDOPSWRD' AND RDB$RELATION_NAME='SYNCBASE';

UPDATE RDB$RELATION_FIELDS SET RDB$Collation_ID =
(Select C.Rdb$Collation_ID from Rdb$Collations C
where C.Rdb$Collation_Name='WIN1251'
 and C.Rdb$Character_Set_ID = (select Rdb$Character_Set_ID from Rdb$character_Sets where Rdb$character_set_name = 'WIN1251'))
  WHERE RDB$FIELD_NAME='SYNCSRVNAME' AND RDB$RELATION_NAME='SYNCBASE';

UPDATE RDB$RELATION_FIELDS SET RDB$Collation_ID =
(Select C.Rdb$Collation_ID from Rdb$Collations C
where C.Rdb$Collation_Name='WIN1251'
 and C.Rdb$Character_Set_ID = (select Rdb$Character_Set_ID from Rdb$character_Sets where Rdb$character_set_name = 'WIN1251'))
  WHERE RDB$FIELD_NAME='ERRINFO' AND RDB$RELATION_NAME='TBLLOADINFO';

UPDATE RDB$RELATION_FIELDS SET RDB$Collation_ID =
(Select C.Rdb$Collation_ID from Rdb$Collations C
where C.Rdb$Collation_Name='WIN1251'
 and C.Rdb$Character_Set_ID = (select Rdb$Character_Set_ID from Rdb$character_Sets where Rdb$character_set_name = 'WIN1251'))
  WHERE RDB$FIELD_NAME='BDOERRINFO' AND RDB$RELATION_NAME='TBLLOADINFO';

/* Create Unique... */
ALTER TABLE ACTDISCOBJ ADD CONSTRAINT UNQ_ACTDISCOBJ_CODE UNIQUE (CODE)
USING DESC INDEX UNQ_ACTDISCOBJ_CODE;

ALTER TABLE COUNTER ADD CONSTRAINT UNQ_COUNTER_CODE UNIQUE (CODE, COUNTERTYPEID)
USING DESC INDEX UNQ_COUNTER_CODE;

ALTER TABLE SECURITY ADD CONSTRAINT UNQ_SECURITY_PROF_SEC UNIQUE (PROFILEID, SECURITY);

/* Alter Procedure... */
/* Alter (APPENDCCARDDISCS) */
SET TERM ^ ;

ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE DOCODE INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;
        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;
END
^

/* empty dependent procedure body */
/* Clear: APPENDCCARDDISCS for: APPENDCOUNTERBYTYPE */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPENDCLIENT for: APPENDCOUNTERBYTYPE */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPENDCOUNTERBYTYPE) */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER,
ICLIENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE COUNTERTYPEID INTEGER;
DECLARE VARIABLE COUNTERID INTEGER;
DECLARE VARIABLE CID INTEGER;
DECLARE VARIABLE COUNTERCODE INTEGER;
DECLARE VARIABLE ABDOCODE INTEGER;
DECLARE VARIABLE AOWNERBDO INTEGER;
BEGIN

  SELECT ID
  FROM COUNTERTYPE
  WHERE CODE = :ICOUNTERTYPE
  INTO :COUNTERTYPEID;

  SELECT BDOCODE, DBIDENT FROM CUSTOMDB INTO AOWNERBDO, ABDOCODE;

  IF (:COUNTERTYPEID IS NULL) THEN
  BEGIN
    ERRORCODE = 28;
    EXIT;
  END

  IF (ICARDID IS NOT NULL) THEN
  BEGIN
    CID = NULL;
    FOR
      SELECT C.ID
      FROM CCARDCOUNTER CC
      JOIN COUNTER C ON CC.COUNTERID = C.ID  AND C.COUNTERTYPEID = :COUNTERTYPEID
      WHERE CC.CCARDID = :ICARDID
      INTO :COUNTERID
    DO
    BEGIN
      INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
      VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, (select -sum(DELTA) from COUNTERD where counterid = :COUNTERID and DTYPE = 1), CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

      INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
      VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, (select -sum(DELTA) from COUNTERD where counterid = :COUNTERID and DTYPE <> 1), CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 2);

      IF (CID IS NULL) THEN
      BEGIN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        UPDATE COUNTER SET
          DATECREATE = CURRENT_DATE + CURRENT_TIME,
          BDOCODE = :ABDOCODE
        WHERE ID = :COUNTERID;
      END
      CID = 0;
    END

    IF (:CID IS NULL) THEN
    BEGIN
      COUNTERID = GEN_ID(GID, 1);

      SELECT NULLTOINT(MAX(CODE)) + 1
      FROM COUNTER
      WHERE COUNTERTYPEID = :COUNTERTYPEID
      INTO :COUNTERCODE;

      INSERT INTO COUNTER(ID, CODE, COUNTERTYPEID, BDOCODE, OWNERBDO)
      VALUES (:COUNTERID, :COUNTERCODE, :COUNTERTYPEID, :ABDOCODE, :AOWNERBDO);

      INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
      VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

      INSERT INTO CCARDCOUNTER(ID, CCARDID, COUNTERID, BDOCODE, OWNERBDO)
      VALUES (GEN_ID(GID, 1), :ICARDID, :COUNTERID, :ABDOCODE, :AOWNERBDO);
    END
  END
  ELSE
    IF (ICLIENTID IS NOT NULL) THEN
    BEGIN
      CID = NULL;
      FOR
        SELECT C.ID
        FROM COUNTER C
          JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
          JOIN CLIENTCOUNTER CC ON CC.COUNTERID = C.ID
        WHERE CT.CODE = :ICOUNTERTYPE  AND CC.CLIENTID = :ICLIENTID
        INTO :COUNTERID
      DO
      BEGIN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, (select -sum(DELTA) from COUNTERD where COUNTERID = :COUNTERID and DTYPE = 1), CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, (select -sum(DELTA) from COUNTERD where COUNTERID = :COUNTERID and DTYPE <> 1), CURRENT_DATE, :ABDOCODE,  :AOWNERBDO, 2);

        IF (CID IS NULL) THEN
        BEGIN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

          UPDATE COUNTER SET
            DATECREATE = CURRENT_DATE + CURRENT_TIME,
            BDOCODE = :ABDOCODE
          WHERE ID = :COUNTERID;
        END
        CID = 0;
      END

      IF (:CID IS NULL) THEN
      BEGIN
        COUNTERID = GEN_ID(GID, 1);

        SELECT NULLTOINT(MAX(CODE)) + 1
        FROM COUNTER
        WHERE COUNTERTYPEID = :COUNTERTYPEID
        INTO :COUNTERCODE;

        INSERT INTO COUNTER(ID, CODE, COUNTERTYPEID, BDOCODE, OWNERBDO)
        VALUES (:COUNTERID, :COUNTERCODE, :COUNTERTYPEID, :ABDOCODE, :AOWNERBDO);

        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        INSERT INTO CLIENTCOUNTER(ID, CLIENTID, COUNTERID, BDOCODE, OWNERBDO)
        VALUES (GEN_ID(GID, 1), :ICLIENTID, :COUNTERID, :ABDOCODE, :AOWNERBDO);
      END
    END
END
^

/* Alter (GET_BDO_SYNCINFO) */
ALTER PROCEDURE GET_BDO_SYNCINFO(ISYNCBASEID INTEGER)
 RETURNS(TABLENAME VARCHAR(100),
QUELENGTH VARCHAR(20),
ERROR VARCHAR(255),
SYNCCATEG INTEGER,
ISUPDIRECTION INTEGER,
CUROPER INTEGER)
 AS
DECLARE VARIABLE CURCHNGVAL INTEGER;
DECLARE VARIABLE ERRINFO VARCHAR(255);
DECLARE VARIABLE BDOERRINFO VARCHAR(255);
DECLARE VARIABLE QUEUELENGTH INTEGER;
DECLARE VARIABLE SYNCKIND INTEGER;
DECLARE VARIABLE BDOCODE INTEGER;
BEGIN
  SELECT BDOCODE FROM CUSTOMDB INTO BDOCODE;
  IF ((BDOCODE IS NULL) OR (BDOCODE = 0)) THEN EXIT;

  FOR SELECT 'DELQUEUE',
    (SELECT COUNT(CHNG) FROM DELQUEUE WHERE CHNG > COALESCE(TL.CHNGVAL, 0)), '',
    TL.BDOERRINFO, 0, 1, TL.CUROPER, TL.ERRINFO
  FROM SYNCBASE S
  LEFT JOIN TBLLOADINFO TL ON TL.SYNCBASEID = S.ID AND TL.TABLENAME = 'DELQUEUE'
  WHERE S.ID = :ISYNCBASEID
  INTO TABLENAME, QUEUELENGTH, QUELENGTH, ERROR, SYNCCATEG, ISUPDIRECTION, CUROPER, ERRINFO DO
  BEGIN
    SUSPEND;
    QUELENGTH = QUEUELENGTH;
    ERROR = ERRINFO;
    ISUPDIRECTION = 2;
    SUSPEND;
  END

  FOR
    SELECT
      CASE
        WHEN TRIM(TC.TABLENAME) LIKE '%USER%' THEN '"USER"'
        ELSE TC.TABLENAME
      END,
      COALESCE(T.CHNGVAL, 0) AS CHNGVAL,
      T.ERRINFO,
      T.BDOERRINFO,
      TC.CATEG,
      ST.SYNCKIND,
      T.CUROPER
    FROM SYNCBASE SB
      JOIN SYNCTABLE ST ON ST.SYNCBASEID = SB.PARENTID AND ST.SYNCKIND <> 0
      JOIN TABLECATEG TC ON TC.CATEG = ST.CATEG
      LEFT JOIN TBLLOADINFO T ON T.SYNCBASEID = SB.ID AND T.TABLENAME = TC.TABLENAME
    WHERE
      SB.ID = :ISYNCBASEID AND
      EXISTS(SELECT 1 FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = TC.TABLENAME AND RDB$FIELD_NAME = 'OWNERBDO')

    INTO TABLENAME, CURCHNGVAL, ERRINFO, BDOERRINFO, SYNCCATEG, SYNCKIND, CUROPER
    DO
    BEGIN
      EXECUTE STATEMENT
      'SELECT COUNT(CHNG) FROM '||TABLENAME||' T '||
        IIF(SYNCKIND = 1, 'JOIN SYNCBASE SB ON T.OWNERBDO = SB.CODE ' ||
                          'WHERE SB.ID = ' || CAST(ISYNCBASEID AS VARCHAR(100)) || ' AND CHNG > ',
                          'WHERE CHNG > ') ||
        CAST(COALESCE(CURCHNGVAL, 0) AS VARCHAR(100))
      INTO QUEUELENGTH;
      ISUPDIRECTION = 1; QUELENGTH = ''; ERROR = BDOERRINFO;
      SUSPEND;
      ISUPDIRECTION = 2; QUELENGTH = QUEUELENGTH; ERROR = ERRINFO;
      SUSPEND;
    END
END
^

/* empty dependent procedure body */
/* Clear: GET_DISCRATE_HIER for: GET_DISCRATE_HIER */
ALTER PROCEDURE GET_DISCRATE_HIER(SYNCBASEID INTEGER,
CHNGEND NUMERIC(18),
PARENTID INTEGER,
UPPERHIER INTEGER,
ISC2L INTEGER)
 RETURNS(ID INTEGER,
HIER INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (GET_DISCRATE_HIER) */
ALTER PROCEDURE GET_DISCRATE_HIER(SYNCBASEID INTEGER,
CHNGEND NUMERIC(18),
PARENTID INTEGER,
UPPERHIER INTEGER,
ISC2L INTEGER)
 RETURNS(ID INTEGER,
HIER INTEGER)
 AS
DECLARE VARIABLE AISFOLDER INTEGER;
DECLARE VARIABLE ACHNG INTEGER;
DECLARE VARIABLE CHNGBEG NUMERIC(18,0);
BEGIN

  IF (ISC2L = 1) THEN
    SELECT CHNGVAL
    FROM TBLLOADINFO TI
    WHERE TI.TABLENAME = 'DISCRATE' AND TI.SYNCBASEID =:SYNCBASEID AND TI.SECTION = :UPPERHIER
    INTO CHNGBEG;
  ELSE
    SELECT CHNGVAL
    FROM TBLINFO TI
    WHERE TI.TABLENAME = 'DISCRATE' AND TI.SECTION = :UPPERHIER
    INTO CHNGBEG;

  IF (CHNGBEG IS NULL) THEN
    CHNGBEG = 0;

  FOR SELECT ID, ISFOLDER, CHNG FROM DISCRATE
  WHERE PARENTID = :PARENTID
  INTO ID, AISFOLDER, ACHNG DO
  BEGIN
    HIER = UPPERHIER;
    IF ((ACHNG > CHNGBEG) AND (ACHNG <= CHNGEND)) THEN
      SUSPEND;
    IF (AISFOLDER = 1) THEN
      FOR SELECT ID, HIER FROM GET_DISCRATE_HIER(:SYNCBASEID, :CHNGEND, :ID, :HIER + 1, :ISC2L) INTO ID, HIER DO
        SUSPEND;
  END
END
^

/* empty dependent procedure body */
/* Clear: CANCELSTORED for: GET_TRANZCOUNT */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter (GET_TRANZCOUNT) */
ALTER PROCEDURE GET_TRANZCOUNT(ARMKID INTEGER)
 RETURNS(TRANZCOUNT INTEGER)
 AS
DECLARE VARIABLE ACODE INTEGER;
BEGIN

  SELECT CODE
  FROM RMK
  WHERE ID = :ARMKID
  INTO ACODE;

  SELECT FIRST 1 TRANZCOUNT + 1
  FROM TRANZT
  WHERE POSNUMBER = :ACODE
  ORDER BY POSNUMBER DESC, TRANZCOUNT DESC
  INTO TRANZCOUNT;
  IF (TRANZCOUNT IS NULL) THEN
    TRANZCOUNT = 1;

END
^

/* Alter (GETHALLPLACES) */
ALTER PROCEDURE GETHALLPLACES(AHALLID INTEGER,
AEDUCATION INTEGER = 0)
 RETURNS(ID INTEGER,
CODE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
STATE INTEGER,
DOCCOUNT INTEGER,
OPENTIME TIME,
TOTALSUMM FLOAT,
USERNAME VARCHAR(100),
CLIENTNAME VARCHAR(100))
 AS
BEGIN
  FOR SELECT ID, CODE, NAME, TEXT FROM HALLPLACE WHERE HALLID = :AHALLID
  ORDER BY CODE
  INTO :ID, :CODE, :NAME, :TEXT DO
  BEGIN
    SELECT COUNT(ID), SUM(SUMMWD) FROM DOCUMENT WHERE HALLPLACEID = :ID AND STATE IN (0, 3) AND EDUCATION = :AEDUCATION
    INTO :DOCCOUNT, :TOTALSUMM;

    STATE = DOCCOUNT;

    OPENTIME = NULL;
    USERNAME = NULL;
    CLIENTNAME = NULL;

    IF (DOCCOUNT > 0) THEN
      SELECT FIRST 1 D.OPENTIME, U.NAME, C.NAME
      FROM DOCUMENT D JOIN "USER" U ON U.ID = D.OPENUSERID LEFT JOIN CLIENT C ON C.ID = D.CLIENTID
      WHERE D.HALLPLACEID = :ID AND D.STATE IN (0, 3)
      ORDER BY D.ID
      INTO :OPENTIME, :USERNAME, :CLIENTNAME;

    SUSPEND;
  END

END
^

/* Alter (SET_WAREREMAIN) */
ALTER PROCEDURE SET_WAREREMAIN(WAREID INTEGER,
REMAIN DOUBLE PRECISION)
 AS
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE NEWREMAINID INTEGER;
DECLARE VARIABLE OLDREMAIN DOUBLE PRECISION;
BEGIN
  SELECT R.ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    R.ASPECTVALUE1ID = 0 AND
    R.ASPECTVALUE2ID = 0 AND
    R.ASPECTVALUE3ID = 0 AND
    R.ASPECTVALUE4ID = 0 AND
    R.ASPECTVALUE5ID = 0
  INTO :REMAINID;

  IF (NOT REMAINID IS NULL) THEN
  BEGIN
    UPDATE REMAIN SET
      BDOCODE = (SELECT DBIDENT FROM CUSTOMDB)
    WHERE ID = :REMAINID;

    SELECT NULLTONUM(SUM(DELTA))
    FROM REMAIND RD
    WHERE
      RD.REMAINID = :REMAINID AND
      DTYPE = 1
    INTO :OLDREMAIN;

    INSERT INTO REMAIND
      (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
    VALUES
      (GEN_ID(GREMAIND, 1), :REMAINID, -:OLDREMAIN -:REMAIN, NULL, 1);
  END
    ELSE
    BEGIN
      NEWREMAINID = GEN_ID(GID, 1);
      INSERT INTO REMAIN
        (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID, BDOCODE)
      SELECT
        :NEWREMAINID, :WAREID, 0, 0, 0, 0, 0, DBIDENT FROM CUSTOMDB;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :NEWREMAINID, - :REMAIN, NULL, 1);
    END
END
^

/* Restore proc. body: APPENDCCARDDISCS */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE DOCODE INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;
        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;
END
^

/* Restore proc. body: APPENDCLIENT */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,      CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE, BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,
                          WEB,     TELEPHONE, INN,      DOCUMENT, OKPO,  OKPD,     DELETED)

      VALUES (:CLIENTID, :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT,  :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE, :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,
              :IWEB,     :ITELEPHONE, :IINN,        :IDOCUMENT, :IOKPO, :IOKPD,     :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;
END
^

/* Restore proc. body: CANCELSTORED */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 AS
DECLARE VARIABLE TRANZCOUNT INTEGER;
DECLARE VARIABLE RMKID INTEGER;
DECLARE VARIABLE DOCID NUMERIC(18,0);
DECLARE VARIABLE WARECODE INTEGER;
DECLARE VARIABLE WAREMARK VARCHAR(100);
DECLARE VARIABLE TRANZTYPE INTEGER;
DECLARE VARIABLE QUANTITY INTEGER;
DECLARE VARIABLE ASPSCHEMECODE INTEGER;
DECLARE VARIABLE ASPSCHEMEID INTEGER;
DECLARE VARIABLE ASPVAL1 INTEGER;
DECLARE VARIABLE ASPVAL2 INTEGER;
DECLARE VARIABLE ASPVAL3 INTEGER;
DECLARE VARIABLE ASPVAL4 INTEGER;
DECLARE VARIABLE ASPVAL5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
DECLARE VARIABLE TRID NUMERIC(18,0);
DECLARE VARIABLE USERCODE INTEGER;
DECLARE VARIABLE TMPID NUMERIC(18,0);
BEGIN
  SELECT ID
  FROM RMK R
  WHERE R.CODE = :APOSNUMBER
  INTO RMKID;

  SELECT CODE
  FROM "USER"
  WHERE ID = :ASELLERID
  INTO USERCODE;

  EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES TRANZCOUNT;

  FOR
    SELECT ID
    FROM DOCUMENT D
    WHERE D.RMKID = :RMKID AND D.STATE = 3 AND NOT EXISTS(SELECT 1 FROM TRAUTH TR WHERE TR.DOCUMENTID = D.ID)
    INTO DOCID
    DO
    BEGIN
         --    11  12, -   
      FOR
        SELECT WARECODE, WAREMARK, TRANZTYPE, QUANTITY,
        ASPECTSCHEME, ASPECTVALUE1, ASPECTVALUE2, ASPECTVALUE3, ASPECTVALUE4, ASPECTVALUE5
        FROM TRANZT T
        LEFT JOIN SPRT S ON S.CODE = T.WARECODE
        WHERE TRANZTYPE IN (11,12) AND T.DOCUMENTID = :DOCID
      INTO WARECODE, WAREMARK, TRANZTYPE, QUANTITY, ASPSCHEMECODE, ASPVAL1, ASPVAL2, ASPVAL3, ASPVAL4, ASPVAL5
      DO
      BEGIN
        WAREID = NULL;
        FLAGS = NULL;
           --  ID    
        IF (AWARECODETOMARK = 0) THEN
        BEGIN
          SELECT ID, FLAGS
          FROM SPRT
          WHERE CODE = :WARECODE
          INTO WAREID, FLAGS;
        END
        ELSE
        BEGIN
          SELECT FIRST 1 ID, FLAGS
          FROM SPRT
          WHERE MARK = :WAREMARK
          INTO :WAREID, :FLAGS;
        END
        --          ,  -
        IF (:ACONTROLSALEREMAIN = 1 OR :ACONTROLSALEREMAIN = 2 AND :FLAGS/64 <> (:FLAGS/32)/2.0) THEN
        BEGIN
          ASPSCHEMEID = NULL;
          SELECT ID
          FROM ASPSCHM
          WHERE CODE = :ASPSCHEMECODE
          INTO :ASPSCHEMEID;

          REMAINID = NULL;
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL1 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 1)) AND
          R.ASPECTVALUE2ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL2 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 2)) AND
          R.ASPECTVALUE3ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL3 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 3)) AND
          R.ASPECTVALUE4ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL4 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 4)) AND
          R.ASPECTVALUE5ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL5 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 5)) AND
          R.WAREID = :WAREID AND
          R.USEREMAIN = 1
          INTO
          REMAINID;

          IF (:REMAINID IS NULL) THEN
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = 0 AND
          R.ASPECTVALUE2ID = 0 AND
          R.ASPECTVALUE3ID = 0 AND
          R.ASPECTVALUE4ID = 0 AND
          R.ASPECTVALUE5ID = 0 AND
          R.WAREID = :WAREID
          INTO
          REMAINID;

          IF (:REMAINID IS NOT NULL) THEN
          INSERT INTO REMAIND (
           ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
          VALUES (
           GEN_ID(GREMAIND, 1), :REMAINID, -:QUANTITY, :DOCID, 0);
        END
      END

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID AND TRANZTYPE = 54
        INTO TMPID
        DO
          UPDATE TRANZT T SET
            TRANZDATE = :ATRANZDATE,
            TRANZHOUR = :ATRANZHOUR,
            TRANZTIME = :ATRANZTIME,
            TRANZTYPE = 56,
            T.SELLER = :USERCODE
          WHERE ID = :TMPID;

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID
        ORDER BY ID
        INTO TRID
        DO
        BEGIN
          UPDATE TRANZT SET
            TRANZCOUNT = :TRANZCOUNT
          WHERE ID = :TRID;
          TRANZCOUNT = TRANZCOUNT + 1;
        END

      DELETE FROM COUNTERD CD WHERE CD.DOCUMENTID = :DOCID;
      UPDATE DOCUMENT D SET
        STATE = 2,
        CLOSEDATE = :ATRANZDATE,
        CLOSETIME = :ATRANZTIME,
        CLOSEUSERID = :ASELLERID,
        SAVED = :ASAVED
      WHERE ID = :DOCID;
    END
END
^

/* Create trigger... */
CREATE TRIGGER UPD_AFT_CCARD FOR CCARD
ACTIVE AFTER UPDATE POSITION 0 
AS
DECLARE VARIABLE TEMPID INTEGER;
DECLARE VARIABLE GRPCODE INTEGER;
BEGIN
  IF (NEW.CODE <> OLD.CODE) THEN
  BEGIN
    SELECT CODE FROM GRPCCARD WHERE ID = NEW.GRPCCARDID INTO GRPCODE;
    FOR
      SELECT C.ID
      FROM COUNTER C
        JOIN COUNTERTYPE CT ON
          CT.ID = C.COUNTERTYPEID AND CT.AUTOCREATE = 1
        JOIN CCARDCOUNTER CC ON
          CC.COUNTERID = C.ID AND CC.CCARDID = NEW.ID
      INTO TEMPID
      DO
        UPDATE COUNTER SET
          CODE = ADDLEFT(:GRPCODE, 48, 9) || ADDLEFT(NEW.CODE, 48, 9)
        WHERE ID = :TEMPID;
  END
END
^


/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_ACTDISC
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_ACTDISCOBJ
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_ASPECT
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_ASPSCHM
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_ASPVALUE
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_BARCODE
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_CCARD
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_CLIENT
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_COUNTER
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_REMAIN
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_SPRT
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER IND_AFT_COUNTERTYPE
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
DECLARE VARIABLE TDBIDENT INTEGER;
DECLARE VARIABLE TCODE1 INTEGER;
DECLARE VARIABLE TCODE2 INTEGER;
BEGIN
  SELECT DBIDENT FROM CUSTOMDB INTO TDBIDENT;
  IF (NEW.AUTOCREATE = 1) THEN
    FOR
      SELECT C.ID, C.CODE, GC.CODE
      FROM CCARD C JOIN GRPCCARD GC ON
                   GC.ID = C.GRPCCARDID
      WHERE COALESCE(C.OWNERBDO, :TDBIDENT) = COALESCE(NEW.OWNERBDO, :TDBIDENT)
      INTO TMPID1, TCODE1, TCODE2
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, BDOCODE) VALUES (:TMPID2, ADDLEFT(:TCODE2, 48, 9) || ADDLEFT(:TCODE1, 48, 9), NEW.ID, NEW.OWNERBDO, NEW.BDOCODE);
        INSERT INTO CCARDCOUNTER (ID, COUNTERID, CCARDID, OWNERBDO, BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, NEW.OWNERBDO, NEW.BDOCODE);
      END
  ELSE IF (NEW.AUTOCREATE = 2) THEN
    FOR
      SELECT ID, CODE
      FROM CLIENT
      WHERE COALESCE(OWNERBDO, :TDBIDENT) = COALESCE(NEW.OWNERBDO, :TDBIDENT) AND ISFOLDER = 0
      INTO TMPID1, TCODE1
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, BDOCODE) VALUES (:TMPID2, :TCODE1, NEW.ID, NEW.OWNERBDO, NEW.BDOCODE);
        INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID, OWNERBDO, BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, NEW.OWNERBDO, NEW.BDOCODE);
      END
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_AFT_CCARD
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TDBIDENT INTEGER;
DECLARE VARIABLE TGRPCODE INTEGER;
DECLARE VARIABLE TCOUNTERID INTEGER;
BEGIN
  SELECT DBIDENT FROM CUSTOMDB INTO TDBIDENT;
  SELECT CODE FROM GRPCCARD WHERE ID = NEW.GRPCCARDID INTO TGRPCODE;
  FOR
    SELECT CT.ID
    FROM COUNTERTYPE CT
    WHERE CT.AUTOCREATE = 1
    AND COALESCE(OWNERBDO, :TDBIDENT) = COALESCE(NEW.OWNERBDO, :TDBIDENT)
    INTO TMPID1
    DO
    BEGIN
      TCOUNTERID = NULL;
      SELECT ID FROM COUNTER WHERE CODE = (ADDLEFT(:TGRPCODE, 48, 9) || ADDLEFT(NEW.CODE, 48, 9))  AND COUNTERTYPEID = :TMPID1 INTO TCOUNTERID;

      IF (TCOUNTERID IS NULL) THEN
      BEGIN
        TCOUNTERID = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO) VALUES (:TCOUNTERID, ADDLEFT(:TGRPCODE, 48, 9) || ADDLEFT(NEW.CODE, 48, 9), :TMPID1, NEW.OWNERBDO);
      END

      INSERT INTO CCARDCOUNTER (ID, COUNTERID, CCARDID, OWNERBDO) VALUES (GEN_ID(GID, 1), :TCOUNTERID, NEW.ID, NEW.OWNERBDO);
    END
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_AFT_CLIENT
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TDBIDENT INTEGER;
DECLARE VARIABLE TCOUNTERID INTEGER;
BEGIN
  IF (NEW.ISFOLDER = 0) THEN
  BEGIN
  SELECT DBIDENT FROM CUSTOMDB INTO TDBIDENT;
  FOR
    SELECT CT.ID
    FROM COUNTERTYPE CT
    WHERE CT.AUTOCREATE = 2
    AND COALESCE(OWNERBDO, :TDBIDENT) = COALESCE(NEW.OWNERBDO, :TDBIDENT)
    INTO TMPID1
    DO
    BEGIN
      TCOUNTERID = NULL;
      SELECT ID FROM COUNTER WHERE CODE = NEW.CODE AND COUNTERTYPEID = :TMPID1 INTO TCOUNTERID;

      IF (TCOUNTERID IS NULL) THEN
      BEGIN
        TCOUNTERID = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO) VALUES (:TCOUNTERID, NEW.CODE, :TMPID1, NEW.OWNERBDO);
      END

      INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID, OWNERBDO) VALUES (GEN_ID(GID, 1), :TCOUNTERID, NEW.ID, NEW.OWNERBDO);
    END
  END
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_BEF_COUNTERD
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT OWNERBDO FROM COUNTER WHERE ID = NEW.COUNTERID INTO NEW.OWNERBDO;
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_AFT_CLIENT
AS
DECLARE VARIABLE TMPID INTEGER;
DECLARE VARIABLE TCOUNTERID INTEGER;
BEGIN
  IF (NEW.CODE <> OLD.CODE) THEN
  BEGIN
    FOR
      SELECT C.ID
      FROM COUNTER C
        JOIN COUNTERTYPE CT ON
          CT.ID = C.COUNTERTYPEID AND CT.AUTOCREATE = 2
        JOIN CLIENTCOUNTER CC ON
          CC.COUNTERID = C.ID AND CC.CLIENTID = NEW.ID
      INTO :TMPID
      DO
        UPDATE COUNTER SET
          CODE = NEW.CODE
        WHERE ID = :TMPID;
  END


  IF (NEW.ISFOLDER = 0 AND OLD.ISFOLDER <> 0) THEN
  BEGIN
    FOR
      SELECT CT.ID
      FROM COUNTERTYPE CT
      WHERE CT.AUTOCREATE = 2
      INTO TMPID
      DO
      BEGIN
        TCOUNTERID = NULL;
        SELECT ID FROM COUNTER WHERE CODE = NEW.CODE AND COUNTERTYPEID = :TMPID INTO TCOUNTERID;

        IF (TCOUNTERID IS NULL) THEN
        BEGIN
          TCOUNTERID = GEN_ID(GID, 1);
          INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO) VALUES (:TCOUNTERID, NEW.CODE, :TMPID, NEW.OWNERBDO);
        END

        INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID, OWNERBDO) VALUES (GEN_ID(GID, 1), :TCOUNTERID, NEW.ID, NEW.OWNERBDO);
      END
  END
  ELSE
  IF (NEW.ISFOLDER <> 0 AND OLD.ISFOLDER = 0) THEN
  FOR
    SELECT CC.COUNTERID
    FROM CLIENTCOUNTER CC
    JOIN COUNTER CO ON CO.ID = CC.COUNTERID
    JOIN COUNTERTYPE CT ON CT.ID = CO.COUNTERTYPEID AND CT.AUTOCREATE = 2
    WHERE CC.CLIENTID = OLD.ID
    INTO TMPID
    DO
      DELETE FROM COUNTER WHERE ID = :TMPID;
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_AFT_COUNTERTYPE
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
DECLARE VARIABLE TCODE1 INTEGER;
DECLARE VARIABLE TCODE2 INTEGER;
BEGIN
/*  OLD.AUTOCREATE >= 0   -.   */
/*      ,     */
/*      . */
/*        -        "" */
  IF (OLD.AUTOCREATE >= 0 AND NEW.AUTOCREATE <> OLD.AUTOCREATE) THEN
  BEGIN
  IF (NEW.AUTOCREATE = 1) THEN
  BEGIN
    DELETE FROM COUNTER C WHERE C.COUNTERTYPEID = NEW.ID AND NOT EXISTS(SELECT 1 FROM CCARD CC
                                                                                   JOIN GRPCCARD GC ON GC.ID = CC.GRPCCARDID
                                                                        WHERE CC.CODE = PCOPY(C.CODE, 0, LEN(C.CODE) - 9) AND GC.CODE = PCOPY(C.CODE, LEN(C.CODE) - 9, 9));
    FOR
      SELECT C.ID, C.CODE, GC.CODE
      FROM CCARD C JOIN GRPCCARD GC ON
                   GC.ID = C.GRPCCARDID
--      WHERE NOT EXISTS(SELECT 1 FROM CCARDCOUNTER CC JOIN COUNTER CN ON CN.ID = CC.COUNTERID
--        WHERE CC.CCARDID = C.ID AND CN.COUNTERTYPEID = NEW.ID)
      INTO TMPID1, TCODE1, TCODE2
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, BDOCODE) VALUES (:TMPID2, ADDLEFT(:TCODE2, 48, 9) || ADDLEFT(:TCODE1, 48, 9), NEW.ID, NEW.OWNERBDO, NEW.BDOCODE);
        INSERT INTO CCARDCOUNTER (ID, COUNTERID, CCARDID, OWNERBDO, BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, NEW.OWNERBDO, NEW.BDOCODE);
      END
  END
  IF (NEW.AUTOCREATE = 2) THEN
  BEGIN
    DELETE FROM COUNTER C WHERE C.COUNTERTYPEID = NEW.ID AND NOT EXISTS(SELECT 1 FROM CLIENT CL WHERE CL.CODE = C.CODE);
    FOR
      SELECT ID, CODE
      FROM CLIENT C
--      WHERE NOT EXISTS(SELECT 1 FROM CLIENTCOUNTER CC JOIN COUNTER CN ON CN.ID = CC.COUNTERID
--        WHERE CC.COUNTERID = C.ID AND CN.COUNTERTYPEID = NEW.ID)
      WHERE  ISFOLDER = 0
      INTO TMPID1, TCODE1
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, BDOCODE) VALUES (:TMPID2, :TCODE1, NEW.ID, NEW.OWNERBDO, NEW.BDOCODE);
        INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID, OWNERBDO, BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, NEW.OWNERBDO, NEW.BDOCODE);
      END
  END
  END
END
^

/* Alter Procedure... */
/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE DOCODE INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;
        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;
END
^

/* Alter (APPENDCLIENT) */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,      CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE, BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,
                          WEB,     TELEPHONE, INN,      DOCUMENT, OKPO,  OKPD,     DELETED)

      VALUES (:CLIENTID, :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT,  :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE, :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,
              :IWEB,     :ITELEPHONE, :IINN,        :IDOCUMENT, :IOKPO, :IOKPD,     :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID
        WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;
END
^

/* Alter (CANCELSTORED) */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 AS
DECLARE VARIABLE TRANZCOUNT INTEGER;
DECLARE VARIABLE RMKID INTEGER;
DECLARE VARIABLE DOCID NUMERIC(18,0);
DECLARE VARIABLE WARECODE INTEGER;
DECLARE VARIABLE WAREMARK VARCHAR(100);
DECLARE VARIABLE TRANZTYPE INTEGER;
DECLARE VARIABLE QUANTITY INTEGER;
DECLARE VARIABLE ASPSCHEMECODE INTEGER;
DECLARE VARIABLE ASPSCHEMEID INTEGER;
DECLARE VARIABLE ASPVAL1 INTEGER;
DECLARE VARIABLE ASPVAL2 INTEGER;
DECLARE VARIABLE ASPVAL3 INTEGER;
DECLARE VARIABLE ASPVAL4 INTEGER;
DECLARE VARIABLE ASPVAL5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
DECLARE VARIABLE TRID NUMERIC(18,0);
DECLARE VARIABLE USERCODE INTEGER;
DECLARE VARIABLE TMPID NUMERIC(18,0);
BEGIN
  SELECT ID
  FROM RMK R
  WHERE R.CODE = :APOSNUMBER
  INTO RMKID;

  SELECT CODE
  FROM "USER"
  WHERE ID = :ASELLERID
  INTO USERCODE;

  EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES TRANZCOUNT;

  FOR
    SELECT ID
    FROM DOCUMENT D
    WHERE D.RMKID = :RMKID AND D.STATE = 3 AND NOT EXISTS(SELECT 1 FROM TRAUTH TR WHERE TR.DOCUMENTID = D.ID)
    INTO DOCID
    DO
    BEGIN
         --    11  12, -   
      FOR
        SELECT WARECODE, WAREMARK, TRANZTYPE, QUANTITY,
        ASPECTSCHEME, ASPECTVALUE1, ASPECTVALUE2, ASPECTVALUE3, ASPECTVALUE4, ASPECTVALUE5
        FROM TRANZT T
        LEFT JOIN SPRT S ON S.CODE = T.WARECODE
        WHERE TRANZTYPE IN (11,12) AND T.DOCUMENTID = :DOCID
      INTO WARECODE, WAREMARK, TRANZTYPE, QUANTITY, ASPSCHEMECODE, ASPVAL1, ASPVAL2, ASPVAL3, ASPVAL4, ASPVAL5
      DO
      BEGIN
        WAREID = NULL;
        FLAGS = NULL;
           --  ID    
        IF (AWARECODETOMARK = 0) THEN
        BEGIN
          SELECT ID, FLAGS
          FROM SPRT
          WHERE CODE = :WARECODE
          INTO WAREID, FLAGS;
        END
        ELSE
        BEGIN
          SELECT FIRST 1 ID, FLAGS
          FROM SPRT
          WHERE MARK = :WAREMARK
          INTO :WAREID, :FLAGS;
        END
        --          ,  -
        IF (:ACONTROLSALEREMAIN = 1 OR :ACONTROLSALEREMAIN = 2 AND :FLAGS/64 <> (:FLAGS/32)/2.0) THEN
        BEGIN
          ASPSCHEMEID = NULL;
          SELECT ID
          FROM ASPSCHM
          WHERE CODE = :ASPSCHEMECODE
          INTO :ASPSCHEMEID;

          REMAINID = NULL;
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL1 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 1)) AND
          R.ASPECTVALUE2ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL2 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 2)) AND
          R.ASPECTVALUE3ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL3 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 3)) AND
          R.ASPECTVALUE4ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL4 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 4)) AND
          R.ASPECTVALUE5ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL5 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 5)) AND
          R.WAREID = :WAREID AND
          R.USEREMAIN = 1
          INTO
          REMAINID;

          IF (:REMAINID IS NULL) THEN
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = 0 AND
          R.ASPECTVALUE2ID = 0 AND
          R.ASPECTVALUE3ID = 0 AND
          R.ASPECTVALUE4ID = 0 AND
          R.ASPECTVALUE5ID = 0 AND
          R.WAREID = :WAREID
          INTO
          REMAINID;

          IF (:REMAINID IS NOT NULL) THEN
          INSERT INTO REMAIND (
           ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
          VALUES (
           GEN_ID(GREMAIND, 1), :REMAINID, -:QUANTITY, :DOCID, 0);
        END
      END

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID AND TRANZTYPE = 54
        INTO TMPID
        DO
          UPDATE TRANZT T SET
            TRANZDATE = :ATRANZDATE,
            TRANZHOUR = :ATRANZHOUR,
            TRANZTIME = :ATRANZTIME,
            TRANZTYPE = 56,
            T.SELLER = :USERCODE
          WHERE ID = :TMPID;

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID
        ORDER BY ID
        INTO TRID
        DO
        BEGIN
          UPDATE TRANZT SET
            TRANZCOUNT = :TRANZCOUNT
          WHERE ID = :TRID;
          TRANZCOUNT = TRANZCOUNT + 1;
        END

      DELETE FROM COUNTERD CD WHERE CD.DOCUMENTID = :DOCID;
      UPDATE DOCUMENT D SET
        STATE = 2,
        CLOSEDATE = :ATRANZDATE,
        CLOSETIME = :ATRANZTIME,
        CLOSEUSERID = :ASELLERID,
        SAVED = :ASAVED
      WHERE ID = :DOCID;
    END
END
^

SET TERM ; ^

ALTER TABLE ACTDISCOBJ ALTER COLUMN ID POSITION 1;

ALTER TABLE ACTDISCOBJ ALTER COLUMN CLIENTID POSITION 2;

ALTER TABLE ACTDISCOBJ ALTER COLUMN WAREID POSITION 3;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE1ID POSITION 4;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE2ID POSITION 5;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE3ID POSITION 6;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE4ID POSITION 7;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE5ID POSITION 8;

ALTER TABLE ACTDISCOBJ ALTER COLUMN PAYMENTID POSITION 9;

ALTER TABLE ACTDISCOBJ ALTER COLUMN DISCRATEID POSITION 10;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ACTSCRIPTID POSITION 11;

ALTER TABLE ACTDISCOBJ ALTER COLUMN GRPACTDISCID POSITION 12;

ALTER TABLE ACTDISCOBJ ALTER COLUMN CARDID POSITION 13;

ALTER TABLE ACTDISCOBJ ALTER COLUMN CHNG POSITION 14;

ALTER TABLE ACTDISCOBJ ALTER COLUMN BDOCODE POSITION 15;

ALTER TABLE ACTDISCOBJ ALTER COLUMN CODE POSITION 16;

ALTER TABLE ACTDISCOBJ ALTER COLUMN OWNERBDO POSITION 17;

ALTER TABLE ACTDISCOBJ ALTER COLUMN INSCHNG POSITION 18;

ALTER TABLE ACTDISCOBJ ALTER COLUMN DELETED POSITION 19;

/* DROP: -- GRANT SELECT ON RDB$ROLES TO PUBLIC */
REVOKE SELECT ON RDB$ROLES FROM PUBLIC;

/* Create(Add) Crant */
GRANT ALL ON CCARDCOUNTER TO PUBLIC;

GRANT ALL ON CLIENTCARD TO PUBLIC;

GRANT ALL ON CLIENTCOUNTER TO PUBLIC;

GRANT ALL ON CUSTOMDB TO PUBLIC;

GRANT ALL ON DELQUEUE TO PUBLIC;

GRANT ALL ON DOCUMENT TO PUBLIC;

GRANT ALL ON HALL TO PUBLIC;

GRANT ALL ON HALLPLACE TO PUBLIC;

GRANT ALL ON IDCOR TO PUBLIC;

GRANT ALL ON SYNCBASE TO PUBLIC;

GRANT ALL ON SYNCSRV TO PUBLIC;

GRANT ALL ON SYNCTABLE TO PUBLIC;

GRANT ALL ON TBLINFO TO PUBLIC;

GRANT ALL ON TBLLOADINFO TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPEND_DELQUEUE TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPEND_SUPERMAG_DISC TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPENDCCARDDISCS TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPENDCLIENT TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPENDCOUNTERBYTYPE TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPENDPILOT TO PUBLIC;

GRANT EXECUTE ON PROCEDURE APPENDWAREPARAMS TO PUBLIC;

GRANT EXECUTE ON PROCEDURE CANCELSTORED TO PUBLIC;

GRANT EXECUTE ON PROCEDURE CLEAR_ALL_GARBAGE TO PUBLIC;

GRANT EXECUTE ON PROCEDURE DEL_WARE TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_BDO_SYNC_STATE TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_BDO_SYNCINFO TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_CLIENT_CHILDREN TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_CLIENT_HIER TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_DEVICES_CHILDREN TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_DEVICES_HIER TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_DISCRATE_CHILDREN TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_DISCRATE_HIER TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_OWNERBDO_BYSYNCBASECATEG TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_SPRT_CHILDREN TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_SYNCBASE_ADDRECORD TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_SYNCBASE_CHILDREN TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_SYNCBASE_PARENTS TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_TRANZCOUNT TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_WARE_CHILDREN TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_WARE_HIER TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GETHALLPLACES TO PUBLIC;

GRANT EXECUTE ON PROCEDURE INITDISCSUPERMAG TO PUBLIC;

GRANT EXECUTE ON PROCEDURE MERGE_IDCOR TO PUBLIC;

GRANT EXECUTE ON PROCEDURE MERGE_SECURITY TO PUBLIC;

GRANT EXECUTE ON PROCEDURE MERGE_SYNCTABLE TO PUBLIC;

GRANT EXECUTE ON PROCEDURE MERGE_TBLINFO TO PUBLIC;

GRANT EXECUTE ON PROCEDURE MERGE_TBLLOADINFO TO PUBLIC;

GRANT EXECUTE ON PROCEDURE SENDEVENT TO PUBLIC;

GRANT EXECUTE ON PROCEDURE SYNC_CASHBOXDEV TO PUBLIC;

GRANT EXECUTE ON PROCEDURE SYNC_CONDITION TO PUBLIC;

GRANT EXECUTE ON PROCEDURE SYNC_PAYCARDDEV TO PUBLIC;

GRANT EXECUTE ON PROCEDURE SYNC_RCPPRNDEV TO PUBLIC;

GRANT EXECUTE ON PROCEDURE SYNC_TERMDEV TO PUBLIC;

GRANT EXECUTE ON PROCEDURE TABLECATEG TO PUBLIC;

GRANT EXECUTE ON PROCEDURE UPDATE_DBIDENT_GLOBAL TO PUBLIC;

GRANT EXECUTE ON PROCEDURE UPDATEMONEYBOX TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$BACKUP_HISTORY TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$CHARACTER_SETS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$CHECK_CONSTRAINTS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$COLLATIONS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$DATABASE TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$DEPENDENCIES TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$EXCEPTIONS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$FIELD_DIMENSIONS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$FIELDS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$FILES TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$FILTERS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$FORMATS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$FUNCTION_ARGUMENTS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$FUNCTIONS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$GENERATORS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$INDEX_SEGMENTS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$INDICES TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$LOG_FILES TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$PAGES TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$PROCEDURE_PARAMETERS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$PROCEDURES TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$REF_CONSTRAINTS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$RELATION_CONSTRAINTS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$RELATION_FIELDS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$RELATIONS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$ROLES TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$SECURITY_CLASSES TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$TRANSACTIONS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$TRIGGER_MESSAGES TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$TRIGGERS TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$TYPES TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$USER_PRIVILEGES TO PUBLIC;

GRANT SELECT, REFERENCES ON RDB$VIEW_RELATIONS TO PUBLIC;

/* TEXT BLOCK END */

/* Convert 4.7.2 */

ALTER TABLE ACTDISC DROP CONSTRAINT UNQ_ACTDISC;

ALTER TABLE COUNTER ADD ISGLOBAL FLAG;

ALTER TABLE DOCUMENT ADD USERVALUES FBLOBTEXT;

ALTER TABLE TRANZT ADD ORDERPOS FINT;

/* Alter Field (Null / Not Null)... */
UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = 1 WHERE RDB$FIELD_NAME='CODE' AND RDB$RELATION_NAME='ACTDISCOBJ';

/* Alter Field (Null / Not Null)... */
UPDATE RDB$RELATION_FIELDS SET RDB$NULL_FLAG = 1 WHERE RDB$FIELD_NAME='DBIDENT' AND RDB$RELATION_NAME='CUSTOMDB';

ALTER TABLE TRANZT ALTER COLUMN INFOSTR TYPE FVARCHAR255;


/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE GET_DISCRATE_FOLDERS(INPUTGROUP_ID INTEGER)
 RETURNS(OID INTEGER)
 AS
 BEGIN SUSPEND; END
^


/* Create index... */
SET TERM ; ^

CREATE INDEX IDX_COUNTER_ISGLOBAL_ID ON COUNTER(ISGLOBAL, ID);


/* Create Unique... */
ALTER TABLE ACTDISC ADD CONSTRAINT UNQ_ACTDISC UNIQUE (GRPACTDISCID, CODE, DELETED)
USING DESC INDEX UNQ_ACTDISC;

/*  Empty APPENDPILOT for APPENDWARE(param list change)  */
SET TERM ^ ;

ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE VARCHAR(20),
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IWARECODETOMARK INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/*  Empty GET_ACTSCRIPT for GET_ACTSCRIPT_CUSTOM(param list change)  */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN SUSPEND; END
^

/*  Empty GET_DISCOUNT for GET_DISCOUNT_CUSTOM(param list change)  */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
ICARDLEN VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure APPENDWARE with new param-list */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure GET_ACTSCRIPT_CUSTOM with new param-list */
ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure GET_DISCOUNT_CUSTOM with new param-list */
ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN SUSPEND; END
^

/* Alter Procedure... */
/* Alter (APPEND_SUPERMAG_DISC) */
ALTER PROCEDURE APPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
declare variable grpactdiscid integer;
declare variable actdiscid integer;
declare variable del integer;
declare variable discrateid integer;
declare variable conditionid integer;
declare variable whereclause varchar(255);
declare variable actdiscobjid integer;
BEGIN

  IF (IGRPACTDISCCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IGRPACTDISCCODE
    INTO GRPACTDISCID;

    IF (GRPACTDISCID IS NULL) THEN
    BEGIN
      GRPACTDISCID = GEN_ID(GID, 1);
      INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
      VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
    END

    IF (IWAREID > 0) THEN
    BEGIN
      SELECT ID, DELETED
      FROM ACTDISCOBJ
      WHERE WAREID = :IWAREID AND GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1
      INTO ACTDISCOBJID, DEL;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), :IWAREID, -1, -1, -1, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :ACTDISCOBJID;
    END
    ELSE
    BEGIN
      SELECT ID, DELETED
      FROM ACTDISCOBJ
      WHERE GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1 AND WAREID = -1
      INTO ACTDISCOBJID, DEL;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), -1, -1, -1, -1, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :ACTDISCOBJID;
    END
  END
  ELSE
    GRPACTDISCID = IGRPACTDISCID;

  IF (IAPPENDTYPE = 0) THEN   -- DiscCli
    BEGIN
      WHERECLAUSE = '';

      IF (ICARDPREFIXBEG IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG = '''|| :ICARDPREFIXBEG ||'''';

      IF (ICARDPREFIXEND IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND = '''|| :ICARDPREFIXEND ||'''';

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.CONDITIONID
                          FROM CONDITION C LEFT JOIN ACTDISC A ON
                                           C.ID = A.CONDITIONID
                          WHERE A.GRPACTDISCID = '|| :GRPACTDISCID ||' AND
                                C.SUMMBEG IS NULL AND C.TIMEBEG IS NULL '|| WHERECLAUSE ||'
                          PLAN JOIN (C INDEX (IDX_C_CARDPRBEG,IDX_C_CARDPREND),A INDEX (FK_AD_CONDITION,FK_AD_GRPACTDISC))'
      INTO :ACTDISCID, :CONDITIONID;
    END
  ELSE
    IF (IAPPENDTYPE = 1) THEN   -- CliClass

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                       C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
            C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
            C.QUANTITYBEG IS NULL
      INTO ACTDISCID, CONDITIONID;

    ELSE
      IF (IAPPENDTYPE = 2) THEN   -- DiscSumm
        BEGIN

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.SUMMBEG = :ISUMMBEG AND
                C.TIMEBEG = :ITIMEBEG AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

          IF (IDELETECURRENT = 1) THEN
            IF (ACTDISCID IS NULL) THEN
              EXIT;
            ELSE
              BEGIN
                DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                EXIT;
              END
        END
      ELSE
        IF (IAPPENDTYPE = 3) THEN   -- DiscCard

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.QUANTITYBEG = :IQUANTITYBEG    AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

        ELSE
          IF (IAPPENDTYPE = 4) THEN   -- CliSumm

            SELECT FIRST 1 A.ID, A.CONDITIONID
            FROM CONDITION C LEFT JOIN ACTDISC A ON
                             C.ID = A.CONDITIONID
            WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                  C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                  C.SUMMBEG = :ISUMMBEG             AND
                  C.TIMEBEG IS NULL
            INTO ACTDISCID, CONDITIONID;

          ELSE
            IF (IAPPENDTYPE = 5) THEN  -- PluDisc  ClasDisc

              SELECT FIRST 1 A.ID, A.CONDITIONID
              FROM CONDITION C LEFT JOIN ACTDISC A ON
                               C.ID = A.CONDITIONID
              WHERE A.GRPACTDISCID  = :GRPACTDISCID
              INTO ACTDISCID, CONDITIONID;

            ELSE
              IF (IAPPENDTYPE = 6) THEN  -- DiscSum 
                BEGIN

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                        C.SUMMRECBEG = :ISUMMRECBEG      AND
                        C.TIMEBEG = :ITIMEBEG            AND
                        C.CARDPREFIXBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                  IF (IDELETECURRENT = 1) THEN
                    IF (ACTDISCID IS NULL) THEN
                      EXIT;
                    ELSE
                    BEGIN
                      DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                      EXIT;
                    END
                END
              ELSE
                IF (IAPPENDTYPE = 7) THEN  -- CliSum 

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                        C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                        C.SUMMRECBEG = :ISUMMRECBEG       AND
                        C.TIMEBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                ELSE
                  BEGIN
                    ERRORCODE = 90; --  IAPPENDTYPE
                    EXIT;
                  END

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, NULL, NULL, NULL, NULL, NULL, NULL,
                                    :IQUANTITYBEG, :IQUANTITYEND,  NULL, NULL, NULL, NULL,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,  NULL, NULL,
                                    :ITIMEBEG, :ITIMEEND, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, NULL, NULL,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      IF (ICODE IS NULL) THEN
      BEGIN
        SELECT FIRST 1 CODE
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        ORDER BY GRPACTDISCID DESC, CODE DESC
        INTO ICODE;

        IF (ICODE IS NULL) THEN
          ICODE = 1;
        ELSE
          ICODE = ICODE + 1;
      END

      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (GEN_ID(GID, 1), :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
       NAME = :INAME,
       CONDITIONID = :CONDITIONID,
       DISCRATEID = :DISCRATEID,
       DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPEND_WARE_DISC) */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TID INTEGER;
BEGIN

    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, '  ', '  ',
                                     :IDISCTYPE, :IDISCVALUE, NULL, NULL, '', NULL,
                                     0, 2, 0, NULL, NULL)
          RETURNING_VALUES ERRORCODE, TDISCRATEID;

    SELECT FIRST 1 A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL
    INTO TACTDISCOBJID;

    IF (TACTDISCOBJID IS NULL) THEN
      INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                               ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                               PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
      VALUES   (GEN_ID(GID, 1), :IWAREID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                -1, :TDISCRATEID, NULL, 0);
    ELSE
      BEGIN
        UPDATE ACTDISCOBJ SET
           DISCRATEID = :TDISCRATEID,
           DELETED = 0
        WHERE ID = :TACTDISCOBJID;

        FOR SELECT A.ID
        FROM ACTDISCOBJ A JOIN DISCRATE D ON
                        D.ID = A.DISCRATEID AND D.KIND = 2
        WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
              A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
              A.ASPECTVALUE1ID IS NULL AND
              A.ASPECTVALUE2ID IS NULL AND
              A.ASPECTVALUE3ID IS NULL AND
              A.ASPECTVALUE4ID IS NULL AND
              A.ASPECTVALUE5ID IS NULL AND
              A.ID <> :TACTDISCOBJID AND DELETED >= 0
        INTO TID
        DO
          UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :TID;
      END
END
^

/* Alter (APPENDCLIENT) */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,      CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE, BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,
                          WEB,     TELEPHONE, INN,      DOCUMENT, OKPO,  OKPD,     DELETED)

      VALUES (:CLIENTID, :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT,  :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE, :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,
              :IWEB,     :ITELEPHONE, :IINN,        :IDOCUMENT, :IOKPO, :IOKPD,     :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;
END
^

/* empty dependent procedure body */
/* Clear: APPENDCCARDDISCS for: APPENDCOUNTERBYTYPE */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPENDCLIENT for: APPENDCOUNTERBYTYPE */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPENDCOUNTERBYTYPE) */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER,
ICLIENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
declare variable countertypeid integer;
declare variable counterid integer;
declare variable cid integer;
declare variable countercode integer;
declare variable abdocode integer;
declare variable aownerbdo integer;
declare variable delta double precision;
BEGIN

  SELECT ID
  FROM COUNTERTYPE
  WHERE CODE = :ICOUNTERTYPE
  INTO :COUNTERTYPEID;

  SELECT BDOCODE, DBIDENT FROM CUSTOMDB INTO AOWNERBDO, ABDOCODE;

  IF (:COUNTERTYPEID IS NULL) THEN
  BEGIN
    ERRORCODE = 28;
    EXIT;
  END

  IF (ICARDID IS NOT NULL) THEN
  BEGIN
    CID = NULL;
    FOR
      SELECT C.ID
      FROM CCARDCOUNTER CC
      JOIN COUNTER C ON CC.COUNTERID = C.ID  AND C.COUNTERTYPEID = :COUNTERTYPEID
      WHERE CC.CCARDID = :ICARDID
      INTO :COUNTERID
    DO
    BEGIN
      SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE = 1 INTO :DELTA;
      IF (DELTA <> 0) THEN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

      SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE <> 1 INTO :DELTA;
      IF (DELTA <> 0) THEN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 2);

      IF (CID IS NULL) THEN
      BEGIN
        IF (NULLTONUM(ICOUNTERVAL) <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        UPDATE COUNTER SET
          DATECREATE = CURRENT_DATE + CURRENT_TIME,
          BDOCODE = :ABDOCODE
        WHERE ID = :COUNTERID;
      END
      CID = 0;
    END

    IF (:CID IS NULL) THEN
    BEGIN
      COUNTERID = GEN_ID(GID, 1);

      SELECT FIRST 1 CODE
      FROM COUNTER
      WHERE COUNTERTYPEID = :COUNTERTYPEID
      ORDER BY COUNTERTYPEID DESC, CODE DESC
      INTO COUNTERCODE;

      IF (COUNTERCODE IS NULL) THEN
        COUNTERCODE = 1;
      ELSE
        COUNTERCODE = COUNTERCODE + 1;

      INSERT INTO COUNTER(ID, CODE, COUNTERTYPEID, BDOCODE, OWNERBDO)
      VALUES (:COUNTERID, :COUNTERCODE, :COUNTERTYPEID, :ABDOCODE, :AOWNERBDO);

      IF (NULLTONUM(ICOUNTERVAL) <> 0) THEN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

      INSERT INTO CCARDCOUNTER(ID, CCARDID, COUNTERID, BDOCODE, OWNERBDO)
      VALUES (GEN_ID(GID, 1), :ICARDID, :COUNTERID, :ABDOCODE, :AOWNERBDO);
    END
  END
  ELSE
    IF (ICLIENTID IS NOT NULL) THEN
    BEGIN
      CID = NULL;
      FOR
        SELECT C.ID
        FROM COUNTER C
          JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
          JOIN CLIENTCOUNTER CC ON CC.COUNTERID = C.ID
        WHERE CT.CODE = :ICOUNTERTYPE  AND CC.CLIENTID = :ICLIENTID
        INTO :COUNTERID
      DO
      BEGIN
        SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE = 1 INTO :DELTA;
        IF (DELTA <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE <> 1 INTO :DELTA;
        IF (DELTA <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE,  :AOWNERBDO, 2);

        IF (CID IS NULL) THEN
        BEGIN
          IF (NULLTONUM(:ICOUNTERVAL) <> 0) THEN
            INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
            VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

          UPDATE COUNTER SET
            DATECREATE = CURRENT_DATE + CURRENT_TIME,
            BDOCODE = :ABDOCODE
          WHERE ID = :COUNTERID;
        END
        CID = 0;
      END

      IF (:CID IS NULL) THEN
      BEGIN
        COUNTERID = GEN_ID(GID, 1);

        SELECT FIRST 1 CODE
        FROM COUNTER
        WHERE COUNTERTYPEID = :COUNTERTYPEID
        ORDER BY COUNTERTYPEID DESC, CODE DESC
        INTO COUNTERCODE;

        IF (COUNTERCODE IS NULL) THEN
          COUNTERCODE = 1;
        ELSE
          COUNTERCODE = COUNTERCODE + 1;

        INSERT INTO COUNTER(ID, CODE, COUNTERTYPEID, BDOCODE, OWNERBDO)
        VALUES (:COUNTERID, :COUNTERCODE, :COUNTERTYPEID, :ABDOCODE, :AOWNERBDO);

        IF (NULLTONUM(:ICOUNTERVAL) <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        INSERT INTO CLIENTCOUNTER(ID, CLIENTID, COUNTERID, BDOCODE, OWNERBDO)
        VALUES (GEN_ID(GID, 1), :ICLIENTID, :COUNTERID, :ABDOCODE, :AOWNERBDO);
      END
    END
END
^

/* Alter (APPENDDEFAULTGRPDISC) */
ALTER PROCEDURE APPENDDEFAULTGRPDISC(ITYPE INTEGER,
ICODE INTEGER,
IWARE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE NEWID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE ADOID INTEGER;
DECLARE VARIABLE SETTING VARCHAR(100);
DECLARE VARIABLE TEMPID INTEGER;
DECLARE VARIABLE TEMPNAME VARCHAR(100);
BEGIN

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :ICODE
  INTO  NEWID;

  IF (NEWID IS NULL) THEN
    BEGIN
      ERRORCODE = 1; /*   */
      EXIT;
    END

  IF (ITYPE = 1) THEN
    SETTING = 'InternalDefaultSchmRecID';
  ELSE
    IF (IWARE = 0) THEN
      SETTING = 'InternalDefaultSchmFreeID';
    ELSE
      SETTING = 'InternalDefaultSchmCodeID';

  IF (ITYPE = 1)  THEN
    FOR SELECT VAL, NAME
    FROM SETTINGS
    WHERE ((NAME = 'InternalDefaultSchmFreeID') OR (NAME = 'InternalDefaultSchmCodeID')) AND
          (VAL = :NEWID) AND (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB))
    INTO TEMPID, TEMPNAME
    DO
      BEGIN
        DELETE FROM ACTDISCOBJ
        WHERE CLIENTID = -1 AND WAREID <= 0 AND CARDID = -1 AND
              PAYMENTID = -1 AND GRPACTDISCID = :TEMPID;

        EXECUTE PROCEDURE MERGE_SETTING(TEMPNAME, 0, NULL, NULL, 9);
      END
  ELSE
    FOR SELECT VAL
    FROM SETTINGS
    WHERE (NAME = 'InternalDefaultSchmRecID') AND (VAL = :NEWID) AND (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB))
    INTO TEMPID
    DO
      BEGIN
         DELETE FROM ACTDISCOBJ
            WHERE CLIENTID = -1 AND WAREID <= 0 AND CARDID = -1 AND
                  PAYMENTID = -1 AND GRPACTDISCID = :TEMPID;

         EXECUTE PROCEDURE MERGE_SETTING('InternalDefaultSchmRecID', 0, NULL, NULL, 9);
      END

  UPDATE ACTDISCOBJ SET
    GRPACTDISCID = :NEWID,
    DELETED = 0
  WHERE
    CLIENTID = -1 AND WAREID = :IWARE AND CARDID = -1 AND
    PAYMENTID = -1 AND GRPACTDISCID = (SELECT VAL FROM SETTINGS WHERE (NAME = :SETTING) AND (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB)));

  SELECT FIRST 1 ID, DELETED
  FROM ACTDISCOBJ
  WHERE CLIENTID = -1 AND WAREID = :IWARE AND
        CARDID = -1 AND PAYMENTID = -1 AND GRPACTDISCID = :NEWID
  INTO ADOID, DEL;

  IF (ADOID IS NULL) THEN
    INSERT INTO ACTDISCOBJ (ID, WAREID, CLIENTID, PAYMENTID, CARDID, GRPACTDISCID)
    VALUES (GEN_ID(GID, 1), :IWARE, -1, -1, -1, :NEWID);
  ELSE
    IF (DEL < 0) THEN
      UPDATE ACTDISCOBJ SET
        DELETED = 0
      WHERE ID = :ADOID;

  UPDATE DISCRATE DR SET
    DR.DESTINATION = :ITYPE
  WHERE DR.ID IN (select AD.DISCRATEID from ACTDISC AD where AD.GRPACTDISCID = :NEWID);

  EXECUTE PROCEDURE MERGE_SETTING(SETTING, NEWID, NULL, NULL, 9);

END
^

ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
DECLARE VARIABLE TISWARE INTEGER;
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TDELETED INTEGER;
DECLARE VARIABLE TDELETEDISWARE INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE HIERLEVEL INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE BARC VARCHAR(40);
BEGIN
  ERRORCODE = 0;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      IF (IEXCHANGEFORMAT <> 1) THEN
        BEGIN
          ERRORCODE = 8;
          EXIT;
        END
      ELSE
        IFIRSTASPECTVALUE = 0;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  HIERLEVEL = 0;
  IF (IPARENTCODE <> '') then
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (CODE = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (MARK = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
  END
  ELSE
    PARENTID = 0;
  HIERLEVEL = HIERLEVEL + 1;

  IF (IISWARE <> 1) THEN
    BEGIN
      IISWARE = -2147483647 + HIERLEVEL;
    END

  IF ((PARENTID IS NULL) OR (TISWARE > 0)) THEN
  BEGIN
    ERRORCODE = 2;
    EXIT;
  END

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  TISWARE = NULL;

  IF (IWARECODETOMARK = 0) THEN
  begin
    SELECT ID, ISWARE, DELETED
    FROM SPRT
    WHERE CODE = :ICODE
    INTO TID, TISWARE, TDELETEDISWARE;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, DELETED, ISWARE, DELETED
    FROM SPRT
    WHERE MARK = :IMARK
    INTO TID, TDELETED, TISWARE, TDELETEDISWARE;
  END

  IF ((((TISWARE > 0) AND (IISWARE <= 0)) OR
       ((TISWARE <= 0) AND (IISWARE > 0))) AND (TDELETEDISWARE >= IDELETED)) then
    EXCEPTION E_CANT_CHANGE_ISWARE;

  IF (TID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO SPRT (ID, PARENTID, CODE, MARK, NAME, TEXT, HIERLEVEL,
      MINPRICE, ECRDEVID, TAXGROUPID, RCPPRNDEVID,
      ASPECTSCHEMEID, PRICELABELID,
      MAXDISCOUNT, ISWARE, PRICE, FLAGS, LIFE, SERIES,
      CERTIFICAT, SCALELPDEVID, SCALELPWARECODE, ASPECTTYPE, QUANTITYPREC,
      SCALELPLOADED, PRICELBPRINTED, DELETED, DESCRIPTION, PICTURE, REWARDTYPE, REWARDVAL,
      ECRDEPARTMENT)
    VALUES (:ID, :PARENTID, :ICODE, :IMARK, :INAME, :ITEXT, :HIERLEVEL,
      :IMINPRICE, :ECRDEVID, :TAXGROUPID, :RCPPRNDEVID,
      :ASPECTSCHEMEID, :PRICELABELID,
      :IMAXDISCOUNT, :IISWARE, :IPRICE, :IFLAGS, :ILIFE, :ISERIES,
      :ICERTIFICAT, :SCALELPDEVID, :ISCALELPWARECODE, :IASPECTTYPE, :IQUANTITYPREC,
      :ISCALELPLOADED, :IPRICELBPRINTED, :IDELETED, :IDESCRIPTION, :IPICTURE, :IREWARDTYPE, :IREWARDVAL,
      :IECRDEPARTMENT);
    INCREMENTCODE = 1;
  END
  ELSE
  BEGIN
    ID = TID;
    IF (TDELETED = IDELETED) THEN
      UPDATE SPRT SET
        ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
        ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
        CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
                                           PRICELABELID = :PRICELABELID,
        DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
        DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
        ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
        ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
        FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
        HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
        ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
        LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
        MARK = :IMARK,                     SERIES = :ISERIES,
        MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
        MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
        NAME = :INAME
      WHERE ID = :ID;
    ELSE
      BEGIN
        UPDATE SPRT SET
          ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
          ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
          CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
          CODE = :ICODE,                     PRICELABELID = :PRICELABELID,
          DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
          DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
          ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
          ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
          FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
          HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
          ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
          LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
          MARK = :IMARK,                     SERIES = :ISERIES,
          MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
          MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
          NAME = :INAME
        WHERE ID = :ID;
        INCREMENTCODE = 1;
      END
  END

  IF (IISWARE = 1) THEN
  BEGIN
    EXECUTE PROCEDURE APPENDREMAINBYWAREID (:ID, :IFIRSTASPECTVALUE, :ASPECTSCHEMEID, :IREMAIN, :IDELETEDREMAIN, :IDELETEDASPECT, :IADDREPLACE)
      RETURNING_VALUES ERRORCODE;

    IF (ERRORCODE > 0) THEN
      EXIT;

    WHILE (IBARCODES <> '') DO
    BEGIN
      BARC = EXTRACTSTR(IBARCODES, ',');

      EXECUTE PROCEDURE APPENDBARCODEBYWAREID (:BARC, :ID, 0, 0, 0, 0, 0, :IFACTOR, 0, :IDELETEDBARCODE)
        RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;

      IBARCODES = PCOPY(IBARCODES, LEN(BARC) + 1, LEN(IBARCODES) - LEN(BARC) - 1);
    END
  END

  IF (ILOADWAREDISC = 1 AND IDISCOUNTVALUE <> '0' AND IDISCOUNTVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPEND_WARE_DISC(:ID, :IDISCOUNTTYPE, :IDISCOUNTVALUE, :IDISCRATEPARENTID)
            RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;
    END

  IF (ILOADWAREDISC = 1 AND TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :ID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID,
          DELETED = 0
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :ID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
END
^

/* Alter (APPENDPILOT) */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE VARCHAR(20),
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IWARECODETOMARK INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE SPRTCODE INTEGER;
DECLARE VARIABLE SPRTMARK VARCHAR(20);
DECLARE VARIABLE DORMANTVAR INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IWARECODETOMARK = 0) THEN
        BEGIN
          SPRTCODE = :ICODE;
          SPRTMARK = '';
        END
      ELSE
        BEGIN
          SPRTCODE = :ICODE;
          SPRTMARK = :ICODE;
        END

      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:SPRTCODE, NULL, :INAME, :INAME, :SPRTMARK, NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, :IWARECODETOMARK, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            IF (IWARECODETOMARK = 0) THEN
              BEGIN
                SELECT ID
                FROM SPRT
                WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
                INTO MAINID;
              END
            ELSE
              BEGIN
                SELECT FIRST 1 ID
                FROM SPRT
                WHERE MARK = :ICODE AND DELETED = :DELETEDSPRT
                INTO MAINID;
              END
            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:SPRTCODE, NULL, :INAME, :INAME, :SPRTMARK, NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, :IWARECODETOMARK, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:SPRTCODE, NULL, :INAME, :INAME, :SPRTMARK, NULL, NULL, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, :IWARECODETOMARK, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

/* Alter (APPENDREMAIN) */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE WARENAME VARCHAR(100);
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCCODE INTEGER;
DECLARE VARIABLE USEREMAIN INTEGER;
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
      BEGIN
        IF (ASPCODE = 1)  THEN
          IF (IASPV1 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
            INTO AD1;
          ELSE
          BEGIN
            ERRORCODE = 10;
            EXIT;
          END

        IF (ASPCODE = 2)  THEN
          IF (IASPV2 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
            INTO AD2;
          ELSE
          BEGIN
            ERRORCODE = 11;
            EXIT;
          END

        IF (ASPCODE = 3)  THEN
          IF (IASPV3 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
            INTO AD3;
          ELSE
          BEGIN
            ERRORCODE = 12;
            EXIT;
          END

        IF (ASPCODE = 4)  THEN
          IF (IASPV4 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
            INTO AD4;
          ELSE
          BEGIN
            ERRORCODE = 13;
            EXIT;
          END

        IF (ASPCODE = 5)  THEN
          IF (IASPV5 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
            INTO AD5;
          ELSE
          BEGIN
            ERRORCODE = 14;
            EXIT;
          END
      END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR
(AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    REMAINID = GEN_ID(GID, 1);

    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, PRICE,
       DELETED, USEREMAIN)
    VALUES
      (:REMAINID, :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5,
      :IPRICE, :IDELETED, :USEREMAIN);

    IF (NOT :IREMAIN IS NULL) THEN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE <> 1) THEN
    BEGIN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 1;

      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;
    END

    UPDATE REMAIN SET
      PRICE = :IPRICE,
      DELETED = :IDELETED
    WHERE ID = :REMAINID;

    IF (NOT :IREMAIN IS NULL) THEN
    BEGIN
      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
     END

    IF (IADDREPLACE = 2) THEN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 0;
  END

  IF ((ILOADWAREDISC = 1) AND NOT IDISCOUNTVALUE IS NULL AND IDISCOUNTVALUE <> '0' AND IDISCOUNTVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       0, 2, 0, NULL, NULL)
            RETURNING_VALUES ERRORCODE, TDISCRATEID;

      WHERECLAUSE = '';

      IF (AD1 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
      ELSE
      BEGIN
        AD1 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID IS NULL ';
      END

      IF (AD2 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
      ELSE
      BEGIN
        AD2 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID IS NULL ';
      END

      IF (AD3 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
      ELSE
      BEGIN
        AD3 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID IS NULL ';
      END

      IF (AD4 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
      ELSE
      BEGIN
        AD4 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID IS NULL ';
      END

     IF (AD5 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
      ELSE
      BEGIN
        AD5 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID IS NULL ';
      END

      IF (IUSEGRPACTDISC <> 0) THEN
      BEGIN

        SELECT ID
        FROM GRPACTDISC
        WHERE CODE = :IGRPACTDISCCODE
        INTO :GRPACTDISCID;

        IF (GRPACTDISCID IS NULL) THEN
        BEGIN
          GRPACTDISCID = GEN_ID(GID, 1);
          INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
          VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
        END

        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.DELETED ' ||
                          ' FROM ACTDISCOBJ A JOIN GRPACTDISC G ON ' ||
                                          ' G.ID = A.GRPACTDISCID AND G.ID = '|| :GRPACTDISCID ||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '      A.PAYMENTID = -1 AND A.CARDID = -1 '|| WHERECLAUSE
        INTO TACTDISCOBJID, DEL;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, NULL, NULL, :GRPACTDISCID);
        ELSE
          IF (DEL < 0) THEN
            UPDATE ACTDISCOBJ SET
              DELETED = 0
            WHERE ID = :TACTDISCOBJID;

        SELECT FIRST 1 A.ID, A.CONDITIONID
        FROM CONDITION C LEFT JOIN ACTDISC A ON
                         C.ID = A.CONDITIONID
        WHERE A.GRPACTDISCID  = :GRPACTDISCID
        INTO ACTDISCID, CONDITIONID;

        EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL,
                                          NULL, NULL,  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  NULL, NULL,
                                          NULL, NULL, NULL, NULL)
        RETURNING_VALUES ERRORCODE, CONDITIONID;

       IF (ACTDISCID IS NULL) THEN
       BEGIN
         SELECT NULLTONUM(MAX(CODE)) + 1
         FROM ACTDISC
         WHERE GRPACTDISCID  = :GRPACTDISCID
         INTO ACTDISCCODE;

         INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                              CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
         VALUES     (GEN_ID(GID, 1), :ACTDISCCODE, :GRPACTDISCID, :WARENAME,
                    :CONDITIONID, :TDISCRATEID, NULL, 0, :IDELETEDACTDISC);
       END
       ELSE
         UPDATE ACTDISC SET
            NAME = :WARENAME,
            CONDITIONID = :CONDITIONID,
            DISCRATEID = :TDISCRATEID,
            DELETED = :IDELETEDACTDISC
         WHERE ID = :ACTDISCID;
      END
      ELSE
      BEGIN
        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID ' ||
                          ' FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                          ' D.ID = A.DISCRATEID AND D.KIND = 2 '||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '       A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
        INTO TACTDISCOBJID;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, :TDISCRATEID, NULL, NULL);
        ELSE
          UPDATE ACTDISCOBJ SET
             DISCRATEID = :TDISCRATEID,
             DELETED = 0
          WHERE ID = :TACTDISCOBJID;
      END
    END
END
^

/* Alter (APPENDWAREPARAMS) */
ALTER PROCEDURE APPENDWAREPARAMS(ICODE VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IASPECTSCHEMECODE INTEGER,
IASPECTTYPE INTEGER,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IPRICELABEL INTEGER,
IDELETED INTEGER,
IWARECODETOMARK INTEGER,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE UPDATESTR VARCHAR(255);
BEGIN

  ERRORCODE = 0;
  UPDATESTR = '';

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID
    FROM SPRT
    WHERE CODE = :ICODE AND DELETED = :IDELETED
    INTO TID;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID
    FROM SPRT
    WHERE MARK = :ICODE AND DELETED = :IDELETED
    INTO TID;
  END

  IF (TID IS NULL) THEN
    EXIT;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      ERRORCODE = 8;
      EXIT;
    END
  END
  ELSE ASPECTSCHEMEID = 0;

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
     PRICELABELID = NULL;

  UPDATE SPRT SET
      ASPECTSCHEMEID =  CASE WHEN (:IASPECTSCHEMECODE IS NULL) THEN ASPECTSCHEMEID  ELSE :ASPECTSCHEMEID   END,
      ASPECTTYPE =      CASE WHEN (:IASPECTTYPE IS NULL)       THEN ASPECTTYPE      ELSE :IASPECTTYPE      END,
      ECRDEVID =        CASE WHEN (:IECRDEVCODE IS NULL)       THEN ECRDEVID        ELSE :ECRDEVID         END,
      TAXGROUPID =      CASE WHEN (:ITAXGROUPCODE IS NULL)     THEN TAXGROUPID      ELSE :TAXGROUPID       END,
      SCALELPDEVID =    CASE WHEN (:ISCALELPDEVCODE IS NULL)   THEN SCALELPDEVID    ELSE :SCALELPDEVID     END,
      SCALELPWARECODE = CASE WHEN (:ISCALELPWARECODE IS NULL)  THEN SCALELPWARECODE ELSE :ISCALELPWARECODE END,
      RCPPRNDEVID =     CASE WHEN (:IRCPPRNDEVCODE IS NULL)    THEN RCPPRNDEVID     ELSE :RCPPRNDEVID      END,
      PRICELABELID =    CASE WHEN (:IPRICELABEL IS NULL)       THEN PRICELABELID    ELSE :PRICELABELID     END
  WHERE ID = :TID;       

  IF (ILOADWAREDISC = 1 AND TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :TID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID,
          DELETED = 0
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :TID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
  ELSE
    IF (IINTDISCSCHMCODE IS NOT NULL) THEN
      DELETE FROM ACTDISCOBJ
      WHERE WAREID = :TID AND CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1 AND DISCRATEID IS NULL AND GRPACTDISCID > 0;
END
^

/* Alter (CANCELSTORED) */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 AS
declare variable tranzcount integer;
declare variable rmkid integer;
declare variable docid numeric(18,0);
declare variable warecode integer;
declare variable waremark varchar(100);
declare variable tranztype integer;
declare variable quantity integer;
declare variable aspschemecode integer;
declare variable aspschemeid integer;
declare variable aspval1 integer;
declare variable aspval2 integer;
declare variable aspval3 integer;
declare variable aspval4 integer;
declare variable aspval5 integer;
declare variable remainid integer;
declare variable wareid integer;
declare variable flags integer;
declare variable trid numeric(18,0);
declare variable usercode integer;
declare variable tmpid numeric(18,0);
BEGIN
  SELECT ID
  FROM RMK R
  WHERE R.CODE = :APOSNUMBER
  INTO RMKID;

  SELECT CODE
  FROM "USER"
  WHERE ID = :ASELLERID
  INTO USERCODE;

  EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES TRANZCOUNT;

  FOR
    SELECT ID
    FROM DOCUMENT D
    WHERE D.RMKID = :RMKID AND D.STATE = 3
    AND NOT EXISTS(SELECT 1 FROM TRAUTH TR WHERE TR.DOCUMENTID = D.ID)
    AND NOT EXISTS(SELECT 1 FROM TRANZT T WHERE T.DOCUMENTID = D.ID AND T.TRANZTYPE IN (40,41))
    AND NOT EXISTS(SELECT 1 FROM DOCUMENT DT WHERE DT.ID = D.ID AND DT.ORDERIDENTIF IS NOT NULL AND DT.ORDERIDENTIF <> '')
    INTO DOCID
    DO
    BEGIN
         --    11  12, -   
      FOR
        SELECT WARECODE, WAREMARK, TRANZTYPE, QUANTITY,
        ASPECTSCHEME, ASPECTVALUE1, ASPECTVALUE2, ASPECTVALUE3, ASPECTVALUE4, ASPECTVALUE5
        FROM TRANZT T
        LEFT JOIN SPRT S ON S.CODE = T.WARECODE
        WHERE TRANZTYPE IN (11,12) AND T.DOCUMENTID = :DOCID
      INTO WARECODE, WAREMARK, TRANZTYPE, QUANTITY, ASPSCHEMECODE, ASPVAL1, ASPVAL2, ASPVAL3, ASPVAL4, ASPVAL5
      DO
      BEGIN
        WAREID = NULL;
        FLAGS = NULL;
           --  ID    
        IF (AWARECODETOMARK = 0) THEN
        BEGIN
          SELECT ID, FLAGS
          FROM SPRT
          WHERE CODE = :WARECODE
          INTO WAREID, FLAGS;
        END
        ELSE
        BEGIN
          SELECT FIRST 1 ID, FLAGS
          FROM SPRT
          WHERE MARK = :WAREMARK
          INTO :WAREID, :FLAGS;
        END
        --          ,  -
        IF (:ACONTROLSALEREMAIN = 1 OR :ACONTROLSALEREMAIN = 2 AND :FLAGS/64 <> (:FLAGS/32)/2.0) THEN
        BEGIN
          ASPSCHEMEID = NULL;
          SELECT ID
          FROM ASPSCHM
          WHERE CODE = :ASPSCHEMECODE
          INTO :ASPSCHEMEID;

          REMAINID = NULL;
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL1 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 1)) AND
          R.ASPECTVALUE2ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL2 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 2)) AND
          R.ASPECTVALUE3ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL3 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 3)) AND
          R.ASPECTVALUE4ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL4 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 4)) AND
          R.ASPECTVALUE5ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL5 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 5)) AND
          R.WAREID = :WAREID AND
          R.USEREMAIN = 1
          INTO
          REMAINID;

          IF (:REMAINID IS NULL) THEN
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = 0 AND
          R.ASPECTVALUE2ID = 0 AND
          R.ASPECTVALUE3ID = 0 AND
          R.ASPECTVALUE4ID = 0 AND
          R.ASPECTVALUE5ID = 0 AND
          R.WAREID = :WAREID
          INTO
          REMAINID;

          IF (:REMAINID IS NOT NULL) THEN
          INSERT INTO REMAIND (
           ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
          VALUES (
           GEN_ID(GREMAIND, 1), :REMAINID, -:QUANTITY, :DOCID, 0);
        END
      END

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID AND TRANZTYPE = 54
        INTO TMPID
        DO
          UPDATE TRANZT T SET
            TRANZDATE = :ATRANZDATE,
            TRANZHOUR = :ATRANZHOUR,
            TRANZTIME = :ATRANZTIME,
            TRANZTYPE = 56,
            T.SELLER = :USERCODE
          WHERE ID = :TMPID;

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID
        ORDER BY ID
        INTO TRID
        DO
        BEGIN
          UPDATE TRANZT SET
            TRANZCOUNT = :TRANZCOUNT
          WHERE ID = :TRID;
          TRANZCOUNT = TRANZCOUNT + 1;
        END

      DELETE FROM COUNTERD CD WHERE CD.DOCUMENTID = :DOCID;
      UPDATE DOCUMENT D SET
        STATE = 2,
        CLOSEDATE = :ATRANZDATE,
        CLOSETIME = :ATRANZTIME,
        CLOSEUSERID = :ASELLERID,
        SAVED = :ASAVED
      WHERE ID = :DOCID;
    END
END
^

ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
DECLARE VARIABLE CARD VARCHAR(255);
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
      AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
      AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND

      (
       NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                       AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:REGDATE,
                     AC.REGDATECOND,
                     AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                     AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

      (
       NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                       AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:MEMDATE,
                     AC.MEMDATECOND,
                     AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                     AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
      (
       NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                         AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:BIRTHDATE,
                     AC.BIRTHDATECOND,
                     AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                     AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

      (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
      (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
      (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
      (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
      (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
      (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)
    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC)))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    DO
      SUSPEND;

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = EXTRACTSTR(:ICARD, ',');
    CARDLEN = LEN(CARD);
    CARD = ADDRIGHT(CARD, 1, 40);

    FOR
      SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID,
        AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
        AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL AND CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
      WHERE
        ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND

        (
         NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                         AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:REGDATE,
                       AC.REGDATECOND,
                       AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                       AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

        (
         NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                         AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:MEMDATE,
                       AC.MEMDATECOND,
                       AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                       AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
        (
         NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                           AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:BIRTHDATE,
                       AC.BIRTHDATECOND,
                       AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                       AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

        (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
        (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
        (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
        (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
        (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
        (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
     PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC)))
     ORDER BY GD.CODE, AD.PRIORITY
     INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
     DO
        SUSPEND;
   ICARD = PCOPY(ICARD, CARDLEN + 1, LEN(ICARD) - CARDLEN - 1);
  END

  GRPCODE = NULL;
  PRIORITY = 0;
  WAREID = NULL;
  FORMULA1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  FORMULA2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  FORMULA3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTSCRIPT ACS ON ACS.ID = A.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
  INTO DATA, CODE
  DO
    SUSPEND;

END
^

/* Alter (GET_ACTSCRIPT) */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
BEGIN
  ID = 1;

  FOR
    SELECT  CODE, DATA, NULLTONUM(GRPCODE), NULLTONUM(PRIORITY), WAREID,
      SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,
      CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    FROM GET_ACTSCRIPT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
      :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,:IWEEKDAY,
      :IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,:ICARD,
      :IANYCARD,:ICARDSTATE,:IACTEVENT,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY, CODE
    INTO CODE, DATA, GRPCODE, PRIORITY,WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END
END
^

ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
declare variable cardlen integer;
declare variable sex integer;
declare variable regdate date;
declare variable memdate date;
declare variable birthdate date;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3, AR.CODE,
      (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID), AR.WAREID
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (
       NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                       AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:REGDATE,
                     AC.REGDATECOND,
                     AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                     AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

      (
       NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                       AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:MEMDATE,
                     AC.MEMDATECOND,
                     AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                     AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
      (
       NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                         AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:BIRTHDATE,
                     AC.BIRTHDATECOND,
                     AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                     AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

      (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
      (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
      (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
      (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
      (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
      (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)

      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC)))
-- OLD    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,DISCRATECODE,CARD, DISCRATEWAREID
    DO
      SUSPEND;

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = EXTRACTSTR(:ICARD, ',');
    CARDLEN = LEN(CARD);
    CARD = ADDRIGHT(CARD, 1, 40);

    FOR
      SELECT GD.CODE, AR.VAL, AC.WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
        QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID,AR.BEGVAL,AR.ENDVAL,
        AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3,AR.CODE, AR.WAREID
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL AND CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
      WHERE
        (
         NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                         AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:REGDATE,
                       AC.REGDATECOND,
                       AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                       AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

        (
         NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                         AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:MEMDATE,
                       AC.MEMDATECOND,
                       AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                       AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
        (
         NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                           AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:BIRTHDATE,
                       AC.BIRTHDATECOND,
                       AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                       AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

        (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
        (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
        (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
        (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
        (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
        (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND

        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC)))
-- OLD      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
      ORDER BY GD.CODE, AD.PRIORITY
      INTO GRPCODE, VAL, WAREID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,DISCRATECODE, DISCRATEWAREID
      DO
        SUSPEND;

   ICARD = PCOPY(ICARD, CARDLEN + 1, LEN(ICARD) - CARDLEN - 1);
  END

  GRPCODE = NULL;
  VAL = NULL;
  WAREID = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;
  "TYPE" = NULL;
  TEXT = NULL;
  CODE = NULL;
  CARDPREFIXBEG = NULL;
  CARDPREFIXEND = NULL;
  DEPENDOTHERPOS = NULL;
  BEGVAL = NULL;
  ENDVAL = NULL;
  FORMULA1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  FORMULA2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  FORMULA3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  PRIORITY = 0;
  CARD = NULL;

  FOR
    SELECT AR.VAL, AR.WAREID, AR."TYPE", AR.NAME, AR.TEXT,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AR.CODE, (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID)
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN DISCRATE AR ON AR.ID = A.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
--    PLAN SORT (JOIN (JOIN (AR NATURAL,A INDEX (IDX_ACTDISCOBJ2,FK_ADO_DISCRATE))))
  INTO VAL, DISCRATEWAREID,"TYPE",NAME, TEXT,PARENTID, BEGVAL, ENDVAL, DISCRATECODE, CARD
  DO
    SUSPEND;
END
^

/* Alter (GET_DISCOUNT) */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
BEGIN
  ID = 1;

  FOR
    SELECT NULLTONUM(GRPCODE), VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
           "TYPE", NAME, TEXT,
           CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, NULLTONUM(PRIORITY), PARENTID, BEGVAL, ENDVAL,
           FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
    FROM GET_DISCOUNT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
          :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,
          :IWEEKDAY,:IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,
          :ICARD,:IANYCARD,:ICARDSTATE,:IDESTINATION,
          :IKIND,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY
    INTO GRPCODE, VAL, WAREID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID, "TYPE", NAME, TEXT,
         CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, PRIORITY, PARENTID, BEGVAL, ENDVAL,
         FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END

END
^

/* Alter (GET_OPERDAY) */
ALTER PROCEDURE GET_OPERDAY(DATE1 DATE,
DATE2 DATE,
POSNUMBER INTEGER)
 RETURNS(TRANZ1 INTEGER,
TRANZ2 INTEGER)
 AS
DECLARE VARIABLE TMPC1 INTEGER;
DECLARE VARIABLE TMPT INTEGER;
DECLARE VARIABLE D1 DATE;
BEGIN

/*   " " -   , 
        (   )*/

  TRANZ1 = 0;
  TRANZ2 = 0;

  SELECT MIN(TRANZCOUNT)
  FROM TRANZT T
  WHERE T.POSNUMBER = :POSNUMBER
  INTO TMPC1;

  SELECT TRANZDATE
  FROM TRANZT T
  WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT = :TMPC1
  INTO  D1;

  IF (D1 >= DATE1) THEN
    TRANZ1 = TMPC1;
    ELSE
    BEGIN
      SELECT MIN(T.TRANZCOUNT)
      FROM TRANZT T, TRANZT TT, DOCUMENT D
      WHERE T.POSNUMBER = :POSNUMBER AND TT.POSNUMBER = :POSNUMBER AND
        T.TRANZCOUNT = TT.TRANZCOUNT + 1 AND TT.TRANZTYPE = 61 AND
        D.ID = T.DOCUMENTID AND D.STATE IN (1, 2) AND
        D.CLOSEDATE BETWEEN :DATE1 AND :DATE2
      INTO TRANZ1;
    END

  IF (TRANZ1 IS NULL) THEN
    EXIT;

  TMPC1 = NULL;
  SELECT MAX(TRANZCOUNT)
  FROM TRANZT T, DOCUMENT D
  WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT >= :TRANZ1 AND D.ID = T.DOCUMENTID AND
    D.CLOSEDATE <= :DATE2 AND D.STATE IN (1, 2)
  INTO TMPC1;

  SELECT TRANZTYPE
  FROM   TRANZT T
  WHERE  T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT = :TMPC1
  INTO   TMPT;

  IF (TMPT = 61) THEN
    TRANZ2 = TMPC1;
    ELSE
    BEGIN
      TRANZ2 = NULL;
      SELECT MIN(TRANZCOUNT)
      FROM TRANZT T
      WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT > :TMPC1 AND
        T.TRANZTYPE = 61
      INTO TRANZ2;

      IF (TRANZ2 IS NULL) THEN
        SELECT MAX(TRANZCOUNT)
        FROM TRANZT T
        WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT < :TMPC1 AND
          T.TRANZTYPE = 61
        INTO TRANZ2;
    END
END
^

/* Alter (GET_OWNERBDO_BYSYNCBASECATEG) */
ALTER PROCEDURE GET_OWNERBDO_BYSYNCBASECATEG(ICATEG INTEGER,
ISYNCBASECODE INTEGER)
 RETURNS(OWNERBDOCODE INTEGER)
 AS
DECLARE VARIABLE DBID INTEGER;
DECLARE VARIABLE DBCODE INTEGER;
DECLARE VARIABLE ASYNCBASEID INTEGER;
DECLARE VARIABLE TMPID INTEGER;
DECLARE VARIABLE ASYNCKIND INTEGER;
DECLARE VARIABLE ACODE INTEGER;
BEGIN
  SELECT ID
  FROM SYNCBASE
  WHERE CODE = :ISYNCBASECODE
  INTO :ASYNCBASEID;

  SELECT CT.BDOCODE, SB.ID
  FROM CUSTOMDB CT
    JOIN SYNCBASE SB ON SB.CODE = CT.BDOCODE
  INTO DBCODE, DBID;

  FOR SELECT SB.CODE, ST.SYNCKIND, SB.ID
  FROM GET_SYNCBASE_PARENTS(:ASYNCBASEID, 0) G
    JOIN SYNCBASE SB ON
      SB.ID = G.ID_PARENT
    LEFT JOIN SYNCTABLE ST ON
      ST.SYNCBASEID = SB.PARENTID AND ST.CATEG = :ICATEG
  ORDER BY G.NUM
  INTO ACODE, ASYNCKIND, TMPID
  DO
    IF ((ACODE = DBCODE) OR
      ((ASYNCKIND = 1) AND (NOT EXISTS(SELECT 1
                                          FROM GET_SYNCBASE_PARENTS(:TMPID, 0, :DBID) G
                                            JOIN SYNCBASE SB ON
                                              SB.ID = G.ID_PARENT
                                            JOIN SYNCTABLE ST ON
                                              ST.SYNCBASEID = SB.PARENTID AND ST.SYNCKIND = 0
                                          WHERE ST.CATEG = :ICATEG)))) THEN
      BEGIN
        OWNERBDOCODE = ACODE;
        SUSPEND;
        EXIT;
      END
END
^

/* Alter (INITDISCSUPERMAG) */
ALTER PROCEDURE INITDISCSUPERMAG(IFORWARE INTEGER,
IDESTINATION INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  FOR SELECT DISTINCT GAD.ID
  FROM GRPACTDISC GAD JOIN ACTDISC A ON
                        A.GRPACTDISCID = GAD.ID
                      JOIN DISCRATE D ON
                        D.ID = A.DISCRATEID
                      JOIN ACTDISCOBJ ADO ON
                        ADO.GRPACTDISCID = GAD.ID AND
                        ADO.CLIENTID = -1 AND ADO.PAYMENTID = -1 AND
                        ADO.CARDID = -1
  WHERE  D.DESTINATION = :IDESTINATION AND ((:IFORWARE = 0 AND ADO.WAREID = -1) OR (:IFORWARE = 1 AND ADO.WAREID > 0))
  INTO ID
  DO
    BEGIN
      UPDATE ACTDISCOBJ SET DELETED = -1 WHERE GRPACTDISCID = :ID;
      UPDATE ACTDISC SET DELETED = -1 WHERE GRPACTDISCID = :ID;
      UPDATE GRPACTDISC SET DELETED = - 1 WHERE ID = :ID;
    END
END
^

/* Alter (UPDATE_ALL_REMAIN) */
ALTER PROCEDURE UPDATE_ALL_REMAIN AS
DECLARE VARIABLE VREMAINID INTEGER;
DECLARE VARIABLE VOLDREMAINID INTEGER;
DECLARE VARIABLE VID INTEGER;
DECLARE VARIABLE RID NUMERIC(18);
DECLARE VARIABLE VDELTA DOUBLE PRECISION;
DECLARE VARIABLE VSUMDELTA DOUBLE PRECISION;
BEGIN
  VOLDREMAINID = -1;
  VSUMDELTA = 0;
  SELECT GEN_ID(GREMAIND, 0) FROM RDB$DATABASE INTO :RID;
  FOR
    SELECT R.ID, R.REMAINID, R.DELTA
    FROM REMAIND R
    LEFT JOIN DOCUMENT D ON R.DOCUMENTID = D.ID
    WHERE ((R.DOCUMENTID IS NULL) OR (D.STATE = 1) OR (D.STATE = 2)) AND R.ID <= :RID
    ORDER BY REMAINID
    INTO :VID, :VREMAINID, :VDELTA
  DO
  BEGIN
    IF (VREMAINID <> VOLDREMAINID) THEN
    BEGIN
      IF (VSUMDELTA <> 0) THEN
        INSERT INTO REMAIND (ID, DELTA, DTYPE, REMAINID) VALUES (GEN_ID(GREMAIND, 1), :VSUMDELTA, 1, :VOLDREMAINID);
      VOLDREMAINID = :VREMAINID;
      VSUMDELTA = 0;
    END
    VSUMDELTA = :VSUMDELTA + :VDELTA;
    DELETE FROM REMAIND WHERE ID = :VID;
  END
  IF (VSUMDELTA <> 0) THEN
    INSERT INTO REMAIND (ID, DELTA, DTYPE, REMAINID) VALUES (GEN_ID(GREMAIND, 1), :VSUMDELTA, 1, :VOLDREMAINID);
END
^

/* Restore proc. body: APPENDCCARDDISCS */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE DOCODE INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;
        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;
END
^

/* Restore proc. body: APPENDCLIENT */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,      CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE, BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,
                          WEB,     TELEPHONE, INN,      DOCUMENT, OKPO,  OKPD,     DELETED)

      VALUES (:CLIENTID, :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT,  :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE, :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,
              :IWEB,     :ITELEPHONE, :IINN,        :IDOCUMENT, :IOKPO, :IOKPD,     :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;
END
^

/* Restore proc. body: GET_DISCRATE_FOLDERS */
ALTER PROCEDURE GET_DISCRATE_FOLDERS(INPUTGROUP_ID INTEGER)
 RETURNS(OID INTEGER)
 AS
BEGIN
  FOR
  SELECT ID FROM DISCRATE
  WHERE PARENTID = :INPUTGROUP_ID AND ISFOLDER = 1
  ORDER BY ISFOLDER DESC, CODE
  INTO OID
  DO
  BEGIN
    SUSPEND;
    FOR
      SELECT OID FROM GET_DISCRATE_FOLDERS(:OID)
      INTO OID
      DO
        SUSPEND;
  END
END
^

/* Alter exist trigger... */
ALTER TRIGGER DEL_BEF_CCARD
AS
DECLARE VARIABLE TMPID INTEGER;
BEGIN
  FOR
    SELECT CC.COUNTERID
    FROM CCARDCOUNTER CC
    LEFT JOIN COUNTER CO ON CO.ID = CC.COUNTERID
    LEFT JOIN COUNTERTYPE CT ON CT.ID = CO.COUNTERTYPEID
    WHERE CC.CCARDID = OLD.ID AND CT.AUTOCREATE = 1
    INTO TMPID
    DO
      DELETE FROM COUNTER WHERE ID = :TMPID;
END
^

/* Alter exist trigger... */
ALTER TRIGGER DEL_BEF_CLIENT
AS
DECLARE VARIABLE TMPID INTEGER;
BEGIN
  IF (OLD.ISFOLDER <> 0) THEN
    DELETE FROM CLIENT WHERE PARENTID = OLD.ID;
  ELSE
  FOR
    SELECT CC.COUNTERID
    FROM CLIENTCOUNTER CC
    LEFT JOIN COUNTER CO ON CO.ID = CC.COUNTERID
    LEFT JOIN COUNTERTYPE CT ON CT.ID = CO.COUNTERTYPEID
    WHERE CC.CLIENTID = OLD.ID AND CT.AUTOCREATE = 2
    INTO TMPID
    DO
      DELETE FROM COUNTER WHERE ID = :TMPID;
END
^

/* Alter exist trigger... */
ALTER TRIGGER IND_AFT_COUNTERTYPE
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
DECLARE VARIABLE OWNBDO INTEGER;
DECLARE VARIABLE TCODE1 INTEGER;
DECLARE VARIABLE TCODE2 INTEGER;
DECLARE VARIABLE CNTCODE NUMERIC(18);
BEGIN
  IF (NEW.AUTOCREATE = 1) THEN
    FOR
      SELECT C.ID, C.CODE, GC.CODE, C.OWNERBDO
      FROM CCARD C JOIN GRPCCARD GC ON
                   GC.ID = C.GRPCCARDID
      INTO TMPID1, TCODE1, TCODE2, OWNBDO
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        CNTCODE = TCODE2 * 2000000000 + TCODE1;
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, BDOCODE) VALUES (:TMPID2, :CNTCODE, NEW.ID, :OWNBDO, NEW.BDOCODE);
        INSERT INTO CCARDCOUNTER (ID, COUNTERID, CCARDID, OWNERBDO, BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, :OWNBDO, NEW.BDOCODE);
      END
  ELSE IF (NEW.AUTOCREATE = 2) THEN
    FOR
      SELECT ID, CODE, OWNERBDO
      FROM CLIENT
      WHERE ISFOLDER = 0
      INTO TMPID1, TCODE1, OWNBDO
      DO
      BEGIN
        TMPID2 = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, BDOCODE) VALUES (:TMPID2, :TCODE1, NEW.ID, NEW.OWNERBDO, :OWNBDO);
        INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID, OWNERBDO, BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, :OWNBDO, NEW.BDOCODE);
      END
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_AFT_CCARD
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TGRPCODE INTEGER;
DECLARE VARIABLE TCOUNTERID INTEGER;
BEGIN
  SELECT CODE FROM GRPCCARD WHERE ID = NEW.GRPCCARDID INTO TGRPCODE;
  FOR
    SELECT CT.ID
    FROM COUNTERTYPE CT
    WHERE CT.AUTOCREATE = 1
    INTO TMPID1
    DO
    BEGIN
      TCOUNTERID = NULL;
      SELECT ID
      FROM COUNTER
      WHERE CODE = :TGRPCODE * 2000000000 + NEW.CODE AND COUNTERTYPEID = :TMPID1
      INTO TCOUNTERID;

      IF (TCOUNTERID IS NULL) THEN
      BEGIN
        TCOUNTERID = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO)
        VALUES (:TCOUNTERID, :TGRPCODE * 2000000000 + NEW.CODE, :TMPID1, NEW.OWNERBDO);
      END

      INSERT INTO CCARDCOUNTER (ID, COUNTERID, CCARDID, OWNERBDO)
        VALUES (GEN_ID(GID, 1), :TCOUNTERID, NEW.ID, NEW.OWNERBDO);
    END
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_AFT_CLIENT
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TCOUNTERID INTEGER;
BEGIN
  IF (NEW.ISFOLDER = 0) THEN
  BEGIN
  FOR
    SELECT CT.ID
    FROM COUNTERTYPE CT
    WHERE CT.AUTOCREATE = 2
    INTO TMPID1
    DO
    BEGIN
      TCOUNTERID = NULL;
      SELECT ID FROM COUNTER WHERE CODE = NEW.CODE AND COUNTERTYPEID = :TMPID1 INTO TCOUNTERID;

      IF (TCOUNTERID IS NULL) THEN
      BEGIN
        TCOUNTERID = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO) VALUES (:TCOUNTERID, NEW.CODE, :TMPID1, NEW.OWNERBDO);
      END

      INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID, OWNERBDO) VALUES (GEN_ID(GID, 1), :TCOUNTERID, NEW.ID, NEW.OWNERBDO);
    END
  END
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_AFT_CCARD
AS
DECLARE VARIABLE TEMPID INTEGER;
DECLARE VARIABLE GRPCODE INTEGER;
BEGIN
  IF (NEW.CODE <> OLD.CODE) THEN
  BEGIN
    SELECT CODE FROM GRPCCARD WHERE ID = NEW.GRPCCARDID INTO GRPCODE;
    FOR
      SELECT C.ID
      FROM COUNTER C
        JOIN COUNTERTYPE CT ON
          CT.ID = C.COUNTERTYPEID AND CT.AUTOCREATE = 1
        JOIN CCARDCOUNTER CC ON
          CC.COUNTERID = C.ID AND CC.CCARDID = NEW.ID
      INTO TEMPID
      DO
        UPDATE COUNTER SET
          CODE = :GRPCODE * 2000000000 + NEW.CODE
        WHERE ID = :TEMPID;
  END
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_AFT_COUNTERTYPE
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
DECLARE VARIABLE TCODE1 INTEGER;
DECLARE VARIABLE TCODE2 INTEGER;
DECLARE VARIABLE OWNBDO INTEGER;
DECLARE VARIABLE CNTCODE NUMERIC(18);
BEGIN
/*  OLD.AUTOCREATE >= 0   -.   */
/*      ,     */
/*      . */
/*        -        "" */
  IF (OLD.AUTOCREATE >= 0 AND NEW.AUTOCREATE <> OLD.AUTOCREATE) THEN
  BEGIN
  IF (NEW.AUTOCREATE = 1) THEN
  BEGIN
    DELETE FROM COUNTER C WHERE C.COUNTERTYPEID = NEW.ID AND
      NOT EXISTS(SELECT 1 FROM CCARD CC JOIN GRPCCARD GC ON GC.ID = CC.GRPCCARDID
                                     WHERE GC.CODE  = CAST(C.CODE / 2000000000 AS INTEGER) AND CC.CODE = C.CODE - 2000000000 * CAST(C.CODE / 2000000000 AS INTEGER));
    FOR
      SELECT C.ID, C.CODE, GC.CODE, C.OWNERBDO
      FROM CCARD C JOIN GRPCCARD GC ON
                   GC.ID = C.GRPCCARDID
      INTO TMPID1, TCODE1, TCODE2, OWNBDO
      DO
      BEGIN
        CNTCODE = TCODE2 * 2000000000 + TCODE1;

        TMPID2 = NULL;
        SELECT ID
        FROM COUNTER
        WHERE CODE = :CNTCODE AND COUNTERTYPEID = NEW.ID
        INTO TMPID2;
        IF (TMPID2 IS NULL) THEN
        BEGIN
          TMPID2 = GEN_ID(GID, 1);
          INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, BDOCODE) VALUES (:TMPID2, :CNTCODE, NEW.ID, :OWNBDO, NEW.BDOCODE);
        END

        IF (NOT EXISTS(SELECT 1 FROM CCARDCOUNTER WHERE COUNTERID = :TMPID2 AND CCARDID = :TMPID1)) THEN
        BEGIN
          DELETE FROM CLIENTCOUNTER WHERE COUNTERID = :TMPID2;
          INSERT INTO CCARDCOUNTER (ID, COUNTERID, CCARDID, OWNERBDO, BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, :OWNBDO, NEW.BDOCODE);
        END
      END
  END
  IF (NEW.AUTOCREATE = 2) THEN
  BEGIN
    DELETE FROM COUNTER C WHERE C.COUNTERTYPEID = NEW.ID AND NOT EXISTS(SELECT 1 FROM CLIENT CL WHERE CL.CODE = C.CODE);
    FOR
      SELECT ID, CODE, OWNERBDO
      FROM CLIENT C
      WHERE  ISFOLDER = 0
      INTO TMPID1, TCODE1, OWNBDO
      DO
      BEGIN
        TMPID2 = NULL;
        SELECT ID
        FROM COUNTER
        WHERE CODE = :TCODE1 AND COUNTERTYPEID = NEW.ID
        INTO TMPID2;

        IF (TMPID2 IS NULL) THEN
        BEGIN
          TMPID2 = GEN_ID(GID, 1);
          INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, BDOCODE) VALUES (:TMPID2, :TCODE1, NEW.ID, :OWNBDO, NEW.BDOCODE);
        END

        IF (NOT EXISTS(SELECT 1 FROM CLIENTCOUNTER WHERE COUNTERID = :TMPID2 AND CLIENTID = :TMPID1)) THEN
        BEGIN
          DELETE FROM CCARDCOUNTER WHERE COUNTERID = :TMPID2;
          INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID, OWNERBDO, BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, :OWNBDO, NEW.BDOCODE);
        END
      END
  END
  END
END
^

/* Drop generator... */
SET TERM ; ^

DROP GENERATOR GCNTCODE;


/* Alter Procedure... */
/* Alter (APPENDCCARDDISCS) */
SET TERM ^ ;

ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE DOCODE INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;
        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;
END
^

/* Alter (APPENDCLIENT) */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,      CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE, BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,
                          WEB,     TELEPHONE, INN,      DOCUMENT, OKPO,  OKPD,     DELETED)

      VALUES (:CLIENTID, :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT,  :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE, :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,
              :IWEB,     :ITELEPHONE, :IINN,        :IDOCUMENT, :IOKPO, :IOKPD,     :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;
END
^

SET TERM ; ^

ALTER TABLE COUNTER ALTER COLUMN ID POSITION 1;

ALTER TABLE COUNTER ALTER COLUMN CODE POSITION 2;

ALTER TABLE COUNTER ALTER COLUMN COUNTERTYPEID POSITION 3;

ALTER TABLE COUNTER ALTER COLUMN DATECREATE POSITION 4;

ALTER TABLE COUNTER ALTER COLUMN CHNG POSITION 5;

ALTER TABLE COUNTER ALTER COLUMN BDOCODE POSITION 6;

ALTER TABLE COUNTER ALTER COLUMN OWNERBDO POSITION 7;

ALTER TABLE COUNTER ALTER COLUMN INSCHNG POSITION 8;

ALTER TABLE COUNTER ALTER COLUMN ISGLOBAL POSITION 9;

ALTER TABLE DOCUMENT ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCUMENT ALTER COLUMN DOCKINDID POSITION 2;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUENUMBER POSITION 3;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDATE POSITION 4;

ALTER TABLE DOCUMENT ALTER COLUMN OPENTIME POSITION 5;

ALTER TABLE DOCUMENT ALTER COLUMN OPENUSERID POSITION 6;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEDATE POSITION 7;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSETIME POSITION 8;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEUSERID POSITION 9;

ALTER TABLE DOCUMENT ALTER COLUMN DOCUMENTID POSITION 10;

ALTER TABLE DOCUMENT ALTER COLUMN CLIENTID POSITION 11;

ALTER TABLE DOCUMENT ALTER COLUMN STATE POSITION 12;

ALTER TABLE DOCUMENT ALTER COLUMN EDUCATION POSITION 13;

ALTER TABLE DOCUMENT ALTER COLUMN RMKID POSITION 14;

ALTER TABLE DOCUMENT ALTER COLUMN SUMM POSITION 15;

ALTER TABLE DOCUMENT ALTER COLUMN SUMMWD POSITION 16;

ALTER TABLE DOCUMENT ALTER COLUMN ECRSESSION POSITION 17;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUETYPE POSITION 18;

ALTER TABLE DOCUMENT ALTER COLUMN ORDERIDENTIF POSITION 19;

ALTER TABLE DOCUMENT ALTER COLUMN COMMENTCODE POSITION 20;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTSCHEME POSITION 21;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE1 POSITION 22;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE2 POSITION 23;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE3 POSITION 24;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE4 POSITION 25;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE5 POSITION 26;

ALTER TABLE DOCUMENT ALTER COLUMN HALLPLACEID POSITION 27;

ALTER TABLE DOCUMENT ALTER COLUMN SAVED POSITION 28;

ALTER TABLE DOCUMENT ALTER COLUMN INNERDOCORDER POSITION 29;

ALTER TABLE DOCUMENT ALTER COLUMN PRECHEQUE POSITION 30;

ALTER TABLE DOCUMENT ALTER COLUMN OPENRMKID POSITION 31;

ALTER TABLE DOCUMENT ALTER COLUMN OPENSESSION POSITION 32;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDOCNUMBER POSITION 33;

ALTER TABLE DOCUMENT ALTER COLUMN CHNG POSITION 34;

ALTER TABLE DOCUMENT ALTER COLUMN BDOCODE POSITION 35;

ALTER TABLE DOCUMENT ALTER COLUMN ISFISCAL POSITION 36;

ALTER TABLE DOCUMENT ALTER COLUMN OWNERBDO POSITION 37;

ALTER TABLE DOCUMENT ALTER COLUMN NSHOP POSITION 38;

ALTER TABLE DOCUMENT ALTER COLUMN USERVALUES POSITION 39;

ALTER TABLE TRANZT ALTER COLUMN ID POSITION 1;

ALTER TABLE TRANZT ALTER COLUMN DOCUMENTID POSITION 2;

ALTER TABLE TRANZT ALTER COLUMN TRANZCOUNT POSITION 3;

ALTER TABLE TRANZT ALTER COLUMN TRANZDATE POSITION 4;

ALTER TABLE TRANZT ALTER COLUMN TRANZTIME POSITION 5;

ALTER TABLE TRANZT ALTER COLUMN TRANZHOUR POSITION 6;

ALTER TABLE TRANZT ALTER COLUMN TRANZTYPE POSITION 7;

ALTER TABLE TRANZT ALTER COLUMN SELLER POSITION 8;

ALTER TABLE TRANZT ALTER COLUMN WARECODE POSITION 9;

ALTER TABLE TRANZT ALTER COLUMN WAREMARK POSITION 10;

ALTER TABLE TRANZT ALTER COLUMN ASPECTSCHEME POSITION 11;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE1 POSITION 12;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE2 POSITION 13;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE3 POSITION 14;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE4 POSITION 15;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE5 POSITION 16;

ALTER TABLE TRANZT ALTER COLUMN PRICE POSITION 17;

ALTER TABLE TRANZT ALTER COLUMN QUANTITY POSITION 18;

ALTER TABLE TRANZT ALTER COLUMN SUMM POSITION 19;

ALTER TABLE TRANZT ALTER COLUMN PRICEWD POSITION 20;

ALTER TABLE TRANZT ALTER COLUMN SUMMWD POSITION 21;

ALTER TABLE TRANZT ALTER COLUMN INFO POSITION 22;

ALTER TABLE TRANZT ALTER COLUMN INFOSTR POSITION 23;

ALTER TABLE TRANZT ALTER COLUMN BARCODE POSITION 24;

ALTER TABLE TRANZT ALTER COLUMN FACTOR POSITION 25;

ALTER TABLE TRANZT ALTER COLUMN CURRENCY POSITION 26;

ALTER TABLE TRANZT ALTER COLUMN PRNONECR POSITION 27;

ALTER TABLE TRANZT ALTER COLUMN ECRNUMBER POSITION 28;

ALTER TABLE TRANZT ALTER COLUMN POSID POSITION 29;

ALTER TABLE TRANZT ALTER COLUMN POSNUMB POSITION 30;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCPOS POSITION 31;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCREC POSITION 32;

ALTER TABLE TRANZT ALTER COLUMN COMMENTCODE POSITION 33;

ALTER TABLE TRANZT ALTER COLUMN COUNTFILLS POSITION 34;

ALTER TABLE TRANZT ALTER COLUMN COUNTPRINTS POSITION 35;

ALTER TABLE TRANZT ALTER COLUMN POSNUMBER POSITION 36;

ALTER TABLE TRANZT ALTER COLUMN BDOCODE POSITION 37;

ALTER TABLE TRANZT ALTER COLUMN OWNERBDO POSITION 38;

ALTER TABLE TRANZT ALTER COLUMN ORDERPOS POSITION 39;

/* TEXT BLOCK END */

/* Convert 4.7.3 */

ALTER TABLE DISCRATE DROP CONSTRAINT UNQ_DISCRATE_CODE;

ALTER TABLE CLIENTCARD ADD DELETED FLAG;

ALTER TABLE PROFILE ADD SKIPMODE FLAG NOT NULL;

/* MAN */
UPDATE PROFILE P SET SKIPMODE = COALESCE((SELECT FIRST 1 SKIPMODE FROM "USER" WHERE PROFILEID = P.ID), 0);
COMMIT;
/* MAN */

/* Drop table-fields... */
ALTER TABLE "USER" DROP SKIPMODE;


/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE APPENDCLIENTCARD(ICLIENTCODE INTEGER,
IGRPCCARDCODE INTEGER,
ICCARDCODE INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

CREATE PROCEDURE DEL_ACTDISC_BY_PREFIXRANGE(ICODESTART VARCHAR(22),
ICODEEND VARCHAR(22))
 AS
 BEGIN EXIT; END
^


/* Create Exception... */
SET TERM ; ^

CREATE EXCEPTION E_OPENDOC_LINK_FOUND '    ';


/* Create Unique... */
ALTER TABLE DISCRATE ADD CONSTRAINT UNQ_DISCRATE_CODE UNIQUE (CODE)
USING DESC INDEX UNQ_DISCRATE_CODE;

ALTER TABLE CLIENTCARD ADD CONSTRAINT UNQ1_CLIENTCARD UNIQUE (ID, DELETED);

/* Alter Procedure... */
/* Alter (APPENDACTDISC) */
SET TERM ^ ;

ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG NUMERIC(15,2),
IPRICEEND NUMERIC(15,2),
IQUANTITYBEG NUMERIC(15,2),
IQUANTITYEND NUMERIC(15,2),
IQUANTITYRECBEG NUMERIC(15,2),
IQUANTITYRECEND NUMERIC(15,2),
IQUANTITYWAREBEG NUMERIC(15,2),
IQUANTITYWAREEND NUMERIC(15,2),
ISUMMBEG NUMERIC(15,2),
ISUMMEND NUMERIC(15,2),
ISUMMRECBEG NUMERIC(15,2),
ISUMMRECEND NUMERIC(15,2),
ISUMMWAREBEG NUMERIC(15,2),
ISUMMWAREEND NUMERIC(15,2),
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :IGRPACTDISCCODE
  INTO GRPACTDISCID;

  IF (GRPACTDISCID IS NULL) THEN
   BEGIN
      ERRORCODE = 1;
      EXIT;
    END

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :GRPACTDISCID
  PLAN (ACTDISC INDEX (UNQ_ACTDISC))
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, :IDATEBEG, :IDATEEND,
                                    :IDAYBEG, :IDAYEND, :IPRICEBEG, :IPRICEEND,
                                    :IQUANTITYBEG, :IQUANTITYEND,
                                    :IQUANTITYRECBEG, :IQUANTITYRECEND,
                                    :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,
                                    :ISUMMWAREBEG, :ISUMMWAREEND, :ITIMEBEG, :ITIMEEND,
                                    :IWARECODE, :IWARECODETOMARK)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (IDISCRATEPARENTCODE IS NOT NULL) THEN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEPARENTCODE AND ISFOLDER > 0
      INTO IDISCRATEPARENTID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, '', 0,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* empty dependent procedure body */
/* Clear: APPEND_SUPERMAG_DISC for: APPENDDISCRATE */
ALTER PROCEDURE APPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPEND_WARE_DISC for: APPENDDISCRATE */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPENDACTDISC for: APPENDDISCRATE */
ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG NUMERIC(15,2),
IPRICEEND NUMERIC(15,2),
IQUANTITYBEG NUMERIC(15,2),
IQUANTITYEND NUMERIC(15,2),
IQUANTITYRECBEG NUMERIC(15,2),
IQUANTITYRECEND NUMERIC(15,2),
IQUANTITYWAREBEG NUMERIC(15,2),
IQUANTITYWAREEND NUMERIC(15,2),
ISUMMBEG NUMERIC(15,2),
ISUMMEND NUMERIC(15,2),
ISUMMRECBEG NUMERIC(15,2),
ISUMMRECEND NUMERIC(15,2),
ISUMMWAREBEG NUMERIC(15,2),
ISUMMWAREEND NUMERIC(15,2),
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPENDCCARDDISCS for: APPENDDISCRATE */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPENDCLIENT for: APPENDDISCRATE */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPENDFIXDISCS for: APPENDDISCRATE */
ALTER PROCEDURE APPENDFIXDISCS(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IPREFIX VARCHAR(40),
IVAL VARCHAR(100),
ITYPE INTEGER,
IDATERANGEBEG DATE,
IDATERANGEEND DATE,
IDESTINATION INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPENDREMAIN for: APPENDDISCRATE */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPENDDISCRATE) */
ALTER PROCEDURE APPENDDISCRATE(IPARENTID INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
IBEGVAL VARCHAR(100),
IENDVAL VARCHAR(100),
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
IISFOLDER INTEGER,
IDISCCOLLOPER INTEGER,
IGRPACTDISCID INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
DECLARE VARIABLE DISCRATECODE INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DISTINATION INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
BEGIN

  ERRORCODE = 0;
  WHERECLAUSE = '';

  IF (IVAL = '') THEN
    IVAL = '0';

  IF (IWARECODE <> '') THEN
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID
      FROM SPRT
      WHERE CODE = :IWARECODE
      INTO WAREID;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID
      FROM SPRT
      WHERE MARK = :IWARECODE
      INTO WAREID;
    END

    IF (WAREID IS NULL) THEN
    BEGIN
      ERRORCODE = 16;
      EXIT;
    END
  END

  SELECT FIRST 1 D.ID
  FROM DISCRATE D LEFT JOIN ACTDISC A ON
                  D.ID = A.DISCRATEID
  WHERE D.PARENTID = :IPARENTID AND D.VAL =  :IVAL  AND
        D."TYPE" = :ITYPE       AND D.NAME =  :INAME  AND
        D.KIND = :IKIND         AND D.DESTINATION = :IDESTINATION
  INTO ID;

  IF (ID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);

    DISCRATECODE = NULL;
    SELECT FIRST 1 CODE
    FROM DISCRATE
    WHERE CODE < 100000000
    ORDER BY CODE DESC
    INTO DISCRATECODE;

    IF (DISCRATECODE IS NULL) then
      DISCRATECODE = 1;
    ELSE
      DISCRATECODE = DISCRATECODE + 1;

    DISTINATION = IDESTINATION;
    IF (DISTINATION IS NULL) THEN
      IF (IGRPACTDISCID IS NULL) THEN
        DISTINATION = 0;
      ELSE
        BEGIN
          SELECT FIRST 1 D.DESTINATION
          FROM ACTDISC A LEFT JOIN DISCRATE D ON
                         D.ID = A.DISCRATEID
          WHERE A.GRPACTDISCID = :IGRPACTDISCID
          INTO DISTINATION;

          IF (DISTINATION IS NULL) THEN
            DISTINATION = 0;
        END

    INSERT INTO DISCRATE (ID, PARENTID, CODE, NAME, TEXT,
                          VAL, BEGVAL, ENDVAL,
                          WAREID, "TYPE", DESTINATION, KIND,
                          ISFOLDER, DISCCOLLOPER)
    VALUES (:ID, :IPARENTID, :DISCRATECODE, :INAME, :ITEXT,
            :IVAL, :IBEGVAL, :IENDVAL, :WAREID, :ITYPE, :DISTINATION, :IKIND,
            :IISFOLDER, :IDISCCOLLOPER);
  END
END
^

/* Alter (APPENDFIXDISCS) */
ALTER PROCEDURE APPENDFIXDISCS(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IPREFIX VARCHAR(40),
IVAL VARCHAR(100),
ITYPE INTEGER,
IDATERANGEBEG DATE,
IDATERANGEEND DATE,
IDESTINATION INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN

  ERRORCODE = 0;

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :IGRPACTDISCID
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL,
                                    :IPREFIX, :IPREFIX,
                                    0, :IDATERANGEBEG, :IDATERANGEEND,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME , :ITEXT, :ITYPE,
                                   :IVAL, NULL, NULL, '', 0, :IDESTINATION,
                                   1, 0, NULL, :IGRPACTDISCID)
        RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :IGRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPENDREMAIN) */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE WARENAME VARCHAR(100);
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCCODE INTEGER;
DECLARE VARIABLE USEREMAIN INTEGER;
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
      BEGIN
        IF (ASPCODE = 1)  THEN
          IF (IASPV1 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
            INTO AD1;
          ELSE
          BEGIN
            ERRORCODE = 10;
            EXIT;
          END

        IF (ASPCODE = 2)  THEN
          IF (IASPV2 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
            INTO AD2;
          ELSE
          BEGIN
            ERRORCODE = 11;
            EXIT;
          END

        IF (ASPCODE = 3)  THEN
          IF (IASPV3 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
            INTO AD3;
          ELSE
          BEGIN
            ERRORCODE = 12;
            EXIT;
          END

        IF (ASPCODE = 4)  THEN
          IF (IASPV4 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
            INTO AD4;
          ELSE
          BEGIN
            ERRORCODE = 13;
            EXIT;
          END

        IF (ASPCODE = 5)  THEN
          IF (IASPV5 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
            INTO AD5;
          ELSE
          BEGIN
            ERRORCODE = 14;
            EXIT;
          END
      END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR
(AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    REMAINID = GEN_ID(GID, 1);

    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, PRICE,
       DELETED, USEREMAIN)
    VALUES
      (:REMAINID, :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5,
      :IPRICE, :IDELETED, :USEREMAIN);

    IF (NOT :IREMAIN IS NULL) THEN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE <> 1) THEN
    BEGIN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 1;

      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;
    END

    UPDATE REMAIN SET
      PRICE = :IPRICE,
      DELETED = :IDELETED
    WHERE ID = :REMAINID;

    IF (NOT :IREMAIN IS NULL) THEN
    BEGIN
      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
     END

    IF (IADDREPLACE = 2) THEN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 0;
  END

  IF ((ILOADWAREDISC = 1) AND NOT IDISCOUNTVALUE IS NULL AND IDISCOUNTVALUE <> '0' AND IDISCOUNTVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       0, 2, 0, NULL, NULL)
            RETURNING_VALUES ERRORCODE, TDISCRATEID;

      WHERECLAUSE = '';

      IF (AD1 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
      ELSE
      BEGIN
        AD1 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID IS NULL ';
      END

      IF (AD2 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
      ELSE
      BEGIN
        AD2 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID IS NULL ';
      END

      IF (AD3 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
      ELSE
      BEGIN
        AD3 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID IS NULL ';
      END

      IF (AD4 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
      ELSE
      BEGIN
        AD4 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID IS NULL ';
      END

     IF (AD5 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
      ELSE
      BEGIN
        AD5 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID IS NULL ';
      END

      IF (IUSEGRPACTDISC <> 0) THEN
      BEGIN

        SELECT ID
        FROM GRPACTDISC
        WHERE CODE = :IGRPACTDISCCODE
        INTO :GRPACTDISCID;

        IF (GRPACTDISCID IS NULL) THEN
        BEGIN
          GRPACTDISCID = GEN_ID(GID, 1);
          INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
          VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
        END

        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.DELETED ' ||
                          ' FROM ACTDISCOBJ A JOIN GRPACTDISC G ON ' ||
                                          ' G.ID = A.GRPACTDISCID AND G.ID = '|| :GRPACTDISCID ||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '      A.PAYMENTID = -1 AND A.CARDID = -1 '|| WHERECLAUSE
        INTO TACTDISCOBJID, DEL;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, NULL, NULL, :GRPACTDISCID);
        ELSE
          IF (DEL < 0) THEN
            UPDATE ACTDISCOBJ SET
              DELETED = 0
            WHERE ID = :TACTDISCOBJID;

        SELECT FIRST 1 A.ID, A.CONDITIONID
        FROM CONDITION C LEFT JOIN ACTDISC A ON
                         C.ID = A.CONDITIONID
        WHERE A.GRPACTDISCID  = :GRPACTDISCID
        INTO ACTDISCID, CONDITIONID;

        EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL,
                                          NULL, NULL,  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  NULL, NULL,
                                          NULL, NULL, NULL, NULL)
        RETURNING_VALUES ERRORCODE, CONDITIONID;

       IF (ACTDISCID IS NULL) THEN
       BEGIN
         SELECT NULLTONUM(MAX(CODE)) + 1
         FROM ACTDISC
         WHERE GRPACTDISCID  = :GRPACTDISCID
         INTO ACTDISCCODE;

         INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                              CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
         VALUES     (GEN_ID(GID, 1), :ACTDISCCODE, :GRPACTDISCID, :WARENAME,
                    :CONDITIONID, :TDISCRATEID, NULL, 0, :IDELETEDACTDISC);
       END
       ELSE
         UPDATE ACTDISC SET
            NAME = :WARENAME,
            CONDITIONID = :CONDITIONID,
            DISCRATEID = :TDISCRATEID,
            DELETED = :IDELETEDACTDISC
         WHERE ID = :ACTDISCID;
      END
      ELSE
      BEGIN
        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID ' ||
                          ' FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                          ' D.ID = A.DISCRATEID AND D.KIND = 2 '||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '       A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
        INTO TACTDISCOBJID;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, :TDISCRATEID, NULL, NULL);
        ELSE
          UPDATE ACTDISCOBJ SET
             DISCRATEID = :TDISCRATEID,
             DELETED = 0
          WHERE ID = :TACTDISCOBJID;
      END
    END
END
^

/* Alter (APPENDUSER) */
ALTER PROCEDURE APPENDUSER(ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IPROFILECODE INTEGER,
IPSWRD VARCHAR(50),
ICARD VARCHAR(255),
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
declare variable profileid integer;
declare variable id integer;
declare variable base integer;
BEGIN
  ERRORCODE = 0;

  SELECT ID, BASE
  FROM PROFILE
  WHERE CODE = :IPROFILECODE
  INTO PROFILEID, :BASE;

  IF (PROFILEID IS NULL) THEN
  BEGIN
    ERRORCODE = 22;
    EXIT;
  END

  IF (:BASE = 1) THEN
  BEGIN
    ERRORCODE = 30;
    EXIT;
  END

  SELECT ID
  FROM "USER"
  WHERE CODE = :ICODE
  INTO ID;

  IF (ID IS NULL) THEN
    INSERT INTO "USER"
      (ID, CODE, NAME, TEXT, PROFILEID, PSWRD, CARD, DELETED)
    VALUES
      (GEN_ID(GID, 1), :ICODE, :INAME, :ITEXT, :PROFILEID, :IPSWRD, :ICARD, :IDELETED);
  ELSE
    BEGIN
      BASE = NULL;
      SELECT P.BASE
      FROM PROFILE P
      JOIN "USER" U ON U.PROFILEID = P.ID
      WHERE U.ID = :ID
      INTO :BASE;

      IF (:BASE = 1) THEN
      BEGIN
        ERRORCODE = 31;
        EXIT;
      END
      UPDATE "USER"
      SET
        NAME = :INAME, 
        TEXT = :ITEXT,
        PROFILEID = :PROFILEID,
        PSWRD = :IPSWRD,
        CARD = :ICARD,
        DELETED = :IDELETED
      WHERE
        ID = :ID;
    END
END
^

/* Alter (UPDATE_ALL_REMAIN) */
ALTER PROCEDURE UPDATE_ALL_REMAIN AS
DECLARE VARIABLE VREMAINID INTEGER;
DECLARE VARIABLE VOLDREMAINID INTEGER;
DECLARE VARIABLE VID NUMERIC(18);
DECLARE VARIABLE RID NUMERIC(18);
DECLARE VARIABLE VDELTA DOUBLE PRECISION;
DECLARE VARIABLE VSUMDELTA DOUBLE PRECISION;
BEGIN
  VOLDREMAINID = -1;
  VSUMDELTA = 0;
  SELECT GEN_ID(GREMAIND, 0) FROM RDB$DATABASE INTO :RID;
  FOR
    SELECT R.ID, R.REMAINID, R.DELTA
    FROM REMAIND R
    LEFT JOIN DOCUMENT D ON R.DOCUMENTID = D.ID
    WHERE ((R.DOCUMENTID IS NULL) OR (D.STATE = 1) OR (D.STATE = 2)) AND R.ID <= :RID
    ORDER BY REMAINID
    INTO :VID, :VREMAINID, :VDELTA
  DO
  BEGIN
    IF (VREMAINID <> VOLDREMAINID) THEN
    BEGIN
      IF (VSUMDELTA <> 0) THEN
        INSERT INTO REMAIND (ID, DELTA, DTYPE, REMAINID) VALUES (GEN_ID(GREMAIND, 1), :VSUMDELTA, 1, :VOLDREMAINID);
      VOLDREMAINID = :VREMAINID;
      VSUMDELTA = 0;
    END
    VSUMDELTA = :VSUMDELTA + :VDELTA;
    DELETE FROM REMAIND WHERE ID = :VID;
  END
  IF (VSUMDELTA <> 0) THEN
    INSERT INTO REMAIND (ID, DELTA, DTYPE, REMAINID) VALUES (GEN_ID(GREMAIND, 1), :VSUMDELTA, 1, :VOLDREMAINID);
END
^

/* Restore proc. body: APPEND_SUPERMAG_DISC */
ALTER PROCEDURE APPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
declare variable grpactdiscid integer;
declare variable actdiscid integer;
declare variable del integer;
declare variable discrateid integer;
declare variable conditionid integer;
declare variable whereclause varchar(255);
declare variable actdiscobjid integer;
BEGIN

  IF (IGRPACTDISCCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IGRPACTDISCCODE
    INTO GRPACTDISCID;

    IF (GRPACTDISCID IS NULL) THEN
    BEGIN
      GRPACTDISCID = GEN_ID(GID, 1);
      INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
      VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
    END

    IF (IWAREID > 0) THEN
    BEGIN
      SELECT ID, DELETED
      FROM ACTDISCOBJ
      WHERE WAREID = :IWAREID AND GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1
      INTO ACTDISCOBJID, DEL;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), :IWAREID, -1, -1, -1, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :ACTDISCOBJID;
    END
    ELSE
    BEGIN
      SELECT ID, DELETED
      FROM ACTDISCOBJ
      WHERE GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1 AND WAREID = -1
      INTO ACTDISCOBJID, DEL;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), -1, -1, -1, -1, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :ACTDISCOBJID;
    END
  END
  ELSE
    GRPACTDISCID = IGRPACTDISCID;

  IF (IAPPENDTYPE = 0) THEN   -- DiscCli
    BEGIN
      WHERECLAUSE = '';

      IF (ICARDPREFIXBEG IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG = '''|| :ICARDPREFIXBEG ||'''';

      IF (ICARDPREFIXEND IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND = '''|| :ICARDPREFIXEND ||'''';

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.CONDITIONID
                          FROM CONDITION C LEFT JOIN ACTDISC A ON
                                           C.ID = A.CONDITIONID
                          WHERE A.GRPACTDISCID = '|| :GRPACTDISCID ||' AND
                                C.SUMMBEG IS NULL AND C.TIMEBEG IS NULL '|| WHERECLAUSE ||'
                          PLAN JOIN (C INDEX (IDX_C_CARDPRBEG,IDX_C_CARDPREND),A INDEX (FK_AD_CONDITION,FK_AD_GRPACTDISC))'
      INTO :ACTDISCID, :CONDITIONID;
    END
  ELSE
    IF (IAPPENDTYPE = 1) THEN   -- CliClass

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                       C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
            C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
            C.QUANTITYBEG IS NULL
      INTO ACTDISCID, CONDITIONID;

    ELSE
      IF (IAPPENDTYPE = 2) THEN   -- DiscSumm
        BEGIN

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.SUMMBEG = :ISUMMBEG AND
                C.TIMEBEG = :ITIMEBEG AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

          IF (IDELETECURRENT = 1) THEN
            IF (ACTDISCID IS NULL) THEN
              EXIT;
            ELSE
              BEGIN
                DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                EXIT;
              END
        END
      ELSE
        IF (IAPPENDTYPE = 3) THEN   -- DiscCard

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.QUANTITYBEG = :IQUANTITYBEG    AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

        ELSE
          IF (IAPPENDTYPE = 4) THEN   -- CliSumm

            SELECT FIRST 1 A.ID, A.CONDITIONID
            FROM CONDITION C LEFT JOIN ACTDISC A ON
                             C.ID = A.CONDITIONID
            WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                  C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                  C.SUMMBEG = :ISUMMBEG             AND
                  C.TIMEBEG IS NULL
            INTO ACTDISCID, CONDITIONID;

          ELSE
            IF (IAPPENDTYPE = 5) THEN  -- PluDisc  ClasDisc

              SELECT FIRST 1 A.ID, A.CONDITIONID
              FROM CONDITION C LEFT JOIN ACTDISC A ON
                               C.ID = A.CONDITIONID
              WHERE A.GRPACTDISCID  = :GRPACTDISCID
              INTO ACTDISCID, CONDITIONID;

            ELSE
              IF (IAPPENDTYPE = 6) THEN  -- DiscSum 
                BEGIN

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                        C.SUMMRECBEG = :ISUMMRECBEG      AND
                        C.TIMEBEG = :ITIMEBEG            AND
                        C.CARDPREFIXBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                  IF (IDELETECURRENT = 1) THEN
                    IF (ACTDISCID IS NULL) THEN
                      EXIT;
                    ELSE
                    BEGIN
                      DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                      EXIT;
                    END
                END
              ELSE
                IF (IAPPENDTYPE = 7) THEN  -- CliSum 

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                        C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                        C.SUMMRECBEG = :ISUMMRECBEG       AND
                        C.TIMEBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                ELSE
                  BEGIN
                    ERRORCODE = 90; --  IAPPENDTYPE
                    EXIT;
                  END

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, NULL, NULL, NULL, NULL, NULL, NULL,
                                    :IQUANTITYBEG, :IQUANTITYEND,  NULL, NULL, NULL, NULL,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,  NULL, NULL,
                                    :ITIMEBEG, :ITIMEEND, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, NULL, NULL,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      IF (ICODE IS NULL) THEN
      BEGIN
        SELECT FIRST 1 CODE
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        ORDER BY GRPACTDISCID DESC, CODE DESC
        INTO ICODE;

        IF (ICODE IS NULL) THEN
          ICODE = 1;
        ELSE
          ICODE = ICODE + 1;
      END

      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (GEN_ID(GID, 1), :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
       NAME = :INAME,
       CONDITIONID = :CONDITIONID,
       DISCRATEID = :DISCRATEID,
       DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Restore proc. body: APPEND_WARE_DISC */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TID INTEGER;
BEGIN

    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, '  ', '  ',
                                     :IDISCTYPE, :IDISCVALUE, NULL, NULL, '', NULL,
                                     0, 2, 0, NULL, NULL)
          RETURNING_VALUES ERRORCODE, TDISCRATEID;

    SELECT FIRST 1 A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL
    INTO TACTDISCOBJID;

    IF (TACTDISCOBJID IS NULL) THEN
      INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                               ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                               PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
      VALUES   (GEN_ID(GID, 1), :IWAREID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                -1, :TDISCRATEID, NULL, 0);
    ELSE
      BEGIN
        UPDATE ACTDISCOBJ SET
           DISCRATEID = :TDISCRATEID,
           DELETED = 0
        WHERE ID = :TACTDISCOBJID;

        FOR SELECT A.ID
        FROM ACTDISCOBJ A JOIN DISCRATE D ON
                        D.ID = A.DISCRATEID AND D.KIND = 2
        WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
              A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
              A.ASPECTVALUE1ID IS NULL AND
              A.ASPECTVALUE2ID IS NULL AND
              A.ASPECTVALUE3ID IS NULL AND
              A.ASPECTVALUE4ID IS NULL AND
              A.ASPECTVALUE5ID IS NULL AND
              A.ID <> :TACTDISCOBJID AND DELETED >= 0
        INTO TID
        DO
          UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :TID;
      END
END
^

/* Restore proc. body: APPENDACTDISC */
ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG NUMERIC(15,2),
IPRICEEND NUMERIC(15,2),
IQUANTITYBEG NUMERIC(15,2),
IQUANTITYEND NUMERIC(15,2),
IQUANTITYRECBEG NUMERIC(15,2),
IQUANTITYRECEND NUMERIC(15,2),
IQUANTITYWAREBEG NUMERIC(15,2),
IQUANTITYWAREEND NUMERIC(15,2),
ISUMMBEG NUMERIC(15,2),
ISUMMEND NUMERIC(15,2),
ISUMMRECBEG NUMERIC(15,2),
ISUMMRECEND NUMERIC(15,2),
ISUMMWAREBEG NUMERIC(15,2),
ISUMMWAREEND NUMERIC(15,2),
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :IGRPACTDISCCODE
  INTO GRPACTDISCID;

  IF (GRPACTDISCID IS NULL) THEN
   BEGIN
      ERRORCODE = 1;
      EXIT;
    END

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :GRPACTDISCID
  PLAN (ACTDISC INDEX (UNQ_ACTDISC))
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, :IDATEBEG, :IDATEEND,
                                    :IDAYBEG, :IDAYEND, :IPRICEBEG, :IPRICEEND,
                                    :IQUANTITYBEG, :IQUANTITYEND,
                                    :IQUANTITYRECBEG, :IQUANTITYRECEND,
                                    :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,
                                    :ISUMMWAREBEG, :ISUMMWAREEND, :ITIMEBEG, :ITIMEEND,
                                    :IWARECODE, :IWARECODETOMARK)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (IDISCRATEPARENTCODE IS NOT NULL) THEN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEPARENTCODE AND ISFOLDER > 0
      INTO IDISCRATEPARENTID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, '', 0,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Restore proc. body: APPENDCCARDDISCS */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE DOCODE INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;
        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;
END
^

/* Restore proc. body: APPENDCLIENT */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,      CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE, BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,
                          WEB,     TELEPHONE, INN,      DOCUMENT, OKPO,  OKPD,     DELETED)

      VALUES (:CLIENTID, :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT,  :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE, :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,
              :IWEB,     :ITELEPHONE, :IINN,        :IDOCUMENT, :IOKPO, :IOKPD,     :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;
END
^

/* Restore proc. body: APPENDCLIENTCARD */
ALTER PROCEDURE APPENDCLIENTCARD(ICLIENTCODE INTEGER,
IGRPCCARDCODE INTEGER,
ICCARDCODE INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE VID INTEGER;
DECLARE VARIABLE VCLIENTID INTEGER;
DECLARE VARIABLE VISFOLDER INTEGER;
DECLARE VARIABLE VCCARDID INTEGER;
DECLARE VARIABLE VGRPCCARDID INTEGER;
BEGIN
  ERRORCODE = 0;
  SELECT ID, ISFOLDER  FROM CLIENT WHERE CODE = :ICLIENTCODE
  INTO VCLIENTID, VISFOLDER;
  IF (VCLIENTID IS NULL) THEN
  BEGIN
    ERRORCODE = 33;
    EXIT;
  END

  IF (VISFOLDER > 0) THEN
  BEGIN
    ERRORCODE = 34;
    EXIT;
  END

  SELECT ID FROM GRPCCARD WHERE CODE = :IGRPCCARDCODE
  INTO VGRPCCARDID;
  IF (VGRPCCARDID IS NULL) THEN
  BEGIN
    ERRORCODE = 35;
    EXIT;
  END

  SELECT ID FROM CCARD WHERE (CODE = :ICCARDCODE) AND
  (GRPCCARDID = :VGRPCCARDID)
  INTO VCCARDID;
  IF (VCCARDID IS NULL) THEN
  BEGIN
    ERRORCODE = 36;
    EXIT;
  END

  SELECT ID
  FROM CLIENTCARD
  WHERE CLIENTID = :VCLIENTID AND CCARDID = :VCCARDID
  INTO VID;

  IF (VID IS NULL) THEN
  BEGIN
    VID = GEN_ID(GID, 1);
    INSERT INTO CLIENTCARD (ID, CLIENTID, CCARDID, DELETED)
    VALUES (:VID, :VCLIENTID, :VCCARDID, :IDELETED);
  END
  ELSE
  BEGIN
    UPDATE CLIENTCARD
    SET DELETED = :IDELETED
    WHERE ID = :VID;
  END
END
^

/* Restore proc. body: DEL_ACTDISC_BY_PREFIXRANGE */
ALTER PROCEDURE DEL_ACTDISC_BY_PREFIXRANGE(ICODESTART VARCHAR(22),
ICODEEND VARCHAR(22))
 AS
declare variable conditionid integer;
declare variable codestart varchar(40);
declare variable codeend varchar(40);
BEGIN
  IF (ICODESTART <> '' AND ICODEEND <> '' AND ICODESTART = ICODEEND) THEN
  BEGIN
    CODESTART = ADDRIGHT(ICODESTART, 1, 40);
    CODEEND = ADDRIGHT(ICODEEND, 255, 40);
    FOR
      SELECT ID
      FROM CONDITION
      WHERE CARDPREFIXBEG = :CODESTART
      INTO CONDITIONID
      DO
        DELETE FROM ACTDISC WHERE CONDITIONID = :CONDITIONID;
  END ELSE

  IF (ICODESTART <> '' AND ICODEEND <> '' AND ICODESTART <> ICODEEND) THEN
  BEGIN
    CODESTART = ADDRIGHT(ICODESTART, 1, 40);
    CODEEND = ADDRIGHT(ICODEEND, 255, 40);
    FOR
      SELECT ID
      FROM CONDITION
      WHERE CARDPREFIXBEG >= :CODESTART AND
      CARDPREFIXEND <= :CODEEND
      INTO CONDITIONID
      DO
        DELETE FROM ACTDISC WHERE CONDITIONID = :CONDITIONID;
  END ELSE

  IF (ICODESTART = '' AND ICODEEND <> '') THEN
  BEGIN
    CODEEND = ADDRIGHT(ICODEEND, 255, 40);
    FOR
      SELECT ID
      FROM CONDITION
      WHERE NOT CARDPREFIXEND IS NULL AND 
      CARDPREFIXBEG = :CODEEND
      INTO CONDITIONID
      DO
        DELETE FROM ACTDISC WHERE CONDITIONID = :CONDITIONID;
  END ELSE

  IF (ICODESTART <> '' AND ICODEEND = '') THEN
  BEGIN
    CODESTART = ADDRIGHT(ICODESTART, 1, 40);
    FOR
      SELECT ID
      FROM CONDITION
      WHERE NOT CARDPREFIXEND IS NULL AND 
      CARDPREFIXBEG = :CODESTART
      INTO CONDITIONID
      DO
        DELETE FROM ACTDISC WHERE CONDITIONID = :CONDITIONID;
  END
END
^

/* Create trigger... */
CREATE TRIGGER AFT_SETTINGS_INFORM FOR SETTINGS
ACTIVE AFTER INSERT OR UPDATE POSITION 0 
AS
BEGIN
  IF (TRIM(NEW.NAME) = 'InformAboutChanges') THEN
    POST_EVENT 'DATACHANGED';
  /* Trigger text */
END
^

CREATE TRIGGER DEL_BEF_HALLPLACE_CHDOC FOR HALLPLACE
ACTIVE BEFORE DELETE POSITION 0 
AS
BEGIN
  IF (EXISTS(SELECT 1 FROM DOCUMENT WHERE STATE = 0 AND HALLPLACEID = OLD.ID)) THEN
    EXCEPTION E_OPENDOC_LINK_FOUND;
END
^


/* Alter exist trigger... */
SET TERM ; ^

DROP TRIGGER DEL_BEF_CLIENT;

SET TERM ^ ;

CREATE TRIGGER DEL_BEF_CLIENT FOR CLIENT
ACTIVE BEFORE DELETE POSITION 1 
AS
DECLARE VARIABLE TMPID INTEGER;
BEGIN
  IF (OLD.ISFOLDER <> 0) THEN
    DELETE FROM CLIENT WHERE PARENTID = OLD.ID;
  ELSE
  FOR
    SELECT CC.COUNTERID
    FROM CLIENTCOUNTER CC
    LEFT JOIN COUNTER CO ON CO.ID = CC.COUNTERID
    LEFT JOIN COUNTERTYPE CT ON CT.ID = CO.COUNTERTYPEID
    WHERE CC.CLIENTID = OLD.ID AND CT.AUTOCREATE = 2
    INTO TMPID
    DO
      DELETE FROM COUNTER WHERE ID = :TMPID;
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_AFT_CCARD
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TGRPCODE INTEGER;
DECLARE VARIABLE TCOUNTERID INTEGER;
DECLARE VARIABLE NCHNG INTEGER;
BEGIN
  NCHNG = IIF(NEW.CHNG = -1, -1, NULL);
  SELECT CODE FROM GRPCCARD WHERE ID = NEW.GRPCCARDID INTO TGRPCODE;
  FOR
    SELECT CT.ID
    FROM COUNTERTYPE CT
    WHERE CT.AUTOCREATE = 1
    INTO TMPID1
    DO
    BEGIN
      TCOUNTERID = NULL;
      SELECT ID
      FROM COUNTER
      WHERE CODE = :TGRPCODE * 2000000000 + NEW.CODE AND COUNTERTYPEID = :TMPID1
      INTO TCOUNTERID;

      IF (TCOUNTERID IS NULL) THEN
      BEGIN
        TCOUNTERID = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, CHNG)
        VALUES (:TCOUNTERID, :TGRPCODE * 2000000000 + NEW.CODE, :TMPID1, NEW.OWNERBDO, :NCHNG);
      END

      INSERT INTO CCARDCOUNTER (ID, COUNTERID, CCARDID, OWNERBDO, CHNG)
        VALUES (GEN_ID(GID, 1), :TCOUNTERID, NEW.ID, NEW.OWNERBDO, :NCHNG);
    END
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_AFT_CLIENT
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TCOUNTERID INTEGER;
DECLARE VARIABLE NCHNG INTEGER;
BEGIN
  IF (NEW.ISFOLDER = 0) THEN
  BEGIN
    NCHNG = IIF(NEW.CHNG = -1, -1, NULL);
    FOR SELECT CT.ID
    FROM COUNTERTYPE CT
    WHERE CT.AUTOCREATE = 2
    INTO TMPID1
    DO
    BEGIN
      TCOUNTERID = NULL;
      SELECT ID FROM COUNTER WHERE CODE = NEW.CODE AND COUNTERTYPEID = :TMPID1 INTO TCOUNTERID;

      IF (TCOUNTERID IS NULL) THEN
      BEGIN
        TCOUNTERID = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, CHNG) VALUES (:TCOUNTERID, NEW.CODE, :TMPID1, NEW.OWNERBDO, :NCHNG);
      END

      INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID, OWNERBDO, CHNG) VALUES (GEN_ID(GID, 1), :TCOUNTERID, NEW.ID, NEW.OWNERBDO, :NCHNG);
    END
  END
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_AFT_CCARD
AS
DECLARE VARIABLE TMPID INTEGER;
DECLARE VARIABLE TCOUNTERID INTEGER;
DECLARE VARIABLE GRPCODE INTEGER;
BEGIN
  /*        CHNG  -1     (   )
          CHNG    CHNG    ()  */

  IF (OLD.CHNG = -1 AND NEW.CHNG <> -1) THEN
    FOR SELECT ID, COUNTERID
    FROM CCARDCOUNTER
    WHERE CCARDID = NEW.ID AND CHNG = -1
    INTO TMPID, TCOUNTERID DO
    BEGIN
      UPDATE CCARDCOUNTER SET CHNG = NULL WHERE ID = :TMPID;
      UPDATE COUNTER SET CHNG = NULL WHERE ID = :TCOUNTERID;
    END

  IF (NEW.CODE <> OLD.CODE) THEN
  BEGIN
    SELECT CODE FROM GRPCCARD WHERE ID = NEW.GRPCCARDID INTO GRPCODE;
    FOR
      SELECT C.ID
      FROM COUNTER C
        JOIN COUNTERTYPE CT ON
          CT.ID = C.COUNTERTYPEID AND CT.AUTOCREATE = 1
        JOIN CCARDCOUNTER CC ON
          CC.COUNTERID = C.ID AND CC.CCARDID = NEW.ID
      INTO TMPID
      DO
        UPDATE COUNTER SET
          CODE = :GRPCODE * 2000000000 + NEW.CODE
        WHERE ID = :TMPID;
  END
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_AFT_CLIENT
AS
DECLARE VARIABLE TMPID INTEGER;
DECLARE VARIABLE TCOUNTERID INTEGER;
BEGIN

  /*        CHNG  -1     (   )
          CHNG    CHNG    ()  */

  IF (OLD.CHNG = -1 AND NEW.CHNG <> -1) THEN
    FOR SELECT ID, COUNTERID
    FROM CLIENTCOUNTER
    WHERE CLIENTID = NEW.ID AND CHNG = -1
    INTO TMPID, TCOUNTERID DO
    BEGIN
      UPDATE CLIENTCOUNTER SET CHNG = NULL WHERE ID = :TMPID;
      UPDATE COUNTER SET CHNG = NULL WHERE ID = :TCOUNTERID;
    END

  IF (NEW.CODE <> OLD.CODE) THEN
  BEGIN
    FOR
      SELECT C.ID
      FROM COUNTER C
        JOIN COUNTERTYPE CT ON
          CT.ID = C.COUNTERTYPEID AND CT.AUTOCREATE = 2
        JOIN CLIENTCOUNTER CC ON
          CC.COUNTERID = C.ID AND CC.CLIENTID = NEW.ID
      INTO :TMPID
      DO
        UPDATE COUNTER SET
          CODE = NEW.CODE
        WHERE ID = :TMPID;
  END


  IF (NEW.ISFOLDER = 0 AND OLD.ISFOLDER <> 0) THEN
  BEGIN
    FOR
      SELECT CT.ID
      FROM COUNTERTYPE CT
      WHERE CT.AUTOCREATE = 2
      INTO TMPID
      DO
      BEGIN
        TCOUNTERID = NULL;
        SELECT ID FROM COUNTER WHERE CODE = NEW.CODE AND COUNTERTYPEID = :TMPID INTO TCOUNTERID;

        IF (TCOUNTERID IS NULL) THEN
        BEGIN
          TCOUNTERID = GEN_ID(GID, 1);
          INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO) VALUES (:TCOUNTERID, NEW.CODE, :TMPID, NEW.OWNERBDO);
        END

        INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID, OWNERBDO) VALUES (GEN_ID(GID, 1), :TCOUNTERID, NEW.ID, NEW.OWNERBDO);
      END
  END
  ELSE
  IF (NEW.ISFOLDER <> 0 AND OLD.ISFOLDER = 0) THEN
  FOR
    SELECT CC.COUNTERID
    FROM CLIENTCOUNTER CC
    JOIN COUNTER CO ON CO.ID = CC.COUNTERID
    JOIN COUNTERTYPE CT ON CT.ID = CO.COUNTERTYPEID AND CT.AUTOCREATE = 2
    WHERE CC.CLIENTID = OLD.ID
    INTO TMPID
    DO
      DELETE FROM COUNTER WHERE ID = :TMPID;
END
^

/* Alter Procedure... */
/* Alter (APPEND_SUPERMAG_DISC) */
ALTER PROCEDURE APPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
declare variable grpactdiscid integer;
declare variable actdiscid integer;
declare variable del integer;
declare variable discrateid integer;
declare variable conditionid integer;
declare variable whereclause varchar(255);
declare variable actdiscobjid integer;
BEGIN

  IF (IGRPACTDISCCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IGRPACTDISCCODE
    INTO GRPACTDISCID;

    IF (GRPACTDISCID IS NULL) THEN
    BEGIN
      GRPACTDISCID = GEN_ID(GID, 1);
      INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
      VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
    END

    IF (IWAREID > 0) THEN
    BEGIN
      SELECT ID, DELETED
      FROM ACTDISCOBJ
      WHERE WAREID = :IWAREID AND GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1
      INTO ACTDISCOBJID, DEL;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), :IWAREID, -1, -1, -1, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :ACTDISCOBJID;
    END
    ELSE
    BEGIN
      SELECT ID, DELETED
      FROM ACTDISCOBJ
      WHERE GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1 AND WAREID = -1
      INTO ACTDISCOBJID, DEL;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), -1, -1, -1, -1, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :ACTDISCOBJID;
    END
  END
  ELSE
    GRPACTDISCID = IGRPACTDISCID;

  IF (IAPPENDTYPE = 0) THEN   -- DiscCli
    BEGIN
      WHERECLAUSE = '';

      IF (ICARDPREFIXBEG IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG = '''|| :ICARDPREFIXBEG ||'''';

      IF (ICARDPREFIXEND IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND = '''|| :ICARDPREFIXEND ||'''';

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.CONDITIONID
                          FROM CONDITION C LEFT JOIN ACTDISC A ON
                                           C.ID = A.CONDITIONID
                          WHERE A.GRPACTDISCID = '|| :GRPACTDISCID ||' AND
                                C.SUMMBEG IS NULL AND C.TIMEBEG IS NULL '|| WHERECLAUSE ||'
                          PLAN JOIN (C INDEX (IDX_C_CARDPRBEG,IDX_C_CARDPREND),A INDEX (FK_AD_CONDITION,FK_AD_GRPACTDISC))'
      INTO :ACTDISCID, :CONDITIONID;
    END
  ELSE
    IF (IAPPENDTYPE = 1) THEN   -- CliClass

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                       C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
            C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
            C.QUANTITYBEG IS NULL
      INTO ACTDISCID, CONDITIONID;

    ELSE
      IF (IAPPENDTYPE = 2) THEN   -- DiscSumm
        BEGIN

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.SUMMBEG = :ISUMMBEG AND
                C.TIMEBEG = :ITIMEBEG AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

          IF (IDELETECURRENT = 1) THEN
            IF (ACTDISCID IS NULL) THEN
              EXIT;
            ELSE
              BEGIN
                DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                EXIT;
              END
        END
      ELSE
        IF (IAPPENDTYPE = 3) THEN   -- DiscCard

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.QUANTITYBEG = :IQUANTITYBEG    AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

        ELSE
          IF (IAPPENDTYPE = 4) THEN   -- CliSumm

            SELECT FIRST 1 A.ID, A.CONDITIONID
            FROM CONDITION C LEFT JOIN ACTDISC A ON
                             C.ID = A.CONDITIONID
            WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                  C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                  C.SUMMBEG = :ISUMMBEG             AND
                  C.TIMEBEG IS NULL
            INTO ACTDISCID, CONDITIONID;

          ELSE
            IF (IAPPENDTYPE = 5) THEN  -- PluDisc  ClasDisc

              SELECT FIRST 1 A.ID, A.CONDITIONID
              FROM CONDITION C LEFT JOIN ACTDISC A ON
                               C.ID = A.CONDITIONID
              WHERE A.GRPACTDISCID  = :GRPACTDISCID
              INTO ACTDISCID, CONDITIONID;

            ELSE
              IF (IAPPENDTYPE = 6) THEN  -- DiscSum 
                BEGIN

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                        C.SUMMRECBEG = :ISUMMRECBEG      AND
                        C.TIMEBEG = :ITIMEBEG            AND
                        C.CARDPREFIXBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                  IF (IDELETECURRENT = 1) THEN
                    IF (ACTDISCID IS NULL) THEN
                      EXIT;
                    ELSE
                    BEGIN
                      DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                      EXIT;
                    END
                END
              ELSE
                IF (IAPPENDTYPE = 7) THEN  -- CliSum 

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                        C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                        C.SUMMRECBEG = :ISUMMRECBEG       AND
                        C.TIMEBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                ELSE
                  BEGIN
                    ERRORCODE = 90; --  IAPPENDTYPE
                    EXIT;
                  END

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, NULL, NULL, NULL, NULL, NULL, NULL,
                                    :IQUANTITYBEG, :IQUANTITYEND,  NULL, NULL, NULL, NULL,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,  NULL, NULL,
                                    :ITIMEBEG, :ITIMEEND, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, NULL, NULL,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      IF (ICODE IS NULL) THEN
      BEGIN
        SELECT FIRST 1 CODE
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        ORDER BY GRPACTDISCID DESC, CODE DESC
        INTO ICODE;

        IF (ICODE IS NULL) THEN
          ICODE = 1;
        ELSE
          ICODE = ICODE + 1;
      END

      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (GEN_ID(GID, 1), :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
       NAME = :INAME,
       CONDITIONID = :CONDITIONID,
       DISCRATEID = :DISCRATEID,
       DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* empty dependent procedure body */
/* Clear: APPENDWARE for: APPEND_WARE_DISC */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPEND_WARE_DISC) */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TID INTEGER;
BEGIN

    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, '  ', '  ',
                                     :IDISCTYPE, :IDISCVALUE, NULL, NULL, '', NULL,
                                     0, 2, 0, NULL, NULL)
          RETURNING_VALUES ERRORCODE, TDISCRATEID;

    SELECT FIRST 1 A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL
    INTO TACTDISCOBJID;

    IF (TACTDISCOBJID IS NULL) THEN
      INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                               ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                               PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
      VALUES   (GEN_ID(GID, 1), :IWAREID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                -1, :TDISCRATEID, NULL, 0);
    ELSE
      BEGIN
        UPDATE ACTDISCOBJ SET
           DISCRATEID = :TDISCRATEID,
           DELETED = 0
        WHERE ID = :TACTDISCOBJID;

        FOR SELECT A.ID
        FROM ACTDISCOBJ A JOIN DISCRATE D ON
                        D.ID = A.DISCRATEID AND D.KIND = 2
        WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
              A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
              A.ASPECTVALUE1ID IS NULL AND
              A.ASPECTVALUE2ID IS NULL AND
              A.ASPECTVALUE3ID IS NULL AND
              A.ASPECTVALUE4ID IS NULL AND
              A.ASPECTVALUE5ID IS NULL AND
              A.ID <> :TACTDISCOBJID AND DELETED >= 0
        INTO TID
        DO
          UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :TID;
      END
END
^

/* Alter (APPENDACTDISC) */
ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG NUMERIC(15,2),
IPRICEEND NUMERIC(15,2),
IQUANTITYBEG NUMERIC(15,2),
IQUANTITYEND NUMERIC(15,2),
IQUANTITYRECBEG NUMERIC(15,2),
IQUANTITYRECEND NUMERIC(15,2),
IQUANTITYWAREBEG NUMERIC(15,2),
IQUANTITYWAREEND NUMERIC(15,2),
ISUMMBEG NUMERIC(15,2),
ISUMMEND NUMERIC(15,2),
ISUMMRECBEG NUMERIC(15,2),
ISUMMRECEND NUMERIC(15,2),
ISUMMWAREBEG NUMERIC(15,2),
ISUMMWAREEND NUMERIC(15,2),
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :IGRPACTDISCCODE
  INTO GRPACTDISCID;

  IF (GRPACTDISCID IS NULL) THEN
   BEGIN
      ERRORCODE = 1;
      EXIT;
    END

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :GRPACTDISCID
  PLAN (ACTDISC INDEX (UNQ_ACTDISC))
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, :IDATEBEG, :IDATEEND,
                                    :IDAYBEG, :IDAYEND, :IPRICEBEG, :IPRICEEND,
                                    :IQUANTITYBEG, :IQUANTITYEND,
                                    :IQUANTITYRECBEG, :IQUANTITYRECEND,
                                    :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,
                                    :ISUMMWAREBEG, :ISUMMWAREEND, :ITIMEBEG, :ITIMEEND,
                                    :IWARECODE, :IWARECODETOMARK)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (IDISCRATEPARENTCODE IS NOT NULL) THEN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEPARENTCODE AND ISFOLDER > 0
      INTO IDISCRATEPARENTID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, '', 0,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE DOCODE INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;
        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;
END
^

/* Alter (APPENDCLIENT) */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,      CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE, BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,
                          WEB,     TELEPHONE, INN,      DOCUMENT, OKPO,  OKPD,     DELETED)

      VALUES (:CLIENTID, :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT,  :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE, :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,
              :IWEB,     :ITELEPHONE, :IINN,        :IDOCUMENT, :IOKPO, :IOKPD,     :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '0' AND IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;
END
^

/* empty dependent procedure body */
/* Clear: APPENDPILOT for: APPENDWARE */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE VARCHAR(20),
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IWARECODETOMARK INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPENDWARE) */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
DECLARE VARIABLE TISWARE INTEGER;
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TDELETED INTEGER;
DECLARE VARIABLE TDELETEDISWARE INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE HIERLEVEL INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE BARC VARCHAR(40);
BEGIN
  ERRORCODE = 0;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      IF (IEXCHANGEFORMAT <> 1) THEN
        BEGIN
          ERRORCODE = 8;
          EXIT;
        END
      ELSE
        IFIRSTASPECTVALUE = 0;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  HIERLEVEL = 0;
  IF (IPARENTCODE <> '') then
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (CODE = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (MARK = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
  END
  ELSE
    PARENTID = 0;
  HIERLEVEL = HIERLEVEL + 1;

  IF (IISWARE <> 1) THEN
    BEGIN
      IISWARE = -2147483647 + HIERLEVEL;
    END

  IF ((PARENTID IS NULL) OR (TISWARE > 0)) THEN
  BEGIN
    ERRORCODE = 2;
    EXIT;
  END

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  TISWARE = NULL;

  IF (IWARECODETOMARK = 0) THEN
  begin
    SELECT ID, ISWARE, DELETED
    FROM SPRT
    WHERE CODE = :ICODE
    INTO TID, TISWARE, TDELETEDISWARE;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, DELETED, ISWARE, DELETED
    FROM SPRT
    WHERE MARK = :IMARK
    INTO TID, TDELETED, TISWARE, TDELETEDISWARE;
  END

  IF ((((TISWARE > 0) AND (IISWARE <= 0)) OR
       ((TISWARE <= 0) AND (IISWARE > 0))) AND (TDELETEDISWARE >= IDELETED)) then
    EXCEPTION E_CANT_CHANGE_ISWARE;

  IF (TID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO SPRT (ID, PARENTID, CODE, MARK, NAME, TEXT, HIERLEVEL,
      MINPRICE, ECRDEVID, TAXGROUPID, RCPPRNDEVID,
      ASPECTSCHEMEID, PRICELABELID,
      MAXDISCOUNT, ISWARE, PRICE, FLAGS, LIFE, SERIES,
      CERTIFICAT, SCALELPDEVID, SCALELPWARECODE, ASPECTTYPE, QUANTITYPREC,
      SCALELPLOADED, PRICELBPRINTED, DELETED, DESCRIPTION, PICTURE, REWARDTYPE, REWARDVAL,
      ECRDEPARTMENT)
    VALUES (:ID, :PARENTID, :ICODE, :IMARK, :INAME, :ITEXT, :HIERLEVEL,
      :IMINPRICE, :ECRDEVID, :TAXGROUPID, :RCPPRNDEVID,
      :ASPECTSCHEMEID, :PRICELABELID,
      :IMAXDISCOUNT, :IISWARE, :IPRICE, :IFLAGS, :ILIFE, :ISERIES,
      :ICERTIFICAT, :SCALELPDEVID, :ISCALELPWARECODE, :IASPECTTYPE, :IQUANTITYPREC,
      :ISCALELPLOADED, :IPRICELBPRINTED, :IDELETED, :IDESCRIPTION, :IPICTURE, :IREWARDTYPE, :IREWARDVAL,
      :IECRDEPARTMENT);
    INCREMENTCODE = 1;
  END
  ELSE
  BEGIN
    ID = TID;
    IF (TDELETED = IDELETED) THEN
      UPDATE SPRT SET
        ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
        ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
        CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
                                           PRICELABELID = :PRICELABELID,
        DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
        DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
        ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
        ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
        FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
        HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
        ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
        LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
        MARK = :IMARK,                     SERIES = :ISERIES,
        MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
        MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
        NAME = :INAME
      WHERE ID = :ID;
    ELSE
      BEGIN
        UPDATE SPRT SET
          ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
          ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
          CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
          CODE = :ICODE,                     PRICELABELID = :PRICELABELID,
          DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
          DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
          ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
          ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
          FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
          HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
          ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
          LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
          MARK = :IMARK,                     SERIES = :ISERIES,
          MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
          MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
          NAME = :INAME
        WHERE ID = :ID;
        INCREMENTCODE = 1;
      END
  END

  IF (IISWARE = 1) THEN
  BEGIN
    EXECUTE PROCEDURE APPENDREMAINBYWAREID (:ID, :IFIRSTASPECTVALUE, :ASPECTSCHEMEID, :IREMAIN, :IDELETEDREMAIN, :IDELETEDASPECT, :IADDREPLACE)
      RETURNING_VALUES ERRORCODE;

    IF (ERRORCODE > 0) THEN
      EXIT;

    WHILE (IBARCODES <> '') DO
    BEGIN
      BARC = EXTRACTSTR(IBARCODES, ',');

      EXECUTE PROCEDURE APPENDBARCODEBYWAREID (:BARC, :ID, 0, 0, 0, 0, 0, :IFACTOR, 0, :IDELETEDBARCODE)
        RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;

      IBARCODES = PCOPY(IBARCODES, LEN(BARC) + 1, LEN(IBARCODES) - LEN(BARC) - 1);
    END
  END

  IF (ILOADWAREDISC = 1 AND IDISCOUNTVALUE <> '0' AND IDISCOUNTVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPEND_WARE_DISC(:ID, :IDISCOUNTTYPE, :IDISCOUNTVALUE, :IDISCRATEPARENTID)
            RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;
    END

  IF (ILOADWAREDISC = 1 AND TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :ID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID,
          DELETED = 0
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :ID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
END
^

/* Restore proc. body: APPENDPILOT */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE VARCHAR(20),
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IWARECODETOMARK INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE SPRTCODE INTEGER;
DECLARE VARIABLE SPRTMARK VARCHAR(20);
DECLARE VARIABLE DORMANTVAR INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IWARECODETOMARK = 0) THEN
        BEGIN
          SPRTCODE = :ICODE;
          SPRTMARK = '';
        END
      ELSE
        BEGIN
          SPRTCODE = :ICODE;
          SPRTMARK = :ICODE;
        END

      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:SPRTCODE, NULL, :INAME, :INAME, :SPRTMARK, NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, :IWARECODETOMARK, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            IF (IWARECODETOMARK = 0) THEN
              BEGIN
                SELECT ID
                FROM SPRT
                WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
                INTO MAINID;
              END
            ELSE
              BEGIN
                SELECT FIRST 1 ID
                FROM SPRT
                WHERE MARK = :ICODE AND DELETED = :DELETEDSPRT
                INTO MAINID;
              END
            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:SPRTCODE, NULL, :INAME, :INAME, :SPRTMARK, NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, :IWARECODETOMARK, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:SPRTCODE, NULL, :INAME, :INAME, :SPRTMARK, NULL, NULL, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, :IWARECODETOMARK, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

SET TERM ; ^

ALTER TABLE CLIENTCARD ALTER COLUMN ID POSITION 1;

ALTER TABLE CLIENTCARD ALTER COLUMN CLIENTID POSITION 2;

ALTER TABLE CLIENTCARD ALTER COLUMN CCARDID POSITION 3;

ALTER TABLE CLIENTCARD ALTER COLUMN CHNG POSITION 4;

ALTER TABLE CLIENTCARD ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE CLIENTCARD ALTER COLUMN OWNERBDO POSITION 6;

ALTER TABLE CLIENTCARD ALTER COLUMN DELETED POSITION 7;

ALTER TABLE PROFILE ALTER COLUMN ID POSITION 1;

ALTER TABLE PROFILE ALTER COLUMN CODE POSITION 2;

ALTER TABLE PROFILE ALTER COLUMN NAME POSITION 3;

ALTER TABLE PROFILE ALTER COLUMN DELETED POSITION 4;

ALTER TABLE PROFILE ALTER COLUMN BASE POSITION 5;

ALTER TABLE PROFILE ALTER COLUMN BDOCODE POSITION 6;

ALTER TABLE PROFILE ALTER COLUMN CHNG POSITION 7;

ALTER TABLE PROFILE ALTER COLUMN OWNERBDO POSITION 8;

ALTER TABLE PROFILE ALTER COLUMN SKIPMODE POSITION 9;

ALTER TABLE "USER" ALTER COLUMN ID POSITION 1;

ALTER TABLE "USER" ALTER COLUMN CODE POSITION 2;

ALTER TABLE "USER" ALTER COLUMN NAME POSITION 3;

ALTER TABLE "USER" ALTER COLUMN TEXT POSITION 4;

ALTER TABLE "USER" ALTER COLUMN PROFILEID POSITION 5;

ALTER TABLE "USER" ALTER COLUMN PSWRD POSITION 6;

ALTER TABLE "USER" ALTER COLUMN CARD POSITION 7;

ALTER TABLE "USER" ALTER COLUMN FINGER POSITION 8;

ALTER TABLE "USER" ALTER COLUMN DELETED POSITION 9;

ALTER TABLE "USER" ALTER COLUMN BDOCODE POSITION 10;

ALTER TABLE "USER" ALTER COLUMN CHNG POSITION 11;

ALTER TABLE "USER" ALTER COLUMN OWNERBDO POSITION 12;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$BACKUP_HISTORY TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$BACKUP_HISTORY FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$CHARACTER_SETS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$CHARACTER_SETS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$CHECK_CONSTRAINTS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$CHECK_CONSTRAINTS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$COLLATIONS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$COLLATIONS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$DATABASE TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$DATABASE FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$DEPENDENCIES TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$DEPENDENCIES FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$EXCEPTIONS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$EXCEPTIONS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$FIELD_DIMENSIONS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$FIELD_DIMENSIONS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$FIELDS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$FIELDS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$FILES TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$FILES FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$FILTERS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$FILTERS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$FORMATS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$FORMATS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$FUNCTION_ARGUMENTS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$FUNCTION_ARGUMENTS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$FUNCTIONS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$FUNCTIONS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$GENERATORS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$GENERATORS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$INDEX_SEGMENTS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$INDEX_SEGMENTS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$INDICES TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$INDICES FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$LOG_FILES TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$LOG_FILES FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$PAGES TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$PAGES FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$PROCEDURE_PARAMETERS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$PROCEDURE_PARAMETERS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$PROCEDURES TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$PROCEDURES FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$REF_CONSTRAINTS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$REF_CONSTRAINTS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$RELATION_CONSTRAINTS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$RELATION_CONSTRAINTS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$RELATION_FIELDS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$RELATION_FIELDS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$RELATIONS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$RELATIONS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$ROLES TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$ROLES FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$SECURITY_CLASSES TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$SECURITY_CLASSES FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$TRANSACTIONS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$TRANSACTIONS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$TRIGGER_MESSAGES TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$TRIGGER_MESSAGES FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$TRIGGERS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$TRIGGERS FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$TYPES TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$TYPES FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$USER_PRIVILEGES TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$USER_PRIVILEGES FROM PUBLIC;

/* DROP: -- GRANT SELECT, REFERENCES ON RDB$VIEW_RELATIONS TO PUBLIC */
REVOKE SELECT, REFERENCES ON RDB$VIEW_RELATIONS FROM PUBLIC;

/* Create(Add) Crant */
GRANT SELECT ON RDB$ROLES TO PUBLIC;

/* TEXT BLOCK END */

/* Convert 4.7.4 */

ALTER TABLE DOCKINDRECTMPL ADD ACT FINT;

ALTER TABLE DOCKINDRECTMPL ADD TARGET FINT;

ALTER TABLE DOCKINDTMPL ADD OPERATION FINT;

ALTER TABLE DOCKINDTMPL ADD ACT FINT;

ALTER TABLE DOCTEMPLATE ADD TEMPLATETYPE FVARCHAR100 COLLATE WIN1251;

ALTER TABLE RCPPRNDEV ADD PRNPRECHQ FLAG;

ALTER TABLE RCPPRNDEV ADD PRNCOPY FLAG;

ALTER TABLE RECTEMPLATE ADD PRINTDEVICE FINT;

ALTER TABLE RECTEMPLATE ADD TEMPLATETYPE FVARCHAR100;

ALTER TABLE RMK ADD EXITONEXCH FINT;

/* MAN */

/*    */
  UPDATE RECTEMPLATE SET PRINTDEVICE = 0, TEMPLATETYPE = '';
  UPDATE DOCTEMPLATE SET TEMPLATETYPE = '';

/*       .   4.7.5 () */
INSERT INTO RECTEMPLATE (ID, CODE, NAME, DATA, PRINTDEVICE)
SELECT GEN_ID(GID, 1), COALESCE(MAX(CODE), 0) + 1, '',
'// 
function PrintHeader(PO, RO)
{
  //      
  PO.FontIndex = 1;

  // ,  
  PO.FontDblHeight = 1;
  PO.FontNegative = 1;
  PO.PrintCenterString(" " + RO.ReceiptNo + " " + PO.DeviceName, " ");
  PO.FontDblHeight = 0;
  PO.FontNegative = 0;

  //  
  PO.FontDblHeight = 1;
  PO.FontDblWidth = 1;
  PO.FontBold = 1;
  PO.Alignment = 1;
  for (RO.Aspect.Index = 1;
       RO.Aspect.Index <=
       RO.Aspect.Count;
       RO.Aspect.Index++)
  {
      if (RO.Aspect.Code != 0) //      
      PO.PrintString(RO.Aspect.AspectText + ": " + RO.Aspect.Text);
  }


  PO.Alignment = 0;
  PO.FontDblHeight = 0;
  PO.FontDblWidth = 0;
  PO.FontBold = 0;

  //     ""
  if (RO.NotificationBarcode != "" )
  {
    PO.PrintCenterString("   ", " ");
    PO.Alignment = 1;
    PO.PrintBarcode(RO.NotificationBarcode, 0, 200, 200);
  }


  //  ,     
  PO.PrintLRString(RO.OpenSellerName, RO.DateOpen + " " + RO.TimeOpen, " ");

  //     
  if (RO.HallCode != 0)
  {
     if (RO.HallText == "")
       s1 = RO.HallName;
     else
       s1 = RO.HallText;
     if (RO.HallPlaceText == "")
       s2 = RO.HallPlaceName;
     else
       s2 = RO.HallPlaceText;
     PO.PrintLRStringLF(RO.HallCode + ". " + s1, RO.HallPlaceCode + ". " + s2, " ");
  }

  // 
  PO.FontBold = 1;
  PO.PrintLRString(" ", "-", " ");
  PO.FontBold = 0;
}

// 

function PrintPosition(PO, RO)
{
  //, , 
  if (RO.Pos.RcpPrnQuantity < 0)
    PO.FontBold = 1;
  else
    PO.FontBold = 0;

  if (RO.Pos.Number > 0)
    s1 = RO.Pos.Number + ". ";
  else
    s1 = "";
  PO.PrintLRString(RO.Pos.CookOrder + ") " + s1 + RO.Pos.WareText, RO.Pos.FracSale?PO.FormatQuantity(RO.Pos.RcpPrnQuantity):RO.Pos.RcpPrnQuantity, " ");
  //  
  for (RO.Pos.Aspect.Index = 1;
       RO.Pos.Aspect.Index <=
       RO.Pos.Aspect.Count;
       RO.Pos.Aspect.Index++)
  {
    if (RO.Pos.Aspect.Code != 0)
      PO.PrintString("    " + RO.Pos.Aspect.AspectText + ": " + RO.Pos.Aspect.Text);
  }

  //     ""

  if (RO.Pos.NotificationBarcode != "" )
  {
    PO.PrintCenterString("   ", " ");
    PO.Alignment = 1;
    PO.PrintBarcode(RO.Pos.NotificationBarcode, 0, 200, 200);
  }
  PO.Alignment = 0;
}


// 

function PrintFooter(PO, RO)
{
  PO.PrintLRStringLF("-","-","-");
}', 1
FROM RECTEMPLATE;

/*        */
  UPDATE DOCKINDRECTMPL SET
    TARGET = IIF(OPERATION IN (0, 1, 3, 4, 5), 0, 1),
    ACT = CASE OPERATION
          WHEN 0 THEN 0
          WHEN 1 THEN 1
      WHEN 2 THEN 1
      WHEN 3 THEN 1
      WHEN 4 THEN 1
      WHEN 5 THEN 3
          END;

  UPDATE DOCKINDRECTMPL SET
    OPERATION = CASE OPERATION
          WHEN 0 THEN 0
          WHEN 1 THEN 1
      WHEN 2 THEN 1
      WHEN 3 THEN 3
      WHEN 4 THEN 4
      WHEN 5 THEN 5
          END;

  COMMIT;

/*    .   */

  INSERT INTO DOCKINDRECTMPL
  (CODE, COPYCOUNT, OPERATION, ACT, TARGET,DOCKINDID, RECTMPLID, ID, DOCORIENTATION)
  SELECT
    COALESCE((SELECT MAX(CODE) + 1 FROM DOCKINDRECTMPL WHERE DOCKINDID = D.DOCKINDID), 1),
    COPYCOUNT,
    0,
    D.ACT,
    D.TARGET,
    DOCKINDID,
    RECTMPLID,
    GEN_ID(GID, 1),
    DOCORIENTATION
  FROM DOCKINDRECTMPL D WHERE ((OPERATION = 1 AND TARGET = 0 AND ACT = 1) OR (OPERATION = 1 AND TARGET = 1 AND ACT = 1)) AND COPYCOUNT IS NOT NULL ;

/*        */

  INSERT INTO DOCKINDRECTMPL
  (CODE, COPYCOUNT, OPERATION, ACT, TARGET, DOCKINDID, RECTMPLID, ID, DOCORIENTATION, OWNERBDO)
  SELECT
    COALESCE((SELECT MAX(CODE) + 1 FROM DOCKINDRECTMPL WHERE DOCKINDID = D.ID), 1),
    1,
    R.OP,
    2,
    NULL,
    D.ID,
    (SELECT FIRST 1 ID FROM RECTEMPLATE WHERE PRINTDEVICE = 1), /*   ID     () */
    GEN_ID(GID, 1),
    0,
    D.OWNERBDO
  FROM DOCKIND D
  CROSS JOIN (
    SELECT 0 AS OP FROM RDB$DATABASE
    UNION SELECT 4 AS OP FROM RDB$DATABASE) AS R
  WHERE D.PRINTONRCP <> 0;

  INSERT INTO DOCKINDRECTMPL
  (CODE, COPYCOUNT, OPERATION, ACT, TARGET, DOCKINDID, RECTMPLID, ID, DOCORIENTATION, OWNERBDO)
  SELECT
    COALESCE((SELECT MAX(CODE) + 1 FROM DOCKINDRECTMPL WHERE DOCKINDID = D.ID), 1),
    1,
    2,
    2,
    NULL,
    D.ID,
    (SELECT FIRST 1 ID FROM RECTEMPLATE WHERE PRINTDEVICE = 1), /*   ID     () */
    GEN_ID(GID, 1),
    0,
    D.OWNERBDO
  FROM DOCKIND D
  WHERE D.ECRRECEIPTTYPE IN (0, 1, 2, 3, 6)
    AND EXISTS(SELECT 1 FROM RMK WHERE RMKVERSION IN (12, 14, 17, 18)) /*      . 4.7.6 () */
    AND NOT EXISTS(SELECT 1 FROM SYNCBASE WHERE PARENTID = (SELECT ID FROM SYNCBASE WHERE CODE = (SELECT BDOCODE FROM CUSTOMDB))); /*     . 4.7.6 () */

/*     .   win- */

  INSERT INTO DOCKINDTMPL
  (ID, CODE, COPYCOUNT, OPERATION, ACT, DOCKINDID, DOCTEMPLID, PREVIEW)
  SELECT
    GEN_ID(GID, 1),
    COALESCE((SELECT MAX(CODE) + 1 FROM DOCKINDTMPL WHERE DOCKINDID = D.DOCKINDID), 1),
    COPYCOUNT,
    0,
    1,
    D.DOCKINDID,
    D.DOCTEMPLID,
    D.PREVIEW
  FROM DOCKINDTMPL D WHERE COPYCOUNT IS NOT NULL AND OPERATION IS NULL;

  UPDATE DOCKINDTMPL SET OPERATION = 1, ACT = 1 WHERE OPERATION IS NULL;

  COMMIT;

/*     ID,  8942 */

CREATE PROCEDURE TMP_FIX_NEGID
AS
DECLARE VARIABLE TABLENAME VARCHAR(100);
BEGIN
  FOR SELECT R.RDB$RELATION_NAME
  FROM RDB$RELATIONS R
  JOIN RDB$RELATION_FIELDS RF ON RF.RDB$RELATION_NAME = R.RDB$RELATION_NAME
  WHERE
    R.RDB$SYSTEM_FLAG = 0 AND
    R.RDB$VIEW_SOURCE IS NULL AND
    RF.RDB$FIELD_NAME = 'ID' AND
    RF.RDB$FIELD_SOURCE = 'FID64'
  INTO TABLENAME
  DO
    EXECUTE STATEMENT 'DELETE FROM ' || :TABLENAME || ' WHERE ID < 0';
  DELETE FROM IDCOR WHERE IDINT < 0 OR IDEXT < 0;
END;

EXECUTE PROCEDURE TMP_FIX_NEGID;

DROP PROCEDURE TMP_FIX_NEGID;

COMMIT;

/* MAN */

/* Drop table-fields... */
ALTER TABLE DOCKIND DROP PRINTONRCP;

/* Empty SYNC_RCPPRNDEV for drop RCPPRNDEV(FONTINDEX) */
SET TERM ^ ;

ALTER PROCEDURE SYNC_RCPPRNDEV(IBEEPCOUNT INTEGER,
IDEVICEID INTEGER,
IFONTINDEX INTEGER)
 AS
 BEGIN EXIT; END
^

SET TERM ; ^

DROP VIEW RCPPRNDEV_V;

ALTER TABLE RCPPRNDEV DROP FONTINDEX;


/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE APPENDDISCELEMS(ISMSDISCID INTEGER,
IDATEBEG DATE,
ITIMEBEG TIME,
IDATEEND DATE,
ITIMEEND TIME,
IDELETED INTEGER,
ILOADKIND INTEGER,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IDEL INTEGER)
 AS
 BEGIN EXIT; END
^


/* Create Views... */
/* Create view: RCPPRNDEV_V (ViwData.CreateDependDef) */
SET TERM ; ^

CREATE VIEW RCPPRNDEV_V(
ID,
CODE,
BUSY,
ISFOLDER,
NAME,
PARENTID,
TEXT,
BEEPCOUNT)
 AS 
SELECT D.ID, D.CODE, D.BUSY, D.ISFOLDER, D.NAME, D.PARENTID,
  D.TEXT, P.BEEPCOUNT
FROM DEVICES D JOIN RCPPRNDEV P ON D.ID = P.DEVICEID
WHERE D.TYPEDEV = 9;
;


/* Alter Procedure... */
/* Alter (APPEND_SUPERMAG_DISC) */
SET TERM ^ ;

ALTER PROCEDURE APPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
declare variable grpactdiscid integer;
declare variable actdiscid integer;
declare variable del integer;
declare variable discrateid integer;
declare variable conditionid integer;
declare variable whereclause varchar(255);
declare variable actdiscobjid integer;
BEGIN

  IF (IGRPACTDISCCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IGRPACTDISCCODE
    INTO GRPACTDISCID;

    IF (GRPACTDISCID IS NULL) THEN
    BEGIN
      GRPACTDISCID = GEN_ID(GID, 1);
      INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
      VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
    END
    ELSE
      UPDATE GRPACTDISC SET
        DELETED = :IDELETED
      WHERE ID = :GRPACTDISCID;

    IF (IWAREID > 0) THEN
    BEGIN
      SELECT ID, DELETED
      FROM ACTDISCOBJ
      WHERE WAREID = :IWAREID AND GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1
      INTO ACTDISCOBJID, DEL;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), :IWAREID, -1, -1, -1, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :ACTDISCOBJID;
    END
    ELSE
    BEGIN
      SELECT ID, DELETED
      FROM ACTDISCOBJ
      WHERE GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1 AND WAREID = -1
      INTO ACTDISCOBJID, DEL;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), -1, -1, -1, -1, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :ACTDISCOBJID;
    END
  END
  ELSE
    GRPACTDISCID = IGRPACTDISCID;

  IF (IAPPENDTYPE = 0) THEN   -- DiscCli
    BEGIN
      WHERECLAUSE = '';

      IF (ICARDPREFIXBEG IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG = '''|| :ICARDPREFIXBEG ||'''';

      IF (ICARDPREFIXEND IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND = '''|| :ICARDPREFIXEND ||'''';

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.CONDITIONID
                          FROM CONDITION C LEFT JOIN ACTDISC A ON
                                           C.ID = A.CONDITIONID
                          WHERE A.GRPACTDISCID = '|| :GRPACTDISCID ||' AND
                                C.SUMMBEG IS NULL '|| WHERECLAUSE ||'
                          PLAN JOIN (C INDEX (IDX_C_CARDPRBEG,IDX_C_CARDPREND),A INDEX (FK_AD_CONDITION,FK_AD_GRPACTDISC))'
      INTO :ACTDISCID, :CONDITIONID;
    END
  ELSE
    IF (IAPPENDTYPE = 1) THEN   -- CliClass

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                       C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
            C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
            C.QUANTITYBEG IS NULL
      INTO ACTDISCID, CONDITIONID;

    ELSE
      IF (IAPPENDTYPE = 2) THEN   -- DiscSumm
        BEGIN

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.SUMMBEG = :ISUMMBEG AND
                C.TIMEBEG = :ITIMEBEG AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

          IF (IDELETECURRENT = 1) THEN
            IF (ACTDISCID IS NULL) THEN
              EXIT;
            ELSE
              BEGIN
                DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                EXIT;
              END
        END
      ELSE
        IF (IAPPENDTYPE = 3) THEN   -- DiscCard

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.QUANTITYBEG = :IQUANTITYBEG    AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

        ELSE
          IF (IAPPENDTYPE = 4) THEN   -- CliSumm

            SELECT FIRST 1 A.ID, A.CONDITIONID
            FROM CONDITION C LEFT JOIN ACTDISC A ON
                             C.ID = A.CONDITIONID
            WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                  C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                  C.SUMMBEG = :ISUMMBEG             AND
                  C.TIMEBEG IS NULL
            INTO ACTDISCID, CONDITIONID;

          ELSE
            IF (IAPPENDTYPE = 5) THEN  -- PluDisc  ClasDisc

              SELECT FIRST 1 A.ID, A.CONDITIONID
              FROM CONDITION C LEFT JOIN ACTDISC A ON
                               C.ID = A.CONDITIONID
              WHERE A.GRPACTDISCID  = :GRPACTDISCID
              INTO ACTDISCID, CONDITIONID;

            ELSE
              IF (IAPPENDTYPE = 6) THEN  -- DiscSum 
                BEGIN

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                        C.SUMMRECBEG = :ISUMMRECBEG      AND
                        C.TIMEBEG = :ITIMEBEG            AND
                        C.CARDPREFIXBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                  IF (IDELETECURRENT = 1) THEN
                    IF (ACTDISCID IS NULL) THEN
                      EXIT;
                    ELSE
                    BEGIN
                      DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                      EXIT;
                    END
                END
              ELSE
                IF (IAPPENDTYPE = 7) THEN  -- CliSum 

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                        C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                        C.SUMMRECBEG = :ISUMMRECBEG
                  INTO ACTDISCID, CONDITIONID;

                ELSE
                  BEGIN
                    ERRORCODE = 90; --  IAPPENDTYPE
                    EXIT;
                  END

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, NULL, NULL, NULL, NULL, NULL, NULL,
                                    :IQUANTITYBEG, :IQUANTITYEND,  NULL, NULL, NULL, NULL,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,  NULL, NULL,
                                    :ITIMEBEG, :ITIMEEND, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, NULL, NULL,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      IF (ICODE IS NULL) THEN
      BEGIN
        SELECT FIRST 1 CODE
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        ORDER BY GRPACTDISCID DESC, CODE DESC
        INTO ICODE;

        IF (ICODE IS NULL) THEN
          ICODE = 1;
        ELSE
          ICODE = ICODE + 1;
      END

      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (GEN_ID(GID, 1), :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
       NAME = :INAME,
       CONDITIONID = :CONDITIONID,
       DISCRATEID = :DISCRATEID,
       DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* empty dependent procedure body */
/* Clear: APPENDWARE for: APPEND_WARE_DISC */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPEND_WARE_DISC) */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TID INTEGER;
BEGIN

    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, '  ', '  ',
                                     :IDISCTYPE, :IDISCVALUE, NULL, NULL, '', NULL,
                                     0, 2, 0, NULL, NULL)
          RETURNING_VALUES ERRORCODE, TDISCRATEID;

  IF (IDISCVALUE <> '') THEN
  BEGIN
    SELECT FIRST 1 A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL
    INTO TACTDISCOBJID;

    IF (TACTDISCOBJID IS NULL) THEN
      INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                               ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                               PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
      VALUES   (GEN_ID(GID, 1), :IWAREID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                -1, :TDISCRATEID, NULL, 0);
    ELSE
    BEGIN
      UPDATE ACTDISCOBJ SET
         DISCRATEID = :TDISCRATEID,
         DELETED = 0
      WHERE ID = :TACTDISCOBJID;

      FOR SELECT A.ID
      FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
      WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
            A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
            A.ASPECTVALUE1ID IS NULL AND
            A.ASPECTVALUE2ID IS NULL AND
            A.ASPECTVALUE3ID IS NULL AND
            A.ASPECTVALUE4ID IS NULL AND
            A.ASPECTVALUE5ID IS NULL AND
            A.ID <> :TACTDISCOBJID AND DELETED >= 0
      INTO TID
      DO
        UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :TID;
    END
  END
  ELSE
  BEGIN
    FOR SELECT A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                    D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL AND
          A.DELETED >= 0
    INTO TID
    DO
      UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :TID;
  END
END
^

/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE DOCODE INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;
        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCARDFLG = 1) THEN
        FOR SELECT A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID
        DO
          UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

    IF (NOT ICOUNTERTYPE1 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE2 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;

    IF (NOT ICOUNTERTYPE3 IS NULL) THEN
      EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL)
      RETURNING_VALUES ERRORCODE;
END
^

/* Alter (APPENDCLIENT) */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,      CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE, BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,
                          WEB,     TELEPHONE, INN,      DOCUMENT, OKPO,  OKPD,     DELETED)

      VALUES (:CLIENTID, :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT,  :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE, :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,
              :IWEB,     :ITELEPHONE, :IINN,        :IDOCUMENT, :IOKPO, :IOKPD,     :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCLIENT = 1) THEN
      FOR SELECT A.ID
      FROM ACTDISCOBJ A
      WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
            A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
            A.DISCRATEID > 0
      INTO ACTDISCOBJID
      DO
        UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID)
    RETURNING_VALUES ERRORCODE;
END
^

/* Alter (APPENDPILOT) */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE DORMANTVAR INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 1535, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            SELECT ID
            FROM SPRT
            WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
            INTO MAINID;

            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

/* Alter (APPENDREMAIN) */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE WARENAME VARCHAR(100);
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCCODE INTEGER;
DECLARE VARIABLE USEREMAIN INTEGER;
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
      BEGIN
        IF (ASPCODE = 1)  THEN
          IF (IASPV1 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
            INTO AD1;
          ELSE
          BEGIN
            ERRORCODE = 10;
            EXIT;
          END

        IF (ASPCODE = 2)  THEN
          IF (IASPV2 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
            INTO AD2;
          ELSE
          BEGIN
            ERRORCODE = 11;
            EXIT;
          END

        IF (ASPCODE = 3)  THEN
          IF (IASPV3 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
            INTO AD3;
          ELSE
          BEGIN
            ERRORCODE = 12;
            EXIT;
          END

        IF (ASPCODE = 4)  THEN
          IF (IASPV4 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
            INTO AD4;
          ELSE
          BEGIN
            ERRORCODE = 13;
            EXIT;
          END

        IF (ASPCODE = 5)  THEN
          IF (IASPV5 <> 0) THEN
            SELECT ID
            FROM ASPVALUE
            WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
            INTO AD5;
          ELSE
          BEGIN
            ERRORCODE = 14;
            EXIT;
          END
      END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR
(AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    REMAINID = GEN_ID(GID, 1);

    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, PRICE,
       DELETED, USEREMAIN)
    VALUES
      (:REMAINID, :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5,
      :IPRICE, :IDELETED, :USEREMAIN);

    IF (NOT :IREMAIN IS NULL) THEN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE <> 1) THEN
    BEGIN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 1;

      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;
    END

    UPDATE REMAIN SET
      PRICE = :IPRICE,
      DELETED = :IDELETED
    WHERE ID = :REMAINID;

    IF (NOT :IREMAIN IS NULL) THEN
    BEGIN
      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
     END

    IF (IADDREPLACE = 2) THEN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 0;
  END

  IF ((ILOADWAREDISC = 1) AND NOT IDISCOUNTVALUE IS NULL) THEN
    BEGIN
      IF (IDISCOUNTVALUE <> '') THEN
        EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       0, 2, 0, NULL, NULL)
            RETURNING_VALUES ERRORCODE, TDISCRATEID;

      WHERECLAUSE = '';

      IF (AD1 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
      ELSE
      BEGIN
        AD1 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID IS NULL ';
      END

      IF (AD2 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
      ELSE
      BEGIN
        AD2 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID IS NULL ';
      END

      IF (AD3 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
      ELSE
      BEGIN
        AD3 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID IS NULL ';
      END

      IF (AD4 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
      ELSE
      BEGIN
        AD4 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID IS NULL ';
      END

     IF (AD5 > 0) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
      ELSE
      BEGIN
        AD5 = NULL;
        WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID IS NULL ';
      END

      IF (IUSEGRPACTDISC <> 0) THEN
      BEGIN

        SELECT ID
        FROM GRPACTDISC
        WHERE CODE = :IGRPACTDISCCODE
        INTO :GRPACTDISCID;

        IF (GRPACTDISCID IS NULL) THEN
        BEGIN
          GRPACTDISCID = GEN_ID(GID, 1);
          INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
          VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
        END

        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.DELETED ' ||
                          ' FROM ACTDISCOBJ A JOIN GRPACTDISC G ON ' ||
                                          ' G.ID = A.GRPACTDISCID AND G.ID = '|| :GRPACTDISCID ||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '      A.PAYMENTID = -1 AND A.CARDID = -1 '|| WHERECLAUSE
        INTO TACTDISCOBJID, DEL;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, NULL, NULL, :GRPACTDISCID);
        ELSE
          IF (DEL < 0) THEN
            UPDATE ACTDISCOBJ SET
              DELETED = 0
            WHERE ID = :TACTDISCOBJID;

        SELECT FIRST 1 A.ID, A.CONDITIONID
        FROM CONDITION C LEFT JOIN ACTDISC A ON
                         C.ID = A.CONDITIONID
        WHERE A.GRPACTDISCID  = :GRPACTDISCID
        INTO ACTDISCID, CONDITIONID;

        EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL,
                                          NULL, NULL,  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  NULL, NULL,
                                          NULL, NULL, NULL, NULL)
        RETURNING_VALUES ERRORCODE, CONDITIONID;

       IF (ACTDISCID IS NULL) THEN
       BEGIN
         SELECT NULLTONUM(MAX(CODE)) + 1
         FROM ACTDISC
         WHERE GRPACTDISCID  = :GRPACTDISCID
         INTO ACTDISCCODE;

         INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                              CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
         VALUES     (GEN_ID(GID, 1), :ACTDISCCODE, :GRPACTDISCID, :WARENAME,
                    :CONDITIONID, :TDISCRATEID, NULL, 0, :IDELETEDACTDISC);
       END
       ELSE
         UPDATE ACTDISC SET
            NAME = :WARENAME,
            CONDITIONID = :CONDITIONID,
            DISCRATEID = :TDISCRATEID,
            DELETED = :IDELETEDACTDISC
         WHERE ID = :ACTDISCID;
      END
      ELSE
      BEGIN
        IF (IDISCOUNTVALUE <> '') THEN
        BEGIN
        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID ' ||
                          ' FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                          ' D.ID = A.DISCRATEID AND D.KIND = 2 '||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '       A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
        INTO TACTDISCOBJID;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, :TDISCRATEID, NULL, NULL);
        ELSE
          UPDATE ACTDISCOBJ SET
             DISCRATEID = :TDISCRATEID,
             DELETED = 0
          WHERE ID = :TACTDISCOBJID;
        END
        ELSE
          EXECUTE STATEMENT
          'UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID IN ' ||
          '(SELECT A.ID FROM ACTDISCOBJ A JOIN DISCRATE D ON ' ||
          '    D.ID = A.DISCRATEID AND D.KIND = 2 ' ||
          '    WHERE A.WAREID = ' || :WAREID || ' AND A.CLIENTID = -1 AND ' ||
          '          A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 ' || WHERECLAUSE || ')';
      END
    END
END
^

/* empty dependent procedure body */
/* Clear: APPENDPILOT for: APPENDWARE */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE VARCHAR(20),
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IWARECODETOMARK INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPENDWARE) */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
DECLARE VARIABLE TISWARE INTEGER;
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TDELETED INTEGER;
DECLARE VARIABLE TDELETEDISWARE INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE HIERLEVEL INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE BARC VARCHAR(40);
BEGIN
  ERRORCODE = 0;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      IF (IEXCHANGEFORMAT <> 1) THEN
        BEGIN
          ERRORCODE = 8;
          EXIT;
        END
      ELSE
        IFIRSTASPECTVALUE = 0;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  HIERLEVEL = 0;
  IF (IPARENTCODE <> '') then
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (CODE = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (MARK = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
  END
  ELSE
    PARENTID = 0;
  HIERLEVEL = HIERLEVEL + 1;

  IF (IISWARE <> 1) THEN
    BEGIN
      IISWARE = -2147483647 + HIERLEVEL;
    END

  IF ((PARENTID IS NULL) OR (TISWARE > 0)) THEN
  BEGIN
    ERRORCODE = 2;
    EXIT;
  END

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  TISWARE = NULL;

  IF (IWARECODETOMARK = 0) THEN
  begin
    SELECT ID, ISWARE, DELETED
    FROM SPRT
    WHERE CODE = :ICODE
    INTO TID, TISWARE, TDELETEDISWARE;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, DELETED, ISWARE, DELETED
    FROM SPRT
    WHERE MARK = :IMARK
    INTO TID, TDELETED, TISWARE, TDELETEDISWARE;
  END

  IF ((((TISWARE > 0) AND (IISWARE <= 0)) OR
       ((TISWARE <= 0) AND (IISWARE > 0))) AND (TDELETEDISWARE >= IDELETED)) then
    EXCEPTION E_CANT_CHANGE_ISWARE;

  IF (TID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO SPRT (ID, PARENTID, CODE, MARK, NAME, TEXT, HIERLEVEL,
      MINPRICE, ECRDEVID, TAXGROUPID, RCPPRNDEVID,
      ASPECTSCHEMEID, PRICELABELID,
      MAXDISCOUNT, ISWARE, PRICE, FLAGS, LIFE, SERIES,
      CERTIFICAT, SCALELPDEVID, SCALELPWARECODE, ASPECTTYPE, QUANTITYPREC,
      SCALELPLOADED, PRICELBPRINTED, DELETED, DESCRIPTION, PICTURE, REWARDTYPE, REWARDVAL,
      ECRDEPARTMENT)
    VALUES (:ID, :PARENTID, :ICODE, :IMARK, :INAME, :ITEXT, :HIERLEVEL,
      :IMINPRICE, :ECRDEVID, :TAXGROUPID, :RCPPRNDEVID,
      :ASPECTSCHEMEID, :PRICELABELID,
      :IMAXDISCOUNT, :IISWARE, :IPRICE, :IFLAGS, :ILIFE, :ISERIES,
      :ICERTIFICAT, :SCALELPDEVID, :ISCALELPWARECODE, :IASPECTTYPE, :IQUANTITYPREC,
      :ISCALELPLOADED, :IPRICELBPRINTED, :IDELETED, :IDESCRIPTION, :IPICTURE, :IREWARDTYPE, :IREWARDVAL,
      :IECRDEPARTMENT);
    INCREMENTCODE = 1;
  END
  ELSE
  BEGIN
    ID = TID;
    IF (TDELETED = IDELETED) THEN
      UPDATE SPRT SET
        ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
        ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
        CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
                                           PRICELABELID = :PRICELABELID,
        DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
        DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
        ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
        ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
        FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
        HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
        ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
        LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
        MARK = :IMARK,                     SERIES = :ISERIES,
        MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
        MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
        NAME = :INAME
      WHERE ID = :ID;
    ELSE
      BEGIN
        UPDATE SPRT SET
          ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
          ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
          CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
          CODE = :ICODE,                     PRICELABELID = :PRICELABELID,
          DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
          DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
          ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
          ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
          FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
          HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
          ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
          LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
          MARK = :IMARK,                     SERIES = :ISERIES,
          MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
          MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
          NAME = :INAME
        WHERE ID = :ID;
        INCREMENTCODE = 1;
      END
  END

  IF (IISWARE = 1) THEN
  BEGIN
    EXECUTE PROCEDURE APPENDREMAINBYWAREID (:ID, :IFIRSTASPECTVALUE, :ASPECTSCHEMEID, :IREMAIN, :IDELETEDREMAIN, :IDELETEDASPECT, :IADDREPLACE)
      RETURNING_VALUES ERRORCODE;

    IF (ERRORCODE > 0) THEN
      EXIT;

    WHILE (IBARCODES <> '') DO
    BEGIN
      BARC = EXTRACTSTR(IBARCODES, ',');

      EXECUTE PROCEDURE APPENDBARCODEBYWAREID (:BARC, :ID, 0, 0, 0, 0, 0, :IFACTOR, 0, :IDELETEDBARCODE)
        RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;

      IBARCODES = PCOPY(IBARCODES, LEN(BARC) + 1, LEN(IBARCODES) - LEN(BARC) - 1);
    END
  END

  IF ((ILOADWAREDISC = 1) AND NOT (IDISCRATEPARENTID IS NULL) AND NOT (IDISCOUNTVALUE IS NULL)) THEN
    BEGIN
      EXECUTE PROCEDURE APPEND_WARE_DISC(:ID, :IDISCOUNTTYPE, :IDISCOUNTVALUE, :IDISCRATEPARENTID)
            RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;
    END

  IF (ILOADWAREDISC = 1 AND TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :ID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID,
          DELETED = 0
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :ID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
END
^

/* empty dependent procedure body */
/* Clear: DEL_WARE for: DEL_WARE */
ALTER PROCEDURE DEL_WARE(WAREID INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter (DEL_WARE) */
ALTER PROCEDURE DEL_WARE(WAREID INTEGER)
 AS
declare variable isware integer;
declare variable tmp_id integer;
BEGIN
  SELECT ISWARE
  FROM SPRT
  WHERE ID = :WAREID
  INTO  ISWARE;
  DELETE FROM SPRT WHERE ID = :WAREID;
  IF (ISWARE > 0) THEN
  BEGIN
    DELETE FROM BARCODE WHERE WAREID = :WAREID;
  END
  ELSE
    FOR
      SELECT ISWARE, ID
      FROM   SPRT
      WHERE  PARENTID = :WAREID
      INTO   ISWARE, TMP_ID
      DO
        IF (ISWARE > 0) THEN
        BEGIN
          DELETE FROM BARCODE WHERE WAREID = :TMP_ID;
          DELETE FROM SPRT WHERE ID = :TMP_ID;
        END
        ELSE
          EXECUTE PROCEDURE DEL_WARE(:TMP_ID);
  DELETE FROM ACTDISCOBJ WHERE ID = :WAREID;
END
^

/* Alter (GET_OPERDAY) */
ALTER PROCEDURE GET_OPERDAY(DATE1 DATE,
DATE2 DATE,
POSNUMBER INTEGER)
 RETURNS(TRANZ1 INTEGER,
TRANZ2 INTEGER)
 AS
DECLARE VARIABLE TMPC1 INTEGER;
DECLARE VARIABLE TMPT INTEGER;
DECLARE VARIABLE D1 DATE;
BEGIN

/*   " " -   , 
        (   )*/

  TRANZ1 = 0;
  TRANZ2 = 0;

  SELECT MIN(TRANZCOUNT)
  FROM TRANZT T
  WHERE T.POSNUMBER = :POSNUMBER
  INTO TMPC1;

  SELECT MIN(TRANZDATE)
  FROM TRANZT T
  WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT = :TMPC1
  INTO  D1;

  IF (D1 >= DATE1) THEN
    TRANZ1 = TMPC1;
    ELSE
    BEGIN
      SELECT MIN(T.TRANZCOUNT)
      FROM TRANZT T, TRANZT TT, DOCUMENT D
      WHERE T.POSNUMBER = :POSNUMBER AND TT.POSNUMBER = :POSNUMBER AND
        T.TRANZCOUNT = TT.TRANZCOUNT + 1 AND TT.TRANZTYPE = 61 AND
        D.ID = T.DOCUMENTID AND D.STATE IN (1, 2) AND
        D.CLOSEDATE BETWEEN :DATE1 AND :DATE2
      INTO TRANZ1;
    END

  IF (TRANZ1 IS NULL) THEN
    EXIT;

  TMPC1 = NULL;
  SELECT MAX(TRANZCOUNT)
  FROM TRANZT T, DOCUMENT D
  WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT >= :TRANZ1 AND D.ID = T.DOCUMENTID AND
    D.CLOSEDATE <= :DATE2 AND D.STATE IN (1, 2)
  INTO TMPC1;

  SELECT TRANZTYPE
  FROM   TRANZT T
  WHERE  T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT = :TMPC1
  INTO   TMPT;

  IF (TMPT = 61) THEN
    TRANZ2 = TMPC1;
    ELSE
    BEGIN
      TRANZ2 = NULL;
      SELECT MIN(TRANZCOUNT)
      FROM TRANZT T
      WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT > :TMPC1 AND
        T.TRANZTYPE = 61
      INTO TRANZ2;

      IF (TRANZ2 IS NULL) THEN
        SELECT MAX(TRANZCOUNT)
        FROM TRANZT T
        WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT < :TMPC1 AND
          T.TRANZTYPE = 61
        INTO TRANZ2;
    END
END
^

/* Alter (SYNC_RCPPRNDEV) */
ALTER PROCEDURE SYNC_RCPPRNDEV(IBEEPCOUNT INTEGER,
IDEVICEID INTEGER,
IPRNCOPY INTEGER,
IPRNPRECHQ INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  SELECT FIRST 1 ID FROM RCPPRNDEV
  WHERE
    DEVICEID = :IDEVICEID
  INTO ID;
  IF (ID IS NULL) THEN
    INSERT INTO RCPPRNDEV
     (
      BEEPCOUNT,
      DEVICEID,
      PRNCOPY,
      PRNPRECHQ,
      ID
      )
    VALUES(
      :IBEEPCOUNT,
      :IDEVICEID,
      :IPRNCOPY,
      :IPRNPRECHQ,
      GEN_ID(GID, 1)
    );
  ELSE
    UPDATE RCPPRNDEV SET
      BEEPCOUNT = :IBEEPCOUNT,
      DEVICEID = :IDEVICEID,
      PRNCOPY = :IPRNCOPY,
      PRNPRECHQ = :IPRNPRECHQ
    WHERE 
      ID = :ID;
END
^

/* Restore proc. body: APPENDDISCELEMS */
ALTER PROCEDURE APPENDDISCELEMS(ISMSDISCID INTEGER,
IDATEBEG DATE,
ITIMEBEG TIME,
IDATEEND DATE,
ITIMEEND TIME,
IDELETED INTEGER,
ILOADKIND INTEGER,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IDEL INTEGER)
 AS
declare variable vconditionid integer;
BEGIN
  IF ((:IDEL = 1) AND (:ILOADKIND = 1)) THEN
  BEGIN
    DELETE FROM ACTDISCOBJ WHERE GRPACTDISCID = (SELECT ID FROM GRPACTDISC WHERE CODE = :ISMSDISCID);
    DELETE FROM GRPACTDISC WHERE CODE = :ISMSDISCID;
    EXIT;
  END
  FOR
   SELECT CONDITIONID
   FROM ACTDISC
   WHERE GRPACTDISCID = (SELECT ID FROM GRPACTDISC WHERE CODE = :ISMSDISCID)
   INTO :VCONDITIONID
  DO
  BEGIN
    UPDATE CONDITION SET
      DATEBEG = :IDATEBEG,
      TIMEBEG = :ITIMEBEG,
      DATEEND = :IDATEEND,
      TIMEEND = :ITIMEEND,
      DAYBEG  = :IDAYBEG,
      DAYEND  = :IDAYEND
    WHERE ID  = :VCONDITIONID;
  END
END
^

/* Restore proc. body: APPENDPILOT */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE DORMANTVAR INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 1535, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            SELECT ID
            FROM SPRT
            WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
            INTO MAINID;

            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_PAYMENT
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
  IF (NEW.PAYCARDDEVID = -1) THEN
    NEW.PAYCARDDEVID = OLD.PAYCARDDEVID;
END
^

/* Alter Procedure... */
/* Alter (APPENDPILOT) */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE DORMANTVAR INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 1535, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            SELECT ID
            FROM SPRT
            WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
            INTO MAINID;

            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

SET TERM ; ^

ALTER TABLE DOCKIND ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCKIND ALTER COLUMN CODE POSITION 2;

ALTER TABLE DOCKIND ALTER COLUMN NAME POSITION 3;

ALTER TABLE DOCKIND ALTER COLUMN TEXT POSITION 4;

ALTER TABLE DOCKIND ALTER COLUMN IDENTIF POSITION 5;

ALTER TABLE DOCKIND ALTER COLUMN ECRRECEIPTTYPE POSITION 6;

ALTER TABLE DOCKIND ALTER COLUMN REMAINOPERATION POSITION 7;

ALTER TABLE DOCKIND ALTER COLUMN ASKCOMMENT POSITION 8;

ALTER TABLE DOCKIND ALTER COLUMN BDOCODE POSITION 9;

ALTER TABLE DOCKIND ALTER COLUMN CHNG POSITION 10;

ALTER TABLE DOCKIND ALTER COLUMN OWNERBDO POSITION 11;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN CODE POSITION 2;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN DOCKINDID POSITION 3;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN RECTMPLID POSITION 4;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN COPYCOUNT POSITION 5;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN OPERATION POSITION 6;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN DOCORIENTATION POSITION 7;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN BDOCODE POSITION 8;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN CHNG POSITION 9;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN OWNERBDO POSITION 10;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN ACT POSITION 11;

ALTER TABLE DOCKINDRECTMPL ALTER COLUMN TARGET POSITION 12;

ALTER TABLE DOCKINDTMPL ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCKINDTMPL ALTER COLUMN CODE POSITION 2;

ALTER TABLE DOCKINDTMPL ALTER COLUMN DOCKINDID POSITION 3;

ALTER TABLE DOCKINDTMPL ALTER COLUMN DOCTEMPLID POSITION 4;

ALTER TABLE DOCKINDTMPL ALTER COLUMN PREVIEW POSITION 5;

ALTER TABLE DOCKINDTMPL ALTER COLUMN COPYCOUNT POSITION 6;

ALTER TABLE DOCKINDTMPL ALTER COLUMN BDOCODE POSITION 7;

ALTER TABLE DOCKINDTMPL ALTER COLUMN CHNG POSITION 8;

ALTER TABLE DOCKINDTMPL ALTER COLUMN OWNERBDO POSITION 9;

ALTER TABLE DOCKINDTMPL ALTER COLUMN OPERATION POSITION 10;

ALTER TABLE DOCKINDTMPL ALTER COLUMN ACT POSITION 11;

ALTER TABLE DOCTEMPLATE ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCTEMPLATE ALTER COLUMN CODE POSITION 2;

ALTER TABLE DOCTEMPLATE ALTER COLUMN NAME POSITION 3;

ALTER TABLE DOCTEMPLATE ALTER COLUMN DATA POSITION 4;

ALTER TABLE DOCTEMPLATE ALTER COLUMN MINLINES POSITION 5;

ALTER TABLE DOCTEMPLATE ALTER COLUMN MAXLINES POSITION 6;

ALTER TABLE DOCTEMPLATE ALTER COLUMN BDOCODE POSITION 7;

ALTER TABLE DOCTEMPLATE ALTER COLUMN CHNG POSITION 8;

ALTER TABLE DOCTEMPLATE ALTER COLUMN OWNERBDO POSITION 9;

ALTER TABLE DOCTEMPLATE ALTER COLUMN TEMPLATETYPE POSITION 10;

ALTER TABLE RCPPRNDEV ALTER COLUMN ID POSITION 1;

ALTER TABLE RCPPRNDEV ALTER COLUMN BEEPCOUNT POSITION 2;

ALTER TABLE RCPPRNDEV ALTER COLUMN DEVICEID POSITION 3;

ALTER TABLE RCPPRNDEV ALTER COLUMN PRNPRECHQ POSITION 4;

ALTER TABLE RCPPRNDEV ALTER COLUMN PRNCOPY POSITION 5;

ALTER TABLE RECTEMPLATE ALTER COLUMN ID POSITION 1;

ALTER TABLE RECTEMPLATE ALTER COLUMN CODE POSITION 2;

ALTER TABLE RECTEMPLATE ALTER COLUMN NAME POSITION 3;

ALTER TABLE RECTEMPLATE ALTER COLUMN DATA POSITION 4;

ALTER TABLE RECTEMPLATE ALTER COLUMN MASTERSETTINGS POSITION 5;

ALTER TABLE RECTEMPLATE ALTER COLUMN BDOCODE POSITION 6;

ALTER TABLE RECTEMPLATE ALTER COLUMN CHNG POSITION 7;

ALTER TABLE RECTEMPLATE ALTER COLUMN OWNERBDO POSITION 8;

ALTER TABLE RECTEMPLATE ALTER COLUMN PRINTDEVICE POSITION 9;

ALTER TABLE RECTEMPLATE ALTER COLUMN TEMPLATETYPE POSITION 10;

ALTER TABLE RMK ALTER COLUMN ID POSITION 1;

ALTER TABLE RMK ALTER COLUMN CODE POSITION 2;

ALTER TABLE RMK ALTER COLUMN NAME POSITION 3;

ALTER TABLE RMK ALTER COLUMN TEXT POSITION 4;

ALTER TABLE RMK ALTER COLUMN EDUCATIONMODE POSITION 5;

ALTER TABLE RMK ALTER COLUMN RMKVERSION POSITION 6;

ALTER TABLE RMK ALTER COLUMN HALLID POSITION 7;

ALTER TABLE RMK ALTER COLUMN AUTOREGUSERID POSITION 8;

ALTER TABLE RMK ALTER COLUMN EXITONEXCH POSITION 9;

ALTER TABLE RMK ALTER COLUMN BDOCODE POSITION 10;

ALTER TABLE RMK ALTER COLUMN CHNG POSITION 11;

ALTER TABLE RMK ALTER COLUMN OWNERBDO POSITION 12;

/* Create(Add) Crant */
GRANT ALL ON RCPPRNDEV_V TO PUBLIC;

GRANT ALL ON RCPPRNDEV_V TO SYNCSRV;

GRANT ALL ON RCPPRNDEV_V TO SYSDBA WITH GRANT OPTION;

/* MAN 4.7.6. () */

UPDATE SECURITY SET SECURITY = 346 WHERE SECURITY = 309;
UPDATE SECURITY SET SECURITY = 309 WHERE SECURITY = 326;
COMMIT;

/* TEXT BLOCK END */

/* Convert 4.7.5 */

DROP PROCEDURE INSTRANZCOPY;


/* Create Table... */
CREATE TABLE DISPLAYDEV(ID FID NOT NULL,
DEVICEID RREF,
CODEPAGE FINT);


CREATE TABLE EMPLOYEE(ID FID,
CODE FINT NOT NULL,
NAME FVARCHAR100 COLLATE WIN1251,
TEXT FVARCHAR100 COLLATE WIN1251,
USERID FINT,
DELETED FLAG,
BDOCODE FINT,
CHNG FINT64,
OWNERBDO FINT,
CARD FVARCHAR255 COLLATE WIN1251);


CREATE TABLE RDNOTIFY(ID FID NOT NULL,
DOCUMENTID FRINT64 NOT NULL,
NOTIFICATIONGRP FINT,
ACT FLAG,
DEVICEID FREF,
WAREID FREF,
POSID FINT);



ALTER TABLE DOCKIND ADD ASKEMPLOYEE FLAG;

ALTER TABLE DOCKIND ADD COPYEMPLOYEE FLAG;

ALTER TABLE DOCUMENT ADD EMPLOYEECODE FINT;

ALTER TABLE DOCUMENT ADD DOCEMPLID FREF64;

ALTER TABLE DOCUMENT ADD RESERVEBEG FDATETIME;

ALTER TABLE DOCUMENT ADD RESERVEEND FDATETIME;

ALTER TABLE DOCUMENT ADD RESERVEINFO FVARCHAR255 COLLATE WIN1251;

ALTER TABLE DOCUMENT ADD RESERVEBEF FDATETIME;

ALTER TABLE RMK ADD NOTIFICATIONGRP FINT;

/* MAN */

UPDATE DOCKIND SET ASKEMPLOYEE = 0, COPYEMPLOYEE = 0;

DELETE FROM SETTINGS
WHERE OWNERBDO = 0
AND (SELECT BDOCODE FROM CUSTOMDB) <> 0;

INSERT INTO SYNCTABLE (ID, CATEG, SYNCBASEID, SYNCKIND)
SELECT GEN_ID(GID, 1), 25, ID, 0 FROM SYNCBASE;

COMMIT;

/* MAN */

/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE APPENDEMPLOYEE(ICODE INTEGER,
INAME VARCHAR(100),
IUSERCODE INTEGER,
ICARD VARCHAR(255),
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

CREATE PROCEDURE SYNC_DISPLAYDEV(IDEVICEID INTEGER,
ICODEPAGE INTEGER)
 AS
 BEGIN EXIT; END
^


/* Create index... */
SET TERM ; ^

CREATE UNIQUE INDEX UNQ_EMPLOYEE ON EMPLOYEE(CODE, DELETED);


/* Create generator... */
CREATE GENERATOR GRDNOTIFY;


/* Create Primary Key... */
ALTER TABLE DISPLAYDEV ADD CONSTRAINT PK_DISPLAYDEV PRIMARY KEY (ID);

ALTER TABLE RDNOTIFY ADD CONSTRAINT PK_RDNOTIFY PRIMARY KEY (ID);

ALTER TABLE EMPLOYEE ADD CONSTRAINT PRI_EMPLOYEE PRIMARY KEY (ID);

/* Create Foreign Key... */
RECONNECT;

ALTER TABLE DISPLAYDEV ADD CONSTRAINT FK_DISPLAYDEV_DEVICEID FOREIGN KEY (DEVICEID) REFERENCES DEVICES (ID) ON DELETE CASCADE
USING INDEX FK_DISPLAYDEV;

ALTER TABLE RDNOTIFY ADD CONSTRAINT FK_RDNOTIFY_DEVICEID FOREIGN KEY (DEVICEID) REFERENCES DEVICES (ID) ON DELETE SET NULL;

ALTER TABLE RDNOTIFY ADD CONSTRAINT FK_RDNOTIFY_DOC FOREIGN KEY (DOCUMENTID) REFERENCES DOCUMENT (ID) ON DELETE CASCADE;

/*  Empty APPENDCCARDDISCS for APPENDCOUNTERBYTYPE(param list change)  */
SET TERM ^ ;

ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/*  Empty APPENDCLIENT for APPENDCOUNTERBYTYPE(param list change)  */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure APPENDCOUNTERBYTYPE with new param-list */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER,
ICLIENTID INTEGER,
ICOUNTERCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter Procedure... */
/* empty dependent procedure body */
/* Clear: APPENDWARE for: APPEND_WARE_DISC */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPEND_WARE_DISC) */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TID INTEGER;
BEGIN

  IF (IDISCVALUE <> '') THEN
  BEGIN

    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, '  ', '  ',
                                     :IDISCTYPE, :IDISCVALUE, NULL, NULL, '', NULL,
                                     0, 2, 0, NULL, NULL)
          RETURNING_VALUES ERRORCODE, TDISCRATEID;

    SELECT FIRST 1 A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL
    INTO TACTDISCOBJID;

    IF (TACTDISCOBJID IS NULL) THEN
      INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                               ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                               PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
      VALUES   (GEN_ID(GID, 1), :IWAREID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                -1, :TDISCRATEID, NULL, 0);
    ELSE
    BEGIN
      UPDATE ACTDISCOBJ SET
         DISCRATEID = :TDISCRATEID,
         DELETED = 0
      WHERE ID = :TACTDISCOBJID;

      FOR SELECT A.ID
      FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
      WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
            A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
            A.ASPECTVALUE1ID IS NULL AND
            A.ASPECTVALUE2ID IS NULL AND
            A.ASPECTVALUE3ID IS NULL AND
            A.ASPECTVALUE4ID IS NULL AND
            A.ASPECTVALUE5ID IS NULL AND
            A.ID <> :TACTDISCOBJID AND DELETED >= 0
      INTO TID
      DO
        UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :TID;
    END
  END
  ELSE
  BEGIN
    FOR SELECT A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                    D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL AND
          A.DELETED >= 0
    INTO TID
    DO
      UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :TID;
  END
END
^

ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER,
ICLIENTID INTEGER,
ICOUNTERCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE INTEGER)
 AS
DECLARE VARIABLE COUNTERTYPEID INTEGER;
DECLARE VARIABLE COUNTERID INTEGER;
DECLARE VARIABLE CID INTEGER;
DECLARE VARIABLE ABDOCODE INTEGER;
DECLARE VARIABLE AOWNERBDO INTEGER;
DECLARE VARIABLE DELTA DOUBLE PRECISION;
BEGIN

  OCOUNTERCODE = ICOUNTERCODE;
  SELECT ID
  FROM COUNTERTYPE
  WHERE CODE = :ICOUNTERTYPE
  INTO :COUNTERTYPEID;

  SELECT BDOCODE, DBIDENT FROM CUSTOMDB INTO AOWNERBDO, ABDOCODE;

  IF (:COUNTERTYPEID IS NULL) THEN
  BEGIN
    ERRORCODE = 28;
    EXIT;
  END

  IF (ICARDID IS NOT NULL) THEN
  BEGIN
    CID = NULL;
    FOR
      SELECT C.ID
      FROM CCARDCOUNTER CC
        LEFT JOIN COUNTER C ON CC.COUNTERID = C.ID
      WHERE CC.CCARDID = :ICARDID AND C.COUNTERTYPEID = :COUNTERTYPEID
      INTO :COUNTERID
    DO
    BEGIN
      SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE = 1 INTO :DELTA;
      IF (DELTA <> 0) THEN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

      SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE <> 1 INTO :DELTA;
      IF (DELTA <> 0) THEN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 2);

      IF (CID IS NULL) THEN
      BEGIN
        IF (NULLTONUM(ICOUNTERVAL) <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        UPDATE COUNTER SET
          DATECREATE = CURRENT_DATE + CURRENT_TIME,
          BDOCODE = :ABDOCODE
        WHERE ID = :COUNTERID;
      END
      CID = 0;
    END

    IF (:CID IS NULL) THEN
    BEGIN
      COUNTERID = GEN_ID(GID, 1);

      OCOUNTERCODE = OCOUNTERCODE + 1;
      INSERT INTO COUNTER(ID, CODE, COUNTERTYPEID, BDOCODE, OWNERBDO)
      VALUES (:COUNTERID, :OCOUNTERCODE, :COUNTERTYPEID, :ABDOCODE, :AOWNERBDO);

      IF (NULLTONUM(ICOUNTERVAL) <> 0) THEN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

      INSERT INTO CCARDCOUNTER(ID, CCARDID, COUNTERID, BDOCODE, OWNERBDO)
      VALUES (GEN_ID(GID, 1), :ICARDID, :COUNTERID, :ABDOCODE, :AOWNERBDO);
    END
  END
  ELSE
    IF (ICLIENTID IS NOT NULL) THEN
    BEGIN
      CID = NULL;
      FOR
        SELECT C.ID
        FROM CLIENTCOUNTER CC
          LEFT JOIN COUNTER C ON CC.COUNTERID = C.ID
        WHERE CC.CLIENTID = :ICLIENTID AND C.COUNTERTYPEID = :COUNTERTYPEID
        INTO :COUNTERID
      DO
      BEGIN
        SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE = 1 INTO :DELTA;
        IF (DELTA <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE <> 1 INTO :DELTA;
        IF (DELTA <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE,  :AOWNERBDO, 2);

        IF (CID IS NULL) THEN
        BEGIN
          IF (NULLTONUM(:ICOUNTERVAL) <> 0) THEN
            INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
            VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

          UPDATE COUNTER SET
            DATECREATE = CURRENT_DATE + CURRENT_TIME,
            BDOCODE = :ABDOCODE
          WHERE ID = :COUNTERID;
        END
        CID = 0;
      END

      IF (:CID IS NULL) THEN
      BEGIN
        COUNTERID = GEN_ID(GID, 1);
        OCOUNTERCODE = OCOUNTERCODE + 1;
        INSERT INTO COUNTER(ID, CODE, COUNTERTYPEID, BDOCODE, OWNERBDO)
        VALUES (:COUNTERID, :OCOUNTERCODE, :COUNTERTYPEID, :ABDOCODE, :AOWNERBDO);

        IF (NULLTONUM(:ICOUNTERVAL) <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        INSERT INTO CLIENTCOUNTER(ID, CLIENTID, COUNTERID, BDOCODE, OWNERBDO)
        VALUES (GEN_ID(GID, 1), :ICLIENTID, :COUNTERID, :ABDOCODE, :AOWNERBDO);
      END
    END
END
^

/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 INTEGER,
ICOUNTERCODE2 INTEGER,
ICOUNTERCODE3 INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 INTEGER,
OCOUNTERCODE2 INTEGER,
OCOUNTERCODE3 INTEGER)
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE DOCODE INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE VAL = :ICARD
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      IF (EXISTS(SELECT 1 FROM CCARD WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID)) THEN
      BEGIN
        SELECT MAX(CODE) + 1 FROM CCARD WHERE GRPCCARDID = :GRPCARDID INTO ICARDCODE;
        IF (ICARDCODE IS NULL) THEN
          ICARDCODE = 1;
      END
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        CODE = :ICARDCODE,
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        PLAN (A INDEX (IDX_ACTDISCOBJ2))
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;

        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCARDFLG = 1) THEN
        FOR SELECT A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID
        DO
          UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL, ICOUNTERCODE1)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL, ICOUNTERCODE2)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL, ICOUNTERCODE3)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;
END
^

/* Alter (APPENDCLIENT) */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 INTEGER,
ICOUNTERCODE2 INTEGER,
ICOUNTERCODE3 INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 INTEGER,
OCOUNTERCODE2 INTEGER,
OCOUNTERCODE3 INTEGER)
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,      CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE, BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,
                          WEB,     TELEPHONE, INN,      DOCUMENT, OKPO,  OKPD,     DELETED)

      VALUES (:CLIENTID, :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT,  :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE, :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,
              :IWEB,     :ITELEPHONE, :IINN,        :IDOCUMENT, :IOKPO, :IOKPD,     :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCLIENT = 1) THEN
      FOR SELECT A.ID
      FROM ACTDISCOBJ A
      WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
            A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
            A.DISCRATEID > 0
      INTO ACTDISCOBJID
      DO
        UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID, ICOUNTERCODE1)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID, ICOUNTERCODE2)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID, ICOUNTERCODE3)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;
END
^

/* Alter (APPENDREMAIN) */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE WARENAME VARCHAR(100);
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCCODE INTEGER;
DECLARE VARIABLE USEREMAIN INTEGER;
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
    BEGIN
      IF (ASPCODE = 1)  THEN
        IF (IASPV1 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
          INTO AD1;
        ELSE
        BEGIN
          ERRORCODE = 10;
          EXIT;
        END

      IF (ASPCODE = 2)  THEN
        IF (IASPV2 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
          INTO AD2;
        ELSE
        BEGIN
          ERRORCODE = 11;
          EXIT;
        END

      IF (ASPCODE = 3)  THEN
        IF (IASPV3 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
          INTO AD3;
        ELSE
        BEGIN
          ERRORCODE = 12;
          EXIT;
        END

      IF (ASPCODE = 4)  THEN
        IF (IASPV4 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
          INTO AD4;
        ELSE
        BEGIN
          ERRORCODE = 13;
          EXIT;
        END

      IF (ASPCODE = 5)  THEN
        IF (IASPV5 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
          INTO AD5;
        ELSE
        BEGIN
          ERRORCODE = 14;
          EXIT;
        END
    END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR (AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    REMAINID = GEN_ID(GID, 1);

    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, PRICE,
       DELETED, USEREMAIN)
    VALUES
      (:REMAINID, :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5,
      :IPRICE, :IDELETED, :USEREMAIN);

    IF (NOT :IREMAIN IS NULL) THEN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE <> 1) THEN
    BEGIN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 1;

      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;
    END

    UPDATE REMAIN SET
      PRICE = :IPRICE,
      DELETED = :IDELETED
    WHERE ID = :REMAINID;

    IF (NOT :IREMAIN IS NULL) THEN
    BEGIN
      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
     END

    IF (IADDREPLACE = 2) THEN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 0;
  END

  IF ((ILOADWAREDISC = 1) AND NOT IDISCOUNTVALUE IS NULL) THEN
  BEGIN
    IF (IDISCOUNTVALUE <> '') THEN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       0, 2, 0, NULL, NULL)
      RETURNING_VALUES ERRORCODE, TDISCRATEID;

    WHERECLAUSE = '';

    IF (AD1 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
    ELSE
    BEGIN
      AD1 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID IS NULL ';
    END

    IF (AD2 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
    ELSE
    BEGIN
      AD2 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID IS NULL ';
    END

    IF (AD3 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
    ELSE
    BEGIN
      AD3 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID IS NULL ';
    END

    IF (AD4 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
    ELSE
    BEGIN
      AD4 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID IS NULL ';
    END

    IF (AD5 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
    ELSE
    BEGIN
      AD5 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID IS NULL ';
    END

    IF (IUSEGRPACTDISC <> 0) THEN
    BEGIN

      SELECT ID
      FROM GRPACTDISC
      WHERE CODE = :IGRPACTDISCCODE
      INTO :GRPACTDISCID;

      IF (GRPACTDISCID IS NULL) THEN
      BEGIN
        GRPACTDISCID = GEN_ID(GID, 1);
        INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
        VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
      END

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.DELETED ' ||
                        ' FROM ACTDISCOBJ A JOIN GRPACTDISC G ON ' ||
                                          ' G.ID = A.GRPACTDISCID AND G.ID = '|| :GRPACTDISCID ||
                        ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                        '      A.PAYMENTID = -1 AND A.CARDID = -1 '|| WHERECLAUSE
      INTO TACTDISCOBJID, DEL;

      IF (TACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, NULL, NULL, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :TACTDISCOBJID;

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                         C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID
      INTO ACTDISCID, CONDITIONID;

      EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL,
                                          NULL, NULL,  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  NULL, NULL,
                                          NULL, NULL, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

      IF (ACTDISCID IS NULL) THEN
      BEGIN
        SELECT NULLTONUM(MAX(CODE)) + 1
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        INTO ACTDISCCODE;

        INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                              CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
        VALUES     (GEN_ID(GID, 1), :ACTDISCCODE, :GRPACTDISCID, :WARENAME,
                    :CONDITIONID, :TDISCRATEID, NULL, 0, :IDELETEDACTDISC);
      END
      ELSE
        UPDATE ACTDISC SET
          NAME = :WARENAME,
          CONDITIONID = :CONDITIONID,
          DISCRATEID = :TDISCRATEID,
          DELETED = :IDELETEDACTDISC
        WHERE ID = :ACTDISCID;
    END
    ELSE
    BEGIN
      IF (IDISCOUNTVALUE <> '') THEN
      BEGIN
        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID ' ||
                          ' FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                          ' D.ID = A.DISCRATEID AND D.KIND = 2 '||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '       A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
        INTO TACTDISCOBJID;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, :TDISCRATEID, NULL, NULL);
        ELSE
          UPDATE ACTDISCOBJ SET
             DISCRATEID = :TDISCRATEID,
             DELETED = 0
          WHERE ID = :TACTDISCOBJID;
      END
      ELSE
        EXECUTE STATEMENT
          'UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID IN ' ||
          '(SELECT A.ID FROM ACTDISCOBJ A JOIN DISCRATE D ON ' ||
          '    D.ID = A.DISCRATEID AND D.KIND = 2 ' ||
          '    WHERE A.WAREID = ' || :WAREID || ' AND A.CLIENTID = -1 AND ' ||
          '          A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 ' || WHERECLAUSE || ')';
    END
  END
END
^

/* Alter (APPENDREMAINBYWAREID) */
ALTER PROCEDURE APPENDREMAINBYWAREID(IWAREID INTEGER,
IASPV1 INTEGER,
IASPECTSCHEMEID INTEGER,
IREMAIN DOUBLE PRECISION,
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IADDREPLACE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE USEREMAIN INTEGER;
BEGIN
  ERRORCODE = 0;

  AD1 = 0;

  IF ((IASPECTSCHEMEID > 0) AND (IASPV1 > 0)) THEN
  BEGIN
    FOR
      SELECT ID, CODE
      FROM ASPECT A
      WHERE A.ASPECTSCHEMEID = :IASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
      DO
      BEGIN
        IF (ASPCODE > 1) THEN
        BEGIN
          ERRORCODE = 15;
          EXIT;
        END
        SELECT ID
        FROM ASPVALUE AV
        WHERE AV.CODE = :IASPV1 AND AV.ASPECTID = :ASPID
        INTO AD1;

        IF (AD1 = 0) THEN
        BEGIN
          ERRORCODE = 10;
          EXIT;
        END
      END
      IF (ASPID IS NULL) THEN
      BEGIN
        ERRORCODE = 9;
        EXIT;
      END
  END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :IWAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = 0 AND
    ASPECTVALUE3ID = 0 AND
    ASPECTVALUE4ID = 0 AND
    ASPECTVALUE5ID = 0
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    REMAINID = GEN_ID(GID, 1);
    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
          ASPECTVALUE4ID, ASPECTVALUE5ID, DELETED, USEREMAIN)
    VALUES
      (:REMAINID, :IWAREID, :AD1, 0, 0, 0, 0, :IDELETED, :USEREMAIN);

    IF (NOT :IREMAIN IS NULL) THEN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE <> 1) THEN
    BEGIN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 1;

      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;
    END

    UPDATE REMAIN SET
      DELETED = :IDELETED
    WHERE ID = :REMAINID;

    IF (NOT :IREMAIN IS NULL) THEN
    BEGIN
      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
    END

    IF (IADDREPLACE = 2) THEN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 0;
  END
END
^

/* empty dependent procedure body */
/* Clear: APPENDPILOT for: APPENDWARE */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPENDWARE) */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
DECLARE VARIABLE TISWARE INTEGER;
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TDELETED INTEGER;
DECLARE VARIABLE TDELETEDISWARE INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE HIERLEVEL INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE BARC VARCHAR(40);
BEGIN
  ERRORCODE = 0;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      IF (IEXCHANGEFORMAT <> 1) THEN
        BEGIN
          ERRORCODE = 8;
          EXIT;
        END
      ELSE
        IFIRSTASPECTVALUE = 0;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  HIERLEVEL = 0;
  IF (IPARENTCODE <> '') then
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (CODE = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (MARK = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
  END
  ELSE
    PARENTID = 0;
  HIERLEVEL = HIERLEVEL + 1;

  IF (IISWARE <> 1) THEN
    BEGIN
      IISWARE = -2147483647 + HIERLEVEL;
    END

  IF ((PARENTID IS NULL) OR (TISWARE > 0)) THEN
  BEGIN
    ERRORCODE = 2;
    EXIT;
  END

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  TISWARE = NULL;

  IF (IWARECODETOMARK = 0) THEN
  begin
    SELECT ID, ISWARE, DELETED
    FROM SPRT
    WHERE CODE = :ICODE
    INTO TID, TISWARE, TDELETEDISWARE;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, DELETED, ISWARE, DELETED
    FROM SPRT
    WHERE MARK = :IMARK
    INTO TID, TDELETED, TISWARE, TDELETEDISWARE;
  END

  IF ((((TISWARE > 0) AND (IISWARE <= 0)) OR
       ((TISWARE <= 0) AND (IISWARE > 0))) AND (TDELETEDISWARE >= IDELETED)) then
    EXCEPTION E_CANT_CHANGE_ISWARE;

  IF (TID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO SPRT (ID, PARENTID, CODE, MARK, NAME, TEXT, HIERLEVEL,
      MINPRICE, ECRDEVID, TAXGROUPID, RCPPRNDEVID,
      ASPECTSCHEMEID, PRICELABELID,
      MAXDISCOUNT, ISWARE, PRICE, FLAGS, LIFE, SERIES,
      CERTIFICAT, SCALELPDEVID, SCALELPWARECODE, ASPECTTYPE, QUANTITYPREC,
      SCALELPLOADED, PRICELBPRINTED, DELETED, DESCRIPTION, PICTURE, REWARDTYPE, REWARDVAL,
      ECRDEPARTMENT)
    VALUES (:ID, :PARENTID, :ICODE, :IMARK, :INAME, :ITEXT, :HIERLEVEL,
      :IMINPRICE, :ECRDEVID, :TAXGROUPID, :RCPPRNDEVID,
      :ASPECTSCHEMEID, :PRICELABELID,
      :IMAXDISCOUNT, :IISWARE, :IPRICE, :IFLAGS, :ILIFE, :ISERIES,
      :ICERTIFICAT, :SCALELPDEVID, :ISCALELPWARECODE, :IASPECTTYPE, :IQUANTITYPREC,
      :ISCALELPLOADED, :IPRICELBPRINTED, :IDELETED, :IDESCRIPTION, :IPICTURE, :IREWARDTYPE, :IREWARDVAL,
      :IECRDEPARTMENT);
    INCREMENTCODE = 1;
  END
  ELSE
  BEGIN
    ID = TID;
    IF (TDELETED = IDELETED) THEN
      UPDATE SPRT SET
        ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
        ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
        CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
                                           PRICELABELID = :PRICELABELID,
        DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
        DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
        ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
        ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
        FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
        HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
        ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
        LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
        MARK = :IMARK,                     SERIES = :ISERIES,
        MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
        MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
        NAME = :INAME
      WHERE ID = :ID;
    ELSE
      BEGIN
        UPDATE SPRT SET
          ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
          ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
          CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
          CODE = :ICODE,                     PRICELABELID = :PRICELABELID,
          DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
          DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
          ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
          ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
          FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
          HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
          ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
          LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
          MARK = :IMARK,                     SERIES = :ISERIES,
          MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
          MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
          NAME = :INAME
        WHERE ID = :ID;
        INCREMENTCODE = 1;
      END
  END

  IF (IISWARE = 1) THEN
  BEGIN
    EXECUTE PROCEDURE APPENDREMAINBYWAREID (:ID, :IFIRSTASPECTVALUE, :ASPECTSCHEMEID, :IREMAIN, :IDELETEDREMAIN, :IDELETEDASPECT, :IADDREPLACE)
      RETURNING_VALUES ERRORCODE;

    IF (ERRORCODE > 0) THEN
      EXIT;

    WHILE (IBARCODES <> '') DO
    BEGIN
      BARC = EXTRACTSTR(IBARCODES, ',');

      EXECUTE PROCEDURE APPENDBARCODEBYWAREID (:BARC, :ID, 0, 0, 0, 0, 0, :IFACTOR, 0, :IDELETEDBARCODE)
        RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;

      IBARCODES = PCOPY(IBARCODES, LEN(BARC) + 1, LEN(IBARCODES) - LEN(BARC) - 1);
    END
  END

  IF ((ILOADWAREDISC = 1) AND NOT (IDISCRATEPARENTID IS NULL) AND NOT (IDISCOUNTVALUE IS NULL)) THEN
    BEGIN
      EXECUTE PROCEDURE APPEND_WARE_DISC(:ID, :IDISCOUNTTYPE, :IDISCOUNTVALUE, :IDISCRATEPARENTID)
            RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;
    END

  IF (ILOADWAREDISC = 1 AND TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :ID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID,
          DELETED = 0
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :ID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
END
^

/* Alter (GET_OPERDAY) */
ALTER PROCEDURE GET_OPERDAY(DATE1 DATE,
DATE2 DATE,
POSNUMBER INTEGER)
 RETURNS(TRANZ1 INTEGER,
TRANZ2 INTEGER)
 AS
DECLARE VARIABLE TMPC1 INTEGER;
DECLARE VARIABLE TMPT INTEGER;
DECLARE VARIABLE D1 DATE;
BEGIN

/*   " " -   , 
        (   )*/

  TRANZ1 = 0;
  TRANZ2 = 0;

  SELECT MIN(TRANZCOUNT)
  FROM TRANZT T
  WHERE T.POSNUMBER = :POSNUMBER
  INTO TMPC1;

  SELECT MIN(TRANZDATE)
  FROM TRANZT T
  WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT = :TMPC1
  INTO  D1;

  IF (D1 >= DATE1) THEN
    TRANZ1 = TMPC1;
    ELSE
    BEGIN
      SELECT MIN(T.TRANZCOUNT)
      FROM TRANZT T, TRANZT TT, DOCUMENT D
      WHERE T.POSNUMBER = :POSNUMBER AND TT.POSNUMBER = :POSNUMBER AND
        T.TRANZCOUNT = TT.TRANZCOUNT + 1 AND TT.TRANZTYPE = 61 AND
        D.ID = T.DOCUMENTID AND D.STATE IN (1, 2) AND
        D.CLOSEDATE BETWEEN :DATE1 AND :DATE2
      INTO TRANZ1;
    END

  IF (TRANZ1 IS NULL) THEN
    EXIT;

  TMPC1 = NULL;
  SELECT MAX(TRANZCOUNT)
  FROM TRANZT T LEFT JOIN DOCUMENT D ON D.ID = T.DOCUMENTID 
  WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT >= :TRANZ1 AND
    D.CLOSEDATE <= :DATE2 AND D.STATE IN (1, 2)
  INTO TMPC1;

  SELECT TRANZTYPE
  FROM   TRANZT T
  WHERE  T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT = :TMPC1
  INTO   TMPT;

  IF (TMPT = 61) THEN
    TRANZ2 = TMPC1;
    ELSE
    BEGIN
      TRANZ2 = NULL;
      SELECT MIN(TRANZCOUNT)
      FROM TRANZT T
      WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT > :TMPC1 AND
        T.TRANZTYPE = 61
      INTO TRANZ2;

      IF (TRANZ2 IS NULL) THEN
        SELECT MAX(TRANZCOUNT)
        FROM TRANZT T
        WHERE T.POSNUMBER = :POSNUMBER AND T.TRANZCOUNT < :TMPC1 AND
          T.TRANZTYPE = 61
        INTO TRANZ2;
    END
END
^

/* Alter (GETHALLPLACES) */
ALTER PROCEDURE GETHALLPLACES(AHALLID INTEGER,
AEDUCATION INTEGER = 0)
 RETURNS(ID INTEGER,
CODE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
STATE INTEGER,
DOCCOUNT INTEGER,
OPENTIME TIME,
TOTALSUMM FLOAT,
USERNAME VARCHAR(100),
CLIENTNAME VARCHAR(100))
 AS
BEGIN
  FOR SELECT ID, CODE, NAME, TEXT FROM HALLPLACE WHERE HALLID = :AHALLID
  ORDER BY CODE
  INTO :ID, :CODE, :NAME, :TEXT DO
  BEGIN
    SELECT COUNT(ID), SUM(SUMMWD) FROM DOCUMENT
    WHERE HALLPLACEID = :ID AND ((STATE IN (0, 3)) OR (STATE = 4 AND (CURRENT_TIMESTAMP >= RESERVEBEF AND CURRENT_TIMESTAMP <= RESERVEEND)))
      AND EDUCATION = :AEDUCATION
    INTO :DOCCOUNT, :TOTALSUMM;

    STATE = 0;

    OPENTIME = NULL;
    USERNAME = NULL;
    CLIENTNAME = NULL;

    IF (DOCCOUNT > 0) THEN
    BEGIN
      SELECT FIRST 1 OPENTIME, USERNAME, CLIENTNAME, HSTATE FROM(
        SELECT D.OPENTIME, U.NAME AS USERNAME, C.NAME AS CLIENTNAME,
        CASE D.STATE
          WHEN 4 THEN 2
          ELSE 1
        END AS HSTATE

        FROM DOCUMENT D JOIN "USER" U ON U.ID = D.OPENUSERID LEFT JOIN CLIENT C ON C.ID = D.CLIENTID
        WHERE D.HALLPLACEID = :ID AND ((D.STATE IN (0, 3)) OR (D.STATE = 4 AND (CURRENT_TIMESTAMP >= D.RESERVEBEF AND CURRENT_TIMESTAMP <= D.RESERVEEND)))
      ) ORDER BY HSTATE
      INTO :OPENTIME, :USERNAME, :CLIENTNAME, :STATE;

    END

    SUSPEND;
  END

END
^

/* empty dependent procedure body */
/* Clear: APPENDDEFAULTGRPDISC for: MERGE_SETTING */
ALTER PROCEDURE APPENDDEFAULTGRPDISC(ITYPE INTEGER,
ICODE INTEGER,
IWARE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (MERGE_SETTING) */
ALTER PROCEDURE MERGE_SETTING(ANAME VARCHAR(100),
AVAL VARCHAR(255),
ABDOCODE INTEGER,
AOWNERBDO INTEGER,
ASYNCCATEG INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  IF (AOWNERBDO IS NULL OR AOWNERBDO = 0) THEN
    SELECT BDOCODE FROM CUSTOMDB INTO AOWNERBDO;

  IF (ABDOCODE = 0) THEN
    ABDOCODE = NULL; --    

  SELECT ID
  FROM SETTINGS
  WHERE NAME = :ANAME AND OWNERBDO = :AOWNERBDO
  INTO  ID;

  IF (ID IS NULL) THEN
    INSERT INTO SETTINGS
    (ID, NAME, VAL, BDOCODE, OWNERBDO, SYNCCATEG)
    VALUES
    (GEN_ID(GID, 1), :ANAME, :AVAL, :ABDOCODE, :AOWNERBDO, :ASYNCCATEG);
    ELSE
      UPDATE SETTINGS SET
        VAL = :AVAL,
        BDOCODE = :ABDOCODE,
        SYNCCATEG = :ASYNCCATEG
      WHERE  ID = :ID;
END
^

/* empty dependent procedure body */
/* Clear: GET_BDO_SYNCINFO for: TABLECATEG */
ALTER PROCEDURE GET_BDO_SYNCINFO(ISYNCBASEID INTEGER)
 RETURNS(TABLENAME VARCHAR(100),
QUELENGTH VARCHAR(20),
ERROR VARCHAR(255),
SYNCCATEG INTEGER,
ISUPDIRECTION INTEGER,
CUROPER INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (TABLECATEG) */
ALTER PROCEDURE TABLECATEG RETURNS(TABLENAME VARCHAR(100),
TABLEID INTEGER,
CATEG INTEGER)
 AS
BEGIN
/*       untSyncTypeDef ()!!!! */

  TABLENAME = 'WINREPORTS'; TABLEID = 0; CATEG = 17;
  SUSPEND;
  TABLENAME = 'KEYBLAYT'; TABLEID = 1; CATEG = 22;
  SUSPEND;
  TABLENAME = 'TOUCHLAYT'; TABLEID = 2; CATEG = 21;
  SUSPEND;
  TABLENAME = 'SETTINGS_SCR'; TABLEID = 3; CATEG = 21;
  SUSPEND;
  TABLENAME = 'CARDGROUP'; TABLEID = 4; CATEG = 14;
  SUSPEND;
  TABLENAME = 'CARD'; TABLEID = 5; CATEG = 14;
  SUSPEND;
  TABLENAME = 'RECTEMPLATE'; TABLEID = 6; CATEG = 15;
  SUSPEND;
  TABLENAME = 'DOCTEMPLATE'; TABLEID = 7; CATEG = 15;
  SUSPEND;
  TABLENAME = 'DOCKIND'; TABLEID = 8; CATEG = 15;
  SUSPEND;
  TABLENAME = 'DOCKINDRECTMPL'; TABLEID = 9; CATEG = 15;
  SUSPEND;
  TABLENAME = 'DOCKINDTMPL'; TABLEID = 10; CATEG = 15;
  SUSPEND;
  TABLENAME = 'SETTINGS_DOC'; TABLEID = 11; CATEG = 15;
  SUSPEND;
  TABLENAME = 'PROFILE'; TABLEID = 12; CATEG = 23;
  SUSPEND;
  TABLENAME = 'SECURITY'; TABLEID = 13; CATEG = 23;
  SUSPEND;
  TABLENAME = '"USER"'; TABLEID = 14; CATEG = 23;
  SUSPEND;
  TABLENAME = 'SETTINGS_USR'; TABLEID = 64; CATEG = 23;
  SUSPEND;
  TABLENAME = 'TAXRATE'; TABLEID = 15; CATEG = 7;
  SUSPEND;
  TABLENAME = 'TAXGROUP'; TABLEID = 16; CATEG = 7;
  SUSPEND;
  TABLENAME = 'TAXGRPRT'; TABLEID = 17; CATEG = 7;
  SUSPEND;
  TABLENAME = 'SETTINGS_TAX'; TABLEID = 18; CATEG = 7;
  SUSPEND;
  TABLENAME = 'KEYBMODE'; TABLEID = 19; CATEG = 22;
  SUSPEND;
  TABLENAME = 'KEYBMAP'; TABLEID = 20; CATEG = 22;
  SUSPEND;
  TABLENAME = 'KEYBMAPF'; TABLEID = 21; CATEG = 22;
  SUSPEND;
  TABLENAME = 'INPDEVFLT'; TABLEID = 22; CATEG = 2;
  SUSPEND;
  TABLENAME = 'DENOMIN'; TABLEID = 23; CATEG = 13;
  SUSPEND;
  TABLENAME = 'COMMENT'; TABLEID = 24; CATEG = 16;
  SUSPEND;
  TABLENAME = 'HALL'; TABLEID = 25; CATEG = 19;
  SUSPEND;
  TABLENAME = 'HALLPLACE'; TABLEID = 26; CATEG = 19;
  SUSPEND;
  TABLENAME = 'RMK'; TABLEID = 27; CATEG = 2;
  SUSPEND;
  TABLENAME = 'CURRENCY'; TABLEID = 28; CATEG = 12;
  SUSPEND;
  TABLENAME = 'MONEYBOX'; TABLEID = 63; CATEG = 2;
  SUSPEND;
  TABLENAME = 'SETTINGS_CUR'; TABLEID = 29; CATEG = 12;
  SUSPEND;
  TABLENAME = 'DEVICES'; TABLEID = 30; CATEG = 2;
  SUSPEND;
  TABLENAME = 'RMKDEV'; TABLEID = 31; CATEG = 2;
  SUSPEND;
  TABLENAME = 'SETTINGS_DEV'; TABLEID = 32; CATEG = 2;
  SUSPEND;
  TABLENAME = 'INTBARCS'; TABLEID = 33; CATEG = 4;
  SUSPEND;
  TABLENAME = 'ASPSCHM'; TABLEID = 34; CATEG = 6;
  SUSPEND;
  TABLENAME = 'ASPECT'; TABLEID = 35; CATEG = 6;
  SUSPEND;
  TABLENAME = 'ASPVALUE'; TABLEID = 36; CATEG = 6;
  SUSPEND;
  TABLENAME = 'SETTINGS_ASP'; TABLEID = 37; CATEG = 6;
  SUSPEND;
  TABLENAME = 'PRICELABEL'; TABLEID = 38; CATEG = 18;
  SUSPEND;
  TABLENAME = 'SETTINGS_PRL'; TABLEID = 39; CATEG = 18;
  SUSPEND;
  TABLENAME = 'SPRT'; TABLEID = 40; CATEG = 4;
  SUSPEND;
  TABLENAME = 'ANALOG'; TABLEID = 41; CATEG = 4;
  SUSPEND;
  TABLENAME = 'REMAIN'; TABLEID = 42; CATEG = 4;
  SUSPEND;
  TABLENAME = 'BARCODE'; TABLEID = 43; CATEG = 4;
  SUSPEND;
  TABLENAME = 'PAYMENT'; TABLEID = 44; CATEG = 11;
  SUSPEND;
  TABLENAME = 'SETTINGS_PAY'; TABLEID = 45; CATEG = 11;
  SUSPEND;
  TABLENAME = 'GRPCCARD'; TABLEID = 46; CATEG = 8;
  SUSPEND;
  TABLENAME = 'CCARD'; TABLEID = 47; CATEG = 8;
  SUSPEND;
  TABLENAME = 'CLIENT'; TABLEID = 48; CATEG = 8;
  SUSPEND;
  TABLENAME = 'CLIENTCARD'; TABLEID = 49; CATEG = 8;
  SUSPEND;
  TABLENAME = 'COUNTERTYPE'; TABLEID = 50; CATEG = 10;
  SUSPEND;
  TABLENAME = 'COUNTER'; TABLEID = 51; CATEG = 10;
  SUSPEND;
  TABLENAME = 'CCARDCOUNTER'; TABLEID = 52; CATEG = 10;
  SUSPEND;
  TABLENAME = 'CLIENTCOUNTER'; TABLEID = 53; CATEG = 10;
  SUSPEND;
  TABLENAME = 'DISCRATE'; TABLEID = 54; CATEG = 9;
  SUSPEND;
  TABLENAME = 'ACTSCRIPT'; TABLEID = 55; CATEG = 9;
  SUSPEND;
  TABLENAME = 'GRPACTDISC'; TABLEID = 56; CATEG = 9;
  SUSPEND;
  TABLENAME = 'ACTDISC'; TABLEID = 57; CATEG = 9;
  SUSPEND;
  TABLENAME = 'ACTDISCOBJ'; TABLEID = 58; CATEG = 9;
  SUSPEND;
  TABLENAME = 'DOCUMENT'; TABLEID = 59; CATEG = 20;
  SUSPEND;
  TABLENAME = 'COUNTERD'; TABLEID = 60; CATEG = 10;
  SUSPEND;
  TABLENAME = 'REMAIND'; TABLEID = 61; CATEG = 5;
  SUSPEND;
  TABLENAME = 'SETTINGS'; TABLEID = 62; CATEG = 3;
  SUSPEND;
  TABLENAME = 'SETTINGS_EXH'; TABLEID = 65; CATEG = 1;
  SUSPEND;
  TABLENAME = 'EMPLOYEE'; TABLEID = 67; CATEG = 25;
  SUSPEND;
  TABLENAME = 'SETTINGS_EMP'; TABLEID = 68; CATEG = 25;
  SUSPEND;
END
^

/* Restore proc. body: APPENDDEFAULTGRPDISC */
ALTER PROCEDURE APPENDDEFAULTGRPDISC(ITYPE INTEGER,
ICODE INTEGER,
IWARE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE NEWID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE ADOID INTEGER;
DECLARE VARIABLE SETTING VARCHAR(100);
DECLARE VARIABLE TEMPID INTEGER;
DECLARE VARIABLE TEMPNAME VARCHAR(100);
BEGIN

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :ICODE
  INTO  NEWID;

  IF (NEWID IS NULL) THEN
    BEGIN
      ERRORCODE = 1; /*   */
      EXIT;
    END

  IF (ITYPE = 1) THEN
    SETTING = 'InternalDefaultSchmRecID';
  ELSE
    IF (IWARE = 0) THEN
      SETTING = 'InternalDefaultSchmFreeID';
    ELSE
      SETTING = 'InternalDefaultSchmCodeID';

  IF (ITYPE = 1)  THEN
    FOR SELECT VAL, NAME
    FROM SETTINGS
    WHERE ((NAME = 'InternalDefaultSchmFreeID') OR (NAME = 'InternalDefaultSchmCodeID')) AND
          (VAL = :NEWID) AND (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB))
    INTO TEMPID, TEMPNAME
    DO
      BEGIN
        DELETE FROM ACTDISCOBJ
        WHERE CLIENTID = -1 AND WAREID <= 0 AND CARDID = -1 AND
              PAYMENTID = -1 AND GRPACTDISCID = :TEMPID;

        EXECUTE PROCEDURE MERGE_SETTING(TEMPNAME, 0, NULL, NULL, 9);
      END
  ELSE
    FOR SELECT VAL
    FROM SETTINGS
    WHERE (NAME = 'InternalDefaultSchmRecID') AND (VAL = :NEWID) AND (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB))
    INTO TEMPID
    DO
      BEGIN
         DELETE FROM ACTDISCOBJ
            WHERE CLIENTID = -1 AND WAREID <= 0 AND CARDID = -1 AND
                  PAYMENTID = -1 AND GRPACTDISCID = :TEMPID;

         EXECUTE PROCEDURE MERGE_SETTING('InternalDefaultSchmRecID', 0, NULL, NULL, 9);
      END

  UPDATE ACTDISCOBJ SET
    GRPACTDISCID = :NEWID,
    DELETED = 0
  WHERE
    CLIENTID = -1 AND WAREID = :IWARE AND CARDID = -1 AND
    PAYMENTID = -1 AND GRPACTDISCID = (SELECT VAL FROM SETTINGS WHERE (NAME = :SETTING) AND (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB)));

  SELECT FIRST 1 ID, DELETED
  FROM ACTDISCOBJ
  WHERE CLIENTID = -1 AND WAREID = :IWARE AND
        CARDID = -1 AND PAYMENTID = -1 AND GRPACTDISCID = :NEWID
  INTO ADOID, DEL;

  IF (ADOID IS NULL) THEN
    INSERT INTO ACTDISCOBJ (ID, WAREID, CLIENTID, PAYMENTID, CARDID, GRPACTDISCID)
    VALUES (GEN_ID(GID, 1), :IWARE, -1, -1, -1, :NEWID);
  ELSE
    IF (DEL < 0) THEN
      UPDATE ACTDISCOBJ SET
        DELETED = 0
      WHERE ID = :ADOID;

  UPDATE DISCRATE DR SET
    DR.DESTINATION = :ITYPE
  WHERE DR.ID IN (select AD.DISCRATEID from ACTDISC AD where AD.GRPACTDISCID = :NEWID);

  EXECUTE PROCEDURE MERGE_SETTING(SETTING, NEWID, NULL, NULL, 9);

END
^

/* Restore proc. body: APPENDEMPLOYEE */
ALTER PROCEDURE APPENDEMPLOYEE(ICODE INTEGER,
INAME VARCHAR(100),
IUSERCODE INTEGER,
ICARD VARCHAR(255),
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
declare variable userid integer;
declare variable id integer;
declare variable countempl integer;
BEGIN

  ERRORCODE = 0;
  IF (:IUSERCODE = 0) THEN
    USERID = 0;
  ELSE
  BEGIN
    SELECT ID
    FROM "USER"
    WHERE CODE = :IUSERCODE
    INTO USERID;

    IF (USERID IS NULL) THEN
    BEGIN
      ERRORCODE = 37;
      EXIT;
    END

    SELECT FIRST 1 1
    FROM EMPLOYEE
    WHERE USERID = :USERID AND DELETED = :IDELETED
    INTO :COUNTEMPL;

    IF (:COUNTEMPL = 1) THEN
    BEGIN
      ERRORCODE = 38;
      EXIT;
    END
  END

  SELECT ID
  FROM EMPLOYEE
  WHERE CODE = :ICODE
  INTO ID;

  IF (ID IS NULL) THEN
    INSERT INTO EMPLOYEE
      (ID, CODE, NAME, USERID, CARD, DELETED)
    VALUES
      (GEN_ID(GID, 1), :ICODE, :INAME, :USERID, :ICARD, :IDELETED);
  ELSE
    BEGIN
      UPDATE EMPLOYEE
      SET
        NAME = :INAME, 
        USERID = :USERID,
        CARD = :ICARD, 
        DELETED = :IDELETED
      WHERE
        ID = :ID;
    END
END
^

/* Restore proc. body: APPENDPILOT */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE DORMANTVAR INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 1535, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            SELECT ID
            FROM SPRT
            WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
            INTO MAINID;

            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

/* Restore proc. body: GET_BDO_SYNCINFO */
ALTER PROCEDURE GET_BDO_SYNCINFO(ISYNCBASEID INTEGER)
 RETURNS(TABLENAME VARCHAR(100),
QUELENGTH VARCHAR(20),
ERROR VARCHAR(255),
SYNCCATEG INTEGER,
ISUPDIRECTION INTEGER,
CUROPER INTEGER)
 AS
DECLARE VARIABLE CURCHNGVAL INTEGER;
DECLARE VARIABLE ERRINFO VARCHAR(255);
DECLARE VARIABLE BDOERRINFO VARCHAR(255);
DECLARE VARIABLE QUEUELENGTH INTEGER;
DECLARE VARIABLE SYNCKIND INTEGER;
DECLARE VARIABLE BDOCODE INTEGER;
BEGIN
  SELECT BDOCODE FROM CUSTOMDB INTO BDOCODE;
  IF ((BDOCODE IS NULL) OR (BDOCODE = 0)) THEN EXIT;

  FOR SELECT 'DELQUEUE',
    (SELECT COUNT(CHNG) FROM DELQUEUE WHERE CHNG > COALESCE(TL.CHNGVAL, 0)), '',
    TL.BDOERRINFO, 0, 1, TL.CUROPER, TL.ERRINFO
  FROM SYNCBASE S
  LEFT JOIN TBLLOADINFO TL ON TL.SYNCBASEID = S.ID AND TL.TABLENAME = 'DELQUEUE'
  WHERE S.ID = :ISYNCBASEID
  INTO TABLENAME, QUEUELENGTH, QUELENGTH, ERROR, SYNCCATEG, ISUPDIRECTION, CUROPER, ERRINFO DO
  BEGIN
    SUSPEND;
    QUELENGTH = QUEUELENGTH;
    ERROR = ERRINFO;
    ISUPDIRECTION = 2;
    SUSPEND;
  END

  FOR
    SELECT
      CASE
        WHEN TRIM(TC.TABLENAME) LIKE '%USER%' THEN '"USER"'
        ELSE TC.TABLENAME
      END,
      COALESCE(T.CHNGVAL, 0) AS CHNGVAL,
      T.ERRINFO,
      T.BDOERRINFO,
      TC.CATEG,
      ST.SYNCKIND,
      T.CUROPER
    FROM SYNCBASE SB
      JOIN SYNCTABLE ST ON ST.SYNCBASEID = SB.PARENTID AND ST.SYNCKIND <> 0
      JOIN TABLECATEG TC ON TC.CATEG = ST.CATEG
      LEFT JOIN TBLLOADINFO T ON T.SYNCBASEID = SB.ID AND T.TABLENAME = TC.TABLENAME
    WHERE
      SB.ID = :ISYNCBASEID AND
      EXISTS(SELECT 1 FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = TC.TABLENAME AND RDB$FIELD_NAME = 'OWNERBDO')

    INTO TABLENAME, CURCHNGVAL, ERRINFO, BDOERRINFO, SYNCCATEG, SYNCKIND, CUROPER
    DO
    BEGIN
      EXECUTE STATEMENT
      'SELECT COUNT(CHNG) FROM '||TABLENAME||' T '||
        IIF(SYNCKIND = 1, 'JOIN SYNCBASE SB ON T.OWNERBDO = SB.CODE ' ||
                          'WHERE SB.ID = ' || CAST(ISYNCBASEID AS VARCHAR(100)) || ' AND CHNG > ',
                          'WHERE CHNG > ') ||
        CAST(COALESCE(CURCHNGVAL, 0) AS VARCHAR(100))
      INTO QUEUELENGTH;
      ISUPDIRECTION = 1; QUELENGTH = ''; ERROR = BDOERRINFO;
      SUSPEND;
      ISUPDIRECTION = 2; QUELENGTH = QUEUELENGTH; ERROR = ERRINFO;
      SUSPEND;
    END
END
^

/* Restore proc. body: SYNC_DISPLAYDEV */
ALTER PROCEDURE SYNC_DISPLAYDEV(IDEVICEID INTEGER,
ICODEPAGE INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
BEGIN
  SELECT FIRST 1 ID FROM DISPLAYDEV
  WHERE
    DEVICEID = :IDEVICEID
  INTO ID;
  IF (ID IS NULL) THEN
    INSERT INTO DISPLAYDEV
     (
      DEVICEID,
      ID,
      CODEPAGE
      )
    VALUES(
      :IDEVICEID,
      GEN_ID(GID, 1),
      :ICODEPAGE
    );
  ELSE
    UPDATE DISPLAYDEV SET
      CODEPAGE = :ICODEPAGE
    WHERE
      ID = :ID;
END
^

/* Create trigger... */
CREATE TRIGGER CHNG_BEF_EMPLOYEE FOR EMPLOYEE
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER DEL_AFT_CURRENCY FOR CURRENCY
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  DELETE FROM MONEYBOX M WHERE M.CURRENCYID = OLD.ID;
END
^

CREATE TRIGGER DEL_AFT_RDNOTIFY FOR RDNOTIFY
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  POST_EVENT 'RD_NOTIFY';
END
^

CREATE TRIGGER DEL_AFT_RMK FOR RMK
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  DELETE FROM MONEYBOX M WHERE M.RMKID = OLD.ID;
END
^

CREATE TRIGGER INS_BEF_RDNOTIFY FOR RDNOTIFY
ACTIVE AFTER INSERT POSITION 0 
AS
BEGIN
  IF (NEW.ACT = 1) THEN
    POST_EVENT 'RD_NOTIFY';
END
^

CREATE TRIGGER OWNBDO_EMPLOYEE FOR EMPLOYEE
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^
/*     ()
CREATE TRIGGER SYNCDEL_EMPLOYEE FOR EMPLOYEE
ACTIVE AFTER DELETE POSITION 0 
AS 
BEGIN 
  EXECUTE PROCEDURE APPEND_DELQUEUE(67, OLD.ID);
END
^
*/

CREATE TRIGGER UPD_AFT_GRPCCARD0 FOR GRPCCARD
ACTIVE AFTER UPDATE POSITION 0 
AS
DECLARE VARIABLE TMPID INTEGER;
DECLARE VARIABLE CDCODE INTEGER;
BEGIN
  IF (OLD.CODE <> NEW.CODE AND EXISTS(SELECT 1 FROM COUNTERTYPE WHERE AUTOCREATE = 1)) THEN
  BEGIN
    FOR
      SELECT C.ID, CD.CODE
      FROM CCARD CD
        JOIN CCARDCOUNTER CC ON CC.CCARDID = CD.ID
        JOIN COUNTER C ON CC.COUNTERID = C.ID
        LEFT JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
      WHERE CD.GRPCCARDID = NEW.ID AND CT.AUTOCREATE = 1
      INTO TMPID, CDCODE
      DO
        UPDATE COUNTER SET
          CODE = IIF(:CDCODE < 0, -2200000000, 2000000000) * NEW.CODE + :CDCODE
        WHERE ID = :TMPID;
  END
END
^

CREATE TRIGGER UPD_BEF_RDNOTIFY FOR RDNOTIFY
ACTIVE AFTER UPDATE POSITION 0 
AS
BEGIN
  IF (NEW.ACT <> OLD.ACT) THEN
    POST_EVENT 'RD_NOTIFY';
END
^


/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_PAYMENT
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER DEL_BEF_SYNCBASE
AS
BEGIN
  DELETE FROM SYNCBASE WHERE PARENTID = OLD.ID;

  DELETE FROM SETTINGS WHERE (OWNERBDO = OLD.CODE) AND (OWNERBDO <> (SELECT BDOCODE FROM CUSTOMDB));
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_AFT_CCARD
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TGRPCODE INTEGER;
DECLARE VARIABLE TCOUNTERID INTEGER;
DECLARE VARIABLE NCHNG INTEGER;
BEGIN
  NCHNG = IIF(NEW.CHNG = -1, -1, NULL);
  SELECT CODE FROM GRPCCARD WHERE ID = NEW.GRPCCARDID INTO TGRPCODE;
  FOR
    SELECT CT.ID
    FROM COUNTERTYPE CT
    WHERE CT.AUTOCREATE = 1
    INTO TMPID1
    DO
    BEGIN
      TCOUNTERID = NULL;
      SELECT ID
      FROM COUNTER
      WHERE CODE = IIF(NEW.CODE < 0, -2200000000, 2000000000) * :TGRPCODE + NEW.CODE AND COUNTERTYPEID = :TMPID1
      INTO TCOUNTERID;

      IF (TCOUNTERID IS NULL) THEN
      BEGIN
        TCOUNTERID = GEN_ID(GID, 1);
        INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, CHNG)
        VALUES (:TCOUNTERID, IIF(NEW.CODE < 0, -2200000000, 2000000000) * :TGRPCODE + NEW.CODE, :TMPID1, NEW.OWNERBDO, :NCHNG);
      END

      INSERT INTO CCARDCOUNTER (ID, COUNTERID, CCARDID, OWNERBDO, CHNG)
        VALUES (GEN_ID(GID, 1), :TCOUNTERID, NEW.ID, NEW.OWNERBDO, :NCHNG);
    END
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_AFT_DOCUMENT
AS
DECLARE VARIABLE RT INTEGER;
BEGIN
  IF (NEW.STATE = 1) THEN -- DP   
  BEGIN
    SELECT DK.ECRRECEIPTTYPE
    FROM DOCKIND DK
    WHERE DK.ID =  NEW.DOCKINDID
    INTO  RT;
    IF (RT = 12) THEN -- DP  
      POST_EVENT 'EMPLLISTCHANGED'; -- DP    ,  
  END
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_AFT_CCARD
AS
DECLARE VARIABLE TMPID INTEGER;
DECLARE VARIABLE TCOUNTERID INTEGER;
DECLARE VARIABLE GRPCODE INTEGER;
BEGIN
  /*        CHNG  -1     (   )
          CHNG    CHNG    ()  */

  IF (OLD.CHNG = -1 AND NEW.CHNG <> -1) THEN
    FOR SELECT ID, COUNTERID
    FROM CCARDCOUNTER
    WHERE CCARDID = NEW.ID AND CHNG = -1
    INTO TMPID, TCOUNTERID DO
    BEGIN
      UPDATE CCARDCOUNTER SET CHNG = NULL WHERE ID = :TMPID;
      UPDATE COUNTER SET CHNG = NULL WHERE ID = :TCOUNTERID;
    END

  IF (NEW.CODE <> OLD.CODE) THEN
  BEGIN
    SELECT CODE FROM GRPCCARD WHERE ID = NEW.GRPCCARDID INTO GRPCODE;
    FOR
      SELECT C.ID
      FROM COUNTER C
        JOIN COUNTERTYPE CT ON
          CT.ID = C.COUNTERTYPEID AND CT.AUTOCREATE = 1
        JOIN CCARDCOUNTER CC ON
          CC.COUNTERID = C.ID AND CC.CCARDID = NEW.ID
      INTO TMPID
      DO
        UPDATE COUNTER SET
          CODE = IIF(NEW.CODE < 0, -2200000000, 2000000000) * :GRPCODE + NEW.CODE
        WHERE ID = :TMPID;
  END
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_AFT_DOCUMENT
AS
DECLARE VARIABLE RT INTEGER;
BEGIN
  IF ((OLD.STATE = NEW.STATE) AND (NULLTOINT(OLD.HALLPLACEID) = NULLTOINT(NEW.HALLPLACEID))) THEN EXIT;

  /*  .   */
  IF ((OLD.STATE <> NEW.STATE) AND (NEW.STATE = 0)) THEN
    DELETE FROM TRANZT WHERE DOCUMENTID = OLD.ID;

  IF (NEW.STATE <> OLD.STATE AND NEW.STATE = 1) THEN -- DP   
  BEGIN
    SELECT DK.ECRRECEIPTTYPE
    FROM DOCKIND DK
    WHERE DK.ID =  NEW.DOCKINDID
    INTO  RT;
    IF (RT = 12) THEN -- DP  
      POST_EVENT 'EMPLLISTCHANGED'; -- DP    ,  
  END

  IF (NEW.STATE <> OLD.STATE AND (NEW.STATE = 1 OR NEW.STATE = 2)) THEN -- DP    ,   
    DELETE FROM RDNOTIFY WHERE DOCUMENTID = NEW.ID;
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_BEF_DOCUMENT
AS
BEGIN
  IF (NEW.CLOSEDATE <> OLD.CLOSEDATE OR OLD.CLOSETIME <> NEW.CLOSETIME OR
      NOT NEW.CLOSEDATE IS NULL AND OLD.CLOSEDATE IS NULL OR
      NOT NEW.CLOSETIME IS NULL AND OLD.CLOSETIME IS NULL) THEN
    NEW.INNERDOCORDER = GEN_ID(GDOCORDER, 1);
END
^

/* Alter Procedure... */
/* Alter (APPENDDEFAULTGRPDISC) */
ALTER PROCEDURE APPENDDEFAULTGRPDISC(ITYPE INTEGER,
ICODE INTEGER,
IWARE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE NEWID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE ADOID INTEGER;
DECLARE VARIABLE SETTING VARCHAR(100);
DECLARE VARIABLE TEMPID INTEGER;
DECLARE VARIABLE TEMPNAME VARCHAR(100);
BEGIN

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :ICODE
  INTO  NEWID;

  IF (NEWID IS NULL) THEN
    BEGIN
      ERRORCODE = 1; /*   */
      EXIT;
    END

  IF (ITYPE = 1) THEN
    SETTING = 'InternalDefaultSchmRecID';
  ELSE
    IF (IWARE = 0) THEN
      SETTING = 'InternalDefaultSchmFreeID';
    ELSE
      SETTING = 'InternalDefaultSchmCodeID';

  IF (ITYPE = 1)  THEN
    FOR SELECT VAL, NAME
    FROM SETTINGS
    WHERE ((NAME = 'InternalDefaultSchmFreeID') OR (NAME = 'InternalDefaultSchmCodeID')) AND
          (VAL = :NEWID) AND (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB))
    INTO TEMPID, TEMPNAME
    DO
      BEGIN
        DELETE FROM ACTDISCOBJ
        WHERE CLIENTID = -1 AND WAREID <= 0 AND CARDID = -1 AND
              PAYMENTID = -1 AND GRPACTDISCID = :TEMPID;

        EXECUTE PROCEDURE MERGE_SETTING(TEMPNAME, 0, NULL, NULL, 9);
      END
  ELSE
    FOR SELECT VAL
    FROM SETTINGS
    WHERE (NAME = 'InternalDefaultSchmRecID') AND (VAL = :NEWID) AND (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB))
    INTO TEMPID
    DO
      BEGIN
         DELETE FROM ACTDISCOBJ
            WHERE CLIENTID = -1 AND WAREID <= 0 AND CARDID = -1 AND
                  PAYMENTID = -1 AND GRPACTDISCID = :TEMPID;

         EXECUTE PROCEDURE MERGE_SETTING('InternalDefaultSchmRecID', 0, NULL, NULL, 9);
      END

  UPDATE ACTDISCOBJ SET
    GRPACTDISCID = :NEWID,
    DELETED = 0
  WHERE
    CLIENTID = -1 AND WAREID = :IWARE AND CARDID = -1 AND
    PAYMENTID = -1 AND GRPACTDISCID = (SELECT VAL FROM SETTINGS WHERE (NAME = :SETTING) AND (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB)));

  SELECT FIRST 1 ID, DELETED
  FROM ACTDISCOBJ
  WHERE CLIENTID = -1 AND WAREID = :IWARE AND
        CARDID = -1 AND PAYMENTID = -1 AND GRPACTDISCID = :NEWID
  INTO ADOID, DEL;

  IF (ADOID IS NULL) THEN
    INSERT INTO ACTDISCOBJ (ID, WAREID, CLIENTID, PAYMENTID, CARDID, GRPACTDISCID)
    VALUES (GEN_ID(GID, 1), :IWARE, -1, -1, -1, :NEWID);
  ELSE
    IF (DEL < 0) THEN
      UPDATE ACTDISCOBJ SET
        DELETED = 0
      WHERE ID = :ADOID;

  UPDATE DISCRATE DR SET
    DR.DESTINATION = :ITYPE
  WHERE DR.ID IN (select AD.DISCRATEID from ACTDISC AD where AD.GRPACTDISCID = :NEWID);

  EXECUTE PROCEDURE MERGE_SETTING(SETTING, NEWID, NULL, NULL, 9);

END
^

/* Alter (APPENDPILOT) */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE DORMANTVAR INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 1535, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            SELECT ID
            FROM SPRT
            WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
            INTO MAINID;

            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

/* Alter (GET_BDO_SYNCINFO) */
ALTER PROCEDURE GET_BDO_SYNCINFO(ISYNCBASEID INTEGER)
 RETURNS(TABLENAME VARCHAR(100),
QUELENGTH VARCHAR(20),
ERROR VARCHAR(255),
SYNCCATEG INTEGER,
ISUPDIRECTION INTEGER,
CUROPER INTEGER)
 AS
DECLARE VARIABLE CURCHNGVAL INTEGER;
DECLARE VARIABLE ERRINFO VARCHAR(255);
DECLARE VARIABLE BDOERRINFO VARCHAR(255);
DECLARE VARIABLE QUEUELENGTH INTEGER;
DECLARE VARIABLE SYNCKIND INTEGER;
DECLARE VARIABLE BDOCODE INTEGER;
BEGIN
  SELECT BDOCODE FROM CUSTOMDB INTO BDOCODE;
  IF ((BDOCODE IS NULL) OR (BDOCODE = 0)) THEN EXIT;

  FOR SELECT 'DELQUEUE',
    (SELECT COUNT(CHNG) FROM DELQUEUE WHERE CHNG > COALESCE(TL.CHNGVAL, 0)), '',
    TL.BDOERRINFO, 0, 1, TL.CUROPER, TL.ERRINFO
  FROM SYNCBASE S
  LEFT JOIN TBLLOADINFO TL ON TL.SYNCBASEID = S.ID AND TL.TABLENAME = 'DELQUEUE'
  WHERE S.ID = :ISYNCBASEID
  INTO TABLENAME, QUEUELENGTH, QUELENGTH, ERROR, SYNCCATEG, ISUPDIRECTION, CUROPER, ERRINFO DO
  BEGIN
    SUSPEND;
    QUELENGTH = QUEUELENGTH;
    ERROR = ERRINFO;
    ISUPDIRECTION = 2;
    SUSPEND;
  END

  FOR
    SELECT
      CASE
        WHEN TRIM(TC.TABLENAME) LIKE '%USER%' THEN '"USER"'
        ELSE TC.TABLENAME
      END,
      COALESCE(T.CHNGVAL, 0) AS CHNGVAL,
      T.ERRINFO,
      T.BDOERRINFO,
      TC.CATEG,
      ST.SYNCKIND,
      T.CUROPER
    FROM SYNCBASE SB
      JOIN SYNCTABLE ST ON ST.SYNCBASEID = SB.PARENTID AND ST.SYNCKIND <> 0
      JOIN TABLECATEG TC ON TC.CATEG = ST.CATEG
      LEFT JOIN TBLLOADINFO T ON T.SYNCBASEID = SB.ID AND T.TABLENAME = TC.TABLENAME
    WHERE
      SB.ID = :ISYNCBASEID AND
      EXISTS(SELECT 1 FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = TC.TABLENAME AND RDB$FIELD_NAME = 'OWNERBDO')

    INTO TABLENAME, CURCHNGVAL, ERRINFO, BDOERRINFO, SYNCCATEG, SYNCKIND, CUROPER
    DO
    BEGIN
      EXECUTE STATEMENT
      'SELECT COUNT(CHNG) FROM '||TABLENAME||' T '||
        IIF(SYNCKIND = 1, 'JOIN SYNCBASE SB ON T.OWNERBDO = SB.CODE ' ||
                          'WHERE SB.ID = ' || CAST(ISYNCBASEID AS VARCHAR(100)) || ' AND CHNG > ',
                          'WHERE CHNG > ') ||
        CAST(COALESCE(CURCHNGVAL, 0) AS VARCHAR(100))
      INTO QUEUELENGTH;
      ISUPDIRECTION = 1; QUELENGTH = ''; ERROR = BDOERRINFO;
      SUSPEND;
      ISUPDIRECTION = 2; QUELENGTH = QUEUELENGTH; ERROR = ERRINFO;
      SUSPEND;
    END
END
^

SET TERM ; ^

ALTER TABLE DOCKIND ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCKIND ALTER COLUMN CODE POSITION 2;

ALTER TABLE DOCKIND ALTER COLUMN NAME POSITION 3;

ALTER TABLE DOCKIND ALTER COLUMN TEXT POSITION 4;

ALTER TABLE DOCKIND ALTER COLUMN IDENTIF POSITION 5;

ALTER TABLE DOCKIND ALTER COLUMN ECRRECEIPTTYPE POSITION 6;

ALTER TABLE DOCKIND ALTER COLUMN REMAINOPERATION POSITION 7;

ALTER TABLE DOCKIND ALTER COLUMN ASKCOMMENT POSITION 8;

ALTER TABLE DOCKIND ALTER COLUMN BDOCODE POSITION 9;

ALTER TABLE DOCKIND ALTER COLUMN CHNG POSITION 10;

ALTER TABLE DOCKIND ALTER COLUMN OWNERBDO POSITION 11;

ALTER TABLE DOCKIND ALTER COLUMN ASKEMPLOYEE POSITION 12;

ALTER TABLE DOCKIND ALTER COLUMN COPYEMPLOYEE POSITION 13;

ALTER TABLE DOCUMENT ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCUMENT ALTER COLUMN DOCKINDID POSITION 2;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUENUMBER POSITION 3;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDATE POSITION 4;

ALTER TABLE DOCUMENT ALTER COLUMN OPENTIME POSITION 5;

ALTER TABLE DOCUMENT ALTER COLUMN OPENUSERID POSITION 6;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEDATE POSITION 7;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSETIME POSITION 8;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEUSERID POSITION 9;

ALTER TABLE DOCUMENT ALTER COLUMN DOCUMENTID POSITION 10;

ALTER TABLE DOCUMENT ALTER COLUMN CLIENTID POSITION 11;

ALTER TABLE DOCUMENT ALTER COLUMN STATE POSITION 12;

ALTER TABLE DOCUMENT ALTER COLUMN EDUCATION POSITION 13;

ALTER TABLE DOCUMENT ALTER COLUMN RMKID POSITION 14;

ALTER TABLE DOCUMENT ALTER COLUMN SUMM POSITION 15;

ALTER TABLE DOCUMENT ALTER COLUMN SUMMWD POSITION 16;

ALTER TABLE DOCUMENT ALTER COLUMN ECRSESSION POSITION 17;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUETYPE POSITION 18;

ALTER TABLE DOCUMENT ALTER COLUMN ORDERIDENTIF POSITION 19;

ALTER TABLE DOCUMENT ALTER COLUMN COMMENTCODE POSITION 20;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTSCHEME POSITION 21;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE1 POSITION 22;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE2 POSITION 23;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE3 POSITION 24;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE4 POSITION 25;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE5 POSITION 26;

ALTER TABLE DOCUMENT ALTER COLUMN HALLPLACEID POSITION 27;

ALTER TABLE DOCUMENT ALTER COLUMN SAVED POSITION 28;

ALTER TABLE DOCUMENT ALTER COLUMN INNERDOCORDER POSITION 29;

ALTER TABLE DOCUMENT ALTER COLUMN PRECHEQUE POSITION 30;

ALTER TABLE DOCUMENT ALTER COLUMN OPENRMKID POSITION 31;

ALTER TABLE DOCUMENT ALTER COLUMN OPENSESSION POSITION 32;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDOCNUMBER POSITION 33;

ALTER TABLE DOCUMENT ALTER COLUMN CHNG POSITION 34;

ALTER TABLE DOCUMENT ALTER COLUMN BDOCODE POSITION 35;

ALTER TABLE DOCUMENT ALTER COLUMN ISFISCAL POSITION 36;

ALTER TABLE DOCUMENT ALTER COLUMN OWNERBDO POSITION 37;

ALTER TABLE DOCUMENT ALTER COLUMN NSHOP POSITION 38;

ALTER TABLE DOCUMENT ALTER COLUMN USERVALUES POSITION 39;

ALTER TABLE DOCUMENT ALTER COLUMN EMPLOYEECODE POSITION 40;

ALTER TABLE DOCUMENT ALTER COLUMN DOCEMPLID POSITION 41;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEBEG POSITION 42;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEEND POSITION 43;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEINFO POSITION 44;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEBEF POSITION 45;

ALTER TABLE RMK ALTER COLUMN ID POSITION 1;

ALTER TABLE RMK ALTER COLUMN CODE POSITION 2;

ALTER TABLE RMK ALTER COLUMN NAME POSITION 3;

ALTER TABLE RMK ALTER COLUMN TEXT POSITION 4;

ALTER TABLE RMK ALTER COLUMN EDUCATIONMODE POSITION 5;

ALTER TABLE RMK ALTER COLUMN RMKVERSION POSITION 6;

ALTER TABLE RMK ALTER COLUMN HALLID POSITION 7;

ALTER TABLE RMK ALTER COLUMN AUTOREGUSERID POSITION 8;

ALTER TABLE RMK ALTER COLUMN EXITONEXCH POSITION 9;

ALTER TABLE RMK ALTER COLUMN BDOCODE POSITION 10;

ALTER TABLE RMK ALTER COLUMN CHNG POSITION 11;

ALTER TABLE RMK ALTER COLUMN OWNERBDO POSITION 12;

ALTER TABLE RMK ALTER COLUMN NOTIFICATIONGRP POSITION 13;

/* Create(Add) Crant */
GRANT ALL ON DISPLAYDEV TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON EMPLOYEE TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON RDNOTIFY TO SYSDBA WITH GRANT OPTION;

/* TEXT BLOCK END */

/* Convert 4.7.6 */

DROP TRIGGER IND_AFT_COUNTERTYPE;


ALTER TABLE DOCUMENT ADD OWNERUSERID FINT;

ALTER TABLE DOCUMENT ADD CARDBONUS FNUM15_2;

/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE GET_WARE_TREE(ID_PARENT INTEGER)
 RETURNS(ID INTEGER,
NAME VARCHAR(100),
CODE INTEGER,
PARENTID INTEGER)
 AS
 BEGIN SUSPEND; END
^

CREATE PROCEDURE GET_WARE_TREE0(ID_PARENT INTEGER)
 RETURNS(ID INTEGER)
 AS
 BEGIN SUSPEND; END
^


/* Alter Procedure... */
/* Alter (APPENDACTDISC) */
ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG DOUBLE PRECISION,
IPRICEEND DOUBLE PRECISION,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IQUANTITYRECBEG DOUBLE PRECISION,
IQUANTITYRECEND DOUBLE PRECISION,
IQUANTITYWAREBEG DOUBLE PRECISION,
IQUANTITYWAREEND DOUBLE PRECISION,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
ISUMMWAREBEG DOUBLE PRECISION,
ISUMMWAREEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
declare variable actdiscid integer;
declare variable grpactdiscid integer;
declare variable discrateid integer;
declare variable conditionid integer;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :IGRPACTDISCCODE
  INTO GRPACTDISCID;

  IF (GRPACTDISCID IS NULL) THEN
   BEGIN
      ERRORCODE = 1;
      EXIT;
    END

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :GRPACTDISCID
  PLAN (ACTDISC INDEX (UNQ_ACTDISC))
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, :IDATEBEG, :IDATEEND,
                                    :IDAYBEG, :IDAYEND, :IPRICEBEG, :IPRICEEND,
                                    :IQUANTITYBEG, :IQUANTITYEND,
                                    :IQUANTITYRECBEG, :IQUANTITYRECEND,
                                    :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,
                                    :ISUMMWAREBEG, :ISUMMWAREEND, :ITIMEBEG, :ITIMEEND,
                                    :IWARECODE, :IWARECODETOMARK)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (IDISCRATEPARENTCODE IS NOT NULL) THEN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEPARENTCODE AND ISFOLDER > 0
      INTO IDISCRATEPARENTID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, '', 0,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (GETHALLPLACES) */
ALTER PROCEDURE GETHALLPLACES(AHALLID INTEGER,
AEDUCATION INTEGER = 0)
 RETURNS(ID INTEGER,
CODE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
STATE INTEGER,
DOCCOUNT INTEGER,
OPENTIME TIME,
TOTALSUMM FLOAT,
USERNAME VARCHAR(100),
CLIENTNAME VARCHAR(100))
 AS
BEGIN
  FOR SELECT ID, CODE, NAME, TEXT FROM HALLPLACE WHERE HALLID = :AHALLID
  ORDER BY CODE
  INTO :ID, :CODE, :NAME, :TEXT DO
  BEGIN
    SELECT COUNT(ID), SUM(SUMMWD) FROM DOCUMENT
    WHERE HALLPLACEID = :ID AND ((STATE IN (0, 3)) OR (STATE = 4 AND (CURRENT_TIMESTAMP >= RESERVEBEF AND CURRENT_TIMESTAMP <= RESERVEEND)))
      AND EDUCATION = :AEDUCATION
    INTO :DOCCOUNT, :TOTALSUMM;

    STATE = 0;

    OPENTIME = NULL;
    USERNAME = NULL;
    CLIENTNAME = NULL;

    IF (DOCCOUNT > 0) THEN
    BEGIN
      SELECT FIRST 1 OPENTIME, USERNAME, CLIENTNAME, HSTATE FROM(
        SELECT D.OPENTIME, U.NAME AS USERNAME, C.NAME AS CLIENTNAME,
        CASE D.STATE
          WHEN 4 THEN 2
          ELSE 1
        END AS HSTATE

        FROM DOCUMENT D LEFT JOIN "USER" U ON U.ID = D.OWNERUSERID LEFT JOIN CLIENT C ON C.ID = D.CLIENTID
        WHERE D.HALLPLACEID = :ID AND ((D.STATE IN (0, 3)) OR (D.STATE = 4 AND (CURRENT_TIMESTAMP >= D.RESERVEBEF AND CURRENT_TIMESTAMP <= D.RESERVEEND)))
      ) ORDER BY HSTATE
      INTO :OPENTIME, :USERNAME, :CLIENTNAME, :STATE;

    END

    SUSPEND;
  END

END
^

/* Alter (UPDATE_ALL_REMAIN) */
ALTER PROCEDURE UPDATE_ALL_REMAIN AS
declare variable vremainid integer;
declare variable rid numeric(18,0);
declare variable vsumdelta double precision;
BEGIN
  VSUMDELTA = 0;
  SELECT GEN_ID(GREMAIND, 0) FROM RDB$DATABASE INTO :RID;
  FOR
    SELECT R.REMAINID, SUM(R.DELTA)
    FROM REMAIND R
    LEFT JOIN DOCUMENT D ON R.DOCUMENTID = D.ID
    WHERE ((R.DOCUMENTID IS NULL) OR (D.STATE = 1) OR (D.STATE = 2)) AND R.ID <= :RID
    GROUP BY R.REMAINID
    HAVING COUNT(*) > 1
    ORDER BY R.REMAINID
    INTO :VREMAINID, :VSUMDELTA
  DO
  BEGIN
    DELETE FROM REMAIND R
    WHERE
      R.REMAINID = :VREMAINID AND
      R.ID <= :RID AND
      (R.DOCUMENTID IS NULL OR EXISTS
        (SELECT * FROM DOCUMENT D
         WHERE D.ID = R.DOCUMENTID AND ((D.STATE = 1) OR (D.STATE = 2))));

    IF (VSUMDELTA <> 0) THEN
      INSERT INTO REMAIND (ID, DELTA, DTYPE, REMAINID) VALUES (GEN_ID(GREMAIND, 1), :VSUMDELTA, 1, :VREMAINID);
  END
END
^

/* Restore proc. body: GET_WARE_TREE */
ALTER PROCEDURE GET_WARE_TREE(ID_PARENT INTEGER)
 RETURNS(ID INTEGER,
NAME VARCHAR(100),
CODE INTEGER,
PARENTID INTEGER)
 AS
BEGIN
  FOR
    SELECT ID, NAME, CODE, PARENTID
    FROM SPRT
    WHERE ISWARE <> 1 AND PARENTID = :ID_PARENT
    ORDER BY CODE
    INTO :ID, :NAME, :CODE, :PARENTID
  DO
  BEGIN
    SUSPEND;
    FOR
      SELECT ID, NAME, CODE, PARENTID
      FROM GET_WARE_TREE(:ID)
      INTO :ID, :NAME, :CODE, :PARENTID
    DO
      SUSPEND;
  END
END
^

/* Restore proc. body: GET_WARE_TREE0 */
ALTER PROCEDURE GET_WARE_TREE0(ID_PARENT INTEGER)
 RETURNS(ID INTEGER)
 AS
BEGIN
  FOR
    SELECT ID
    FROM SPRT
    WHERE ISWARE <> 1 AND PARENTID = :ID_PARENT
    ORDER BY CODE
    INTO :ID
  DO
  BEGIN
    SUSPEND;
    FOR
      SELECT ID
      FROM GET_WARE_TREE(:ID)
      INTO :ID
    DO
      SUSPEND;
  END
END
^

/* Create trigger... */
CREATE TRIGGER INS_AFT_COUNTERTYPE FOR COUNTERTYPE
ACTIVE AFTER INSERT POSITION 0 
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
DECLARE VARIABLE OWNBDO INTEGER;
DECLARE VARIABLE TCODE1 INTEGER;
DECLARE VARIABLE TCODE2 INTEGER;
DECLARE VARIABLE CNTCODE NUMERIC(18);
BEGIN
 IF (NEW.AUTOCREATE = 1) THEN
   FOR
     SELECT C.ID, C.CODE, GC.CODE, C.OWNERBDO
     FROM CCARD C JOIN GRPCCARD GC ON
                  GC.ID = C.GRPCCARDID
     INTO TMPID1, TCODE1, TCODE2, OWNBDO
     DO
     BEGIN
       CNTCODE = IIF(:TCODE1 < 0, -2200000000, 2000000000) * :TCODE2 + 
:TCODE1;

       TMPID2 = NULL;
       SELECT ID
       FROM COUNTER
       WHERE CODE = :CNTCODE AND COUNTERTYPEID = NEW.ID
       INTO TMPID2;
       IF (TMPID2 IS NULL) THEN
       BEGIN
         TMPID2 = GEN_ID(GID, 1);
         INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, 
BDOCODE) VALUES (:TMPID2, :CNTCODE, NEW.ID, :OWNBDO, NEW.BDOCODE);
       END

       IF (NOT EXISTS(SELECT 1 FROM CCARDCOUNTER WHERE COUNTERID = 
:TMPID2 AND CCARDID = :TMPID1)) THEN
       BEGIN
         DELETE FROM CLIENTCOUNTER WHERE COUNTERID = :TMPID2;
         INSERT INTO CCARDCOUNTER (ID, COUNTERID, CCARDID, OWNERBDO, 
BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, :OWNBDO, NEW.BDOCODE);
       END
     END
 ELSE IF (NEW.AUTOCREATE = 2) THEN
   FOR
     SELECT ID, CODE, OWNERBDO
     FROM CLIENT
     WHERE ISFOLDER = 0
     INTO TMPID1, TCODE1, OWNBDO
     DO
     BEGIN
       TMPID2 = GEN_ID(GID, 1);
       INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, BDOCODE) 
VALUES (:TMPID2, :TCODE1, NEW.ID, NEW.OWNERBDO, :OWNBDO);
       INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID, OWNERBDO, 
BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, :OWNBDO, NEW.BDOCODE);
     END
END
^


/* Alter exist trigger... */
ALTER TRIGGER UPD_AFT_COUNTERTYPE
AS
DECLARE VARIABLE TMPID1 INTEGER;
DECLARE VARIABLE TMPID2 INTEGER;
DECLARE VARIABLE TCODE1 INTEGER;
DECLARE VARIABLE TCODE2 INTEGER;
DECLARE VARIABLE OWNBDO INTEGER;
DECLARE VARIABLE CNTCODE NUMERIC(18);
BEGIN
/*  OLD.AUTOCREATE >= 0   -.  
 */
/*      ,    
 */
/*      . */
/*        -     
   "" */
 IF (OLD.AUTOCREATE >= 0 AND NEW.AUTOCREATE <> OLD.AUTOCREATE) THEN
 BEGIN
 IF (NEW.AUTOCREATE = 1) THEN
 BEGIN
   DELETE FROM COUNTER C WHERE C.COUNTERTYPEID = NEW.ID AND
     NOT EXISTS(SELECT 1 FROM CCARD CC JOIN GRPCCARD GC ON GC.ID = 
CC.GRPCCARDID
                                    WHERE GC.CODE  = CAST(C.CODE / 
2000000000 AS INTEGER) AND CC.CODE = C.CODE - 2000000000 * CAST(C.CODE / 
2000000000 AS INTEGER));
   FOR
     SELECT C.ID, C.CODE, GC.CODE, C.OWNERBDO
     FROM CCARD C JOIN GRPCCARD GC ON
                  GC.ID = C.GRPCCARDID
     INTO TMPID1, TCODE1, TCODE2, OWNBDO
     DO
     BEGIN
       CNTCODE = IIF(:TCODE1 < 0, -2200000000, 2000000000) * :TCODE2 + 
:TCODE1;

       TMPID2 = NULL;
       SELECT ID
       FROM COUNTER
       WHERE CODE = :CNTCODE AND COUNTERTYPEID = NEW.ID
       INTO TMPID2;
       IF (TMPID2 IS NULL) THEN
       BEGIN
         TMPID2 = GEN_ID(GID, 1);
         INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, 
BDOCODE) VALUES (:TMPID2, :CNTCODE, NEW.ID, :OWNBDO, NEW.BDOCODE);
       END

       IF (NOT EXISTS(SELECT 1 FROM CCARDCOUNTER WHERE COUNTERID = 
:TMPID2 AND CCARDID = :TMPID1)) THEN
       BEGIN
         DELETE FROM CLIENTCOUNTER WHERE COUNTERID = :TMPID2;
         INSERT INTO CCARDCOUNTER (ID, COUNTERID, CCARDID, OWNERBDO, 
BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, :OWNBDO, NEW.BDOCODE);
       END
     END
 END
 IF (NEW.AUTOCREATE = 2) THEN
 BEGIN
   DELETE FROM COUNTER C WHERE C.COUNTERTYPEID = NEW.ID AND NOT 
EXISTS(SELECT 1 FROM CLIENT CL WHERE CL.CODE = C.CODE);
   FOR
     SELECT ID, CODE, OWNERBDO
     FROM CLIENT C
     WHERE  ISFOLDER = 0
     INTO TMPID1, TCODE1, OWNBDO
     DO
     BEGIN
       TMPID2 = NULL;
       SELECT ID
       FROM COUNTER
       WHERE CODE = :TCODE1 AND COUNTERTYPEID = NEW.ID
       INTO TMPID2;

       IF (TMPID2 IS NULL) THEN
       BEGIN
         TMPID2 = GEN_ID(GID, 1);
         INSERT INTO COUNTER (ID, CODE, COUNTERTYPEID, OWNERBDO, 
BDOCODE) VALUES (:TMPID2, :TCODE1, NEW.ID, :OWNBDO, NEW.BDOCODE);
       END

       IF (NOT EXISTS(SELECT 1 FROM CLIENTCOUNTER WHERE COUNTERID = 
:TMPID2 AND CLIENTID = :TMPID1)) THEN
       BEGIN
         DELETE FROM CCARDCOUNTER WHERE COUNTERID = :TMPID2;
         INSERT INTO CLIENTCOUNTER (ID, COUNTERID, CLIENTID, OWNERBDO, 
BDOCODE) VALUES (GEN_ID(GID, 1), :TMPID2, :TMPID1, :OWNBDO, NEW.BDOCODE);
       END
     END
 END
 END
END
^

/* Alter Procedure... */
SET TERM ; ^

ALTER TABLE DOCUMENT ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCUMENT ALTER COLUMN DOCKINDID POSITION 2;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUENUMBER POSITION 3;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDATE POSITION 4;

ALTER TABLE DOCUMENT ALTER COLUMN OPENTIME POSITION 5;

ALTER TABLE DOCUMENT ALTER COLUMN OPENUSERID POSITION 6;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEDATE POSITION 7;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSETIME POSITION 8;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEUSERID POSITION 9;

ALTER TABLE DOCUMENT ALTER COLUMN DOCUMENTID POSITION 10;

ALTER TABLE DOCUMENT ALTER COLUMN CLIENTID POSITION 11;

ALTER TABLE DOCUMENT ALTER COLUMN STATE POSITION 12;

ALTER TABLE DOCUMENT ALTER COLUMN EDUCATION POSITION 13;

ALTER TABLE DOCUMENT ALTER COLUMN RMKID POSITION 14;

ALTER TABLE DOCUMENT ALTER COLUMN SUMM POSITION 15;

ALTER TABLE DOCUMENT ALTER COLUMN SUMMWD POSITION 16;

ALTER TABLE DOCUMENT ALTER COLUMN ECRSESSION POSITION 17;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUETYPE POSITION 18;

ALTER TABLE DOCUMENT ALTER COLUMN ORDERIDENTIF POSITION 19;

ALTER TABLE DOCUMENT ALTER COLUMN COMMENTCODE POSITION 20;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTSCHEME POSITION 21;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE1 POSITION 22;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE2 POSITION 23;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE3 POSITION 24;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE4 POSITION 25;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE5 POSITION 26;

ALTER TABLE DOCUMENT ALTER COLUMN HALLPLACEID POSITION 27;

ALTER TABLE DOCUMENT ALTER COLUMN SAVED POSITION 28;

ALTER TABLE DOCUMENT ALTER COLUMN INNERDOCORDER POSITION 29;

ALTER TABLE DOCUMENT ALTER COLUMN PRECHEQUE POSITION 30;

ALTER TABLE DOCUMENT ALTER COLUMN OPENRMKID POSITION 31;

ALTER TABLE DOCUMENT ALTER COLUMN OPENSESSION POSITION 32;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDOCNUMBER POSITION 33;

ALTER TABLE DOCUMENT ALTER COLUMN CHNG POSITION 34;

ALTER TABLE DOCUMENT ALTER COLUMN BDOCODE POSITION 35;

ALTER TABLE DOCUMENT ALTER COLUMN ISFISCAL POSITION 36;

ALTER TABLE DOCUMENT ALTER COLUMN OWNERBDO POSITION 37;

ALTER TABLE DOCUMENT ALTER COLUMN NSHOP POSITION 38;

ALTER TABLE DOCUMENT ALTER COLUMN USERVALUES POSITION 39;

ALTER TABLE DOCUMENT ALTER COLUMN EMPLOYEECODE POSITION 40;

ALTER TABLE DOCUMENT ALTER COLUMN DOCEMPLID POSITION 41;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEBEG POSITION 42;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEEND POSITION 43;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEINFO POSITION 44;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEBEF POSITION 45;

ALTER TABLE DOCUMENT ALTER COLUMN OWNERUSERID POSITION 46;

ALTER TABLE DOCUMENT ALTER COLUMN CARDBONUS POSITION 47;

/* MAN */

UPDATE DOCKIND SET ECRRECEIPTTYPE = 6 WHERE ECRRECEIPTTYPE = 7;
UPDATE DOCUMENT SET OWNERUSERID = OPENUSERID WHERE STATE <> 4;
COMMIT;

/* TEXT BLOCK END */

/* Convert 4.7.7 */

SET TERM ^ ;

CREATE OR ALTER PROCEDURE GET_TRANZCOUNT (
    ARMKID INTEGER)
RETURNS (
    TRANZCOUNT INTEGER)
AS
DECLARE VARIABLE ACODE INTEGER;
BEGIN

  SELECT CODE
  FROM RMK
  WHERE ID = :ARMKID
  INTO ACODE;

  SELECT FIRST 1 TRANZCOUNT + 1
  FROM TRANZT
  WHERE POSNUMBER = :ACODE
  PLAN (TRANZT ORDER IDX_POSN_TRZT_DESC )
  ORDER BY POSNUMBER DESC, TRANZCOUNT DESC
  INTO TRANZCOUNT;
  IF (TRANZCOUNT IS NULL) THEN
    TRANZCOUNT = 1;
END ^

CREATE OR ALTER TRIGGER INS_BEF_TRANZT0 FOR TRANZT
ACTIVE BEFORE INSERT POSITION 0
AS
DECLARE VARIABLE DSTATE INTEGER;
DECLARE VARIABLE RMKID INTEGER;
BEGIN

  SELECT STATE, RMKID FROM DOCUMENT WHERE ID = NEW.DOCUMENTID INTO :DSTATE, :RMKID;

  /*     */
  IF (DSTATE IN (1, 2)) THEN
    EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES NEW.TRANZCOUNT;

  IF (NEW.WAREMARK IS NULL) THEN
    NEW.WAREMARK = '';
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GDOC, 1);
END ^

CREATE OR ALTER PROCEDURE APPENDREMAIN (
    IWARECODE VARCHAR(20),
    IASPV1 INTEGER,
    IASPV2 INTEGER,
    IASPV3 INTEGER,
    IASPV4 INTEGER,
    IASPV5 INTEGER,
    IREMAIN DOUBLE PRECISION,
    IPRICE DOUBLE PRECISION,
    IADDREPLACE INTEGER,
    IDISCOUNTTYPE INTEGER,
    IDISCOUNTVALUE VARCHAR(100),
    IDELETED INTEGER,
    IDELETEDASPECT INTEGER,
    IWARECODETOMARK INTEGER,
    IDISCRATEPARENTID INTEGER,
    IUSEGRPACTDISC INTEGER,
    IGRPACTDISCCODE INTEGER,
    IDELETEDGRPACTDISC INTEGER,
    IDELETEDACTDISC INTEGER,
    ILOADWAREDISC INTEGER = 1)
RETURNS (
    ERRORCODE INTEGER)
AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE WARENAME VARCHAR(100);
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCCODE INTEGER;
DECLARE VARIABLE USEREMAIN INTEGER;
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (AD1 + AD2 + AD3 + AD4 + AD5 = 0) THEN
  BEGIN
    ASPECTSCHEMEID = NULL;
    IF (NOT IPRICE IS NULL) THEN
      UPDATE SPRT SET PRICE = :IPRICE WHERE ID = :WAREID;
  END

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
    BEGIN
      IF (ASPCODE = 1)  THEN
        IF (IASPV1 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
          INTO AD1;
        ELSE
        BEGIN
          ERRORCODE = 10;
          EXIT;
        END

      IF (ASPCODE = 2)  THEN
        IF (IASPV2 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
          INTO AD2;
        ELSE
        BEGIN
          ERRORCODE = 11;
          EXIT;
        END

      IF (ASPCODE = 3)  THEN
        IF (IASPV3 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
          INTO AD3;
        ELSE
        BEGIN
          ERRORCODE = 12;
          EXIT;
        END

      IF (ASPCODE = 4)  THEN
        IF (IASPV4 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
          INTO AD4;
        ELSE
        BEGIN
          ERRORCODE = 13;
          EXIT;
        END

      IF (ASPCODE = 5)  THEN
        IF (IASPV5 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
          INTO AD5;
        ELSE
        BEGIN
          ERRORCODE = 14;
          EXIT;
        END
    END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR (AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    REMAINID = GEN_ID(GID, 1);

    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, PRICE,
       DELETED, USEREMAIN)
    VALUES
      (:REMAINID, :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5,
      :IPRICE, :IDELETED, :USEREMAIN);

    IF (NOT :IREMAIN IS NULL) THEN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE <> 1) THEN
    BEGIN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 1;

      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;
    END

    UPDATE REMAIN SET
      PRICE = :IPRICE,
      DELETED = :IDELETED
    WHERE ID = :REMAINID;

    IF (NOT :IREMAIN IS NULL) THEN
    BEGIN
      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
     END

    IF (IADDREPLACE = 2) THEN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 0;
  END

  IF ((ILOADWAREDISC = 1) AND NOT IDISCOUNTVALUE IS NULL) THEN
  BEGIN
    IF (IDISCOUNTVALUE <> '') THEN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       0, 2, 0, NULL, NULL)
      RETURNING_VALUES ERRORCODE, TDISCRATEID;

    WHERECLAUSE = '';

    IF (AD1 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
    ELSE
    BEGIN
      AD1 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID IS NULL ';
    END

    IF (AD2 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
    ELSE
    BEGIN
      AD2 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID IS NULL ';
    END

    IF (AD3 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
    ELSE
    BEGIN
      AD3 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID IS NULL ';
    END

    IF (AD4 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
    ELSE
    BEGIN
      AD4 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID IS NULL ';
    END

    IF (AD5 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
    ELSE
    BEGIN
      AD5 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID IS NULL ';
    END

    IF (IUSEGRPACTDISC <> 0) THEN
    BEGIN

      SELECT ID
      FROM GRPACTDISC
      WHERE CODE = :IGRPACTDISCCODE
      INTO :GRPACTDISCID;

      IF (GRPACTDISCID IS NULL) THEN
      BEGIN
        GRPACTDISCID = GEN_ID(GID, 1);
        INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
        VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
      END

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.DELETED ' ||
                        ' FROM ACTDISCOBJ A JOIN GRPACTDISC G ON ' ||
                                          ' G.ID = A.GRPACTDISCID AND G.ID = '|| :GRPACTDISCID ||
                        ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                        '      A.PAYMENTID = -1 AND A.CARDID = -1 '|| WHERECLAUSE
      INTO TACTDISCOBJID, DEL;

      IF (TACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, NULL, NULL, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :TACTDISCOBJID;

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                         C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID
      INTO ACTDISCID, CONDITIONID;

      EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL,
                                          NULL, NULL,  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  NULL, NULL,
                                          NULL, NULL, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

      IF (ACTDISCID IS NULL) THEN
      BEGIN
        SELECT NULLTONUM(MAX(CODE)) + 1
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        INTO ACTDISCCODE;

        INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                              CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
        VALUES     (GEN_ID(GID, 1), :ACTDISCCODE, :GRPACTDISCID, :WARENAME,
                    :CONDITIONID, :TDISCRATEID, NULL, 0, :IDELETEDACTDISC);
      END
      ELSE
        UPDATE ACTDISC SET
          NAME = :WARENAME,
          CONDITIONID = :CONDITIONID,
          DISCRATEID = :TDISCRATEID,
          DELETED = :IDELETEDACTDISC
        WHERE ID = :ACTDISCID;
    END
    ELSE
    BEGIN
      IF (IDISCOUNTVALUE <> '') THEN
      BEGIN
        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID ' ||
                          ' FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                          ' D.ID = A.DISCRATEID AND D.KIND = 2 '||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '       A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
        INTO TACTDISCOBJID;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, :TDISCRATEID, NULL, NULL);
        ELSE
          UPDATE ACTDISCOBJ SET
             DISCRATEID = :TDISCRATEID,
             DELETED = 0
          WHERE ID = :TACTDISCOBJID;
      END
      ELSE
        EXECUTE STATEMENT
          'UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID IN ' ||
          '(SELECT A.ID FROM ACTDISCOBJ A JOIN DISCRATE D ON ' ||
          '    D.ID = A.DISCRATEID AND D.KIND = 2 ' ||
          '    WHERE A.WAREID = ' || :WAREID || ' AND A.CLIENTID = -1 AND ' ||
          '          A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 ' || WHERECLAUSE || ')';
    END
  END
END
^

/* Create trigger... */
CREATE TRIGGER INS_AFT_SPRT_REMAIN FOR SPRT
ACTIVE AFTER INSERT POSITION 0 
AS
BEGIN
  IF (NEW.ISWARE = 1) THEN
  BEGIN
    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID, BDOCODE)
    VALUES
      (GEN_ID(GID, 1), NEW.ID, 0, 0, 0, 0, 0, NEW.BDOCODE);
  END
END
^


/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_SETTINGS
AS
BEGIN
  IF ((NEW.VAL <> OLD.VAL) OR (NEW.CHNG IS NULL) OR (NEW.CHNG > 0) ) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

SET TERM ; ^

/* MAN */

INSERT INTO REMAIN (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID, BDOCODE)
SELECT GEN_ID(GID, 1), S.ID, 0, 0, 0, 0, 0, NULL FROM SPRT S
WHERE NOT EXISTS(SELECT 1 FROM REMAIN WHERE WAREID = S.ID);

COMMIT;

/* MAN */

/* TEXT BLOCK END */

/* Convert 4.7.8 */

ALTER TABLE DOCUMENT ADD ECRDEPARTMENT FINT;

/* Alter Procedure... */
/* Alter (SYNC_DEL_REC) */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE SYNC_DEL_REC(TBLNAME VARCHAR(50),
RECID NUMERIC(18))
 AS
BEGIN
  IF (NOT RECID IS NULL) THEN
    EXECUTE STATEMENT 'DELETE FROM ' || TBLNAME || ' WHERE ID = ' || RECID;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_SETTINGS
AS
BEGIN
  IF (NEW.VAL = OLD.VAL) THEN
    NEW.CHNG = OLD.CHNG;
  ELSE
    NEW.CHNG = GEN_ID(GCHNG, 1);

  IF (NEW.CHNG IS NULL) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);

  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

SET TERM ; ^

ALTER TABLE DOCUMENT ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCUMENT ALTER COLUMN DOCKINDID POSITION 2;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUENUMBER POSITION 3;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDATE POSITION 4;

ALTER TABLE DOCUMENT ALTER COLUMN OPENTIME POSITION 5;

ALTER TABLE DOCUMENT ALTER COLUMN OPENUSERID POSITION 6;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEDATE POSITION 7;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSETIME POSITION 8;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEUSERID POSITION 9;

ALTER TABLE DOCUMENT ALTER COLUMN DOCUMENTID POSITION 10;

ALTER TABLE DOCUMENT ALTER COLUMN CLIENTID POSITION 11;

ALTER TABLE DOCUMENT ALTER COLUMN STATE POSITION 12;

ALTER TABLE DOCUMENT ALTER COLUMN EDUCATION POSITION 13;

ALTER TABLE DOCUMENT ALTER COLUMN RMKID POSITION 14;

ALTER TABLE DOCUMENT ALTER COLUMN SUMM POSITION 15;

ALTER TABLE DOCUMENT ALTER COLUMN SUMMWD POSITION 16;

ALTER TABLE DOCUMENT ALTER COLUMN ECRSESSION POSITION 17;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUETYPE POSITION 18;

ALTER TABLE DOCUMENT ALTER COLUMN ORDERIDENTIF POSITION 19;

ALTER TABLE DOCUMENT ALTER COLUMN COMMENTCODE POSITION 20;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTSCHEME POSITION 21;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE1 POSITION 22;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE2 POSITION 23;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE3 POSITION 24;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE4 POSITION 25;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE5 POSITION 26;

ALTER TABLE DOCUMENT ALTER COLUMN HALLPLACEID POSITION 27;

ALTER TABLE DOCUMENT ALTER COLUMN SAVED POSITION 28;

ALTER TABLE DOCUMENT ALTER COLUMN INNERDOCORDER POSITION 29;

ALTER TABLE DOCUMENT ALTER COLUMN PRECHEQUE POSITION 30;

ALTER TABLE DOCUMENT ALTER COLUMN OPENRMKID POSITION 31;

ALTER TABLE DOCUMENT ALTER COLUMN OPENSESSION POSITION 32;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDOCNUMBER POSITION 33;

ALTER TABLE DOCUMENT ALTER COLUMN CHNG POSITION 34;

ALTER TABLE DOCUMENT ALTER COLUMN BDOCODE POSITION 35;

ALTER TABLE DOCUMENT ALTER COLUMN ISFISCAL POSITION 36;

ALTER TABLE DOCUMENT ALTER COLUMN OWNERBDO POSITION 37;

ALTER TABLE DOCUMENT ALTER COLUMN NSHOP POSITION 38;

ALTER TABLE DOCUMENT ALTER COLUMN USERVALUES POSITION 39;

ALTER TABLE DOCUMENT ALTER COLUMN EMPLOYEECODE POSITION 40;

ALTER TABLE DOCUMENT ALTER COLUMN DOCEMPLID POSITION 41;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEBEG POSITION 42;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEEND POSITION 43;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEINFO POSITION 44;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEBEF POSITION 45;

ALTER TABLE DOCUMENT ALTER COLUMN OWNERUSERID POSITION 46;

ALTER TABLE DOCUMENT ALTER COLUMN CARDBONUS POSITION 47;

ALTER TABLE DOCUMENT ALTER COLUMN ECRDEPARTMENT POSITION 48;

/* MAN */
/*  4.7.5   DISPLAYDEV     ()*/
INSERT INTO DISPLAYDEV (ID, DEVICEID, CODEPAGE)
SELECT GEN_ID(GID, 1), ID, 866 FROM DEVICES D
WHERE ISFOLDER = 0 AND TYPEDEV = 2 AND NOT EXISTS(SELECT 1 FROM DISPLAYDEV WHERE DEVICEID = D.ID);
COMMIT;
/* 10520.        . () */
UPDATE CLIENT SET CODE = -CODE;
UPDATE CLIENT SET CODE = -CODE;
COMMIT;
/* MAN */

/* TEXT BLOCK END */

/* Convert 4.8.0 */

ALTER TABLE COUNTERD DROP CONSTRAINT FK_CNTD_CNT;

ALTER TABLE SPRT ADD GTD FVARCHAR100;

ALTER TABLE SYNCBASE ADD DBIDENT FINT;

ALTER TABLE DOCUMENT ALTER COLUMN ECRDEPARTMENT TYPE INTEGER;

/* Empty APPENDWARE for drop SPRT(SERIES) */
SET TERM ^ ;

ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(30),
ICERTIFICAT VARCHAR(30),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

SET TERM ; ^

/* MAN */
ALTER TABLE SPRT ADD DESCRIPTION_ FBLOBTEXT;
UPDATE SPRT SET DESCRIPTION_ = DESCRIPTION WHERE DESCRIPTION IS NOT NULL;
COMMIT;
ALTER TABLE SPRT DROP DESCRIPTION;
ALTER TABLE SPRT ALTER DESCRIPTION_ TO DESCRIPTION;
/* _MAN */

ALTER TABLE SPRT ALTER COLUMN SERIES TYPE FVARCHAR100;

ALTER TABLE SPRT ALTER COLUMN CERTIFICAT TYPE FVARCHAR100;

SET TERM ^ ;

CREATE PROCEDURE UNI_FILTER(ATABLENAME VARCHAR(100),
AKEYFIELD VARCHAR(20),
AFIELDS VARCHAR(255),
AFILTER VARCHAR(255))
 RETURNS(ID INTEGER)
 AS
 BEGIN SUSPEND; END
^


/* Create index... */
SET TERM ; ^

CREATE INDEX IDX_REMAIN_ASPV1 ON REMAIN(ASPECTVALUE1ID);

CREATE INDEX IDX_REMAIN_ASPV2 ON REMAIN(ASPECTVALUE2ID);

CREATE INDEX IDX_REMAIN_ASPV3 ON REMAIN(ASPECTVALUE3ID);

CREATE INDEX IDX_REMAIN_ASPV4 ON REMAIN(ASPECTVALUE4ID);

CREATE INDEX IDX_REMAIN_ASPV5 ON REMAIN(ASPECTVALUE5ID);


/*  Empty APPENDCCARDDISCS for APPENDCOUNTERBYTYPE(param list change)  */
SET TERM ^ ;

ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 INTEGER,
ICOUNTERCODE2 INTEGER,
ICOUNTERCODE3 INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 INTEGER,
OCOUNTERCODE2 INTEGER,
OCOUNTERCODE3 INTEGER)
 AS
 BEGIN SUSPEND; END
^

/*  Empty APPENDCLIENT for APPENDCOUNTERBYTYPE(param list change)  */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 INTEGER,
ICOUNTERCODE2 INTEGER,
ICOUNTERCODE3 INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 INTEGER,
OCOUNTERCODE2 INTEGER,
OCOUNTERCODE3 INTEGER)
 AS
 BEGIN SUSPEND; END
^

/*  Empty APPENDPILOT for APPENDWARE(param list change)  */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure APPENDCOUNTERBYTYPE with new param-list */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER,
ICLIENTID INTEGER,
ICOUNTERCODE NUMERIC(18),
IERRORCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE NUMERIC(18))
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure APPENDWARE with new param-list */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(100),
ICERTIFICAT VARCHAR(100),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
IGTD VARCHAR(100),
ILOADWAREDISC INTEGER = 1)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter Procedure... */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER,
ICLIENTID INTEGER,
ICOUNTERCODE NUMERIC(18),
IERRORCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE NUMERIC(18))
 AS
DECLARE VARIABLE COUNTERTYPEID INTEGER;
DECLARE VARIABLE COUNTERID INTEGER;
DECLARE VARIABLE CID INTEGER;
DECLARE VARIABLE ABDOCODE INTEGER;
DECLARE VARIABLE AOWNERBDO INTEGER;
DECLARE VARIABLE DELTA DOUBLE PRECISION;
BEGIN

  OCOUNTERCODE = ICOUNTERCODE;
  SELECT ID
  FROM COUNTERTYPE
  WHERE CODE = :ICOUNTERTYPE
  INTO :COUNTERTYPEID;

  SELECT BDOCODE, DBIDENT FROM CUSTOMDB INTO AOWNERBDO, ABDOCODE;

  IF (:COUNTERTYPEID IS NULL) THEN
  BEGIN
    ERRORCODE = IERRORCODE;
    EXIT;
  END

  IF (ICARDID IS NOT NULL) THEN
  BEGIN
    CID = NULL;
    FOR
      SELECT C.ID
      FROM CCARDCOUNTER CC
        LEFT JOIN COUNTER C ON CC.COUNTERID = C.ID
      WHERE CC.CCARDID = :ICARDID AND C.COUNTERTYPEID = :COUNTERTYPEID
      INTO :COUNTERID
    DO
    BEGIN
      SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE = 1 INTO :DELTA;
      IF (DELTA <> 0) THEN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

      SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE <> 1 INTO :DELTA;
      IF (DELTA <> 0) THEN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 2);

      IF (CID IS NULL) THEN
      BEGIN
        IF (NULLTONUM(ICOUNTERVAL) <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        UPDATE COUNTER SET
          DATECREATE = CURRENT_DATE + CURRENT_TIME,
          BDOCODE = :ABDOCODE
        WHERE ID = :COUNTERID;
      END
      CID = 0;
    END

    IF (:CID IS NULL) THEN
    BEGIN
      COUNTERID = GEN_ID(GID, 1);

      OCOUNTERCODE = OCOUNTERCODE + 1;
      INSERT INTO COUNTER(ID, CODE, COUNTERTYPEID, BDOCODE, OWNERBDO)
      VALUES (:COUNTERID, :OCOUNTERCODE, :COUNTERTYPEID, :ABDOCODE, :AOWNERBDO);

      IF (NULLTONUM(ICOUNTERVAL) <> 0) THEN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

      INSERT INTO CCARDCOUNTER(ID, CCARDID, COUNTERID, BDOCODE, OWNERBDO)
      VALUES (GEN_ID(GID, 1), :ICARDID, :COUNTERID, :ABDOCODE, :AOWNERBDO);
    END
  END
  ELSE
    IF (ICLIENTID IS NOT NULL) THEN
    BEGIN
      CID = NULL;
      FOR
        SELECT C.ID
        FROM CLIENTCOUNTER CC
          LEFT JOIN COUNTER C ON CC.COUNTERID = C.ID
        WHERE CC.CLIENTID = :ICLIENTID AND C.COUNTERTYPEID = :COUNTERTYPEID
        INTO :COUNTERID
      DO
      BEGIN
        SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE = 1 INTO :DELTA;
        IF (DELTA <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE <> 1 INTO :DELTA;
        IF (DELTA <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE,  :AOWNERBDO, 2);

        IF (CID IS NULL) THEN
        BEGIN
          IF (NULLTONUM(:ICOUNTERVAL) <> 0) THEN
            INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
            VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

          UPDATE COUNTER SET
            DATECREATE = CURRENT_DATE + CURRENT_TIME,
            BDOCODE = :ABDOCODE
          WHERE ID = :COUNTERID;
        END
        CID = 0;
      END

      IF (:CID IS NULL) THEN
      BEGIN
        COUNTERID = GEN_ID(GID, 1);
        OCOUNTERCODE = OCOUNTERCODE + 1;
        INSERT INTO COUNTER(ID, CODE, COUNTERTYPEID, BDOCODE, OWNERBDO)
        VALUES (:COUNTERID, :OCOUNTERCODE, :COUNTERTYPEID, :ABDOCODE, :AOWNERBDO);

        IF (NULLTONUM(:ICOUNTERVAL) <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        INSERT INTO CLIENTCOUNTER(ID, CLIENTID, COUNTERID, BDOCODE, OWNERBDO)
        VALUES (GEN_ID(GID, 1), :ICLIENTID, :COUNTERID, :ABDOCODE, :AOWNERBDO);
      END
    END
END
^

/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE DOCODE INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE VAL = :ICARD
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      IF (EXISTS(SELECT 1 FROM CCARD WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID)) THEN
      BEGIN
        SELECT MAX(CODE) + 1 FROM CCARD WHERE GRPCCARDID = :GRPCARDID INTO ICARDCODE;
        IF (ICARDCODE IS NULL) THEN
          ICARDCODE = 1;
      END
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        CODE = :ICARDCODE,
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        PLAN (A INDEX (IDX_ACTDISCOBJ2))
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;

        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCARDFLG = 1) THEN
        FOR SELECT A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID
        DO
          UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;
END
^

/* Alter (APPENDCLIENT) */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,      CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE, BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,
                          WEB,     TELEPHONE, INN,      DOCUMENT, OKPO,  OKPD,     DELETED)

      VALUES (:CLIENTID, :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT,  :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE, :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,
              :IWEB,     :ITELEPHONE, :IINN,        :IDOCUMENT, :IOKPO, :IOKPD,     :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCLIENT = 1) THEN
      FOR SELECT A.ID
      FROM ACTDISCOBJ A
      WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
            A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
            A.DISCRATEID > 0
      INTO ACTDISCOBJID
      DO
        UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;
END
^

ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(100),
ICERTIFICAT VARCHAR(100),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
IGTD VARCHAR(100),
ILOADWAREDISC INTEGER = 1)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
DECLARE VARIABLE TISWARE INTEGER;
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TDELETED INTEGER;
DECLARE VARIABLE TDELETEDISWARE INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE HIERLEVEL INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE BARC VARCHAR(40);
BEGIN
  ERRORCODE = 0;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      IF (IEXCHANGEFORMAT <> 1) THEN
        BEGIN
          ERRORCODE = 8;
          EXIT;
        END
      ELSE
        IFIRSTASPECTVALUE = 0;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  HIERLEVEL = 0;
  IF (IPARENTCODE <> '') THEN
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (CODE = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (MARK = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
  END
  ELSE
    PARENTID = 0;
  HIERLEVEL = HIERLEVEL + 1;

  IF (IISWARE <> 1) THEN
    BEGIN
      IISWARE = -2147483647 + HIERLEVEL;
    END

  IF ((PARENTID IS NULL) OR (TISWARE > 0)) THEN
  BEGIN
    ERRORCODE = 2;
    EXIT;
  END

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  TISWARE = NULL;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ISWARE, DELETED
    FROM SPRT
    WHERE CODE = :ICODE
    INTO TID, TISWARE, TDELETEDISWARE;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, DELETED, ISWARE, DELETED
    FROM SPRT
    WHERE MARK = :IMARK
    INTO TID, TDELETED, TISWARE, TDELETEDISWARE;
  END

  IF ((((TISWARE > 0) AND (IISWARE <= 0)) OR
       ((TISWARE <= 0) AND (IISWARE > 0))) AND (TDELETEDISWARE >= IDELETED)) THEN
    EXCEPTION E_CANT_CHANGE_ISWARE;

  IF (TID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO SPRT (ID, PARENTID, CODE, MARK, NAME, TEXT, HIERLEVEL,
      MINPRICE, ECRDEVID, TAXGROUPID, RCPPRNDEVID,
      ASPECTSCHEMEID, PRICELABELID,
      MAXDISCOUNT, ISWARE, PRICE, FLAGS, LIFE, SERIES,
      CERTIFICAT, SCALELPDEVID, SCALELPWARECODE, ASPECTTYPE, QUANTITYPREC,
      SCALELPLOADED, PRICELBPRINTED, DELETED, DESCRIPTION, PICTURE, REWARDTYPE, REWARDVAL,
      ECRDEPARTMENT, GTD)
    VALUES (:ID, :PARENTID, :ICODE, :IMARK, :INAME, :ITEXT, :HIERLEVEL,
      :IMINPRICE, :ECRDEVID, :TAXGROUPID, :RCPPRNDEVID,
      :ASPECTSCHEMEID, :PRICELABELID,
      :IMAXDISCOUNT, :IISWARE, :IPRICE, :IFLAGS, :ILIFE, :ISERIES,
      :ICERTIFICAT, :SCALELPDEVID, :ISCALELPWARECODE, :IASPECTTYPE, :IQUANTITYPREC,
      :ISCALELPLOADED, :IPRICELBPRINTED, :IDELETED, :IDESCRIPTION, :IPICTURE, :IREWARDTYPE, :IREWARDVAL,
      :IECRDEPARTMENT, :IGTD);
    INCREMENTCODE = 1;
  END
  ELSE
  BEGIN
    ID = TID;
    IF (TDELETED = IDELETED) THEN
      UPDATE SPRT SET
        ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
        ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
        CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
                                           PRICELABELID = :PRICELABELID,
        DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
        DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
        ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
        ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
        FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
        HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
        ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
        LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
        MARK = :IMARK,                     SERIES = :ISERIES,
        MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
        MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
        NAME = :INAME,
        GTD = :IGTD
      WHERE ID = :ID;
    ELSE
      BEGIN
        UPDATE SPRT SET
          ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
          ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
          CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
          CODE = :ICODE,                     PRICELABELID = :PRICELABELID,
          DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
          DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
          ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
          ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
          FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
          HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
          ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
          LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
          MARK = :IMARK,                     SERIES = :ISERIES,
          MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
          MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
          NAME = :INAME,
          GTD = :IGTD
        WHERE ID = :ID;
        INCREMENTCODE = 1;
      END
  END

  IF (IISWARE = 1) THEN
  BEGIN
    EXECUTE PROCEDURE APPENDREMAINBYWAREID (:ID, :IFIRSTASPECTVALUE, :ASPECTSCHEMEID, :IREMAIN, :IDELETEDREMAIN, :IDELETEDASPECT, :IADDREPLACE)
      RETURNING_VALUES ERRORCODE;

    IF (ERRORCODE > 0) THEN
      EXIT;

    WHILE (IBARCODES <> '') DO
    BEGIN
      BARC = EXTRACTSTR(IBARCODES, ',');

      EXECUTE PROCEDURE APPENDBARCODEBYWAREID (:BARC, :ID, 0, 0, 0, 0, 0, :IFACTOR, 0, :IDELETEDBARCODE)
        RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;

      IBARCODES = PCOPY(IBARCODES, LEN(BARC) + 1, LEN(IBARCODES) - LEN(BARC) - 1);
    END
  END

  IF ((ILOADWAREDISC = 1) AND NOT (IDISCRATEPARENTID IS NULL) AND NOT (IDISCOUNTVALUE IS NULL)) THEN
    BEGIN
      EXECUTE PROCEDURE APPEND_WARE_DISC(:ID, :IDISCOUNTTYPE, :IDISCOUNTVALUE, :IDISCRATEPARENTID)
            RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;
    END

  IF (ILOADWAREDISC = 1 AND TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :ID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID,
          DELETED = 0
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :ID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
END
^

/* Alter (APPENDPILOT) */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE DORMANTVAR INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 1535, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            SELECT ID
            FROM SPRT
            WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
            INTO MAINID;

            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

/* Alter (APPENDREMAIN) */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE WARENAME VARCHAR(100);
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCCODE INTEGER;
DECLARE VARIABLE USEREMAIN INTEGER;
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (AD1 + AD2 + AD3 + AD4 + AD5 = 0) THEN
  BEGIN
    ASPECTSCHEMEID = NULL;
    IF (NOT IPRICE IS NULL) THEN
      UPDATE SPRT SET PRICE = :IPRICE WHERE ID = :WAREID;
  END

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
    BEGIN
      IF (ASPCODE = 1)  THEN
        IF (IASPV1 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
          INTO AD1;
        ELSE
        BEGIN
          ERRORCODE = 10;
          EXIT;
        END

      IF (ASPCODE = 2)  THEN
        IF (IASPV2 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
          INTO AD2;
        ELSE
        BEGIN
          ERRORCODE = 11;
          EXIT;
        END

      IF (ASPCODE = 3)  THEN
        IF (IASPV3 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
          INTO AD3;
        ELSE
        BEGIN
          ERRORCODE = 12;
          EXIT;
        END

      IF (ASPCODE = 4)  THEN
        IF (IASPV4 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
          INTO AD4;
        ELSE
        BEGIN
          ERRORCODE = 13;
          EXIT;
        END

      IF (ASPCODE = 5)  THEN
        IF (IASPV5 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
          INTO AD5;
        ELSE
        BEGIN
          ERRORCODE = 14;
          EXIT;
        END
    END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR (AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    REMAINID = GEN_ID(GID, 1);

    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, PRICE,
       DELETED, USEREMAIN)
    VALUES
      (:REMAINID, :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5,
      :IPRICE, :IDELETED, :USEREMAIN);

    IF (NOT :IREMAIN IS NULL) THEN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE <> 1) THEN
    BEGIN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 1;

      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;
    END

    UPDATE REMAIN SET
      PRICE = :IPRICE,
      DELETED = :IDELETED
    WHERE ID = :REMAINID;

    IF (NOT :IREMAIN IS NULL) THEN
    BEGIN
      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
     END

    IF (IADDREPLACE = 2) THEN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 0;
  END

  IF ((ILOADWAREDISC = 1) AND NOT IDISCOUNTVALUE IS NULL) THEN
  BEGIN
    IF (IDISCOUNTVALUE <> '') THEN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       0, 2, 0, NULL, NULL)
      RETURNING_VALUES ERRORCODE, TDISCRATEID;

    WHERECLAUSE = '';

    IF (AD1 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
    ELSE
    BEGIN
      AD1 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID IS NULL ';
    END

    IF (AD2 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
    ELSE
    BEGIN
      AD2 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID IS NULL ';
    END

    IF (AD3 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
    ELSE
    BEGIN
      AD3 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID IS NULL ';
    END

    IF (AD4 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
    ELSE
    BEGIN
      AD4 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID IS NULL ';
    END

    IF (AD5 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
    ELSE
    BEGIN
      AD5 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID IS NULL ';
    END

    IF (IUSEGRPACTDISC <> 0) THEN
    BEGIN

      SELECT ID
      FROM GRPACTDISC
      WHERE CODE = :IGRPACTDISCCODE
      INTO :GRPACTDISCID;

      IF (GRPACTDISCID IS NULL) THEN
      BEGIN
        GRPACTDISCID = GEN_ID(GID, 1);
        INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
        VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
      END

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.DELETED ' ||
                        ' FROM ACTDISCOBJ A JOIN GRPACTDISC G ON ' ||
                                          ' G.ID = A.GRPACTDISCID AND G.ID = '|| :GRPACTDISCID ||
                        ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                        '      A.PAYMENTID = -1 AND A.CARDID = -1 '|| WHERECLAUSE
      INTO TACTDISCOBJID, DEL;

      IF (TACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, NULL, NULL, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :TACTDISCOBJID;

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                         C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID
      INTO ACTDISCID, CONDITIONID;

      EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL,
                                          NULL, NULL,  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  NULL, NULL,
                                          NULL, NULL, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

      IF (ACTDISCID IS NULL) THEN
      BEGIN
        SELECT NULLTONUM(MAX(CODE)) + 1
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        INTO ACTDISCCODE;

        INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                              CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
        VALUES     (GEN_ID(GID, 1), :ACTDISCCODE, :GRPACTDISCID, :WARENAME,
                    :CONDITIONID, :TDISCRATEID, NULL, 0, :IDELETEDACTDISC);
      END
      ELSE
        UPDATE ACTDISC SET
          NAME = :WARENAME,
          CONDITIONID = :CONDITIONID,
          DISCRATEID = :TDISCRATEID,
          DELETED = :IDELETEDACTDISC
        WHERE ID = :ACTDISCID;
    END
    ELSE
    BEGIN
      IF (IDISCOUNTVALUE <> '') THEN
      BEGIN
        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID ' ||
                          ' FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                          ' D.ID = A.DISCRATEID AND D.KIND = 2 '||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '       A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
        INTO TACTDISCOBJID;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, :TDISCRATEID, NULL, NULL);
        ELSE
          UPDATE ACTDISCOBJ SET
             DISCRATEID = :TDISCRATEID,
             DELETED = 0
          WHERE ID = :TACTDISCOBJID;
      END
      ELSE
        FOR EXECUTE STATEMENT
          'SELECT A.ID FROM ACTDISCOBJ A JOIN DISCRATE D ON ' ||
          '    D.ID = A.DISCRATEID AND D.KIND = 2 ' ||
          '    WHERE A.WAREID = ' || :WAREID || ' AND A.CLIENTID = -1 AND ' ||
          '          A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 ' || WHERECLAUSE
          INTO ACTDISCID
          DO
            UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCID;
        /*EXECUTE STATEMENT
          'UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID IN ' ||
          '(SELECT A.ID FROM ACTDISCOBJ A JOIN DISCRATE D ON ' ||
          '    D.ID = A.DISCRATEID AND D.KIND = 2 ' ||
          '    WHERE A.WAREID = ' || :WAREID || ' AND A.CLIENTID = -1 AND ' ||
          '          A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 ' || WHERECLAUSE || ')';*/
    END
  END
END
^

/* Alter (APPENDREMAINBYWAREID) */
ALTER PROCEDURE APPENDREMAINBYWAREID(IWAREID INTEGER,
IASPV1 INTEGER,
IASPECTSCHEMEID INTEGER,
IREMAIN DOUBLE PRECISION,
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IADDREPLACE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE aspid INTEGER;
DECLARE VARIABLE ad1 INTEGER;
DECLARE VARIABLE aspcode INTEGER;
DECLARE VARIABLE remainid INTEGER;
DECLARE VARIABLE useremain INTEGER;
BEGIN
  ERRORCODE = 0;

  AD1 = 0;

  IF ((IASPECTSCHEMEID > 0) AND (IASPV1 > 0)) THEN
  BEGIN
    FOR
      SELECT ID, CODE
      FROM ASPECT A
      WHERE A.ASPECTSCHEMEID = :IASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
      DO
      BEGIN
        IF (ASPCODE > 1) THEN
        BEGIN
          ERRORCODE = 15;
          EXIT;
        END
        SELECT ID
        FROM ASPVALUE AV
        WHERE AV.CODE = :IASPV1 AND AV.ASPECTID = :ASPID
        INTO AD1;

        IF (AD1 = 0) THEN
        BEGIN
          ERRORCODE = 10;
          EXIT;
        END
      END
      IF (ASPID IS NULL) THEN
      BEGIN
        ERRORCODE = 9;
        EXIT;
      END
  END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :IWAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = 0 AND
    ASPECTVALUE3ID = 0 AND
    ASPECTVALUE4ID = 0 AND
    ASPECTVALUE5ID = 0
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    REMAINID = GEN_ID(GID, 1);
    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
          ASPECTVALUE4ID, ASPECTVALUE5ID, DELETED, USEREMAIN)
    VALUES
      (:REMAINID, :IWAREID, :AD1, 0, 0, 0, 0, :IDELETED, :USEREMAIN);

    IF ((NOT :IREMAIN IS NULL) AND (:IREMAIN <> 0)) THEN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE <> 1) THEN
    BEGIN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 1;

      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;
    END

    UPDATE REMAIN SET
      DELETED = :IDELETED
    WHERE ID = :REMAINID;

    IF ((NOT :IREMAIN IS NULL) AND (:IREMAIN <> 0)) THEN
    BEGIN
      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
    END

    IF (IADDREPLACE = 2) THEN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 0;
  END
END
^

/* Alter (GET_BDO_SYNCINFO) */
ALTER PROCEDURE GET_BDO_SYNCINFO(ISYNCBASEID INTEGER)
 RETURNS(TABLENAME VARCHAR(100),
QUELENGTH VARCHAR(20),
ERROR VARCHAR(255),
SYNCCATEG INTEGER,
ISUPDIRECTION INTEGER,
CUROPER INTEGER)
 AS
DECLARE VARIABLE CURCHNGVAL INTEGER;
DECLARE VARIABLE ERRINFO VARCHAR(255);
DECLARE VARIABLE BDOERRINFO VARCHAR(255);
DECLARE VARIABLE QUEUELENGTH INTEGER;
DECLARE VARIABLE SYNCKIND INTEGER;
DECLARE VARIABLE BDOCODE INTEGER;
DECLARE VARIABLE DBIDENT INTEGER;
BEGIN
  SELECT BDOCODE FROM CUSTOMDB INTO BDOCODE;
  IF ((BDOCODE IS NULL) OR (BDOCODE = 0)) THEN EXIT;

  FOR SELECT 'DELQUEUE',
    (SELECT COUNT(CHNG) FROM DELQUEUE WHERE CHNG > COALESCE(TL.CHNGVAL, 0)), '',
    TL.BDOERRINFO, 0, 1, TL.CUROPER, TL.ERRINFO
  FROM SYNCBASE S
  LEFT JOIN TBLLOADINFO TL ON TL.SYNCBASEID = S.ID AND TL.TABLENAME = 'DELQUEUE'
  WHERE S.ID = :ISYNCBASEID
  INTO TABLENAME, QUEUELENGTH, QUELENGTH, ERROR, SYNCCATEG, ISUPDIRECTION, CUROPER, ERRINFO DO
  BEGIN
    SUSPEND;
    QUELENGTH = QUEUELENGTH;
    ERROR = ERRINFO;
    ISUPDIRECTION = 2;
    SUSPEND;
  END

  FOR
    SELECT
      CASE
        WHEN TRIM(TC.TABLENAME) LIKE '%USER%' THEN '"USER"'
        ELSE TC.TABLENAME
      END,
      COALESCE(T.CHNGVAL, 0) AS CHNGVAL,
      T.ERRINFO,
      T.BDOERRINFO,
      TC.CATEG,
      ST.SYNCKIND,
      T.CUROPER,
      SB.DBIDENT
    FROM SYNCBASE SB
      JOIN SYNCTABLE ST ON ST.SYNCBASEID = SB.PARENTID AND ST.SYNCKIND <> 0
      JOIN TABLECATEG TC ON TC.CATEG = ST.CATEG
      LEFT JOIN TBLLOADINFO T ON T.SYNCBASEID = SB.ID AND T.TABLENAME = TC.TABLENAME
    WHERE
      SB.ID = :ISYNCBASEID AND
      EXISTS(SELECT 1 FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = TC.TABLENAME AND RDB$FIELD_NAME = 'OWNERBDO')

    INTO TABLENAME, CURCHNGVAL, ERRINFO, BDOERRINFO, SYNCCATEG, SYNCKIND, CUROPER, DBIDENT
    DO
    BEGIN
      EXECUTE STATEMENT
      'SELECT COUNT(CHNG) FROM '||TABLENAME||' T '||
        IIF(SYNCKIND = 1, 'JOIN SYNCBASE SB ON T.OWNERBDO = SB.CODE ' ||
                          'WHERE SB.ID = ' || CAST(ISYNCBASEID AS VARCHAR(100)) || ' AND ',
                          'WHERE ') ||
                          'CHNG > ' || CAST(COALESCE(CURCHNGVAL, 0) AS VARCHAR(30)) ||
                          ' AND BDOCODE <> ' || CAST(COALESCE(DBIDENT, 0) AS VARCHAR(10))
      INTO QUEUELENGTH;
      ISUPDIRECTION = 1; QUELENGTH = ''; ERROR = BDOERRINFO;
      SUSPEND;
      ISUPDIRECTION = 2; QUELENGTH = QUEUELENGTH; ERROR = ERRINFO;
      SUSPEND;
    END
END
^

/* Restore proc. body: UNI_FILTER */
ALTER PROCEDURE UNI_FILTER(ATABLENAME VARCHAR(100),
AKEYFIELD VARCHAR(20),
AFIELDS VARCHAR(255),
AFILTER VARCHAR(255))
 RETURNS(ID INTEGER)
 AS
DECLARE VARIABLE FLD VARCHAR(50);
DECLARE VARIABLE TMPL VARCHAR(255);
DECLARE VARIABLE WHCLAUSE VARCHAR(4096);
DECLARE VARIABLE NUMFLD INTEGER;
DECLARE VARIABLE FTMP FLOAT;
DECLARE VARIABLE PRFX VARCHAR(1);
DECLARE VARIABLE SUFX VARCHAR(1);
BEGIN
  ID = NULL;
  WHCLAUSE = '';
  PRFX = '';
  SUFX = '';
  AFILTER = TRIM(COALESCE(AFILTER, ''));
  IF (AFILTER <> '') THEN
  BEGIN
    AFILTER = TRIM(AFILTER);
    WHILE (PCOPY(AFILTER, 0, 1) = '%') DO
    BEGIN
      PRFX = '%';
      AFILTER = PCOPY(AFILTER, 1, LEN(AFILTER) - 1);
    END
    WHILE (PCOPY(AFILTER, LEN(AFILTER) - 1, 1) = '%') DO
    BEGIN
      SUFX = '%';
      AFILTER = PCOPY(AFILTER, 0, LEN(AFILTER) - 1);
    END

    WHILE (AFIELDS <> '') DO
    BEGIN
      FLD = EXTRACTSTR(AFIELDS, ',');
      SELECT
        CASE
          WHEN F.RDB$FIELD_TYPE IN (11, 27, 10, 16, 8, 9, 7) THEN 1
          ELSE 0 END,
        CASE
          WHEN F.RDB$FIELD_TYPE IN (11, 10, 16, 9, 7, 8, 27) THEN IIF(:SUFX='' AND :PRFX='', :FLD||'='||:AFILTER, /*'UPPER('||*/:FLD||' LIKE '''||:PRFX||:AFILTER||:SUFX||'''')
          WHEN F.RDB$FIELD_TYPE = 261 THEN :FLD||' CONTAINING '''||:AFILTER||''''
          ELSE 'UPPER('||:FLD||') LIKE '''||:PRFX||:AFILTER||'%''' END
      FROM RDB$RELATION_FIELDS RF JOIN RDB$FIELDS F ON F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE
      WHERE RF.RDB$FIELD_NAME = :FLD AND RF.RDB$RELATION_NAME = TRIM(:ATABLENAME)
      INTO NUMFLD, TMPL;
/*  RDB$FIELD_TYPE
    * 261 - BLOB
    * 14 - CHAR
    * 40 - CSTRING
    * 11 - DFLOAT
    * 27 - DOUBLE
    * 10 - FLOAT
    * 16 - INT64
    * 8 - INTEGER
    * 9 - QUAD
    * 7 - SMALLINT
    * 12 - DATE ( 3)
    * 13 - TIME
    * 35 - TIMESTAMP
    * 37 - VARCHAR
*/
      BEGIN
        IF (NUMFLD = 1) THEN
          FTMP = CAST(AFILTER AS FLOAT);
        WHCLAUSE = WHCLAUSE || IIF(WHCLAUSE = '', ' WHERE ', ' OR ') || TMPL;
        WHEN ANY DO BEGIN END
      END


      AFIELDS = PCOPY(AFIELDS, LEN(FLD) + 1, LEN(AFIELDS) - LEN(FLD) - 1);

    END
  END
  FOR EXECUTE STATEMENT 'SELECT DISTINCT '||AKEYFIELD||' FROM ' || ATABLENAME || WHCLAUSE INTO ID DO
    SUSPEND;
END
^

/* Create trigger... */
CREATE TRIGGER DEL_AFT_COUNTER FOR COUNTER
ACTIVE BEFORE DELETE POSITION 0 
AS
BEGIN
  DELETE FROM COUNTERD CD WHERE CD.COUNTERID = OLD.ID;
END
^


/* Alter exist trigger... */
ALTER TRIGGER UPD_BEF_SPRT0
AS
DECLARE VARIABLE RID INTEGER;
BEGIN
  IF (NEW.NAME IS NULL) THEN
    NEW.NAME = '';
  IF (NEW.MARK IS NULL) THEN
    NEW.MARK = '';
  IF (NEW.SCALELPLOADED IS NULL) THEN
    NEW.SCALELPLOADED = 0;
  IF (NEW.PRICELBPRINTED IS NULL) THEN
    NEW.PRICELBPRINTED = 0;
  IF (NEW.DELETED > OLD.DELETED) THEN
  BEGIN
    DELETE FROM REMAIN R WHERE WAREID = OLD.ID AND (R.ASPECTVALUE1ID <> 0 OR R.ASPECTVALUE2ID <> 0 OR
      R.ASPECTVALUE3ID <> 0 OR R.ASPECTVALUE4ID <> 0 OR R.ASPECTVALUE5ID <> 0);

    SELECT ID
    FROM REMAIN R
    WHERE WAREID = OLD.ID AND R.ASPECTVALUE1ID = 0 AND R.ASPECTVALUE2ID = 0 AND
      R.ASPECTVALUE3ID = 0 AND R.ASPECTVALUE4ID = 0 AND R.ASPECTVALUE5ID = 0
    INTO RID;

    UPDATE REMAIN R SET
      R.PRICE = NULL,
      R.USEREMAIN = 0
    WHERE ID = :RID;

    DELETE FROM REMAIND RD WHERE RD.REMAINID = :RID;
  END
END
^

/* Alter Procedure... */
SET TERM ; ^

ALTER TABLE SPRT ALTER COLUMN ID POSITION 1;

ALTER TABLE SPRT ALTER COLUMN CODE POSITION 2;

ALTER TABLE SPRT ALTER COLUMN MARK POSITION 3;

ALTER TABLE SPRT ALTER COLUMN PARENTID POSITION 4;

ALTER TABLE SPRT ALTER COLUMN NAME POSITION 5;

ALTER TABLE SPRT ALTER COLUMN TEXT POSITION 6;

ALTER TABLE SPRT ALTER COLUMN PRICE POSITION 7;

ALTER TABLE SPRT ALTER COLUMN MINPRICE POSITION 8;

ALTER TABLE SPRT ALTER COLUMN MAXDISCOUNT POSITION 9;

ALTER TABLE SPRT ALTER COLUMN ASPECTSCHEMEID POSITION 10;

ALTER TABLE SPRT ALTER COLUMN ISWARE POSITION 11;

ALTER TABLE SPRT ALTER COLUMN HIERLEVEL POSITION 12;

ALTER TABLE SPRT ALTER COLUMN LIFE POSITION 13;

ALTER TABLE SPRT ALTER COLUMN FLAGS POSITION 14;

ALTER TABLE SPRT ALTER COLUMN SERIES POSITION 15;

ALTER TABLE SPRT ALTER COLUMN CERTIFICAT POSITION 16;

ALTER TABLE SPRT ALTER COLUMN ECRDEVID POSITION 17;

ALTER TABLE SPRT ALTER COLUMN TAXGROUPID POSITION 18;

ALTER TABLE SPRT ALTER COLUMN SCALELPDEVID POSITION 19;

ALTER TABLE SPRT ALTER COLUMN SCALELPLOADED POSITION 20;

ALTER TABLE SPRT ALTER COLUMN SCALELPWARECODE POSITION 21;

ALTER TABLE SPRT ALTER COLUMN ASPECTTYPE POSITION 22;

ALTER TABLE SPRT ALTER COLUMN RCPPRNDEVID POSITION 23;

ALTER TABLE SPRT ALTER COLUMN PICTURE POSITION 24;

ALTER TABLE SPRT ALTER COLUMN DESCRIPTION POSITION 25;

ALTER TABLE SPRT ALTER COLUMN QUANTITYPREC POSITION 26;

ALTER TABLE SPRT ALTER COLUMN PRICELABELID POSITION 27;

ALTER TABLE SPRT ALTER COLUMN DELETED POSITION 28;

ALTER TABLE SPRT ALTER COLUMN PRICELBPRINTED POSITION 29;

ALTER TABLE SPRT ALTER COLUMN REWARDTYPE POSITION 30;

ALTER TABLE SPRT ALTER COLUMN REWARDVAL POSITION 31;

ALTER TABLE SPRT ALTER COLUMN ECRDEPARTMENT POSITION 32;

ALTER TABLE SPRT ALTER COLUMN CHNG POSITION 33;

ALTER TABLE SPRT ALTER COLUMN BDOCODE POSITION 34;

ALTER TABLE SPRT ALTER COLUMN OWNERBDO POSITION 35;

ALTER TABLE SPRT ALTER COLUMN INSCHNG POSITION 36;

ALTER TABLE SPRT ALTER COLUMN GTD POSITION 37;

ALTER TABLE SYNCBASE ALTER COLUMN ID POSITION 1;

ALTER TABLE SYNCBASE ALTER COLUMN CODE POSITION 2;

ALTER TABLE SYNCBASE ALTER COLUMN NAME POSITION 3;

ALTER TABLE SYNCBASE ALTER COLUMN PARENTID POSITION 4;

ALTER TABLE SYNCBASE ALTER COLUMN BDOPATH POSITION 5;

ALTER TABLE SYNCBASE ALTER COLUMN BDONAME POSITION 6;

ALTER TABLE SYNCBASE ALTER COLUMN BDOUSER POSITION 7;

ALTER TABLE SYNCBASE ALTER COLUMN BDOPSWRD POSITION 8;

ALTER TABLE SYNCBASE ALTER COLUMN SYNCSRVNAME POSITION 9;

ALTER TABLE SYNCBASE ALTER COLUMN SYNCSRVID POSITION 10;

ALTER TABLE SYNCBASE ALTER COLUMN SYNCINTERVAL POSITION 11;

ALTER TABLE SYNCBASE ALTER COLUMN SYNCRESUMEINTERVAL POSITION 12;

ALTER TABLE SYNCBASE ALTER COLUMN DBIDENT POSITION 13;

/* TEXT BLOCK END */

/* Convert 4.8.1 */

/* Drop: IDX_POSN_TRZT_ASC (TIdxData) */
DROP INDEX IDX_POSN_TRZT_ASC;

SET TERM ^ ;

ALTER PROCEDURE GET_TRANZCOUNT(ARMKID INTEGER)
 RETURNS(TRANZCOUNT INTEGER)
 AS
 BEGIN SUSPEND; END
^

SET TERM ; ^

RECONNECT;

/* Drop: IDX_POSN_TRZT_DESC (TIdxData) */
DROP INDEX IDX_POSN_TRZT_DESC;


ALTER TABLE CLIENT ADD LEGALZIPCODE FVARCHAR10 COLLATE WIN1251;

ALTER TABLE CLIENT ADD LEGALCITY FVARCHAR100 COLLATE WIN1251;

ALTER TABLE CLIENT ADD LEGALADDRESS FVARCHAR255 COLLATE WIN1251;

ALTER TABLE DOCUMENT ADD PREPAYEDDOCID FREF64;

ALTER TABLE TRANZT ADD TRMKID FREF;

ALTER TABLE WINREPORTS ADD ZCLOSE FINT;

/* Drop table-fields... */
/* Empty GET_OPERDAY for drop TRANZT(POSNUMBER) */
SET TERM ^ ;

ALTER PROCEDURE GET_OPERDAY(DATE1 DATE,
DATE2 DATE,
POSNUMBER INTEGER)
 RETURNS(TRANZ1 INTEGER,
TRANZ2 INTEGER)
 AS
 BEGIN SUSPEND; END
^

SET TERM ; ^

ALTER TABLE TRANZT DROP POSNUMBER;


/* Create index... */
CREATE INDEX IDX_RMKID_TRANZCOUNT_ASC ON TRANZT(TRMKID, TRANZCOUNT);

CREATE DESC INDEX IDX_RMKID_TRANZCOUNT_DESC ON TRANZT(TRMKID, TRANZCOUNT);


/* Alter Procedure... */
/* Alter (APPENDCLIENT) */
SET TERM ^ ;

ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ILEGALZIPCODE VARCHAR(10),
ILEGALCITY VARCHAR(100),
ILEGALADDRESS VARCHAR(255))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,        CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE,   BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,       WEB,
                          TELEPHONE, INN,       DOCUMENT, OKPO,     OKPD,  DELETED,  LEGALZIPCODE,
                          LEGALCITY, LEGALADDRESS)

      VALUES (:CLIENTID,   :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT, :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE,   :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,       :IWEB,
              :ITELEPHONE, :IINN,       :IDOCUMENT,   :IOKPO,     :IOKPD, :IDELETED,  :ILEGALZIPCODE,
              :ILEGALCITY, :ILEGALADDRESS);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED,
          LEGALZIPCODE = :ILEGALZIPCODE,
          LEGALCITY = :ILEGALCITY,
          LEGALADDRESS = :ILEGALADDRESS
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCLIENT = 1) THEN
      FOR SELECT A.ID
      FROM ACTDISCOBJ A
      WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
            A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
            A.DISCRATEID > 0
      INTO ACTDISCOBJID
      DO
        UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;
END
^

/* empty dependent procedure body */
/* Clear: APPENDPILOT for: APPENDWARE */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPENDWARE) */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(100),
ICERTIFICAT VARCHAR(100),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
IGTD VARCHAR(100),
ILOADWAREDISC INTEGER = 1)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
DECLARE VARIABLE TISWARE INTEGER;
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TDELETED INTEGER;
DECLARE VARIABLE TDELETEDISWARE INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE HIERLEVEL INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE BARC VARCHAR(40);
BEGIN
  ERRORCODE = 0;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      IF (IEXCHANGEFORMAT <> 1) THEN
        BEGIN
          ERRORCODE = 8;
          EXIT;
        END
      ELSE
        IFIRSTASPECTVALUE = 0;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  HIERLEVEL = 0;
  IF (IPARENTCODE <> '') THEN
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (CODE = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (MARK = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
  END
  ELSE
    PARENTID = 0;
  HIERLEVEL = HIERLEVEL + 1;

  IF (IISWARE <> 1) THEN
    BEGIN
      IISWARE = -2147483647 + HIERLEVEL;
    END

  IF ((PARENTID IS NULL) OR (TISWARE > 0)) THEN
  BEGIN
    ERRORCODE = 2;
    EXIT;
  END

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  TISWARE = NULL;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ISWARE, DELETED
    FROM SPRT
    WHERE CODE = :ICODE
    INTO TID, TISWARE, TDELETEDISWARE;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, DELETED, ISWARE, DELETED
    FROM SPRT
    WHERE MARK = :IMARK
    INTO TID, TDELETED, TISWARE, TDELETEDISWARE;
  END

  IF ((((TISWARE > 0) AND (IISWARE <= 0)) OR
       ((TISWARE <= 0) AND (IISWARE > 0))) AND (TDELETEDISWARE >= IDELETED)) THEN
    EXCEPTION E_CANT_CHANGE_ISWARE;

  IF (TID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO SPRT (ID, PARENTID, CODE, MARK, NAME, TEXT, HIERLEVEL,
      MINPRICE, ECRDEVID, TAXGROUPID, RCPPRNDEVID,
      ASPECTSCHEMEID, PRICELABELID,
      MAXDISCOUNT, ISWARE, PRICE, FLAGS, LIFE, SERIES,
      CERTIFICAT, SCALELPDEVID, SCALELPWARECODE, ASPECTTYPE, QUANTITYPREC,
      SCALELPLOADED, PRICELBPRINTED, DELETED, DESCRIPTION, PICTURE, REWARDTYPE, REWARDVAL,
      ECRDEPARTMENT, GTD)
    VALUES (:ID, :PARENTID, :ICODE, :IMARK, :INAME, :ITEXT, :HIERLEVEL,
      :IMINPRICE, :ECRDEVID, :TAXGROUPID, :RCPPRNDEVID,
      :ASPECTSCHEMEID, :PRICELABELID,
      :IMAXDISCOUNT, :IISWARE, :IPRICE, :IFLAGS, :ILIFE, :ISERIES,
      :ICERTIFICAT, :SCALELPDEVID, :ISCALELPWARECODE, :IASPECTTYPE, :IQUANTITYPREC,
      :ISCALELPLOADED, :IPRICELBPRINTED, :IDELETED, :IDESCRIPTION, :IPICTURE, :IREWARDTYPE, :IREWARDVAL,
      :IECRDEPARTMENT, :IGTD);
    INCREMENTCODE = 1;
  END
  ELSE
  BEGIN
    ID = TID;
    IF (TDELETED = IDELETED) THEN
      UPDATE SPRT SET
        ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
        ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
        CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
                                           PRICELABELID = :PRICELABELID,
        DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
        DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
        ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
        ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
        FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
        HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
        ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
        LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
        MARK = :IMARK,                     SERIES = :ISERIES,
        MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
        MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
        NAME = :INAME,
        GTD = :IGTD
      WHERE ID = :ID;
    ELSE
      BEGIN
        UPDATE SPRT SET
          ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
          ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
          CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
          CODE = :ICODE,                     PRICELABELID = :PRICELABELID,
          DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
          DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
          ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
          ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
          FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
          HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
          ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
          LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
          MARK = :IMARK,                     SERIES = :ISERIES,
          MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
          MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
          NAME = :INAME,
          GTD = :IGTD
        WHERE ID = :ID;
        INCREMENTCODE = 1;
      END
  END

  IF (IISWARE = 1) THEN
  BEGIN
    EXECUTE PROCEDURE APPENDREMAINBYWAREID (:ID, :IFIRSTASPECTVALUE, :ASPECTSCHEMEID, :IREMAIN, :IDELETEDREMAIN, :IDELETEDASPECT, :IADDREPLACE)
      RETURNING_VALUES ERRORCODE;

    IF (ERRORCODE > 0) THEN
      EXIT;

    WHILE (IBARCODES <> '') DO
    BEGIN
      BARC = EXTRACTSTR(IBARCODES, ',');

      EXECUTE PROCEDURE APPENDBARCODEBYWAREID (:BARC, :ID, 0, 0, 0, 0, 0, :IFACTOR, 0, :IDELETEDBARCODE)
        RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;

      IBARCODES = PCOPY(IBARCODES, LEN(BARC) + 1, LEN(IBARCODES) - LEN(BARC) - 1);
    END
  END

  IF ((ILOADWAREDISC = 1) AND NOT (IDISCRATEPARENTID IS NULL) AND NOT (IDISCOUNTVALUE IS NULL)) THEN
    BEGIN
      EXECUTE PROCEDURE APPEND_WARE_DISC(:ID, :IDISCOUNTTYPE, :IDISCOUNTVALUE, :IDISCRATEPARENTID)
            RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;
    END

  IF (ILOADWAREDISC = 1) THEN
  BEGIN
    IF (TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :ID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID,
          DELETED = 0
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :ID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
    ELSE
    BEGIN
      DELETE FROM ACTDISCOBJ WHERE WAREID = :ID AND CLIENTID = -1 AND CARDID = -1 AND
                                 ASPECTVALUE1ID IS NULL AND ASPECTVALUE2ID IS NULL AND ASPECTVALUE3ID IS NULL AND
                                 ASPECTVALUE4ID IS NULL AND ASPECTVALUE5ID IS NULL AND
                                 PAYMENTID = -1 AND DISCRATEID IS NULL AND ACTSCRIPTID IS NULL;
    END
  END
END
^

/* Alter (CANCELSTORED) */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 AS
DECLARE VARIABLE TRANZCOUNT INTEGER;
DECLARE VARIABLE RMKID INTEGER;
DECLARE VARIABLE DOCID NUMERIC(18,0);
DECLARE VARIABLE WARECODE INTEGER;
DECLARE VARIABLE WAREMARK VARCHAR(100);
DECLARE VARIABLE TRANZTYPE INTEGER;
DECLARE VARIABLE QUANTITY INTEGER;
DECLARE VARIABLE ASPSCHEMECODE INTEGER;
DECLARE VARIABLE ASPSCHEMEID INTEGER;
DECLARE VARIABLE ASPVAL1 INTEGER;
DECLARE VARIABLE ASPVAL2 INTEGER;
DECLARE VARIABLE ASPVAL3 INTEGER;
DECLARE VARIABLE ASPVAL4 INTEGER;
DECLARE VARIABLE ASPVAL5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
DECLARE VARIABLE TRID NUMERIC(18,0);
DECLARE VARIABLE USERCODE INTEGER;
DECLARE VARIABLE TMPID NUMERIC(18,0);
BEGIN
  SELECT ID
  FROM RMK R
  WHERE R.CODE = :APOSNUMBER
  INTO RMKID;

  SELECT CODE
  FROM "USER"
  WHERE ID = :ASELLERID
  INTO USERCODE;

  EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES TRANZCOUNT;

  FOR
    SELECT ID
    FROM DOCUMENT D
    WHERE D.RMKID = :RMKID AND D.STATE = 3
    AND NOT EXISTS(SELECT 1 FROM TRAUTH TR WHERE TR.DOCUMENTID = D.ID)
    AND NOT EXISTS(SELECT 1 FROM TRANZT T WHERE T.DOCUMENTID = D.ID AND T.TRANZTYPE IN (40,41))
    AND NOT EXISTS(SELECT 1 FROM DOCUMENT DT WHERE DT.ID = D.ID AND DT.ORDERIDENTIF IS NOT NULL AND DT.ORDERIDENTIF <> '')
    AND NOT EXISTS(SELECT 1 FROM DOCUMENT DP
                   JOIN DOCKIND DPDK ON DPDK.ID = DP.DOCKINDID
                   WHERE DP.PREPAYEDDOCID = D.ID AND DP.STATE = 1 AND DPDK.ECRRECEIPTTYPE = 0 AND
                   NOT EXISTS(
                   SELECT 1 FROM DOCUMENT DPR
                   JOIN DOCKIND DPRDK ON DPRDK.ID = DPR.DOCKINDID
                   WHERE DPR.DOCUMENTID = DP.ID AND DPRDK.ECRRECEIPTTYPE IN (1, 2)))
    INTO DOCID
    DO
    BEGIN
         --    11  12, -   
      FOR
        SELECT WARECODE, WAREMARK, TRANZTYPE, QUANTITY,
        ASPECTSCHEME, ASPECTVALUE1, ASPECTVALUE2, ASPECTVALUE3, ASPECTVALUE4, ASPECTVALUE5
        FROM TRANZT T
        LEFT JOIN SPRT S ON S.CODE = T.WARECODE
        WHERE TRANZTYPE IN (11,12) AND T.DOCUMENTID = :DOCID
      INTO WARECODE, WAREMARK, TRANZTYPE, QUANTITY, ASPSCHEMECODE, ASPVAL1, ASPVAL2, ASPVAL3, ASPVAL4, ASPVAL5
      DO
      BEGIN
        WAREID = NULL;
        FLAGS = NULL;
           --  ID    
        IF (AWARECODETOMARK = 0) THEN
        BEGIN
          SELECT ID, FLAGS
          FROM SPRT
          WHERE CODE = :WARECODE
          INTO WAREID, FLAGS;
        END
        ELSE
        BEGIN
          SELECT FIRST 1 ID, FLAGS
          FROM SPRT
          WHERE MARK = :WAREMARK
          INTO :WAREID, :FLAGS;
        END
        --          ,  -
        IF (:ACONTROLSALEREMAIN = 1 OR :ACONTROLSALEREMAIN = 2 AND :FLAGS/64 <> (:FLAGS/32)/2.0) THEN
        BEGIN
          ASPSCHEMEID = NULL;
          SELECT ID
          FROM ASPSCHM
          WHERE CODE = :ASPSCHEMECODE
          INTO :ASPSCHEMEID;

          REMAINID = NULL;
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL1 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 1)) AND
          R.ASPECTVALUE2ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL2 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 2)) AND
          R.ASPECTVALUE3ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL3 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 3)) AND
          R.ASPECTVALUE4ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL4 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 4)) AND
          R.ASPECTVALUE5ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL5 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 5)) AND
          R.WAREID = :WAREID AND
          R.USEREMAIN = 1
          INTO
          REMAINID;

          IF (:REMAINID IS NULL) THEN
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = 0 AND
          R.ASPECTVALUE2ID = 0 AND
          R.ASPECTVALUE3ID = 0 AND
          R.ASPECTVALUE4ID = 0 AND
          R.ASPECTVALUE5ID = 0 AND
          R.WAREID = :WAREID
          INTO
          REMAINID;

          IF (:REMAINID IS NOT NULL) THEN
          INSERT INTO REMAIND (
           ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
          VALUES (
           GEN_ID(GREMAIND, 1), :REMAINID, -:QUANTITY, :DOCID, 0);
        END
      END

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID AND TRANZTYPE = 54
        INTO TMPID
        DO
          UPDATE TRANZT T SET
            TRANZDATE = :ATRANZDATE,
            TRANZHOUR = :ATRANZHOUR,
            TRANZTIME = :ATRANZTIME,
            TRANZTYPE = 56,
            T.SELLER = :USERCODE
          WHERE ID = :TMPID;

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID
        ORDER BY ID
        INTO TRID
        DO
        BEGIN
          UPDATE TRANZT SET
            TRANZCOUNT = :TRANZCOUNT
          WHERE ID = :TRID;
          TRANZCOUNT = TRANZCOUNT + 1;
        END

      DELETE FROM COUNTERD CD WHERE CD.DOCUMENTID = :DOCID;
      UPDATE DOCUMENT D SET
        STATE = 2,
        CLOSEDATE = :ATRANZDATE,
        CLOSETIME = :ATRANZTIME,
        CLOSEUSERID = :ASELLERID,
        SAVED = :ASAVED
      WHERE ID = :DOCID;
    END
END
^

/* Alter (GET_OPERDAY) */
ALTER PROCEDURE GET_OPERDAY(DATE1 DATE,
DATE2 DATE,
POSNUMBER INTEGER)
 RETURNS(TRANZ1 INTEGER,
TRANZ2 INTEGER)
 AS
DECLARE VARIABLE TMPC1 INTEGER;
DECLARE VARIABLE TMPT INTEGER;
DECLARE VARIABLE D1 DATE;
DECLARE VARIABLE RMKID INTEGER;
BEGIN

/*   " " -   , 
        (   )*/

  TRANZ1 = 0;
  TRANZ2 = 0;

  SELECT ID FROM RMK
  WHERE CODE = :POSNUMBER
  INTO :RMKID;

  SELECT MIN(TRANZCOUNT)
  FROM TRANZT T JOIN DOCUMENT D ON D.ID = T.DOCUMENTID
  WHERE D.RMKID = :RMKID
  INTO TMPC1;

  SELECT MIN(TRANZDATE)
  FROM TRANZT T JOIN DOCUMENT D ON D.ID = T.DOCUMENTID
  WHERE D.RMKID = :RMKID AND T.TRANZCOUNT = :TMPC1
  INTO  D1;

  IF (D1 >= DATE1) THEN
    TRANZ1 = TMPC1;
    ELSE
    BEGIN
      SELECT MIN(T.TRANZCOUNT)
      FROM TRANZT T, TRANZT TT, DOCUMENT D, DOCUMENT DD
      WHERE D.RMKID = :RMKID AND DD.RMKID = :RMKID AND
        T.TRANZCOUNT = TT.TRANZCOUNT + 1 AND TT.TRANZTYPE = 61 AND
        D.ID = T.DOCUMENTID AND DD.ID = TT.DOCUMENTID AND D.STATE IN (1, 2) AND
        D.CLOSEDATE BETWEEN :DATE1 AND :DATE2
      INTO TRANZ1;
    END

  IF (TRANZ1 IS NULL) THEN
    EXIT;

  TMPC1 = NULL;
  SELECT MAX(TRANZCOUNT)
  FROM TRANZT T LEFT JOIN DOCUMENT D ON D.ID = T.DOCUMENTID 
  WHERE D.RMKID = :RMKID AND T.TRANZCOUNT >= :TRANZ1 AND
    D.CLOSEDATE <= :DATE2 AND D.STATE IN (1, 2)
  INTO TMPC1;

  SELECT TRANZTYPE
  FROM   TRANZT T JOIN DOCUMENT D ON D.ID = T.DOCUMENTID
  WHERE D.RMKID = :RMKID AND T.TRANZCOUNT = :TMPC1
  INTO   TMPT;

  IF (TMPT = 61) THEN
    TRANZ2 = TMPC1;
    ELSE
    BEGIN
      TRANZ2 = NULL;
      SELECT MIN(TRANZCOUNT)
      FROM TRANZT T JOIN DOCUMENT D ON D.ID = T.DOCUMENTID
      WHERE D.RMKID = :RMKID AND T.TRANZCOUNT > :TMPC1 AND
        T.TRANZTYPE = 61
      INTO TRANZ2;

      IF (TRANZ2 IS NULL) THEN
        SELECT MAX(TRANZCOUNT)
        FROM TRANZT T JOIN DOCUMENT D ON D.ID = T.DOCUMENTID
        WHERE D.RMKID = :RMKID AND T.TRANZCOUNT < :TMPC1 AND
          T.TRANZTYPE = 61
        INTO TRANZ2;
    END
END
^

/* empty dependent procedure body */
/* Clear: CANCELSTORED for: GET_TRANZCOUNT */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 AS
 BEGIN EXIT; END
^

/* Alter (GET_TRANZCOUNT) */
ALTER PROCEDURE GET_TRANZCOUNT(ARMKID INTEGER)
 RETURNS(TRANZCOUNT INTEGER)
 AS
BEGIN

  /*SELECT CODE
  FROM RMK
  WHERE ID = :ARMKID
  INTO ACODE;  */

  SELECT FIRST 1 TRANZCOUNT + 1
  FROM TRANZT
  WHERE TRMKID = :ARMKID --POSNUMBER = :ACODE
  PLAN (TRANZT ORDER IDX_RMKID_TRANZCOUNT_DESC)
  ORDER BY TRMKID DESC, TRANZCOUNT DESC
  INTO TRANZCOUNT;
  IF (TRANZCOUNT IS NULL) THEN
    TRANZCOUNT = 1;
END
^

/* Restore proc. body: APPENDPILOT */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE DORMANTVAR INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 1535, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            SELECT ID
            FROM SPRT
            WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
            INTO MAINID;

            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

/* Restore proc. body: CANCELSTORED */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 AS
DECLARE VARIABLE TRANZCOUNT INTEGER;
DECLARE VARIABLE RMKID INTEGER;
DECLARE VARIABLE DOCID NUMERIC(18,0);
DECLARE VARIABLE WARECODE INTEGER;
DECLARE VARIABLE WAREMARK VARCHAR(100);
DECLARE VARIABLE TRANZTYPE INTEGER;
DECLARE VARIABLE QUANTITY INTEGER;
DECLARE VARIABLE ASPSCHEMECODE INTEGER;
DECLARE VARIABLE ASPSCHEMEID INTEGER;
DECLARE VARIABLE ASPVAL1 INTEGER;
DECLARE VARIABLE ASPVAL2 INTEGER;
DECLARE VARIABLE ASPVAL3 INTEGER;
DECLARE VARIABLE ASPVAL4 INTEGER;
DECLARE VARIABLE ASPVAL5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
DECLARE VARIABLE TRID NUMERIC(18,0);
DECLARE VARIABLE USERCODE INTEGER;
DECLARE VARIABLE TMPID NUMERIC(18,0);
BEGIN
  SELECT ID
  FROM RMK R
  WHERE R.CODE = :APOSNUMBER
  INTO RMKID;

  SELECT CODE
  FROM "USER"
  WHERE ID = :ASELLERID
  INTO USERCODE;

  EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES TRANZCOUNT;

  FOR
    SELECT ID
    FROM DOCUMENT D
    WHERE D.RMKID = :RMKID AND D.STATE = 3
    AND NOT EXISTS(SELECT 1 FROM TRAUTH TR WHERE TR.DOCUMENTID = D.ID)
    AND NOT EXISTS(SELECT 1 FROM TRANZT T WHERE T.DOCUMENTID = D.ID AND T.TRANZTYPE IN (40,41))
    AND NOT EXISTS(SELECT 1 FROM DOCUMENT DT WHERE DT.ID = D.ID AND DT.ORDERIDENTIF IS NOT NULL AND DT.ORDERIDENTIF <> '')
    AND NOT EXISTS(SELECT 1 FROM DOCUMENT DP
                   JOIN DOCKIND DPDK ON DPDK.ID = DP.DOCKINDID
                   WHERE DP.PREPAYEDDOCID = D.ID AND DP.STATE = 1 AND DPDK.ECRRECEIPTTYPE = 0 AND
                   NOT EXISTS(
                   SELECT 1 FROM DOCUMENT DPR
                   JOIN DOCKIND DPRDK ON DPRDK.ID = DPR.DOCKINDID
                   WHERE DPR.DOCUMENTID = DP.ID AND DPRDK.ECRRECEIPTTYPE IN (1, 2)))
    INTO DOCID
    DO
    BEGIN
         --    11  12, -   
      FOR
        SELECT WARECODE, WAREMARK, TRANZTYPE, QUANTITY,
        ASPECTSCHEME, ASPECTVALUE1, ASPECTVALUE2, ASPECTVALUE3, ASPECTVALUE4, ASPECTVALUE5
        FROM TRANZT T
        LEFT JOIN SPRT S ON S.CODE = T.WARECODE
        WHERE TRANZTYPE IN (11,12) AND T.DOCUMENTID = :DOCID
      INTO WARECODE, WAREMARK, TRANZTYPE, QUANTITY, ASPSCHEMECODE, ASPVAL1, ASPVAL2, ASPVAL3, ASPVAL4, ASPVAL5
      DO
      BEGIN
        WAREID = NULL;
        FLAGS = NULL;
           --  ID    
        IF (AWARECODETOMARK = 0) THEN
        BEGIN
          SELECT ID, FLAGS
          FROM SPRT
          WHERE CODE = :WARECODE
          INTO WAREID, FLAGS;
        END
        ELSE
        BEGIN
          SELECT FIRST 1 ID, FLAGS
          FROM SPRT
          WHERE MARK = :WAREMARK
          INTO :WAREID, :FLAGS;
        END
        --          ,  -
        IF (:ACONTROLSALEREMAIN = 1 OR :ACONTROLSALEREMAIN = 2 AND :FLAGS/64 <> (:FLAGS/32)/2.0) THEN
        BEGIN
          ASPSCHEMEID = NULL;
          SELECT ID
          FROM ASPSCHM
          WHERE CODE = :ASPSCHEMECODE
          INTO :ASPSCHEMEID;

          REMAINID = NULL;
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL1 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 1)) AND
          R.ASPECTVALUE2ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL2 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 2)) AND
          R.ASPECTVALUE3ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL3 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 3)) AND
          R.ASPECTVALUE4ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL4 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 4)) AND
          R.ASPECTVALUE5ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL5 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 5)) AND
          R.WAREID = :WAREID AND
          R.USEREMAIN = 1
          INTO
          REMAINID;

          IF (:REMAINID IS NULL) THEN
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = 0 AND
          R.ASPECTVALUE2ID = 0 AND
          R.ASPECTVALUE3ID = 0 AND
          R.ASPECTVALUE4ID = 0 AND
          R.ASPECTVALUE5ID = 0 AND
          R.WAREID = :WAREID
          INTO
          REMAINID;

          IF (:REMAINID IS NOT NULL) THEN
          INSERT INTO REMAIND (
           ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
          VALUES (
           GEN_ID(GREMAIND, 1), :REMAINID, -:QUANTITY, :DOCID, 0);
        END
      END

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID AND TRANZTYPE = 54
        INTO TMPID
        DO
          UPDATE TRANZT T SET
            TRANZDATE = :ATRANZDATE,
            TRANZHOUR = :ATRANZHOUR,
            TRANZTIME = :ATRANZTIME,
            TRANZTYPE = 56,
            T.SELLER = :USERCODE
          WHERE ID = :TMPID;

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID
        ORDER BY ID
        INTO TRID
        DO
        BEGIN
          UPDATE TRANZT SET
            TRANZCOUNT = :TRANZCOUNT
          WHERE ID = :TRID;
          TRANZCOUNT = TRANZCOUNT + 1;
        END

      DELETE FROM COUNTERD CD WHERE CD.DOCUMENTID = :DOCID;
      UPDATE DOCUMENT D SET
        STATE = 2,
        CLOSEDATE = :ATRANZDATE,
        CLOSETIME = :ATRANZTIME,
        CLOSEUSERID = :ASELLERID,
        SAVED = :ASAVED
      WHERE ID = :DOCID;
    END
END
^

/* Alter exist trigger... */
ALTER TRIGGER DEL_AFT_DOCUMENT
AS
BEGIN
  IF (OLD.STATE IN (0, 3, 4)) THEN
    POST_EVENT 'DOCUMENTCHANGED';
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_AFT_DOCUMENT
AS
DECLARE VARIABLE RT INTEGER;
BEGIN
  IF (NEW.STATE = 1) THEN -- DP   
  BEGIN
    SELECT DK.ECRRECEIPTTYPE
    FROM DOCKIND DK
    WHERE DK.ID =  NEW.DOCKINDID
    INTO  RT;
    IF (RT = 12) THEN -- DP  
      POST_EVENT 'EMPLLISTCHANGED'; -- DP    ,  
  END

  IF (NEW.STATE IN (0, 3, 4)) THEN
    POST_EVENT 'DOCUMENTCHANGED';
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_AFT_SPRT_REMAIN
AS
DECLARE VARIABLE CH NUMERIC(18);
BEGIN
  IF (NEW.ISWARE = 1) THEN
  BEGIN
    IF (NEW.CHNG < 0) THEN
      CH = -1;
    ELSE
      CH = NULL;
    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID, BDOCODE, CHNG)
    VALUES
      (GEN_ID(GID, 1), NEW.ID, 0, 0, 0, 0, 0, NEW.BDOCODE, :CH);
  END
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_BEF_TRANZT0
AS
DECLARE VARIABLE DSTATE INTEGER;
DECLARE VARIABLE RMKID INTEGER;
BEGIN

  SELECT STATE, RMKID FROM DOCUMENT WHERE ID = NEW.DOCUMENTID INTO :DSTATE, :RMKID;
  NEW.TRMKID = RMKID;

  /*     */
  IF (DSTATE IN (1, 2)) THEN
    EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES NEW.TRANZCOUNT;

  IF (NEW.WAREMARK IS NULL) THEN
    NEW.WAREMARK = '';
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GDOC, 1);
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_AFT_DOCUMENT
AS
DECLARE VARIABLE RT INTEGER;
BEGIN
  IF ((OLD.STATE = NEW.STATE) AND (NULLTOINT(OLD.HALLPLACEID) = NULLTOINT(NEW.HALLPLACEID))) THEN EXIT;

  /*  .   */
  IF ((OLD.STATE <> NEW.STATE) AND (NEW.STATE = 0)) THEN
    DELETE FROM TRANZT WHERE DOCUMENTID = OLD.ID;

  IF (NEW.STATE <> OLD.STATE AND NEW.STATE = 1) THEN -- DP   
  BEGIN
    SELECT DK.ECRRECEIPTTYPE
    FROM DOCKIND DK
    WHERE DK.ID =  NEW.DOCKINDID
    INTO  RT;
    IF (RT = 12) THEN -- DP  
      POST_EVENT 'EMPLLISTCHANGED'; -- DP    ,  
  END

  IF (NEW.STATE <> OLD.STATE AND (NEW.STATE = 1 OR NEW.STATE = 2)) THEN -- DP    ,   
    DELETE FROM RDNOTIFY WHERE DOCUMENTID = NEW.ID;

  IF (NEW.STATE <> OLD.STATE) THEN
    POST_EVENT 'DOCUMENTCHANGED';
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_BEF_SPRT0
AS
DECLARE VARIABLE RID INTEGER;
BEGIN
  IF (NEW.NAME IS NULL) THEN
    NEW.NAME = '';
  IF (NEW.MARK IS NULL) THEN
    NEW.MARK = '';
  IF (NEW.SCALELPLOADED IS NULL) THEN
    NEW.SCALELPLOADED = 0;
  IF (NEW.PRICELBPRINTED IS NULL) THEN
    NEW.PRICELBPRINTED = 0;
  IF (NEW.CHNG > 0 AND OLD.CHNG < 0) THEN
  BEGIN
    UPDATE REMAIN R SET
      CHNG = NULL
    WHERE WAREID = OLD.ID AND R.ASPECTVALUE1ID = 0 AND R.ASPECTVALUE2ID = 0 AND
      R.ASPECTVALUE3ID = 0 AND R.ASPECTVALUE4ID = 0 AND R.ASPECTVALUE5ID = 0;
  END
  IF (NEW.DELETED > OLD.DELETED) THEN
  BEGIN
    UPDATE REMAIN R SET
      DELETED = - 1
    WHERE WAREID = OLD.ID AND (R.ASPECTVALUE1ID <> 0 OR R.ASPECTVALUE2ID <> 0 OR
      R.ASPECTVALUE3ID <> 0 OR R.ASPECTVALUE4ID <> 0 OR R.ASPECTVALUE5ID <> 0);

    SELECT ID
    FROM REMAIN R
    WHERE WAREID = OLD.ID AND R.ASPECTVALUE1ID = 0 AND R.ASPECTVALUE2ID = 0 AND
      R.ASPECTVALUE3ID = 0 AND R.ASPECTVALUE4ID = 0 AND R.ASPECTVALUE5ID = 0
    INTO RID;

    INSERT INTO REMAIND
    (ID, DELTA, REMAINID, DTYPE)
    SELECT GEN_ID(GREMAIND, 1), -(SELECT SUM(DELTA) FROM REMAIND RD WHERE RD.REMAINID = R.ID), R.ID, 1
    FROM REMAIN R
    WHERE R.WAREID = OLD.ID AND EXISTS(SELECT 1 FROM REMAIND RD1 WHERE RD1.REMAINID = R.ID);

    UPDATE REMAIN R SET
      R.PRICE = NULL,
      R.USEREMAIN = 0
    WHERE ID = :RID;
  END
END
^

/* Alter Procedure... */
/* Alter (APPENDPILOT) */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE DORMANTVAR INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 1535, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            SELECT ID
            FROM SPRT
            WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
            INTO MAINID;

            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, NULL, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, 511, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

/* Alter (CANCELSTORED) */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 AS
DECLARE VARIABLE TRANZCOUNT INTEGER;
DECLARE VARIABLE RMKID INTEGER;
DECLARE VARIABLE DOCID NUMERIC(18,0);
DECLARE VARIABLE WARECODE INTEGER;
DECLARE VARIABLE WAREMARK VARCHAR(100);
DECLARE VARIABLE TRANZTYPE INTEGER;
DECLARE VARIABLE QUANTITY INTEGER;
DECLARE VARIABLE ASPSCHEMECODE INTEGER;
DECLARE VARIABLE ASPSCHEMEID INTEGER;
DECLARE VARIABLE ASPVAL1 INTEGER;
DECLARE VARIABLE ASPVAL2 INTEGER;
DECLARE VARIABLE ASPVAL3 INTEGER;
DECLARE VARIABLE ASPVAL4 INTEGER;
DECLARE VARIABLE ASPVAL5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
DECLARE VARIABLE TRID NUMERIC(18,0);
DECLARE VARIABLE USERCODE INTEGER;
DECLARE VARIABLE TMPID NUMERIC(18,0);
BEGIN
  SELECT ID
  FROM RMK R
  WHERE R.CODE = :APOSNUMBER
  INTO RMKID;

  SELECT CODE
  FROM "USER"
  WHERE ID = :ASELLERID
  INTO USERCODE;

  EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES TRANZCOUNT;

  FOR
    SELECT ID
    FROM DOCUMENT D
    WHERE D.RMKID = :RMKID AND D.STATE = 3
    AND NOT EXISTS(SELECT 1 FROM TRAUTH TR WHERE TR.DOCUMENTID = D.ID)
    AND NOT EXISTS(SELECT 1 FROM TRANZT T WHERE T.DOCUMENTID = D.ID AND T.TRANZTYPE IN (40,41))
    AND NOT EXISTS(SELECT 1 FROM DOCUMENT DT WHERE DT.ID = D.ID AND DT.ORDERIDENTIF IS NOT NULL AND DT.ORDERIDENTIF <> '')
    AND NOT EXISTS(SELECT 1 FROM DOCUMENT DP
                   JOIN DOCKIND DPDK ON DPDK.ID = DP.DOCKINDID
                   WHERE DP.PREPAYEDDOCID = D.ID AND DP.STATE = 1 AND DPDK.ECRRECEIPTTYPE = 0 AND
                   NOT EXISTS(
                   SELECT 1 FROM DOCUMENT DPR
                   JOIN DOCKIND DPRDK ON DPRDK.ID = DPR.DOCKINDID
                   WHERE DPR.DOCUMENTID = DP.ID AND DPRDK.ECRRECEIPTTYPE IN (1, 2)))
    INTO DOCID
    DO
    BEGIN
         --    11  12, -   
      FOR
        SELECT WARECODE, WAREMARK, TRANZTYPE, QUANTITY,
        ASPECTSCHEME, ASPECTVALUE1, ASPECTVALUE2, ASPECTVALUE3, ASPECTVALUE4, ASPECTVALUE5
        FROM TRANZT T
        LEFT JOIN SPRT S ON S.CODE = T.WARECODE
        WHERE TRANZTYPE IN (11,12) AND T.DOCUMENTID = :DOCID
      INTO WARECODE, WAREMARK, TRANZTYPE, QUANTITY, ASPSCHEMECODE, ASPVAL1, ASPVAL2, ASPVAL3, ASPVAL4, ASPVAL5
      DO
      BEGIN
        WAREID = NULL;
        FLAGS = NULL;
           --  ID    
        IF (AWARECODETOMARK = 0) THEN
        BEGIN
          SELECT ID, FLAGS
          FROM SPRT
          WHERE CODE = :WARECODE
          INTO WAREID, FLAGS;
        END
        ELSE
        BEGIN
          SELECT FIRST 1 ID, FLAGS
          FROM SPRT
          WHERE MARK = :WAREMARK
          INTO :WAREID, :FLAGS;
        END
        --          ,  -
        IF (:ACONTROLSALEREMAIN = 1 OR :ACONTROLSALEREMAIN = 2 AND :FLAGS/64 <> (:FLAGS/32)/2.0) THEN
        BEGIN
          ASPSCHEMEID = NULL;
          SELECT ID
          FROM ASPSCHM
          WHERE CODE = :ASPSCHEMECODE
          INTO :ASPSCHEMEID;

          REMAINID = NULL;
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL1 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 1)) AND
          R.ASPECTVALUE2ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL2 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 2)) AND
          R.ASPECTVALUE3ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL3 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 3)) AND
          R.ASPECTVALUE4ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL4 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 4)) AND
          R.ASPECTVALUE5ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL5 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 5)) AND
          R.WAREID = :WAREID AND
          R.USEREMAIN = 1
          INTO
          REMAINID;

          IF (:REMAINID IS NULL) THEN
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = 0 AND
          R.ASPECTVALUE2ID = 0 AND
          R.ASPECTVALUE3ID = 0 AND
          R.ASPECTVALUE4ID = 0 AND
          R.ASPECTVALUE5ID = 0 AND
          R.WAREID = :WAREID
          INTO
          REMAINID;

          IF (:REMAINID IS NOT NULL) THEN
          INSERT INTO REMAIND (
           ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
          VALUES (
           GEN_ID(GREMAIND, 1), :REMAINID, -:QUANTITY, :DOCID, 0);
        END
      END

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID AND TRANZTYPE = 54
        INTO TMPID
        DO
          UPDATE TRANZT T SET
            TRANZDATE = :ATRANZDATE,
            TRANZHOUR = :ATRANZHOUR,
            TRANZTIME = :ATRANZTIME,
            TRANZTYPE = 56,
            T.SELLER = :USERCODE
          WHERE ID = :TMPID;

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID
        ORDER BY ID
        INTO TRID
        DO
        BEGIN
          UPDATE TRANZT SET
            TRANZCOUNT = :TRANZCOUNT
          WHERE ID = :TRID;
          TRANZCOUNT = TRANZCOUNT + 1;
        END

      DELETE FROM COUNTERD CD WHERE CD.DOCUMENTID = :DOCID;
      UPDATE DOCUMENT D SET
        STATE = 2,
        CLOSEDATE = :ATRANZDATE,
        CLOSETIME = :ATRANZTIME,
        CLOSEUSERID = :ASELLERID,
        SAVED = :ASAVED
      WHERE ID = :DOCID;
    END
END
^

SET TERM ; ^

ALTER TABLE CLIENT ALTER COLUMN ID POSITION 1;

ALTER TABLE CLIENT ALTER COLUMN CODE POSITION 2;

ALTER TABLE CLIENT ALTER COLUMN PARENTID POSITION 3;

ALTER TABLE CLIENT ALTER COLUMN NAME POSITION 4;

ALTER TABLE CLIENT ALTER COLUMN TEXT POSITION 5;

ALTER TABLE CLIENT ALTER COLUMN ISFOLDER POSITION 6;

ALTER TABLE CLIENT ALTER COLUMN DESCRIPTION POSITION 7;

ALTER TABLE CLIENT ALTER COLUMN SEX POSITION 8;

ALTER TABLE CLIENT ALTER COLUMN MEMDATE POSITION 9;

ALTER TABLE CLIENT ALTER COLUMN BIRTHDATE POSITION 10;

ALTER TABLE CLIENT ALTER COLUMN REGDATE POSITION 11;

ALTER TABLE CLIENT ALTER COLUMN ZIPCODE POSITION 12;

ALTER TABLE CLIENT ALTER COLUMN CITY POSITION 13;

ALTER TABLE CLIENT ALTER COLUMN ADDRESS POSITION 14;

ALTER TABLE CLIENT ALTER COLUMN EMAIL POSITION 15;

ALTER TABLE CLIENT ALTER COLUMN WEB POSITION 16;

ALTER TABLE CLIENT ALTER COLUMN TELEPHONE POSITION 17;

ALTER TABLE CLIENT ALTER COLUMN INN POSITION 18;

ALTER TABLE CLIENT ALTER COLUMN DOCUMENT POSITION 19;

ALTER TABLE CLIENT ALTER COLUMN OKPO POSITION 20;

ALTER TABLE CLIENT ALTER COLUMN OKPD POSITION 21;

ALTER TABLE CLIENT ALTER COLUMN CHNG POSITION 22;

ALTER TABLE CLIENT ALTER COLUMN DELETED POSITION 23;

ALTER TABLE CLIENT ALTER COLUMN BDOCODE POSITION 24;

ALTER TABLE CLIENT ALTER COLUMN OWNERBDO POSITION 25;

ALTER TABLE CLIENT ALTER COLUMN INSCHNG POSITION 26;

ALTER TABLE CLIENT ALTER COLUMN LEGALZIPCODE POSITION 27;

ALTER TABLE CLIENT ALTER COLUMN LEGALCITY POSITION 28;

ALTER TABLE CLIENT ALTER COLUMN LEGALADDRESS POSITION 29;

ALTER TABLE DOCUMENT ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCUMENT ALTER COLUMN DOCKINDID POSITION 2;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUENUMBER POSITION 3;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDATE POSITION 4;

ALTER TABLE DOCUMENT ALTER COLUMN OPENTIME POSITION 5;

ALTER TABLE DOCUMENT ALTER COLUMN OPENUSERID POSITION 6;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEDATE POSITION 7;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSETIME POSITION 8;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEUSERID POSITION 9;

ALTER TABLE DOCUMENT ALTER COLUMN DOCUMENTID POSITION 10;

ALTER TABLE DOCUMENT ALTER COLUMN CLIENTID POSITION 11;

ALTER TABLE DOCUMENT ALTER COLUMN STATE POSITION 12;

ALTER TABLE DOCUMENT ALTER COLUMN EDUCATION POSITION 13;

ALTER TABLE DOCUMENT ALTER COLUMN RMKID POSITION 14;

ALTER TABLE DOCUMENT ALTER COLUMN SUMM POSITION 15;

ALTER TABLE DOCUMENT ALTER COLUMN SUMMWD POSITION 16;

ALTER TABLE DOCUMENT ALTER COLUMN ECRSESSION POSITION 17;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUETYPE POSITION 18;

ALTER TABLE DOCUMENT ALTER COLUMN ORDERIDENTIF POSITION 19;

ALTER TABLE DOCUMENT ALTER COLUMN COMMENTCODE POSITION 20;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTSCHEME POSITION 21;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE1 POSITION 22;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE2 POSITION 23;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE3 POSITION 24;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE4 POSITION 25;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE5 POSITION 26;

ALTER TABLE DOCUMENT ALTER COLUMN HALLPLACEID POSITION 27;

ALTER TABLE DOCUMENT ALTER COLUMN SAVED POSITION 28;

ALTER TABLE DOCUMENT ALTER COLUMN INNERDOCORDER POSITION 29;

ALTER TABLE DOCUMENT ALTER COLUMN PRECHEQUE POSITION 30;

ALTER TABLE DOCUMENT ALTER COLUMN OPENRMKID POSITION 31;

ALTER TABLE DOCUMENT ALTER COLUMN OPENSESSION POSITION 32;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDOCNUMBER POSITION 33;

ALTER TABLE DOCUMENT ALTER COLUMN CHNG POSITION 34;

ALTER TABLE DOCUMENT ALTER COLUMN BDOCODE POSITION 35;

ALTER TABLE DOCUMENT ALTER COLUMN ISFISCAL POSITION 36;

ALTER TABLE DOCUMENT ALTER COLUMN OWNERBDO POSITION 37;

ALTER TABLE DOCUMENT ALTER COLUMN NSHOP POSITION 38;

ALTER TABLE DOCUMENT ALTER COLUMN USERVALUES POSITION 39;

ALTER TABLE DOCUMENT ALTER COLUMN EMPLOYEECODE POSITION 40;

ALTER TABLE DOCUMENT ALTER COLUMN DOCEMPLID POSITION 41;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEBEG POSITION 42;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEEND POSITION 43;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEINFO POSITION 44;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEBEF POSITION 45;

ALTER TABLE DOCUMENT ALTER COLUMN OWNERUSERID POSITION 46;

ALTER TABLE DOCUMENT ALTER COLUMN CARDBONUS POSITION 47;

ALTER TABLE DOCUMENT ALTER COLUMN ECRDEPARTMENT POSITION 48;

ALTER TABLE DOCUMENT ALTER COLUMN PREPAYEDDOCID POSITION 49;

ALTER TABLE TRANZT ALTER COLUMN ID POSITION 1;

ALTER TABLE TRANZT ALTER COLUMN DOCUMENTID POSITION 2;

ALTER TABLE TRANZT ALTER COLUMN TRANZCOUNT POSITION 3;

ALTER TABLE TRANZT ALTER COLUMN TRANZDATE POSITION 4;

ALTER TABLE TRANZT ALTER COLUMN TRANZTIME POSITION 5;

ALTER TABLE TRANZT ALTER COLUMN TRANZHOUR POSITION 6;

ALTER TABLE TRANZT ALTER COLUMN TRANZTYPE POSITION 7;

ALTER TABLE TRANZT ALTER COLUMN SELLER POSITION 8;

ALTER TABLE TRANZT ALTER COLUMN WARECODE POSITION 9;

ALTER TABLE TRANZT ALTER COLUMN WAREMARK POSITION 10;

ALTER TABLE TRANZT ALTER COLUMN ASPECTSCHEME POSITION 11;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE1 POSITION 12;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE2 POSITION 13;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE3 POSITION 14;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE4 POSITION 15;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE5 POSITION 16;

ALTER TABLE TRANZT ALTER COLUMN PRICE POSITION 17;

ALTER TABLE TRANZT ALTER COLUMN QUANTITY POSITION 18;

ALTER TABLE TRANZT ALTER COLUMN SUMM POSITION 19;

ALTER TABLE TRANZT ALTER COLUMN PRICEWD POSITION 20;

ALTER TABLE TRANZT ALTER COLUMN SUMMWD POSITION 21;

ALTER TABLE TRANZT ALTER COLUMN INFO POSITION 22;

ALTER TABLE TRANZT ALTER COLUMN INFOSTR POSITION 23;

ALTER TABLE TRANZT ALTER COLUMN BARCODE POSITION 24;

ALTER TABLE TRANZT ALTER COLUMN FACTOR POSITION 25;

ALTER TABLE TRANZT ALTER COLUMN CURRENCY POSITION 26;

ALTER TABLE TRANZT ALTER COLUMN PRNONECR POSITION 27;

ALTER TABLE TRANZT ALTER COLUMN ECRNUMBER POSITION 28;

ALTER TABLE TRANZT ALTER COLUMN POSID POSITION 29;

ALTER TABLE TRANZT ALTER COLUMN POSNUMB POSITION 30;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCPOS POSITION 31;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCREC POSITION 32;

ALTER TABLE TRANZT ALTER COLUMN COMMENTCODE POSITION 33;

ALTER TABLE TRANZT ALTER COLUMN COUNTFILLS POSITION 34;

ALTER TABLE TRANZT ALTER COLUMN COUNTPRINTS POSITION 35;

ALTER TABLE TRANZT ALTER COLUMN BDOCODE POSITION 36;

ALTER TABLE TRANZT ALTER COLUMN OWNERBDO POSITION 37;

ALTER TABLE TRANZT ALTER COLUMN ORDERPOS POSITION 38;

ALTER TABLE TRANZT ALTER COLUMN TRMKID POSITION 39;

ALTER TABLE WINREPORTS ALTER COLUMN ID POSITION 1;

ALTER TABLE WINREPORTS ALTER COLUMN CODE POSITION 2;

ALTER TABLE WINREPORTS ALTER COLUMN NAME POSITION 3;

ALTER TABLE WINREPORTS ALTER COLUMN VIEWREPORT POSITION 4;

ALTER TABLE WINREPORTS ALTER COLUMN BDOCODE POSITION 5;

ALTER TABLE WINREPORTS ALTER COLUMN CHNG POSITION 6;

ALTER TABLE WINREPORTS ALTER COLUMN OWNERBDO POSITION 7;

ALTER TABLE WINREPORTS ALTER COLUMN PREVIEW POSITION 8;

ALTER TABLE WINREPORTS ALTER COLUMN ZCLOSE POSITION 9;

/* MAN */

UPDATE TRANZT T
SET TRMKID = (SELECT RMKID FROM DOCUMENT WHERE ID = T.DOCUMENTID);
COMMIT;

/* MAN */

/* TEXT BLOCK END */

/* Convert 4.8.2 */
ALTER TABLE DOCUMENT ADD GUESTCOUNT FINT;

/* Alter Procedure... */
/* Alter (GETHALLPLACES) */
SET TERM ^ ;

ALTER PROCEDURE GETHALLPLACES(AHALLID INTEGER,
AEDUCATION INTEGER = 0)
 RETURNS(ID INTEGER,
CODE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
STATE INTEGER,
DOCCOUNT INTEGER,
OPENTIME TIME,
TOTALSUMM FLOAT,
USERNAME VARCHAR(100),
CLIENTNAME VARCHAR(100),
GUESTCOUNT INTEGER)
 AS
BEGIN
  FOR SELECT ID, CODE, NAME, TEXT FROM HALLPLACE WHERE HALLID = :AHALLID
  ORDER BY CODE
  INTO :ID, :CODE, :NAME, :TEXT DO
  BEGIN
    SELECT COUNT(ID), SUM(SUMMWD), SUM(GUESTCOUNT) FROM DOCUMENT
    WHERE HALLPLACEID = :ID AND ((STATE IN (0, 3)) OR (STATE = 4 AND (CURRENT_TIMESTAMP >= RESERVEBEF AND CURRENT_TIMESTAMP <= RESERVEEND)))
      AND EDUCATION = :AEDUCATION
    INTO :DOCCOUNT, :TOTALSUMM, :GUESTCOUNT;

    STATE = 0;

    OPENTIME = NULL;
    USERNAME = NULL;
    CLIENTNAME = NULL;

    IF (DOCCOUNT > 0) THEN
    BEGIN
      SELECT FIRST 1 OPENTIME, USERNAME, CLIENTNAME, HSTATE FROM(
        SELECT D.OPENTIME, U.NAME AS USERNAME, C.NAME AS CLIENTNAME,
        CASE D.STATE
          WHEN 4 THEN 2
          ELSE 1
        END AS HSTATE

        FROM DOCUMENT D LEFT JOIN "USER" U ON U.ID = D.OWNERUSERID LEFT JOIN CLIENT C ON C.ID = D.CLIENTID
        WHERE D.HALLPLACEID = :ID AND ((D.STATE IN (0, 3)) OR (D.STATE = 4 AND (CURRENT_TIMESTAMP >= D.RESERVEBEF AND CURRENT_TIMESTAMP <= D.RESERVEEND)))
      ) ORDER BY HSTATE
      INTO :OPENTIME, :USERNAME, :CLIENTNAME, :STATE;

      IF (STATE = 1 AND EXISTS (SELECT D.ID FROM DOCUMENT D WHERE D.HALLPLACEID = :ID AND D.STATE = 4 AND CURRENT_TIMESTAMP >= D.RESERVEBEF AND CURRENT_TIMESTAMP <= D.RESERVEEND)) THEN
        STATE = 3;

    END

    SUSPEND;
  END

END
^

/* Alter (UNI_FILTER) */
ALTER PROCEDURE UNI_FILTER(ATABLENAME VARCHAR(100),
AKEYFIELD VARCHAR(20),
AFIELDS VARCHAR(255),
AFILTER VARCHAR(255))
 RETURNS(ID INTEGER)
 AS
DECLARE VARIABLE FLD VARCHAR(50);
DECLARE VARIABLE TMPL VARCHAR(255);
DECLARE VARIABLE WHCLAUSE VARCHAR(4096);
DECLARE VARIABLE NUMFLD INTEGER;
DECLARE VARIABLE FTMP FLOAT;
DECLARE VARIABLE PRFX VARCHAR(1);
DECLARE VARIABLE SUFX VARCHAR(1);
BEGIN
  ID = NULL;
  WHCLAUSE = '';
  PRFX = '';
  SUFX = '';
  AFILTER = TRIM(COALESCE(AFILTER, ''));
  IF (AFILTER <> '') THEN
  BEGIN
    AFILTER = TRIM(AFILTER);
    WHILE (PCOPY(AFILTER, 0, 1) = '%') DO
    BEGIN
      PRFX = '%';
      AFILTER = PCOPY(AFILTER, 1, LEN(AFILTER) - 1);
    END
    WHILE (PCOPY(AFILTER, LEN(AFILTER) - 1, 1) = '%') DO
    BEGIN
      SUFX = '%';
      AFILTER = PCOPY(AFILTER, 0, LEN(AFILTER) - 1);
    END

    WHILE (AFIELDS <> '') DO
    BEGIN
      FLD = EXTRACTSTR(AFIELDS, ',');
      SELECT
        F.RDB$FIELD_TYPE
      FROM RDB$RELATION_FIELDS RF JOIN RDB$FIELDS F ON F.RDB$FIELD_NAME = RF.RDB$FIELD_SOURCE
      WHERE RF.RDB$FIELD_NAME = :FLD AND RF.RDB$RELATION_NAME = TRIM(:ATABLENAME)
      INTO NUMFLD;
/*  RDB$FIELD_TYPE
    * 261 - BLOB
    * 14 - CHAR
    * 40 - CSTRING
    * 11 - DFLOAT
    * 27 - DOUBLE
    * 10 - FLOAT
    * 16 - INT64
    * 8 - INTEGER
    * 9 - QUAD
    * 7 - SMALLINT
    * 12 - DATE ( 3)
    * 13 - TIME
    * 35 - TIMESTAMP
    * 37 - VARCHAR
*/
      BEGIN
        IF (NUMFLD IN (11, 27, 10, 16, 8, 9, 7)) THEN
        BEGIN
          FTMP = CAST(AFILTER AS FLOAT);
          TMPL = IIF(SUFX='' AND PRFX='', FLD||'='||FTMP, FLD||' LIKE '''||PRFX||FTMP||SUFX||'''');
        END
        ELSE
        IF (NUMFLD IN (261)) THEN
          TMPL = FLD||' CONTAINING '''||AFILTER||'''';
        ELSE
          TMPL = 'UPPER('||:FLD||') LIKE '''||:PRFX||:AFILTER||'%''';
        WHCLAUSE = WHCLAUSE || IIF(WHCLAUSE = '', ' WHERE ', ' OR ') || TMPL;
        WHEN ANY DO BEGIN END
      END


      AFIELDS = PCOPY(AFIELDS, LEN(FLD) + 1, LEN(AFIELDS) - LEN(FLD) - 1);

    END
  END
  FOR EXECUTE STATEMENT 'SELECT DISTINCT '||AKEYFIELD||' FROM ' || ATABLENAME || WHCLAUSE INTO ID DO
    SUSPEND;
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_BEF_TRANZT0
AS
DECLARE VARIABLE DSTATE INTEGER;
DECLARE VARIABLE RMKID INTEGER;
BEGIN

  SELECT STATE, RMKID FROM DOCUMENT WHERE ID = NEW.DOCUMENTID INTO :DSTATE, :RMKID;
  NEW.TRMKID = RMKID;

  /*     */
  IF (DSTATE IN (1, 2) AND NEW.TRANZCOUNT IS NULL) THEN
    EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES NEW.TRANZCOUNT;

  IF (NEW.WAREMARK IS NULL) THEN
    NEW.WAREMARK = '';
  IF (NEW.ID IS NULL) THEN
    NEW.ID = GEN_ID(GDOC, 1);
END
^

/*MAN*/
INSERT INTO SETTINGS (ID, NAME, VAL, SYNCCATEG, OWNERBDO)
SELECT GEN_ID(GID, 1), 'LockOtherApplications', '0', SYNCCATEG, OWNERBDO
FROM SETTINGS
WHERE NAME = 'ExternalProgramPath' AND VAL IS NOT NULL AND VAL <> ''
^
SET TERM ; ^
/*MAN*/

/* TEXT BLOCK END */

/* Convert 4.8.3 */
CREATE TABLE CCARDCLASSIFIER(ID FID NOT NULL,
CCARDID RREF,
CLASSIFIERID RREF,
CHNG FINT64,
BDOCODE FINT,
OWNERBDO FINT,
DELETED FLAG);


CREATE TABLE CLASSIFIER(ID FID NOT NULL,
CODE FRINT,
PARENTID RREF,
NAME FVARCHAR100,
TEXT FVARCHAR100,
ISFOLDER FLAG NOT NULL,
DELETED FLAG,
BDOCODE FINT,
OWNERBDO FINT,
INSCHNG FINT64,
CHNG FINT64);


CREATE TABLE CLIENTCLASSIFIER(ID FID NOT NULL,
CLIENTID RREF,
CLASSIFIERID RREF,
OWNERBDO FINT,
BDOCODE FINT,
CHNG FINT64,
DELETED FLAG);


CREATE TABLE SPRTCLASSIFIER(ID FID NOT NULL,
WAREID RREF,
CLASSIFIERID RREF,
CHNG FINT64,
BDOCODE FINT,
OWNERBDO FINT,
DELETED FLAG);



ALTER TABLE ACTDISCOBJ ADD CCARDCLASSIFIERID RREF DEFAULT -1;

ALTER TABLE ACTDISCOBJ ADD CLIENTCLASSIFIERID RREF DEFAULT -1;

ALTER TABLE ACTDISCOBJ ADD WARECLASSIFIERID RREF DEFAULT -1;

ALTER TABLE CONDITION ADD WARECLASSIFIERID FREF;

ALTER TABLE DISCRATE ADD WARECLASSIFIERID FREF;

ALTER TABLE PAYCARDDEV ADD MINSUMADD FNUM15_2 DEFAULT 0;

ALTER TABLE PAYCARDDEV ADD MINSUMSUB FNUM15_2 DEFAULT 0;

ALTER TABLE PAYCARDDEV ADD MINCASHPAY FNUM15_2 DEFAULT 0;

/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE APPENDCCARDCLASSIFIERLINK(ICLASSIFIERCODE INTEGER,
ICARDVAL VARCHAR(40),
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

CREATE PROCEDURE APPENDCLASSIFIER(ICODE INTEGER,
IPARENTCODE INTEGER,
IISFOLDER INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

CREATE PROCEDURE APPENDCLIENTCLASSIFIERLINK(ICLASSIFIERCODE INTEGER,
ICLIENTCODE INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

CREATE PROCEDURE APPENDSPRTCLASSIFIERLINK(ICLASSIFIERCODE INTEGER,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

CREATE PROCEDURE GET_CLASSIFIER_HIER(SYNCBASEID INTEGER,
CHNGEND NUMERIC(18),
PARENTID INTEGER,
UPPERHIER INTEGER,
ISC2L INTEGER)
 RETURNS(ID INTEGER,
HIER INTEGER)
 AS
 BEGIN SUSPEND; END
^

CREATE PROCEDURE GET_CLASSIFIER_PARENTS(ID_CLASSIFIER INTEGER,
IN_NUM INTEGER)
 RETURNS(ID_PARENT INTEGER,
NUM INTEGER)
 AS
 BEGIN SUSPEND; END
^


/* Create index... */
SET TERM ; ^

CREATE INDEX IDX_ACTDISCOBJ3 ON ACTDISCOBJ(CCARDCLASSIFIERID, CLIENTID, CARDID, PAYMENTID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID);

CREATE INDEX IDX_CLASSIFIER_NAME ON CLASSIFIER(NAME);

CREATE INDEX IDX_CLASSIFIER_PARENT ON CLASSIFIER(PARENTID);


/* Create Exception... */
CREATE EXCEPTION E_CLASSIFIER_STRUCT_CORRUPT '    ';


/* Create Primary Key... */
ALTER TABLE CCARDCLASSIFIER ADD CONSTRAINT PK_CCARDCLASSIFIER PRIMARY KEY (ID);

ALTER TABLE CLASSIFIER ADD CONSTRAINT PK_CLASSIFIER PRIMARY KEY (ID);

ALTER TABLE CLIENTCLASSIFIER ADD CONSTRAINT PK_CLIENTCLASSIFIER PRIMARY KEY (ID);

ALTER TABLE SPRTCLASSIFIER ADD CONSTRAINT PK_SPRTCLASSIFIER PRIMARY KEY (ID);

/* Create Unique... */
ALTER TABLE CCARDCLASSIFIER ADD CONSTRAINT UNQ_CCARDCLASSIFIER UNIQUE (CCARDID, CLASSIFIERID);

ALTER TABLE CLASSIFIER ADD CONSTRAINT UNQ_CLASSIFIER_CODE UNIQUE (CODE, DELETED);

ALTER TABLE CLIENTCLASSIFIER ADD CONSTRAINT UNQ_CLIENTCLASSIFIER UNIQUE (CLIENTID, CLASSIFIERID);

ALTER TABLE SPRTCLASSIFIER ADD CONSTRAINT UNQ_SPRTCLASSIFIER UNIQUE (WAREID, CLASSIFIERID);

/* Create Foreign Key... */
RECONNECT;

ALTER TABLE CCARDCLASSIFIER ADD CONSTRAINT FK_CCARDCLASSIFIER_1 FOREIGN KEY (CCARDID) REFERENCES CCARD (ID) ON DELETE CASCADE;

ALTER TABLE CCARDCLASSIFIER ADD CONSTRAINT FK_CCARDCLASSIFIER_2 FOREIGN KEY (CLASSIFIERID) REFERENCES CLASSIFIER (ID) ON DELETE CASCADE;

ALTER TABLE CLIENTCLASSIFIER ADD CONSTRAINT FK_CLIENTCLASSIFIER_1 FOREIGN KEY (CLIENTID) REFERENCES CLIENT (ID) ON DELETE CASCADE;

ALTER TABLE CLIENTCLASSIFIER ADD CONSTRAINT FK_CLIENTCLASSIFIER_2 FOREIGN KEY (CLASSIFIERID) REFERENCES CLASSIFIER (ID) ON DELETE CASCADE;

ALTER TABLE SPRTCLASSIFIER ADD CONSTRAINT FK_SPRTCLASSIFIER_1 FOREIGN KEY (WAREID) REFERENCES SPRT (ID) ON DELETE CASCADE;

ALTER TABLE SPRTCLASSIFIER ADD CONSTRAINT FK_SPRTCLASSIFIER_2 FOREIGN KEY (CLASSIFIERID) REFERENCES CLASSIFIER (ID) ON DELETE CASCADE;

/*  Empty GET_ACTSCRIPT for GET_ACTSCRIPT_CUSTOM(param list change)  */
SET TERM ^ ;

ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN SUSPEND; END
^

/*  Empty GET_DISCOUNT for GET_DISCOUNT_CUSTOM(param list change)  */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure GET_ACTSCRIPT_CUSTOM with new param-list */
ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure GET_DISCOUNT_CUSTOM with new param-list */
ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
DISCRATECLASSIFIERID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN SUSPEND; END
^

/* Alter Procedure... */
ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
DECLARE VARIABLE CARD VARCHAR(255);
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID, AC.WARECLASSIFIERID,
      AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
      AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
            UNION
            SELECT COALESCE(WRCL.CLASSIFIERID, 0) AS CLASSIFIERID
            FROM RDB$DATABASE LEFT JOIN SPRTCLASSIFIER WRCL ON WRCL.WAREID = :IWARE) WRCL1 ON WRCL1.CLASSIFIERID = A.WARECLASSIFIERID
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
            UNION
            SELECT COALESCE(CLCL.CLASSIFIERID, 0) AS CLASSIFIERID
            FROM RDB$DATABASE LEFT JOIN CLIENTCLASSIFIER CLCL ON CLCL.CLIENTID = :ICLIENT) CLCL1 ON CLCL1.CLASSIFIERID = A.CLIENTCLASSIFIERID
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
              AND (A.CCARDCLASSIFIERID = -1 OR A.CCARDCLASSIFIERID IN (
                      SELECT COALESCE(CCL.CLASSIFIERID, 0)
                      FROM RDB$DATABASE GCL LEFT JOIN CCARDCLASSIFIER CCL ON CCL.CCARDID = A.CARDID))
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND

      (
       NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                       AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:REGDATE,
                     AC.REGDATECOND,
                     AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                     AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

      (
       NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                       AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:MEMDATE,
                     AC.MEMDATECOND,
                     AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                     AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
      (
       NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                         AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:BIRTHDATE,
                     AC.BIRTHDATECOND,
                     AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                     AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

      (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
      (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
      (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
      (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
      (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
      (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)
    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ3), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC)))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    DO
      SUSPEND;

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = EXTRACTSTR(:ICARD, ',');
    CARDLEN = LEN(CARD);
    CARD = ADDRIGHT(CARD, 1, 40);

    FOR
      SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID, AC.WARECLASSIFIERID,
        AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
        AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
              UNION
              SELECT COALESCE(WRCL.CLASSIFIERID, 0) AS CLASSIFIERID
              FROM RDB$DATABASE LEFT JOIN SPRTCLASSIFIER WRCL ON WRCL.WAREID = :IWARE) WRCL1 ON WRCL1.CLASSIFIERID = A.WARECLASSIFIERID
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
              UNION
              SELECT COALESCE(CLCL.CLASSIFIERID, 0) AS CLASSIFIERID
              FROM RDB$DATABASE LEFT JOIN CLIENTCLASSIFIER CLCL ON CLCL.CLIENTID = :ICLIENT) CLCL1 ON CLCL1.CLASSIFIERID = A.CLIENTCLASSIFIERID
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
              AND (A.CCARDCLASSIFIERID = -1 OR A.CCARDCLASSIFIERID IN (
                      SELECT COALESCE(CCL.CLASSIFIERID, 0)
                      FROM RDB$DATABASE GCL LEFT JOIN CCARDCLASSIFIER CCL ON CCL.CCARDID = A.CARDID))
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL AND CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
      WHERE
        ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND

        (
         NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                         AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:REGDATE,
                       AC.REGDATECOND,
                       AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                       AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

        (
         NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                         AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:MEMDATE,
                       AC.MEMDATECOND,
                       AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                       AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
        (
         NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                           AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:BIRTHDATE,
                       AC.BIRTHDATECOND,
                       AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                       AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

        (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
        (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
        (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
        (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
        (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
        (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
     PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ3), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC)))
     ORDER BY GD.CODE, AD.PRIORITY
     INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
     DO
        SUSPEND;
   ICARD = PCOPY(ICARD, CARDLEN + 1, LEN(ICARD) - CARDLEN - 1);
  END

  GRPCODE = NULL;
  PRIORITY = 0;
  WAREID = NULL;
  WARECLASSIFIERID = NULL;
  FORMULA1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  FORMULA2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  FORMULA3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
            UNION
            SELECT COALESCE(WRCL.CLASSIFIERID, 0) AS CLASSIFIERID
            FROM RDB$DATABASE LEFT JOIN SPRTCLASSIFIER WRCL ON WRCL.WAREID = :IWARE) WRCL1 ON WRCL1.CLASSIFIERID = A.WARECLASSIFIERID
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
            UNION
            SELECT COALESCE(CLCL.CLASSIFIERID, 0) AS CLASSIFIERID
            FROM RDB$DATABASE LEFT JOIN CLIENTCLASSIFIER CLCL ON CLCL.CLIENTID = :ICLIENT) CLCL1 ON CLCL1.CLASSIFIERID = A.CLIENTCLASSIFIERID
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
              AND (A.CCARDCLASSIFIERID = -1 OR A.CCARDCLASSIFIERID IN (
                      SELECT COALESCE(CCL.CLASSIFIERID, 0)
                      FROM RDB$DATABASE GCL LEFT JOIN CCARDCLASSIFIER CCL ON CCL.CCARDID = A.CARDID))
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTSCRIPT ACS ON ACS.ID = A.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
  INTO DATA, CODE
  DO
    SUSPEND;

END
^

/* Alter (GET_ACTSCRIPT) */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
BEGIN
  ID = 1;

  FOR
    SELECT  CODE, DATA, NULLTONUM(GRPCODE), NULLTONUM(PRIORITY), WAREID, WARECLASSIFIERID,
      SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,
      CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    FROM GET_ACTSCRIPT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
      :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,:IWEEKDAY,
      :IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,:ICARD,
      :IANYCARD,:ICARDSTATE,:IACTEVENT,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY, CODE
    INTO CODE, DATA, GRPCODE, PRIORITY,WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END
END
^

ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
DISCRATECLASSIFIERID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT GD.CODE, AR.VAL, AC.WAREID, AC.WARECLASSIFIERID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3, AR.CODE,
      (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID), AR.WAREID, AR.WARECLASSIFIERID
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
            UNION
            SELECT COALESCE(WRCL.CLASSIFIERID, 0) AS CLASSIFIERID
            FROM RDB$DATABASE LEFT JOIN SPRTCLASSIFIER WRCL ON WRCL.WAREID = :IWARE) WRCL1 ON WRCL1.CLASSIFIERID = A.WARECLASSIFIERID
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
            UNION
            SELECT COALESCE(CLCL.CLASSIFIERID, 0) AS CLASSIFIERID
            FROM RDB$DATABASE LEFT JOIN CLIENTCLASSIFIER CLCL ON CLCL.CLIENTID = :ICLIENT) CLCL1 ON CLCL1.CLASSIFIERID = A.CLIENTCLASSIFIERID
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
              AND (A.CCARDCLASSIFIERID = -1 OR A.CCARDCLASSIFIERID IN (
                      SELECT COALESCE(CCL.CLASSIFIERID, 0)
                      FROM RDB$DATABASE GCL LEFT JOIN CCARDCLASSIFIER CCL ON CCL.CCARDID = A.CARDID))
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (
       NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                       AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:REGDATE,
                     AC.REGDATECOND,
                     AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                     AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

      (
       NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                       AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:MEMDATE,
                     AC.MEMDATECOND,
                     AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                     AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
      (
       NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                         AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:BIRTHDATE,
                     AC.BIRTHDATECOND,
                     AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                     AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

      (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
      (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
      (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
      (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
      (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
      (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)

      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ3), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC)))
-- OLD    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO GRPCODE, VAL, WAREID, WARECLASSIFIERID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,DISCRATECODE,CARD, DISCRATEWAREID, DISCRATECLASSIFIERID
    DO
      SUSPEND;

  WHILE (ICARD <> '') DO
  BEGIN
    CARD = EXTRACTSTR(:ICARD, ',');
    CARDLEN = LEN(CARD);
    CARD = ADDRIGHT(CARD, 1, 40);

    FOR
      SELECT GD.CODE, AR.VAL, AC.WAREID, AC.WARECLASSIFIERID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
        QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID,AR.BEGVAL,AR.ENDVAL,
        AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3,AR.CODE, AR.WAREID, AR.WARECLASSIFIERID
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
              UNION
              SELECT COALESCE(WRCL.CLASSIFIERID, 0) AS CLASSIFIERID
              FROM RDB$DATABASE LEFT JOIN SPRTCLASSIFIER WRCL ON WRCL.WAREID = :IWARE) WRCL1 ON WRCL1.CLASSIFIERID = A.WARECLASSIFIERID
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
              UNION
              SELECT COALESCE(CLCL.CLASSIFIERID, 0) AS CLASSIFIERID
              FROM RDB$DATABASE LEFT JOIN CLIENTCLASSIFIER CLCL ON CLCL.CLIENTID = :ICLIENT) CLCL1 ON CLCL1.CLASSIFIERID = A.CLIENTCLASSIFIERID
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
              AND (A.CCARDCLASSIFIERID = -1 OR A.CCARDCLASSIFIERID IN (
                      SELECT COALESCE(CCL.CLASSIFIERID, 0)
                      FROM RDB$DATABASE GCL LEFT JOIN CCARDCLASSIFIER CCL ON CCL.CCARDID = A.CARDID))
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL AND CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
      WHERE
        (
         NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                         AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:REGDATE,
                       AC.REGDATECOND,
                       AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                       AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

        (
         NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                         AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:MEMDATE,
                       AC.MEMDATECOND,
                       AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                       AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
        (
         NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                           AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:BIRTHDATE,
                       AC.BIRTHDATECOND,
                       AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                       AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

        (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
        (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
        (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
        (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
        (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
        (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND

        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ3), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC)))
-- OLD      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
      ORDER BY GD.CODE, AD.PRIORITY
      INTO GRPCODE, VAL, WAREID, WARECLASSIFIERID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,DISCRATECODE, DISCRATEWAREID, DISCRATECLASSIFIERID
      DO
        SUSPEND;

   ICARD = PCOPY(ICARD, CARDLEN + 1, LEN(ICARD) - CARDLEN - 1);
  END

  GRPCODE = NULL;
  VAL = NULL;
  WAREID = NULL;
  WARECLASSIFIERID = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;
  "TYPE" = NULL;
  TEXT = NULL;
  CODE = NULL;
  CARDPREFIXBEG = NULL;
  CARDPREFIXEND = NULL;
  DEPENDOTHERPOS = NULL;
  BEGVAL = NULL;
  ENDVAL = NULL;
  FORMULA1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  FORMULA2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  FORMULA3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  PRIORITY = 0;
  CARD = NULL;

  FOR
    SELECT AR.VAL, AR.WAREID, AR.WARECLASSIFIERID, AR."TYPE", AR.NAME, AR.TEXT,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AR.CODE, (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID)
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
            UNION
            SELECT COALESCE(WRCL.CLASSIFIERID, 0) AS CLASSIFIERID
            FROM RDB$DATABASE LEFT JOIN SPRTCLASSIFIER WRCL ON WRCL.WAREID = :IWARE) WRCL1 ON WRCL1.CLASSIFIERID = A.WARECLASSIFIERID
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
            UNION
            SELECT COALESCE(CLCL.CLASSIFIERID, 0) AS CLASSIFIERID
            FROM RDB$DATABASE LEFT JOIN CLIENTCLASSIFIER CLCL ON CLCL.CLIENTID = :ICLIENT) CLCL1 ON CLCL1.CLASSIFIERID = A.CLIENTCLASSIFIERID
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
              AND (A.CCARDCLASSIFIERID = -1 OR A.CCARDCLASSIFIERID IN (
                      SELECT COALESCE(CCL.CLASSIFIERID, 0)
                      FROM RDB$DATABASE GCL LEFT JOIN CCARDCLASSIFIER CCL ON CCL.CCARDID = A.CARDID))
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN DISCRATE AR ON AR.ID = A.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
--    PLAN SORT (JOIN (JOIN (AR NATURAL,A INDEX (IDX_ACTDISCOBJ2,FK_ADO_DISCRATE))))
  INTO VAL, DISCRATEWAREID, DISCRATECLASSIFIERID, "TYPE", NAME, TEXT, PARENTID, BEGVAL, ENDVAL, DISCRATECODE, CARD
  DO
    SUSPEND;
END
^

/* Alter (GET_DISCOUNT) */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
DISCRATECLASSIFIERID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
BEGIN
  ID = 1;

  FOR
    SELECT NULLTONUM(GRPCODE), VAL, WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
           DISCRATECLASSIFIERID, "TYPE", NAME, TEXT,
           CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, NULLTONUM(PRIORITY), PARENTID, BEGVAL, ENDVAL,
           FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
    FROM GET_DISCOUNT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
          :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,
          :IWEEKDAY,:IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,
          :ICARD,:IANYCARD,:ICARDSTATE,:IDESTINATION,
          :IKIND,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY
    INTO GRPCODE, VAL, WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
         DISCRATECLASSIFIERID,"TYPE", NAME, TEXT,
         CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, PRIORITY, PARENTID, BEGVAL, ENDVAL,
         FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END

END
^

/* Alter (GETHALLPLACES) */
ALTER PROCEDURE GETHALLPLACES(AHALLID INTEGER,
AEDUCATION INTEGER = 0)
 RETURNS(ID INTEGER,
CODE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
STATE INTEGER,
DOCCOUNT INTEGER,
OPENTIME TIME,
TOTALSUMM FLOAT,
USERNAME VARCHAR(100),
CLIENTNAME VARCHAR(100),
GUESTCOUNT INTEGER,
NEXTRES TIMESTAMP,
EMPLOYEENAME VARCHAR(100))
 AS
BEGIN
  FOR SELECT ID, CODE, NAME, TEXT FROM HALLPLACE WHERE HALLID = :AHALLID
  ORDER BY CODE
  INTO :ID, :CODE, :NAME, :TEXT DO
  BEGIN
    SELECT COUNT(ID), SUM(SUMMWD), SUM(GUESTCOUNT) FROM DOCUMENT
    WHERE HALLPLACEID = :ID AND ((STATE IN (0, 3)) OR (STATE = 4 AND (CURRENT_TIMESTAMP >= RESERVEBEF AND CURRENT_TIMESTAMP <= RESERVEEND)))
      AND EDUCATION = :AEDUCATION
    INTO :DOCCOUNT, :TOTALSUMM, :GUESTCOUNT;

    SELECT MIN(RESERVEBEF) FROM DOCUMENT
    WHERE HALLPLACEID = :ID
    AND RESERVEBEF > CURRENT_TIMESTAMP
    AND STATE = 4
    AND EDUCATION = :AEDUCATION
    INTO :NEXTRES;

    STATE = 0;

    OPENTIME = NULL;
    USERNAME = NULL;
    CLIENTNAME = NULL;
    EMPLOYEENAME = NULL;

    IF (DOCCOUNT > 0) THEN
    BEGIN
      SELECT FIRST 1 OPENTIME, USERNAME, CLIENTNAME, EMPLOYEENAME, HSTATE FROM(
        SELECT D.OPENTIME, U.NAME AS USERNAME, C.NAME AS CLIENTNAME, E.NAME AS EMPLOYEENAME,
        CASE D.STATE
          WHEN 4 THEN 2
          ELSE 1
        END AS HSTATE

        FROM DOCUMENT D LEFT JOIN "USER" U ON U.ID = D.OWNERUSERID LEFT JOIN CLIENT C ON C.ID = D.CLIENTID LEFT JOIN EMPLOYEE E ON E.CODE = D.EMPLOYEECODE
        WHERE D.HALLPLACEID = :ID AND ((D.STATE IN (0, 3)) OR (D.STATE = 4 AND (CURRENT_TIMESTAMP >= D.RESERVEBEF AND CURRENT_TIMESTAMP <= D.RESERVEEND)))
      ) ORDER BY HSTATE
      INTO :OPENTIME, :USERNAME, :CLIENTNAME, :EMPLOYEENAME, :STATE;

      IF (STATE = 1 AND EXISTS (SELECT D.ID FROM DOCUMENT D WHERE D.HALLPLACEID = :ID AND D.STATE = 4 AND CURRENT_TIMESTAMP >= D.RESERVEBEF AND CURRENT_TIMESTAMP <= D.RESERVEEND)) THEN
        STATE = 3;

    END

    SUSPEND;
  END

END
^

/* empty dependent procedure body */
/* Clear: GET_BDO_SYNCINFO for: TABLECATEG */
ALTER PROCEDURE GET_BDO_SYNCINFO(ISYNCBASEID INTEGER)
 RETURNS(TABLENAME VARCHAR(100),
QUELENGTH VARCHAR(20),
ERROR VARCHAR(255),
SYNCCATEG INTEGER,
ISUPDIRECTION INTEGER,
CUROPER INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (TABLECATEG) */
ALTER PROCEDURE TABLECATEG RETURNS(TABLENAME VARCHAR(100),
TABLEID INTEGER,
CATEG INTEGER)
 AS
BEGIN
/*       untSyncTypeDef ()!!!! */

  TABLENAME = 'WINREPORTS'; TABLEID = 0; CATEG = 17;
  SUSPEND;
  TABLENAME = 'KEYBLAYT'; TABLEID = 1; CATEG = 22;
  SUSPEND;
  TABLENAME = 'TOUCHLAYT'; TABLEID = 2; CATEG = 21;
  SUSPEND;
  TABLENAME = 'SETTINGS_SCR'; TABLEID = 3; CATEG = 21;
  SUSPEND;
  TABLENAME = 'CARDGROUP'; TABLEID = 4; CATEG = 14;
  SUSPEND;
  TABLENAME = 'CARD'; TABLEID = 5; CATEG = 14;
  SUSPEND;
  TABLENAME = 'RECTEMPLATE'; TABLEID = 6; CATEG = 15;
  SUSPEND;
  TABLENAME = 'DOCTEMPLATE'; TABLEID = 7; CATEG = 15;
  SUSPEND;
  TABLENAME = 'DOCKIND'; TABLEID = 8; CATEG = 15;
  SUSPEND;
  TABLENAME = 'DOCKINDRECTMPL'; TABLEID = 9; CATEG = 15;
  SUSPEND;
  TABLENAME = 'DOCKINDTMPL'; TABLEID = 10; CATEG = 15;
  SUSPEND;
  TABLENAME = 'SETTINGS_DOC'; TABLEID = 11; CATEG = 15;
  SUSPEND;
  TABLENAME = 'PROFILE'; TABLEID = 12; CATEG = 23;
  SUSPEND;
  TABLENAME = 'SECURITY'; TABLEID = 13; CATEG = 23;
  SUSPEND;
  TABLENAME = '"USER"'; TABLEID = 14; CATEG = 23;
  SUSPEND;
  TABLENAME = 'SETTINGS_USR'; TABLEID = 64; CATEG = 23;
  SUSPEND;
  TABLENAME = 'TAXRATE'; TABLEID = 15; CATEG = 7;
  SUSPEND;
  TABLENAME = 'TAXGROUP'; TABLEID = 16; CATEG = 7;
  SUSPEND;
  TABLENAME = 'TAXGRPRT'; TABLEID = 17; CATEG = 7;
  SUSPEND;
  TABLENAME = 'SETTINGS_TAX'; TABLEID = 18; CATEG = 7;
  SUSPEND;
  TABLENAME = 'KEYBMODE'; TABLEID = 19; CATEG = 22;
  SUSPEND;
  TABLENAME = 'KEYBMAP'; TABLEID = 20; CATEG = 22;
  SUSPEND;
  TABLENAME = 'KEYBMAPF'; TABLEID = 21; CATEG = 22;
  SUSPEND;
  TABLENAME = 'INPDEVFLT'; TABLEID = 22; CATEG = 2;
  SUSPEND;
  TABLENAME = 'DENOMIN'; TABLEID = 23; CATEG = 13;
  SUSPEND;
  TABLENAME = 'COMMENT'; TABLEID = 24; CATEG = 16;
  SUSPEND;
  TABLENAME = 'HALL'; TABLEID = 25; CATEG = 19;
  SUSPEND;
  TABLENAME = 'HALLPLACE'; TABLEID = 26; CATEG = 19;
  SUSPEND;
  TABLENAME = 'RMK'; TABLEID = 27; CATEG = 2;
  SUSPEND;
  TABLENAME = 'CURRENCY'; TABLEID = 28; CATEG = 12;
  SUSPEND;
  TABLENAME = 'MONEYBOX'; TABLEID = 63; CATEG = 2;
  SUSPEND;
  TABLENAME = 'SETTINGS_CUR'; TABLEID = 29; CATEG = 12;
  SUSPEND;
  TABLENAME = 'DEVICES'; TABLEID = 30; CATEG = 2;
  SUSPEND;
  TABLENAME = 'RMKDEV'; TABLEID = 31; CATEG = 2;
  SUSPEND;
  TABLENAME = 'SETTINGS_DEV'; TABLEID = 32; CATEG = 2;
  SUSPEND;
  TABLENAME = 'INTBARCS'; TABLEID = 33; CATEG = 4;
  SUSPEND;
  TABLENAME = 'ASPSCHM'; TABLEID = 34; CATEG = 6;
  SUSPEND;
  TABLENAME = 'ASPECT'; TABLEID = 35; CATEG = 6;
  SUSPEND;
  TABLENAME = 'ASPVALUE'; TABLEID = 36; CATEG = 6;
  SUSPEND;
  TABLENAME = 'SETTINGS_ASP'; TABLEID = 37; CATEG = 6;
  SUSPEND;
  TABLENAME = 'PRICELABEL'; TABLEID = 38; CATEG = 18;
  SUSPEND;
  TABLENAME = 'SETTINGS_PRL'; TABLEID = 39; CATEG = 18;
  SUSPEND;
  TABLENAME = 'SPRT'; TABLEID = 40; CATEG = 4;
  SUSPEND;
  TABLENAME = 'ANALOG'; TABLEID = 41; CATEG = 4;
  SUSPEND;
  TABLENAME = 'REMAIN'; TABLEID = 42; CATEG = 4;
  SUSPEND;
  TABLENAME = 'BARCODE'; TABLEID = 43; CATEG = 4;
  SUSPEND;
  TABLENAME = 'PAYMENT'; TABLEID = 44; CATEG = 11;
  SUSPEND;
  TABLENAME = 'SETTINGS_PAY'; TABLEID = 45; CATEG = 11;
  SUSPEND;
  TABLENAME = 'GRPCCARD'; TABLEID = 46; CATEG = 8;
  SUSPEND;
  TABLENAME = 'CCARD'; TABLEID = 47; CATEG = 8;
  SUSPEND;
  TABLENAME = 'CLIENT'; TABLEID = 48; CATEG = 8;
  SUSPEND;
  TABLENAME = 'CLIENTCARD'; TABLEID = 49; CATEG = 8;
  SUSPEND;
  TABLENAME = 'COUNTERTYPE'; TABLEID = 50; CATEG = 10;
  SUSPEND;
  TABLENAME = 'COUNTER'; TABLEID = 51; CATEG = 10;
  SUSPEND;
  TABLENAME = 'CCARDCOUNTER'; TABLEID = 52; CATEG = 10;
  SUSPEND;
  TABLENAME = 'CLIENTCOUNTER'; TABLEID = 53; CATEG = 10;
  SUSPEND;
  TABLENAME = 'DISCRATE'; TABLEID = 54; CATEG = 9;
  SUSPEND;
  TABLENAME = 'ACTSCRIPT'; TABLEID = 55; CATEG = 9;
  SUSPEND;
  TABLENAME = 'GRPACTDISC'; TABLEID = 56; CATEG = 9;
  SUSPEND;
  TABLENAME = 'ACTDISC'; TABLEID = 57; CATEG = 9;
  SUSPEND;
  TABLENAME = 'ACTDISCOBJ'; TABLEID = 58; CATEG = 9;
  SUSPEND;
  TABLENAME = 'DOCUMENT'; TABLEID = 59; CATEG = 20;
  SUSPEND;
  TABLENAME = 'COUNTERD'; TABLEID = 60; CATEG = 10;
  SUSPEND;
  TABLENAME = 'REMAIND'; TABLEID = 61; CATEG = 5;
  SUSPEND;
  TABLENAME = 'SETTINGS'; TABLEID = 62; CATEG = 3;
  SUSPEND;
  TABLENAME = 'SETTINGS_EXH'; TABLEID = 65; CATEG = 1;
  SUSPEND;
  TABLENAME = 'EMPLOYEE'; TABLEID = 67; CATEG = 25;
  SUSPEND;
  TABLENAME = 'SETTINGS_EMP'; TABLEID = 68; CATEG = 25;
  SUSPEND;
  TABLENAME = 'CLASSIFIER'; TABLEID = 70; CATEG = 26;
  SUSPEND;
  TABLENAME = 'SPRTCLASSIFIER'; TABLEID = 71; CATEG = 26;
  SUSPEND;
  TABLENAME = 'CLIENTCLASSIFIER'; TABLEID = 72; CATEG = 26;
  SUSPEND;
  TABLENAME = 'CCARDCLASSIFIER'; TABLEID = 73; CATEG = 26;
  SUSPEND;
END
^

/* Restore proc. body: APPENDCCARDCLASSIFIERLINK */
ALTER PROCEDURE APPENDCCARDCLASSIFIERLINK(ICLASSIFIERCODE INTEGER,
ICARDVAL VARCHAR(40),
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CLASSIFIERID INTEGER;
DECLARE VARIABLE IDTABLE INTEGER;
DECLARE VARIABLE ID INTEGER;
BEGIN

  ERRORCODE = 0;

  SELECT ID
  FROM CLASSIFIER
  WHERE CODE = :ICLASSIFIERCODE AND ISFOLDER = 0
  INTO CLASSIFIERID;

  SELECT ID FROM CCARD WHERE VAL = :ICARDVAL INTO :IDTABLE;

  IF (CLASSIFIERID IS NULL) THEN
    ERRORCODE = 41;
  ELSE IF (IDTABLE IS NULL) THEN
    ERRORCODE = 42;
  ELSE
  BEGIN
    SELECT ID FROM CCARDCLASSIFIER WHERE CCARDID = :IDTABLE AND CLASSIFIERID = :CLASSIFIERID INTO :ID;
    IF (ID IS NULL) THEN
      INSERT INTO CCARDCLASSIFIER (ID, CCARDID, CLASSIFIERID, DELETED) VALUES (GEN_ID(GID, 1), :IDTABLE, :CLASSIFIERID, :IDELETED);
    ELSE
      UPDATE CCARDCLASSIFIER SET DELETED = :IDELETED WHERE ID = :ID;
  END
END
^

/* Restore proc. body: APPENDCLASSIFIER */
ALTER PROCEDURE APPENDCLASSIFIER(ICODE INTEGER,
IPARENTCODE INTEGER,
IISFOLDER INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ISFOLDER INTEGER;
DECLARE VARIABLE DELETED INTEGER;
BEGIN

  ERRORCODE = 0;

  SELECT ID, ISFOLDER, DELETED
  FROM CLASSIFIER
  WHERE CODE = :ICODE
  INTO ID, ISFOLDER, DELETED;
  IF (ISFOLDER <> IISFOLDER AND DELETED >= IDELETED) THEN
  BEGIN
    ERRORCODE = 43;
    EXIT;
  END

  IF (IPARENTCODE IS NULL) THEN
    PARENTID = 0;
  ELSE
    SELECT ID FROM CLASSIFIER
    WHERE CODE = :IPARENTCODE AND ISFOLDER = 1 AND DELETED = :IDELETED
    INTO PARENTID;

  IF (PARENTID IS NULL) THEN
  BEGIN
    ERRORCODE = 44;
    EXIT;
  END


  IF (ID IS NULL) THEN
  BEGIN
    INSERT INTO CLASSIFIER
      (ID, PARENTID, ISFOLDER, CODE, NAME, TEXT, DELETED)
    VALUES
      (GEN_ID(GID, 1), COALESCE(:PARENTID, 0), :IISFOLDER, :ICODE, :INAME, :ITEXT, :IDELETED);
  END
  ELSE
    UPDATE CLASSIFIER
    SET
      NAME = :INAME,
      TEXT = :ITEXT,
      DELETED = :IDELETED,
      ISFOLDER = :IISFOLDER,
      PARENTID = :PARENTID
    WHERE ID = :ID;
END
^

/* Restore proc. body: APPENDCLIENTCLASSIFIERLINK */
ALTER PROCEDURE APPENDCLIENTCLASSIFIERLINK(ICLASSIFIERCODE INTEGER,
ICLIENTCODE INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CLASSIFIERID INTEGER;
DECLARE VARIABLE IDTABLE INTEGER;
DECLARE VARIABLE ID INTEGER;
BEGIN

  ERRORCODE = 0;

  SELECT ID
  FROM CLASSIFIER
  WHERE CODE = :ICLASSIFIERCODE
  INTO CLASSIFIERID;

  SELECT ID FROM CLIENT WHERE CODE = :ICLIENTCODE AND ISFOLDER = 0 INTO :IDTABLE;

  IF (CLASSIFIERID IS NULL) THEN
    ERRORCODE = 41;
  ELSE IF (IDTABLE IS NULL) THEN
    ERRORCODE = 33;
  ELSE
  BEGIN
    SELECT ID FROM CLIENTCLASSIFIER WHERE CLIENTID = :IDTABLE AND CLASSIFIERID = :CLASSIFIERID INTO :ID;
    IF (ID IS NULL) THEN
      INSERT INTO CLIENTCLASSIFIER (ID, CLIENTID, CLASSIFIERID, DELETED) VALUES (GEN_ID(GID, 1), :IDTABLE, :CLASSIFIERID, :IDELETED);
    ELSE
      UPDATE CLIENTCLASSIFIER SET DELETED = :IDELETED WHERE ID = :ID;
  END
END
^

/* Restore proc. body: APPENDSPRTCLASSIFIERLINK */
ALTER PROCEDURE APPENDSPRTCLASSIFIERLINK(ICLASSIFIERCODE INTEGER,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE CLASSIFIERID INTEGER;
DECLARE VARIABLE IDTABLE INTEGER;
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE ISFOLDERCF INTEGER;
BEGIN

  ERRORCODE = 0;

  SELECT ID
  FROM CLASSIFIER
  WHERE CODE = :ICLASSIFIERCODE AND ISFOLDER = 0
  INTO CLASSIFIERID;

  IF (IWARECODETOMARK = 1) THEN
    SELECT ID FROM SPRT WHERE MARK = :IWARECODE AND ISWARE = 1 INTO :IDTABLE;
  ELSE
    SELECT ID FROM SPRT WHERE CODE = :IWARECODE AND ISWARE = 1 INTO :IDTABLE;

  IF (CLASSIFIERID IS NULL) THEN
    ERRORCODE = 41;
  ELSE IF (IDTABLE IS NULL) THEN
    ERRORCODE = 16;
  ELSE
  BEGIN
    SELECT ID FROM SPRTCLASSIFIER WHERE WAREID = :IDTABLE AND CLASSIFIERID = :CLASSIFIERID INTO :ID;
    IF (ID IS NULL) THEN
      INSERT INTO SPRTCLASSIFIER (ID, WAREID, CLASSIFIERID, DELETED) VALUES (GEN_ID(GID, 1), :IDTABLE, :CLASSIFIERID, :IDELETED);
    ELSE
      UPDATE SPRTCLASSIFIER SET DELETED = :IDELETED WHERE ID = :ID;
  END
END
^

/* Restore proc. body: GET_BDO_SYNCINFO */
ALTER PROCEDURE GET_BDO_SYNCINFO(ISYNCBASEID INTEGER)
 RETURNS(TABLENAME VARCHAR(100),
QUELENGTH VARCHAR(20),
ERROR VARCHAR(255),
SYNCCATEG INTEGER,
ISUPDIRECTION INTEGER,
CUROPER INTEGER)
 AS
DECLARE VARIABLE CURCHNGVAL INTEGER;
DECLARE VARIABLE ERRINFO VARCHAR(255);
DECLARE VARIABLE BDOERRINFO VARCHAR(255);
DECLARE VARIABLE QUEUELENGTH INTEGER;
DECLARE VARIABLE SYNCKIND INTEGER;
DECLARE VARIABLE BDOCODE INTEGER;
DECLARE VARIABLE DBIDENT INTEGER;
BEGIN
  SELECT BDOCODE FROM CUSTOMDB INTO BDOCODE;
  IF ((BDOCODE IS NULL) OR (BDOCODE = 0)) THEN EXIT;

  FOR SELECT 'DELQUEUE',
    (SELECT COUNT(CHNG) FROM DELQUEUE WHERE CHNG > COALESCE(TL.CHNGVAL, 0)), '',
    TL.BDOERRINFO, 0, 1, TL.CUROPER, TL.ERRINFO
  FROM SYNCBASE S
  LEFT JOIN TBLLOADINFO TL ON TL.SYNCBASEID = S.ID AND TL.TABLENAME = 'DELQUEUE'
  WHERE S.ID = :ISYNCBASEID
  INTO TABLENAME, QUEUELENGTH, QUELENGTH, ERROR, SYNCCATEG, ISUPDIRECTION, CUROPER, ERRINFO DO
  BEGIN
    SUSPEND;
    QUELENGTH = QUEUELENGTH;
    ERROR = ERRINFO;
    ISUPDIRECTION = 2;
    SUSPEND;
  END

  FOR
    SELECT
      CASE
        WHEN TRIM(TC.TABLENAME) LIKE '%USER%' THEN '"USER"'
        ELSE TC.TABLENAME
      END,
      COALESCE(T.CHNGVAL, 0) AS CHNGVAL,
      T.ERRINFO,
      T.BDOERRINFO,
      TC.CATEG,
      ST.SYNCKIND,
      T.CUROPER,
      SB.DBIDENT
    FROM SYNCBASE SB
      JOIN SYNCTABLE ST ON ST.SYNCBASEID = SB.PARENTID AND ST.SYNCKIND <> 0
      JOIN TABLECATEG TC ON TC.CATEG = ST.CATEG
      LEFT JOIN TBLLOADINFO T ON T.SYNCBASEID = SB.ID AND T.TABLENAME = TC.TABLENAME
    WHERE
      SB.ID = :ISYNCBASEID AND
      EXISTS(SELECT 1 FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = TC.TABLENAME AND RDB$FIELD_NAME = 'OWNERBDO')

    INTO TABLENAME, CURCHNGVAL, ERRINFO, BDOERRINFO, SYNCCATEG, SYNCKIND, CUROPER, DBIDENT
    DO
    BEGIN
      EXECUTE STATEMENT
      'SELECT COUNT(CHNG) FROM '||TABLENAME||' T '||
        IIF(SYNCKIND = 1, 'JOIN SYNCBASE SB ON T.OWNERBDO = SB.CODE ' ||
                          'WHERE SB.ID = ' || CAST(ISYNCBASEID AS VARCHAR(100)) || ' AND ',
                          'WHERE ') ||
                          'CHNG > ' || CAST(COALESCE(CURCHNGVAL, 0) AS VARCHAR(30)) ||
                          ' AND BDOCODE <> ' || CAST(COALESCE(DBIDENT, 0) AS VARCHAR(10))
      INTO QUEUELENGTH;
      ISUPDIRECTION = 1; QUELENGTH = ''; ERROR = BDOERRINFO;
      SUSPEND;
      ISUPDIRECTION = 2; QUELENGTH = QUEUELENGTH; ERROR = ERRINFO;
      SUSPEND;
    END
END
^

/* Restore proc. body: GET_CLASSIFIER_HIER */
ALTER PROCEDURE GET_CLASSIFIER_HIER(SYNCBASEID INTEGER,
CHNGEND NUMERIC(18),
PARENTID INTEGER,
UPPERHIER INTEGER,
ISC2L INTEGER)
 RETURNS(ID INTEGER,
HIER INTEGER)
 AS
DECLARE VARIABLE AISFOLDER INTEGER;
DECLARE VARIABLE ACHNG INTEGER;
DECLARE VARIABLE CHNGBEG NUMERIC(18,0);
BEGIN

  IF (ISC2L = 1) THEN
    SELECT CHNGVAL
    FROM TBLLOADINFO TI
    WHERE TI.TABLENAME = 'CLASSIFIER' AND TI.SYNCBASEID =:SYNCBASEID AND TI.SECTION = :UPPERHIER
    INTO CHNGBEG;
  ELSE
    SELECT CHNGVAL
    FROM TBLINFO TI
    WHERE TI.TABLENAME =  'CLASSIFIER' AND TI.SECTION = :UPPERHIER
    INTO CHNGBEG;

  IF (CHNGBEG IS NULL) THEN
    CHNGBEG = 0;

  FOR SELECT ID, ISFOLDER, CHNG FROM  CLASSIFIER
  WHERE PARENTID = :PARENTID
  INTO ID, AISFOLDER, ACHNG DO
  BEGIN
    HIER = UPPERHIER;
    IF ((ACHNG > CHNGBEG) AND (ACHNG <= CHNGEND)) THEN
      SUSPEND;
    IF (AISFOLDER = 1) THEN
      FOR SELECT ID, HIER FROM GET_CLASSIFIER_HIER(:SYNCBASEID, :CHNGEND, :ID, :HIER + 1, :ISC2L) INTO ID, HIER DO
        SUSPEND;
  END
END
^

/* Restore proc. body: GET_CLASSIFIER_PARENTS */
ALTER PROCEDURE GET_CLASSIFIER_PARENTS(ID_CLASSIFIER INTEGER,
IN_NUM INTEGER)
 RETURNS(ID_PARENT INTEGER,
NUM INTEGER)
 AS
declare variable TMP_NUM integer;
BEGIN

  IF (ID_CLASSIFIER <> 0) THEN
  BEGIN

    SELECT S.PARENTID
    FROM   CLASSIFIER S
    WHERE  S.ID = :ID_CLASSIFIER
    INTO   ID_PARENT;

    IF (ID_PARENT = ID_CLASSIFIER) THEN
      EXCEPTION E_CLASSIFIER_STRUCT_CORRUPT;

    IF (ID_PARENT <> 0) THEN
    BEGIN
      TMP_NUM = IN_NUM + 1;
      FOR
        SELECT ID_PARENT, NUM
        FROM   GET_CLASSIFIER_PARENTS(:ID_PARENT, :TMP_NUM)
        INTO   ID_PARENT, NUM
        DO
          SUSPEND;
    END

    NUM = IN_NUM;
    ID_PARENT = ID_CLASSIFIER;
    SUSPEND;
  END
END
^

/* Create trigger... */
CREATE TRIGGER CHNG_BEF_CCARDCLASSIFIER FOR CCARDCLASSIFIER
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_CLASSIFIER FOR CLASSIFIER
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_CLIENTCLASSIFIER FOR CLIENTCLASSIFIER
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER CHNG_BEF_SPRTCLASSIFIER FOR SPRTCLASSIFIER
INACTIVE BEFORE INSERT OR UPDATE POSITION 0 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

CREATE TRIGGER DEL_BEF_CLASSIFIER FOR CLASSIFIER
ACTIVE BEFORE DELETE POSITION 0 
AS
BEGIN
  IF (OLD.ISFOLDER <> 0) THEN
    DELETE FROM CLASSIFIER WHERE PARENTID = OLD.ID;
END
^

CREATE TRIGGER OWNBDO_CCARDCLASSIFIER FOR CCARDCLASSIFIER
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_CLASSIFIER FOR CLASSIFIER
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_CLIENTCLASSIFIER FOR CLIENTCLASSIFIER
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER OWNBDO_SPRTCLASSIFIER FOR SPRTCLASSIFIER
ACTIVE BEFORE INSERT POSITION 100 
AS
BEGIN
  IF (NEW.OWNERBDO IS NULL) THEN
    SELECT FIRST 1 BDOCODE FROM CUSTOMDB INTO NEW.OWNERBDO;
END
^

CREATE TRIGGER SYNCDEL_CCARDCLASSIFIER FOR CCARDCLASSIFIER
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(73, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_CLASSIFIER FOR CLASSIFIER
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(70, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_CLIENTCLASSIFIER FOR CLIENTCLASSIFIER
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(72, OLD.ID);
END
^

CREATE TRIGGER SYNCDEL_SPRTCLASSIFIER FOR SPRTCLASSIFIER
ACTIVE AFTER DELETE POSITION 0 
AS
BEGIN
  EXECUTE PROCEDURE APPEND_DELQUEUE(71, OLD.ID);
END
^


/* Alter Procedure... */
/* Alter (GET_BDO_SYNCINFO) */
ALTER PROCEDURE GET_BDO_SYNCINFO(ISYNCBASEID INTEGER)
 RETURNS(TABLENAME VARCHAR(100),
QUELENGTH VARCHAR(20),
ERROR VARCHAR(255),
SYNCCATEG INTEGER,
ISUPDIRECTION INTEGER,
CUROPER INTEGER)
 AS
DECLARE VARIABLE CURCHNGVAL INTEGER;
DECLARE VARIABLE ERRINFO VARCHAR(255);
DECLARE VARIABLE BDOERRINFO VARCHAR(255);
DECLARE VARIABLE QUEUELENGTH INTEGER;
DECLARE VARIABLE SYNCKIND INTEGER;
DECLARE VARIABLE BDOCODE INTEGER;
DECLARE VARIABLE DBIDENT INTEGER;
BEGIN
  SELECT BDOCODE FROM CUSTOMDB INTO BDOCODE;
  IF ((BDOCODE IS NULL) OR (BDOCODE = 0)) THEN EXIT;

  FOR SELECT 'DELQUEUE',
    (SELECT COUNT(CHNG) FROM DELQUEUE WHERE CHNG > COALESCE(TL.CHNGVAL, 0)), '',
    TL.BDOERRINFO, 0, 1, TL.CUROPER, TL.ERRINFO
  FROM SYNCBASE S
  LEFT JOIN TBLLOADINFO TL ON TL.SYNCBASEID = S.ID AND TL.TABLENAME = 'DELQUEUE'
  WHERE S.ID = :ISYNCBASEID
  INTO TABLENAME, QUEUELENGTH, QUELENGTH, ERROR, SYNCCATEG, ISUPDIRECTION, CUROPER, ERRINFO DO
  BEGIN
    SUSPEND;
    QUELENGTH = QUEUELENGTH;
    ERROR = ERRINFO;
    ISUPDIRECTION = 2;
    SUSPEND;
  END

  FOR
    SELECT
      CASE
        WHEN TRIM(TC.TABLENAME) LIKE '%USER%' THEN '"USER"'
        ELSE TC.TABLENAME
      END,
      COALESCE(T.CHNGVAL, 0) AS CHNGVAL,
      T.ERRINFO,
      T.BDOERRINFO,
      TC.CATEG,
      ST.SYNCKIND,
      T.CUROPER,
      SB.DBIDENT
    FROM SYNCBASE SB
      JOIN SYNCTABLE ST ON ST.SYNCBASEID = SB.PARENTID AND ST.SYNCKIND <> 0
      JOIN TABLECATEG TC ON TC.CATEG = ST.CATEG
      LEFT JOIN TBLLOADINFO T ON T.SYNCBASEID = SB.ID AND T.TABLENAME = TC.TABLENAME
    WHERE
      SB.ID = :ISYNCBASEID AND
      EXISTS(SELECT 1 FROM RDB$RELATION_FIELDS WHERE RDB$RELATION_NAME = TC.TABLENAME AND RDB$FIELD_NAME = 'OWNERBDO')

    INTO TABLENAME, CURCHNGVAL, ERRINFO, BDOERRINFO, SYNCCATEG, SYNCKIND, CUROPER, DBIDENT
    DO
    BEGIN
      EXECUTE STATEMENT
      'SELECT COUNT(CHNG) FROM '||TABLENAME||' T '||
        IIF(SYNCKIND = 1, 'JOIN SYNCBASE SB ON T.OWNERBDO = SB.CODE ' ||
                          'WHERE SB.ID = ' || CAST(ISYNCBASEID AS VARCHAR(100)) || ' AND ',
                          'WHERE ') ||
                          'CHNG > ' || CAST(COALESCE(CURCHNGVAL, 0) AS VARCHAR(30)) ||
                          ' AND BDOCODE <> ' || CAST(COALESCE(DBIDENT, 0) AS VARCHAR(10))
      INTO QUEUELENGTH;
      ISUPDIRECTION = 1; QUELENGTH = ''; ERROR = BDOERRINFO;
      SUSPEND;
      ISUPDIRECTION = 2; QUELENGTH = QUEUELENGTH; ERROR = ERRINFO;
      SUSPEND;
    END
END
^

SET TERM ; ^

ALTER TABLE ACTDISCOBJ ALTER COLUMN ID POSITION 1;

ALTER TABLE ACTDISCOBJ ALTER COLUMN CLIENTID POSITION 2;

ALTER TABLE ACTDISCOBJ ALTER COLUMN WAREID POSITION 3;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE1ID POSITION 4;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE2ID POSITION 5;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE3ID POSITION 6;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE4ID POSITION 7;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ASPECTVALUE5ID POSITION 8;

ALTER TABLE ACTDISCOBJ ALTER COLUMN PAYMENTID POSITION 9;

ALTER TABLE ACTDISCOBJ ALTER COLUMN DISCRATEID POSITION 10;

ALTER TABLE ACTDISCOBJ ALTER COLUMN ACTSCRIPTID POSITION 11;

ALTER TABLE ACTDISCOBJ ALTER COLUMN GRPACTDISCID POSITION 12;

ALTER TABLE ACTDISCOBJ ALTER COLUMN CARDID POSITION 13;

ALTER TABLE ACTDISCOBJ ALTER COLUMN CHNG POSITION 14;

ALTER TABLE ACTDISCOBJ ALTER COLUMN BDOCODE POSITION 15;

ALTER TABLE ACTDISCOBJ ALTER COLUMN CODE POSITION 16;

ALTER TABLE ACTDISCOBJ ALTER COLUMN OWNERBDO POSITION 17;

ALTER TABLE ACTDISCOBJ ALTER COLUMN INSCHNG POSITION 18;

ALTER TABLE ACTDISCOBJ ALTER COLUMN DELETED POSITION 19;

ALTER TABLE ACTDISCOBJ ALTER COLUMN CCARDCLASSIFIERID POSITION 20;

ALTER TABLE ACTDISCOBJ ALTER COLUMN CLIENTCLASSIFIERID POSITION 21;

ALTER TABLE ACTDISCOBJ ALTER COLUMN WARECLASSIFIERID POSITION 22;

ALTER TABLE CONDITION ALTER COLUMN ID POSITION 1;

ALTER TABLE CONDITION ALTER COLUMN TIMEBEG POSITION 2;

ALTER TABLE CONDITION ALTER COLUMN TIMEEND POSITION 3;

ALTER TABLE CONDITION ALTER COLUMN DATEBEG POSITION 4;

ALTER TABLE CONDITION ALTER COLUMN DATEEND POSITION 5;

ALTER TABLE CONDITION ALTER COLUMN DAYBEG POSITION 6;

ALTER TABLE CONDITION ALTER COLUMN DAYEND POSITION 7;

ALTER TABLE CONDITION ALTER COLUMN QUANTITYBEG POSITION 8;

ALTER TABLE CONDITION ALTER COLUMN QUANTITYEND POSITION 9;

ALTER TABLE CONDITION ALTER COLUMN SUMMBEG POSITION 10;

ALTER TABLE CONDITION ALTER COLUMN SUMMEND POSITION 11;

ALTER TABLE CONDITION ALTER COLUMN SUMMRECBEG POSITION 12;

ALTER TABLE CONDITION ALTER COLUMN SUMMRECEND POSITION 13;

ALTER TABLE CONDITION ALTER COLUMN CARDPREFIXBEG POSITION 14;

ALTER TABLE CONDITION ALTER COLUMN CARDPREFIXEND POSITION 15;

ALTER TABLE CONDITION ALTER COLUMN QUANTITYRECBEG POSITION 16;

ALTER TABLE CONDITION ALTER COLUMN QUANTITYRECEND POSITION 17;

ALTER TABLE CONDITION ALTER COLUMN PRICEBEG POSITION 18;

ALTER TABLE CONDITION ALTER COLUMN PRICEEND POSITION 19;

ALTER TABLE CONDITION ALTER COLUMN WAREID POSITION 20;

ALTER TABLE CONDITION ALTER COLUMN SUMMWAREBEG POSITION 21;

ALTER TABLE CONDITION ALTER COLUMN SUMMWAREEND POSITION 22;

ALTER TABLE CONDITION ALTER COLUMN QUANTITYWAREEND POSITION 23;

ALTER TABLE CONDITION ALTER COLUMN QUANTITYWAREBEG POSITION 24;

ALTER TABLE CONDITION ALTER COLUMN CARDSTATE POSITION 25;

ALTER TABLE CONDITION ALTER COLUMN CARDLENBEG POSITION 26;

ALTER TABLE CONDITION ALTER COLUMN CARDLENEND POSITION 27;

ALTER TABLE CONDITION ALTER COLUMN MEMDAYBEG POSITION 28;

ALTER TABLE CONDITION ALTER COLUMN MEMDAYEND POSITION 29;

ALTER TABLE CONDITION ALTER COLUMN MEMMONTHBEG POSITION 30;

ALTER TABLE CONDITION ALTER COLUMN MEMMONTHEND POSITION 31;

ALTER TABLE CONDITION ALTER COLUMN MEMYEARBEG POSITION 32;

ALTER TABLE CONDITION ALTER COLUMN MEMYEAREND POSITION 33;

ALTER TABLE CONDITION ALTER COLUMN REGDAYBEG POSITION 34;

ALTER TABLE CONDITION ALTER COLUMN REGDAYEND POSITION 35;

ALTER TABLE CONDITION ALTER COLUMN REGMONTHBEG POSITION 36;

ALTER TABLE CONDITION ALTER COLUMN REGMONTHEND POSITION 37;

ALTER TABLE CONDITION ALTER COLUMN REGYEARBEG POSITION 38;

ALTER TABLE CONDITION ALTER COLUMN REGYEAREND POSITION 39;

ALTER TABLE CONDITION ALTER COLUMN COUNTERBEG1 POSITION 40;

ALTER TABLE CONDITION ALTER COLUMN COUNTEREND1 POSITION 41;

ALTER TABLE CONDITION ALTER COLUMN BIRTHDAYBEG POSITION 42;

ALTER TABLE CONDITION ALTER COLUMN BIRTHDAYEND POSITION 43;

ALTER TABLE CONDITION ALTER COLUMN BIRTHMONTHBEG POSITION 44;

ALTER TABLE CONDITION ALTER COLUMN BIRTHMONTHEND POSITION 45;

ALTER TABLE CONDITION ALTER COLUMN BIRTHYEARBEG POSITION 46;

ALTER TABLE CONDITION ALTER COLUMN BIRTHYEAREND POSITION 47;

ALTER TABLE CONDITION ALTER COLUMN REGDATECOND POSITION 48;

ALTER TABLE CONDITION ALTER COLUMN REGDATEBEG POSITION 49;

ALTER TABLE CONDITION ALTER COLUMN REGDATEEND POSITION 50;

ALTER TABLE CONDITION ALTER COLUMN MEMDATEBEG POSITION 51;

ALTER TABLE CONDITION ALTER COLUMN MEMDATEEND POSITION 52;

ALTER TABLE CONDITION ALTER COLUMN MEMDATECOND POSITION 53;

ALTER TABLE CONDITION ALTER COLUMN BIRTHDATEBEG POSITION 54;

ALTER TABLE CONDITION ALTER COLUMN BIRTHDATEEND POSITION 55;

ALTER TABLE CONDITION ALTER COLUMN BIRTHDATECOND POSITION 56;

ALTER TABLE CONDITION ALTER COLUMN COUNTERBEG2 POSITION 57;

ALTER TABLE CONDITION ALTER COLUMN COUNTEREND2 POSITION 58;

ALTER TABLE CONDITION ALTER COLUMN COUNTERBEG3 POSITION 59;

ALTER TABLE CONDITION ALTER COLUMN COUNTEREND3 POSITION 60;

ALTER TABLE CONDITION ALTER COLUMN SEX POSITION 61;

ALTER TABLE CONDITION ALTER COLUMN FORMULA1 POSITION 62;

ALTER TABLE CONDITION ALTER COLUMN FORMULA2 POSITION 63;

ALTER TABLE CONDITION ALTER COLUMN FORMULA3 POSITION 64;

ALTER TABLE CONDITION ALTER COLUMN WARECLASSIFIERID POSITION 65;

ALTER TABLE DISCRATE ALTER COLUMN ID POSITION 1;

ALTER TABLE DISCRATE ALTER COLUMN PARENTID POSITION 2;

ALTER TABLE DISCRATE ALTER COLUMN CODE POSITION 3;

ALTER TABLE DISCRATE ALTER COLUMN NAME POSITION 4;

ALTER TABLE DISCRATE ALTER COLUMN TEXT POSITION 5;

ALTER TABLE DISCRATE ALTER COLUMN VAL POSITION 6;

ALTER TABLE DISCRATE ALTER COLUMN BEGVAL POSITION 7;

ALTER TABLE DISCRATE ALTER COLUMN ENDVAL POSITION 8;

ALTER TABLE DISCRATE ALTER COLUMN WAREID POSITION 9;

ALTER TABLE DISCRATE ALTER COLUMN TYPE POSITION 10;

ALTER TABLE DISCRATE ALTER COLUMN DESTINATION POSITION 11;

ALTER TABLE DISCRATE ALTER COLUMN KIND POSITION 12;

ALTER TABLE DISCRATE ALTER COLUMN ISFOLDER POSITION 13;

ALTER TABLE DISCRATE ALTER COLUMN DISCCOLLOPER POSITION 14;

ALTER TABLE DISCRATE ALTER COLUMN CHNG POSITION 15;

ALTER TABLE DISCRATE ALTER COLUMN BDOCODE POSITION 16;

ALTER TABLE DISCRATE ALTER COLUMN OWNERBDO POSITION 17;

ALTER TABLE DISCRATE ALTER COLUMN WARECLASSIFIERID POSITION 18;

ALTER TABLE PAYCARDDEV ALTER COLUMN ID POSITION 1;

ALTER TABLE PAYCARDDEV ALTER COLUMN CAPPAY POSITION 2;

ALTER TABLE PAYCARDDEV ALTER COLUMN CAPINTPAY POSITION 3;

ALTER TABLE PAYCARDDEV ALTER COLUMN CAPDISC POSITION 4;

ALTER TABLE PAYCARDDEV ALTER COLUMN CAPMOBILE POSITION 5;

ALTER TABLE PAYCARDDEV ALTER COLUMN CAPGKH POSITION 6;

ALTER TABLE PAYCARDDEV ALTER COLUMN DEVICEID POSITION 7;

ALTER TABLE PAYCARDDEV ALTER COLUMN SLIPCOUNT POSITION 8;

ALTER TABLE PAYCARDDEV ALTER COLUMN MINSUMADD POSITION 9;

ALTER TABLE PAYCARDDEV ALTER COLUMN MINSUMSUB POSITION 10;

ALTER TABLE PAYCARDDEV ALTER COLUMN MINCASHPAY POSITION 11;

/* Create(Add) Crant */
GRANT ALL ON CCARDCLASSIFIER TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON CLASSIFIER TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON CLIENTCLASSIFIER TO SYSDBA WITH GRANT OPTION;

GRANT ALL ON SPRTCLASSIFIER TO SYSDBA WITH GRANT OPTION;

GRANT EXECUTE ON PROCEDURE GET_CLASSIFIER_PARENTS TO PROCEDURE GET_CLASSIFIER_PARENTS;

GRANT EXECUTE ON PROCEDURE GET_CLASSIFIER_PARENTS TO PUBLIC;

GRANT EXECUTE ON PROCEDURE GET_CLASSIFIER_PARENTS TO SYNCSRV;

GRANT SELECT ON CLASSIFIER TO PROCEDURE GET_CLASSIFIER_PARENTS;

/*MAN*/
UPDATE ACTDISCOBJ SET
CCARDCLASSIFIERID = -1,
CLIENTCLASSIFIERID = -1,
WARECLASSIFIERID = -1;
/*MAN*/

/* TEXT BLOCK END */

/* Convert 4.8.4 */

/* Drop Index... */
SET TERM ^ ;

ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN SUSPEND; END
^

ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
DISCRATECLASSIFIERID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN SUSPEND; END
^

SET TERM ; ^

RECONNECT;

/* Drop: IDX_ACTDISCOBJ3 (TIdxData) */
DROP INDEX IDX_ACTDISCOBJ3;

RECONNECT;

/* Drop: IDX_DOCUMENT_OPEN_NUMBSESSRMKID (TIdxData) */
DROP INDEX IDX_DOCUMENT_OPEN_NUMBSESSRMKID;


ALTER TABLE RMK ADD DOCNUM FINT DEFAULT 1;

ALTER TABLE RMK ADD SESNUM FINT DEFAULT 1;

ALTER TABLE RMK ADD NOCHNG FINT;

/* Drop table-fields... */
ALTER TABLE DOCUMENT DROP OPENDOCNUMBER;

ALTER TABLE TRANZT DROP PRNONECR;


/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE CCARD_REPLACE(IOLDID INTEGER,
ICODE INTEGER,
IVAL VARCHAR(40))
 RETURNS(ID INTEGER)
 AS
 BEGIN SUSPEND; END
^


/* Create generator... */
SET TERM ; ^

CREATE GENERATOR GDOCNUMBER;

CREATE GENERATOR GSESSIONNUMBER;


/* Alter Procedure... */
/* Alter (APPENDCCARDDISCS) */
SET TERM ^ ;

ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERTYPE4 INTEGER,
ICOUNTERTYPE5 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERVAL4 DOUBLE PRECISION,
ICOUNTERVAL5 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ICOUNTERCODE4 NUMERIC(18),
ICOUNTERCODE5 NUMERIC(18))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18),
OCOUNTERCODE4 NUMERIC(18),
OCOUNTERCODE5 NUMERIC(18))
 AS
declare variable CARDID integer;
declare variable DOCODE integer;
declare variable GRPCARDID integer;
declare variable OLDCARDFLG integer;
declare variable DISCRATEID integer;
declare variable ACTDISCOBJID integer;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  OCOUNTERCODE4 = ICOUNTERCODE4;
  OCOUNTERCODE5 = ICOUNTERCODE5;

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE VAL = :ICARD
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      IF (EXISTS(SELECT 1 FROM CCARD WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID)) THEN
      BEGIN
        SELECT MAX(CODE) + 1 FROM CCARD WHERE GRPCCARDID = :GRPCARDID INTO ICARDCODE;
        IF (ICARDCODE IS NULL) THEN
          ICARDCODE = 1;
      END
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        CODE = :ICARDCODE,
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
        EXIT;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        PLAN (A INDEX (IDX_ACTDISCOBJ2))
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;

        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCARDFLG = 1) THEN
        FOR SELECT A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID
        DO
          UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE4 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE4, :ICOUNTERVAL4, :CARDID, NULL, ICOUNTERCODE4, 45)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE4;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE5 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE5, :ICOUNTERVAL5, :CARDID, NULL, ICOUNTERCODE5, 46)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE5;
END
^

/* empty dependent procedure body */
/* Clear: APPENDCCARDDISCS for: APPENDCOUNTERBYTYPE */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPENDCLIENT for: APPENDCOUNTERBYTYPE */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ILEGALZIPCODE VARCHAR(10),
ILEGALCITY VARCHAR(100),
ILEGALADDRESS VARCHAR(255))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPENDCOUNTERBYTYPE) */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER,
ICLIENTID INTEGER,
ICOUNTERCODE NUMERIC(18),
IERRORCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE NUMERIC(18))
 AS
DECLARE VARIABLE COUNTERTYPEID INTEGER;
DECLARE VARIABLE COUNTERID INTEGER;
DECLARE VARIABLE CID INTEGER;
DECLARE VARIABLE ABDOCODE INTEGER;
DECLARE VARIABLE AOWNERBDO INTEGER;
DECLARE VARIABLE DELTA DOUBLE PRECISION;
DECLARE VARIABLE CTALG INTEGER;
BEGIN

  OCOUNTERCODE = ICOUNTERCODE;
  SELECT ID
  FROM COUNTERTYPE
  WHERE CODE = :ICOUNTERTYPE
  INTO :COUNTERTYPEID;

  SELECT BDOCODE, DBIDENT FROM CUSTOMDB INTO AOWNERBDO, ABDOCODE;

  IF (:COUNTERTYPEID IS NULL) THEN
  BEGIN
    ERRORCODE = IERRORCODE;
    EXIT;
  END

  IF (ICARDID IS NOT NULL) THEN
  BEGIN
    CID = NULL;
    FOR
      SELECT C.ID, CT.COUNTERALG
      FROM CCARDCOUNTER CC
      JOIN COUNTER C ON CC.COUNTERID = C.ID
      JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
      WHERE CC.CCARDID = :ICARDID AND CT.ID = :COUNTERTYPEID
      INTO :COUNTERID, :CTALG
    DO
    BEGIN
      SELECT SUM(DELTA) FROM COUNTERD WHERE COUNTERID = :COUNTERID INTO :DELTA;
      IF ((CTALG <> 0) OR (DELTA IS NULL) OR (:DELTA <> :ICOUNTERVAL)) THEN
      BEGIN

        SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE = 1 INTO :DELTA;
        IF (DELTA <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE <> 1 INTO :DELTA;
        IF (DELTA <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 2);

        IF (CID IS NULL) THEN
        BEGIN
          IF (NULLTONUM(ICOUNTERVAL) <> 0) THEN
            INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
            VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

          UPDATE COUNTER SET
            DATECREATE = CURRENT_DATE + CURRENT_TIME,
            BDOCODE = :ABDOCODE
          WHERE ID = :COUNTERID;
        END
      END
      CID = 0;
    END

    IF (:CID IS NULL) THEN
    BEGIN
      COUNTERID = GEN_ID(GID, 1);

      OCOUNTERCODE = OCOUNTERCODE + 1;
      INSERT INTO COUNTER(ID, CODE, COUNTERTYPEID, BDOCODE, OWNERBDO)
      VALUES (:COUNTERID, :OCOUNTERCODE, :COUNTERTYPEID, :ABDOCODE, :AOWNERBDO);

      IF (NULLTONUM(ICOUNTERVAL) <> 0) THEN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

      INSERT INTO CCARDCOUNTER(ID, CCARDID, COUNTERID, BDOCODE, OWNERBDO)
      VALUES (GEN_ID(GID, 1), :ICARDID, :COUNTERID, :ABDOCODE, :AOWNERBDO);
    END
  END
  ELSE
    IF (ICLIENTID IS NOT NULL) THEN
    BEGIN
      CID = NULL;
      FOR
        SELECT C.ID
        FROM CLIENTCOUNTER CC
        JOIN COUNTER C ON CC.COUNTERID = C.ID
        WHERE CC.CLIENTID = :ICLIENTID AND C.COUNTERTYPEID = :COUNTERTYPEID
        INTO :COUNTERID
      DO
      BEGIN
        SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE = 1 INTO :DELTA;
        IF (DELTA <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        SELECT NULLTONUM(-SUM(DELTA)) FROM COUNTERD WHERE COUNTERID = :COUNTERID AND DTYPE <> 1 INTO :DELTA;
        IF (DELTA <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :DELTA, CURRENT_DATE, :ABDOCODE,  :AOWNERBDO, 2);

        IF (CID IS NULL) THEN
        BEGIN
          IF (NULLTONUM(:ICOUNTERVAL) <> 0) THEN
            INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
            VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

          UPDATE COUNTER SET
            DATECREATE = CURRENT_DATE + CURRENT_TIME,
            BDOCODE = :ABDOCODE
          WHERE ID = :COUNTERID;
        END
        CID = 0;
      END

      IF (:CID IS NULL) THEN
      BEGIN
        COUNTERID = GEN_ID(GID, 1);
        OCOUNTERCODE = OCOUNTERCODE + 1;
        INSERT INTO COUNTER(ID, CODE, COUNTERTYPEID, BDOCODE, OWNERBDO)
        VALUES (:COUNTERID, :OCOUNTERCODE, :COUNTERTYPEID, :ABDOCODE, :AOWNERBDO);

        IF (NULLTONUM(:ICOUNTERVAL) <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        INSERT INTO CLIENTCOUNTER(ID, CLIENTID, COUNTERID, BDOCODE, OWNERBDO)
        VALUES (GEN_ID(GID, 1), :ICLIENTID, :COUNTERID, :ABDOCODE, :AOWNERBDO);
      END
    END
END
^

/* empty dependent procedure body */
/* Clear: GET_ACTSCRIPT for: GET_ACTSCRIPT_CUSTOM */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN SUSPEND; END
^

/* Alter (GET_ACTSCRIPT_CUSTOM) */
ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
DECLARE VARIABLE CARD VARCHAR(255);
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
DECLARE VARIABLE AWARECLASSIFIERID INTEGER;
DECLARE VARIABLE ACLIENTCLASSIFIERID INTEGER;
DECLARE VARIABLE ACCARDCLASSIFIERID INTEGER;
DECLARE VARIABLE ACONTINUE INTEGER;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID, AC.WARECLASSIFIERID,
      AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
      AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3,
      A.WARECLASSIFIERID, A.CLIENTCLASSIFIERID, A.CCARDCLASSIFIERID
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND

      (
       NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                       AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:REGDATE,
                     AC.REGDATECOND,
                     AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                     AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

      (
       NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                       AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:MEMDATE,
                     AC.MEMDATECOND,
                     AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                     AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
      (
       NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                         AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:BIRTHDATE,
                     AC.BIRTHDATECOND,
                     AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                     AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

      (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
      (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
      (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
      (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
      (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
      (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)
    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC)))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,
      AWARECLASSIFIERID, ACLIENTCLASSIFIERID, ACCARDCLASSIFIERID
    DO
    BEGIN
      ACONTINUE = 0;
      IF (AWARECLASSIFIERID <> -1) THEN
      BEGIN
        IF (AWARECLASSIFIERID = 0) THEN
        BEGIN
          IF (EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE)) THEN
            ACONTINUE = 1;
        END
        ELSE
        BEGIN
          IF (NOT EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE AND CL.CLASSIFIERID = :AWARECLASSIFIERID)) THEN
            ACONTINUE = 1;
        END
      END

      IF (ACONTINUE = 0) THEN
      BEGIN
      IF (ACLIENTCLASSIFIERID <> -1) THEN
      BEGIN
        IF (ACLIENTCLASSIFIERID = 0) THEN
        BEGIN
          IF (EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT)) THEN
            ACONTINUE = 1;
        END
        ELSE
        BEGIN
          IF (NOT EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT AND CL.CLASSIFIERID = :ACLIENTCLASSIFIERID)) THEN
            ACONTINUE = 1;
        END
      END
      END

      IF (ACONTINUE = 0) THEN
      BEGIN
      IF (ACCARDCLASSIFIERID <> -1) THEN
      BEGIN
        IF (ACCARDCLASSIFIERID = 0) THEN
        BEGIN
          IF (EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID)) THEN
            ACONTINUE = 1;
        END
        ELSE
        BEGIN
          IF (NOT EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID AND CL.CLASSIFIERID = :ACCARDCLASSIFIERID)) THEN
            ACONTINUE = 1;
        END
      END
      END
      IF (ACONTINUE = 0) THEN
        SUSPEND;
    END


  WHILE (ICARD <> '') DO
  BEGIN
    CARD = EXTRACTSTR(:ICARD, ',');
    CARDLEN = LEN(CARD);
    CARD = ADDRIGHT(CARD, 1, 40);

    FOR
      SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID, AC.WARECLASSIFIERID,
        AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
        AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3,
        A.WARECLASSIFIERID, A.CLIENTCLASSIFIERID, A.CCARDCLASSIFIERID
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
              UNION
              SELECT COALESCE(WRCL.CLASSIFIERID, 0) AS CLASSIFIERID
              FROM RDB$DATABASE LEFT JOIN SPRTCLASSIFIER WRCL ON WRCL.WAREID = :IWARE) WRCL1 ON WRCL1.CLASSIFIERID = A.WARECLASSIFIERID
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
              UNION
              SELECT COALESCE(CLCL.CLASSIFIERID, 0) AS CLASSIFIERID
              FROM RDB$DATABASE LEFT JOIN CLIENTCLASSIFIER CLCL ON CLCL.CLIENTID = :ICLIENT) CLCL1 ON CLCL1.CLASSIFIERID = A.CLIENTCLASSIFIERID
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
              AND (A.CCARDCLASSIFIERID = -1 OR A.CCARDCLASSIFIERID IN (
                      SELECT COALESCE(CCL.CLASSIFIERID, 0)
                      FROM RDB$DATABASE GCL LEFT JOIN CCARDCLASSIFIER CCL ON CCL.CCARDID = A.CARDID))
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL AND CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
      WHERE
        ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND

        (
         NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                         AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:REGDATE,
                       AC.REGDATECOND,
                       AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                       AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

        (
         NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                         AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:MEMDATE,
                       AC.MEMDATECOND,
                       AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                       AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
        (
         NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                           AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:BIRTHDATE,
                       AC.BIRTHDATECOND,
                       AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                       AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

        (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
        (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
        (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
        (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
        (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
        (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
     PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC)))
     ORDER BY GD.CODE, AD.PRIORITY
     INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,
       AWARECLASSIFIERID, ACLIENTCLASSIFIERID, ACCARDCLASSIFIERID
     DO
     BEGIN
       ACONTINUE = 0;
       IF (AWARECLASSIFIERID <> -1) THEN
       BEGIN
         IF (AWARECLASSIFIERID = 0) THEN
         BEGIN
           IF (EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE)) THEN
             ACONTINUE = 1;
         END
         ELSE
         BEGIN
           IF (NOT EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE AND CL.CLASSIFIERID = :AWARECLASSIFIERID)) THEN
             ACONTINUE = 1;
         END
       END

       IF (ACONTINUE = 0) THEN
       BEGIN
         IF (ACLIENTCLASSIFIERID <> -1) THEN
         BEGIN
           IF (ACLIENTCLASSIFIERID = 0) THEN
           BEGIN
             IF (EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT)) THEN
               ACONTINUE = 1;
           END
           ELSE
           BEGIN
             IF (NOT EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT AND CL.CLASSIFIERID = :ACLIENTCLASSIFIERID)) THEN
               ACONTINUE = 1;
           END
         END
       END

       IF (ACONTINUE = 0) THEN
       BEGIN
         IF (ACCARDCLASSIFIERID <> -1) THEN
         BEGIN
           IF (ACCARDCLASSIFIERID = 0) THEN
           BEGIN
             IF (EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID)) THEN
               ACONTINUE = 1;
           END
           ELSE
           BEGIN
             IF (NOT EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID AND CL.CLASSIFIERID = :ACCARDCLASSIFIERID)) THEN
               ACONTINUE = 1;
           END
         END
       END
       IF (ACONTINUE = 0) THEN
        SUSPEND;
     END
   ICARD = PCOPY(ICARD, CARDLEN + 1, LEN(ICARD) - CARDLEN - 1);
  END

  GRPCODE = NULL;
  PRIORITY = 0;
  WAREID = NULL;
  WARECLASSIFIERID = NULL;
  FORMULA1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  FORMULA2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  FORMULA3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE, A.WARECLASSIFIERID, A.CLIENTCLASSIFIERID, A.CCARDCLASSIFIERID
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTSCRIPT ACS ON ACS.ID = A.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
  INTO DATA, CODE, AWARECLASSIFIERID, ACLIENTCLASSIFIERID, ACCARDCLASSIFIERID
  DO
  BEGIN
    ACONTINUE = 0;
    IF (AWARECLASSIFIERID <> -1) THEN
    BEGIN
      IF (AWARECLASSIFIERID = 0) THEN
      BEGIN
        IF (EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE)) THEN
          ACONTINUE = 1;
      END
      ELSE
      BEGIN
        IF (NOT EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE AND CL.CLASSIFIERID = :AWARECLASSIFIERID)) THEN
          ACONTINUE = 1;
      END
    END

    IF (ACONTINUE = 0) THEN
    BEGIN
    IF (ACLIENTCLASSIFIERID <> -1) THEN
    BEGIN
      IF (ACLIENTCLASSIFIERID = 0) THEN
      BEGIN
        IF (EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT)) THEN
          ACONTINUE = 1;
      END
      ELSE
      BEGIN
        IF (NOT EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT AND CL.CLASSIFIERID = :ACLIENTCLASSIFIERID)) THEN
          ACONTINUE = 1;
      END
    END
    END

    IF (ACONTINUE = 0) THEN
    BEGIN
    IF (ACCARDCLASSIFIERID <> -1) THEN
    BEGIN
      IF (ACCARDCLASSIFIERID = 0) THEN
      BEGIN
        IF (EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID)) THEN
          ACONTINUE = 1;
      END
      ELSE
      BEGIN
        IF (NOT EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID AND CL.CLASSIFIERID = :ACCARDCLASSIFIERID)) THEN
          ACONTINUE = 1;
      END
    END
    END
    IF (ACONTINUE = 0) THEN
      SUSPEND;
  END

END
^

/* empty dependent procedure body */
/* Clear: GET_DISCOUNT for: GET_DISCOUNT_CUSTOM */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
DISCRATECLASSIFIERID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN SUSPEND; END
^

/* Alter (GET_DISCOUNT_CUSTOM) */
ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
DISCRATECLASSIFIERID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
DECLARE VARIABLE AWARECLASSIFIERID INTEGER;
DECLARE VARIABLE ACLIENTCLASSIFIERID INTEGER;
DECLARE VARIABLE ACCARDCLASSIFIERID INTEGER;
DECLARE VARIABLE ACONTINUE INTEGER;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT GD.CODE, AR.VAL, AC.WAREID, AC.WARECLASSIFIERID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3, AR.CODE,
      (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID), AR.WAREID, AR.WARECLASSIFIERID,
      A.WARECLASSIFIERID, A.CLIENTCLASSIFIERID, A.CCARDCLASSIFIERID
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (
       NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                       AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:REGDATE,
                     AC.REGDATECOND,
                     AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                     AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

      (
       NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                       AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:MEMDATE,
                     AC.MEMDATECOND,
                     AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                     AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
      (
       NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                         AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:BIRTHDATE,
                     AC.BIRTHDATECOND,
                     AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                     AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

      (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
      (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
      (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
      (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
      (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
      (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)

      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC)))
-- OLD    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO GRPCODE, VAL, WAREID, WARECLASSIFIERID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,DISCRATECODE,CARD, DISCRATEWAREID, DISCRATECLASSIFIERID,
      AWARECLASSIFIERID, ACLIENTCLASSIFIERID, ACCARDCLASSIFIERID
    DO
    BEGIN
      ACONTINUE = 0;
      IF (AWARECLASSIFIERID <> -1) THEN
      BEGIN
        IF (AWARECLASSIFIERID = 0) THEN
        BEGIN
          IF (EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE)) THEN
            ACONTINUE = 1;
        END
        ELSE
        BEGIN
          IF (NOT EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE AND CL.CLASSIFIERID = :AWARECLASSIFIERID)) THEN
            ACONTINUE = 1;
        END
      END

      IF (ACONTINUE = 0) THEN
      BEGIN
      IF (ACLIENTCLASSIFIERID <> -1) THEN
      BEGIN
        IF (ACLIENTCLASSIFIERID = 0) THEN
        BEGIN
          IF (EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT)) THEN
            ACONTINUE = 1;
        END
        ELSE
        BEGIN
          IF (NOT EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT AND CL.CLASSIFIERID = :ACLIENTCLASSIFIERID)) THEN
            ACONTINUE = 1;
        END
      END
      END

      IF (ACONTINUE = 0) THEN
      BEGIN
      IF (ACCARDCLASSIFIERID <> -1) THEN
      BEGIN
        IF (ACCARDCLASSIFIERID = 0) THEN
        BEGIN
          IF (EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID)) THEN
            ACONTINUE = 1;
        END
        ELSE
        BEGIN
          IF (NOT EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID AND CL.CLASSIFIERID = :ACCARDCLASSIFIERID)) THEN
            ACONTINUE = 1;
        END
      END
      END
      IF (ACONTINUE = 0) THEN
        SUSPEND;
    END


  WHILE (ICARD <> '') DO
  BEGIN
    CARD = EXTRACTSTR(:ICARD, ',');
    CARDLEN = LEN(CARD);
    CARD = ADDRIGHT(CARD, 1, 40);

    FOR
      SELECT GD.CODE, AR.VAL, AC.WAREID, AC.WARECLASSIFIERID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
        QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID,AR.BEGVAL,AR.ENDVAL,
        AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3,AR.CODE, AR.WAREID, AR.WARECLASSIFIERID,
        A.WARECLASSIFIERID, A.CLIENTCLASSIFIERID, A.CCARDCLASSIFIERID
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
              UNION
              SELECT COALESCE(WRCL.CLASSIFIERID, 0) AS CLASSIFIERID
              FROM RDB$DATABASE LEFT JOIN SPRTCLASSIFIER WRCL ON WRCL.WAREID = :IWARE) WRCL1 ON WRCL1.CLASSIFIERID = A.WARECLASSIFIERID
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
              UNION
              SELECT COALESCE(CLCL.CLASSIFIERID, 0) AS CLASSIFIERID
              FROM RDB$DATABASE LEFT JOIN CLIENTCLASSIFIER CLCL ON CLCL.CLIENTID = :ICLIENT) CLCL1 ON CLCL1.CLASSIFIERID = A.CLIENTCLASSIFIERID
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
              AND (A.CCARDCLASSIFIERID = -1 OR A.CCARDCLASSIFIERID IN (
                      SELECT COALESCE(CCL.CLASSIFIERID, 0)
                      FROM RDB$DATABASE GCL LEFT JOIN CCARDCLASSIFIER CCL ON CCL.CCARDID = A.CARDID))
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL AND CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
      WHERE
        (
         NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                         AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:REGDATE,
                       AC.REGDATECOND,
                       AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                       AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

        (
         NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                         AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:MEMDATE,
                       AC.MEMDATECOND,
                       AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                       AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
        (
         NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                           AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:BIRTHDATE,
                       AC.BIRTHDATECOND,
                       AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                       AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

        (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
        (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
        (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
        (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
        (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
        (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND

        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC)))
-- OLD      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
      ORDER BY GD.CODE, AD.PRIORITY
      INTO GRPCODE, VAL, WAREID, WARECLASSIFIERID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,DISCRATECODE, DISCRATEWAREID, DISCRATECLASSIFIERID,
      AWARECLASSIFIERID, ACLIENTCLASSIFIERID, ACCARDCLASSIFIERID
      DO
      BEGIN
        ACONTINUE = 0;
        IF (AWARECLASSIFIERID <> -1) THEN
        BEGIN
          IF (AWARECLASSIFIERID = 0) THEN
          BEGIN
            IF (EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE)) THEN
              ACONTINUE = 1;
          END
          ELSE
          BEGIN
            IF (NOT EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE AND CL.CLASSIFIERID = :AWARECLASSIFIERID)) THEN
              ACONTINUE = 1;
          END
        END

        IF (ACONTINUE = 0) THEN
        BEGIN
        IF (ACLIENTCLASSIFIERID <> -1) THEN
        BEGIN
          IF (ACLIENTCLASSIFIERID = 0) THEN
          BEGIN
            IF (EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT)) THEN
              ACONTINUE = 1;
          END
          ELSE
          BEGIN
            IF (NOT EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT AND CL.CLASSIFIERID = :ACLIENTCLASSIFIERID)) THEN
              ACONTINUE = 1;
          END
        END
        END

        IF (ACONTINUE = 0) THEN
        BEGIN
        IF (ACCARDCLASSIFIERID <> -1) THEN
        BEGIN
          IF (ACCARDCLASSIFIERID = 0) THEN
          BEGIN
            IF (EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID)) THEN
              ACONTINUE = 1;
          END
          ELSE
          BEGIN
            IF (NOT EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID AND CL.CLASSIFIERID = :ACCARDCLASSIFIERID)) THEN
              ACONTINUE = 1;
          END
        END
        END
        IF (ACONTINUE = 0) THEN
          SUSPEND;
      END

   ICARD = PCOPY(ICARD, CARDLEN + 1, LEN(ICARD) - CARDLEN - 1);
  END

  GRPCODE = NULL;
  VAL = NULL;
  WAREID = NULL;
  WARECLASSIFIERID = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;
  "TYPE" = NULL;
  TEXT = NULL;
  CODE = NULL;
  CARDPREFIXBEG = NULL;
  CARDPREFIXEND = NULL;
  DEPENDOTHERPOS = NULL;
  BEGVAL = NULL;
  ENDVAL = NULL;
  FORMULA1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  FORMULA2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  FORMULA3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  PRIORITY = 0;
  CARD = NULL;

  FOR
    SELECT AR.VAL, AR.WAREID, AR.WARECLASSIFIERID, AR."TYPE", AR.NAME, AR.TEXT,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AR.CODE, (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID), A.WARECLASSIFIERID, A.CLIENTCLASSIFIERID, A.CCARDCLASSIFIERID
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN DISCRATE AR ON AR.ID = A.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
--    PLAN SORT (JOIN (JOIN (AR NATURAL,A INDEX (IDX_ACTDISCOBJ2,FK_ADO_DISCRATE))))
  INTO VAL, DISCRATEWAREID, DISCRATECLASSIFIERID, "TYPE", NAME, TEXT, PARENTID, BEGVAL, ENDVAL, DISCRATECODE, CARD,
    AWARECLASSIFIERID, ACLIENTCLASSIFIERID, ACCARDCLASSIFIERID
  DO
  BEGIN
    ACONTINUE = 0;
    IF (AWARECLASSIFIERID <> -1) THEN
    BEGIN
      IF (AWARECLASSIFIERID = 0) THEN
      BEGIN
        IF (EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE)) THEN
          ACONTINUE = 1;
      END
      ELSE
      BEGIN
        IF (NOT EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE AND CL.CLASSIFIERID = :AWARECLASSIFIERID)) THEN
          ACONTINUE = 1;
      END
    END

    IF (ACONTINUE = 0) THEN
    BEGIN
    IF (ACLIENTCLASSIFIERID <> -1) THEN
    BEGIN
      IF (ACLIENTCLASSIFIERID = 0) THEN
      BEGIN
        IF (EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT)) THEN
          ACONTINUE = 1;
      END
      ELSE
      BEGIN
        IF (NOT EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT AND CL.CLASSIFIERID = :ACLIENTCLASSIFIERID)) THEN
          ACONTINUE = 1;
      END
    END
    END

    IF (ACONTINUE = 0) THEN
    BEGIN
    IF (ACCARDCLASSIFIERID <> -1) THEN
    BEGIN
      IF (ACCARDCLASSIFIERID = 0) THEN
      BEGIN
        IF (EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID)) THEN
          ACONTINUE = 1;
      END
      ELSE
      BEGIN
        IF (NOT EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID AND CL.CLASSIFIERID = :ACCARDCLASSIFIERID)) THEN
          ACONTINUE = 1;
      END
    END
    END
    IF (ACONTINUE = 0) THEN
      SUSPEND;
  END
END
^

/* Restore proc. body: APPENDCCARDDISCS */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERTYPE4 INTEGER,
ICOUNTERTYPE5 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERVAL4 DOUBLE PRECISION,
ICOUNTERVAL5 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ICOUNTERCODE4 NUMERIC(18),
ICOUNTERCODE5 NUMERIC(18))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18),
OCOUNTERCODE4 NUMERIC(18),
OCOUNTERCODE5 NUMERIC(18))
 AS
declare variable CARDID integer;
declare variable DOCODE integer;
declare variable GRPCARDID integer;
declare variable OLDCARDFLG integer;
declare variable DISCRATEID integer;
declare variable ACTDISCOBJID integer;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  OCOUNTERCODE4 = ICOUNTERCODE4;
  OCOUNTERCODE5 = ICOUNTERCODE5;

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE VAL = :ICARD
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      IF (EXISTS(SELECT 1 FROM CCARD WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID)) THEN
      BEGIN
        SELECT MAX(CODE) + 1 FROM CCARD WHERE GRPCCARDID = :GRPCARDID INTO ICARDCODE;
        IF (ICARDCODE IS NULL) THEN
          ICARDCODE = 1;
      END
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        CODE = :ICARDCODE,
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
        EXIT;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        PLAN (A INDEX (IDX_ACTDISCOBJ2))
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;

        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCARDFLG = 1) THEN
        FOR SELECT A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID
        DO
          UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE4 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE4, :ICOUNTERVAL4, :CARDID, NULL, ICOUNTERCODE4, 45)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE4;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE5 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE5, :ICOUNTERVAL5, :CARDID, NULL, ICOUNTERCODE5, 46)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE5;
END
^

/* Restore proc. body: APPENDCLIENT */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ILEGALZIPCODE VARCHAR(10),
ILEGALCITY VARCHAR(100),
ILEGALADDRESS VARCHAR(255))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,        CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE,   BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,       WEB,
                          TELEPHONE, INN,       DOCUMENT, OKPO,     OKPD,  DELETED,  LEGALZIPCODE,
                          LEGALCITY, LEGALADDRESS)

      VALUES (:CLIENTID,   :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT, :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE,   :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,       :IWEB,
              :ITELEPHONE, :IINN,       :IDOCUMENT,   :IOKPO,     :IOKPD, :IDELETED,  :ILEGALZIPCODE,
              :ILEGALCITY, :ILEGALADDRESS);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED,
          LEGALZIPCODE = :ILEGALZIPCODE,
          LEGALCITY = :ILEGALCITY,
          LEGALADDRESS = :ILEGALADDRESS
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCLIENT = 1) THEN
      FOR SELECT A.ID
      FROM ACTDISCOBJ A
      WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
            A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
            A.DISCRATEID > 0
      INTO ACTDISCOBJID
      DO
        UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;
END
^

/* Restore proc. body: CCARD_REPLACE */
ALTER PROCEDURE CCARD_REPLACE(IOLDID INTEGER,
ICODE INTEGER,
IVAL VARCHAR(40))
 RETURNS(ID INTEGER)
 AS
DECLARE VARIABLE CID INTEGER;
DECLARE VARIABLE CNID INTEGER;
DECLARE VARIABLE AUTOCREATE INTEGER;
BEGIN

  SELECT GEN_ID(GID, 1) FROM RDB$DATABASE INTO :ID;

  INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE)
  SELECT :ID, :ICODE, GRPCCARDID, :IVAL, EXPDATEBEG, EXPDATEEND, 1
  FROM CCARD WHERE ID = :IOLDID;

  FOR SELECT CLIENTID FROM CLIENTCARD WHERE CCARDID = :IOLDID INTO :CID DO
  BEGIN
    INSERT INTO CLIENTCARD (ID, CLIENTID, CCARDID)
    VALUES (GEN_ID(GID, 1), :CID, :ID);
  END

  FOR SELECT C.ID, CN.ID, CT.AUTOCREATE
  FROM CCARDCOUNTER CCC
  JOIN COUNTER C ON CCC.COUNTERID = C.ID
  JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
  LEFT JOIN COUNTER CN ON CN.COUNTERTYPEID = CT.ID
  JOIN CCARDCOUNTER CCCN ON CCCN.COUNTERID = CN.ID AND CCCN.CCARDID = :ID
  WHERE CCC.CCARDID = :IOLDID
  INTO :CID, :CNID, :AUTOCREATE DO
  BEGIN
    IF (AUTOCREATE = 0) THEN
      INSERT INTO CCARDCOUNTER(ID, COUNTERID, CCARDID)
      VALUES (GEN_ID(GID, 1), :CID, :ID);
    ELSE IF (AUTOCREATE = 1) THEN
      INSERT INTO COUNTERD(ID, COUNTERID, DELTA, DELTADATE, DTYPE, DOCUMENTID)
      SELECT GEN_ID(GCOUNTERD, 1), :CNID, DELTA, DELTADATE, DTYPE, DOCUMENTID
      FROM COUNTERD WHERE COUNTERID = :CID;
  END

  UPDATE CCARD SET STATE = 0 WHERE ID = :IOLDID;
  DELETE FROM ACTDISCOBJ WHERE CARDID = :IOLDID;
  SUSPEND;
END
^

/* Restore proc. body: GET_ACTSCRIPT */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
BEGIN
  ID = 1;

  FOR
    SELECT  CODE, DATA, NULLTONUM(GRPCODE), NULLTONUM(PRIORITY), WAREID, WARECLASSIFIERID,
      SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,
      CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    FROM GET_ACTSCRIPT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
      :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,:IWEEKDAY,
      :IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,:ICARD,
      :IANYCARD,:ICARDSTATE,:IACTEVENT,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY, CODE
    INTO CODE, DATA, GRPCODE, PRIORITY,WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END
END
^

/* Restore proc. body: GET_DISCOUNT */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
DISCRATECLASSIFIERID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
BEGIN
  ID = 1;

  FOR
    SELECT NULLTONUM(GRPCODE), VAL, WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
           DISCRATECLASSIFIERID, "TYPE", NAME, TEXT,
           CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, NULLTONUM(PRIORITY), PARENTID, BEGVAL, ENDVAL,
           FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
    FROM GET_DISCOUNT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
          :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,
          :IWEEKDAY,:IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,
          :ICARD,:IANYCARD,:ICARDSTATE,:IDESTINATION,
          :IKIND,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY
    INTO GRPCODE, VAL, WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
         DISCRATECLASSIFIERID,"TYPE", NAME, TEXT,
         CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, PRIORITY, PARENTID, BEGVAL, ENDVAL,
         FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END

END
^

/* Create trigger... */
CREATE TRIGGER DEL_AFT_DISCRATE_GRP FOR DISCRATE
ACTIVE AFTER DELETE POSITION 10 
AS
BEGIN
  IF (OLD.ISFOLDER = 1) THEN
    POST_EVENT 'DISCRATE_GRP_CHANGED';
END
^

CREATE TRIGGER INS_AFT_DISCRATE_GRP FOR DISCRATE
ACTIVE AFTER INSERT POSITION 10 
AS
BEGIN
  IF (NEW.ISFOLDER = 1) THEN
    POST_EVENT 'DISCRATE_GRP_CHANGED';
END
^


/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_RMK
AS 
BEGIN
  IF (NEW.NOCHNG = 1) THEN
  BEGIN
    NEW.NOCHNG = 0;
    EXIT;
  END
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE IS NULL) THEN
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB
    INTO
    NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER INS_BEF_DOCKIND
AS
begin
  if (NEW.ECRRECEIPTTYPE IN (8, 9, 10, 13)) then
  BEGIN
    IF (EXISTS(SELECT ID FROM DOCKIND WHERE ECRRECEIPTTYPE = NEW.ECRRECEIPTTYPE)) THEN
      EXCEPTION E_TRY_CREATE_DUP_DOCKIND;
  END
end
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_BEF_DOCKIND
AS
BEGIN
  IF (NEW.ECRRECEIPTTYPE IN (8, 9, 10, 13)) THEN
  BEGIN
    IF (EXISTS(SELECT ID FROM DOCKIND WHERE (ID <> NEW.ID) AND (ECRRECEIPTTYPE = NEW.ECRRECEIPTTYPE))) THEN
      EXCEPTION E_TRY_CREATE_DUP_DOCKIND;
  END
END
^

/* Alter Procedure... */
/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERTYPE4 INTEGER,
ICOUNTERTYPE5 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERVAL4 DOUBLE PRECISION,
ICOUNTERVAL5 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ICOUNTERCODE4 NUMERIC(18),
ICOUNTERCODE5 NUMERIC(18))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18),
OCOUNTERCODE4 NUMERIC(18),
OCOUNTERCODE5 NUMERIC(18))
 AS
declare variable CARDID integer;
declare variable DOCODE integer;
declare variable GRPCARDID integer;
declare variable OLDCARDFLG integer;
declare variable DISCRATEID integer;
declare variable ACTDISCOBJID integer;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  OCOUNTERCODE4 = ICOUNTERCODE4;
  OCOUNTERCODE5 = ICOUNTERCODE5;

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE VAL = :ICARD
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      IF (EXISTS(SELECT 1 FROM CCARD WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID)) THEN
      BEGIN
        SELECT MAX(CODE) + 1 FROM CCARD WHERE GRPCCARDID = :GRPCARDID INTO ICARDCODE;
        IF (ICARDCODE IS NULL) THEN
          ICARDCODE = 1;
      END
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        CODE = :ICARDCODE,
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
        EXIT;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        PLAN (A INDEX (IDX_ACTDISCOBJ2))
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;

        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCARDFLG = 1) THEN
        FOR SELECT A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID
        DO
          UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE4 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE4, :ICOUNTERVAL4, :CARDID, NULL, ICOUNTERCODE4, 45)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE4;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE5 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE5, :ICOUNTERVAL5, :CARDID, NULL, ICOUNTERCODE5, 46)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE5;
END
^

/* Alter (APPENDCLIENT) */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ILEGALZIPCODE VARCHAR(10),
ILEGALCITY VARCHAR(100),
ILEGALADDRESS VARCHAR(255))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,        CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE,   BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,       WEB,
                          TELEPHONE, INN,       DOCUMENT, OKPO,     OKPD,  DELETED,  LEGALZIPCODE,
                          LEGALCITY, LEGALADDRESS)

      VALUES (:CLIENTID,   :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT, :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE,   :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,       :IWEB,
              :ITELEPHONE, :IINN,       :IDOCUMENT,   :IOKPO,     :IOKPD, :IDELETED,  :ILEGALZIPCODE,
              :ILEGALCITY, :ILEGALADDRESS);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED,
          LEGALZIPCODE = :ILEGALZIPCODE,
          LEGALCITY = :ILEGALCITY,
          LEGALADDRESS = :ILEGALADDRESS
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCLIENT = 1) THEN
      FOR SELECT A.ID
      FROM ACTDISCOBJ A
      WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
            A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
            A.DISCRATEID > 0
      INTO ACTDISCOBJID
      DO
        UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;
END
^

/* Alter (GET_ACTSCRIPT) */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
BEGIN
  ID = 1;

  FOR
    SELECT  CODE, DATA, NULLTONUM(GRPCODE), NULLTONUM(PRIORITY), WAREID, WARECLASSIFIERID,
      SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,
      CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    FROM GET_ACTSCRIPT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
      :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,:IWEEKDAY,
      :IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,:ICARD,
      :IANYCARD,:ICARDSTATE,:IACTEVENT,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY, CODE
    INTO CODE, DATA, GRPCODE, PRIORITY,WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END
END
^

/* Alter (GET_DISCOUNT) */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
DISCRATECLASSIFIERID INTEGER,
TYPE INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
BEGIN
  ID = 1;

  FOR
    SELECT NULLTONUM(GRPCODE), VAL, WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
           DISCRATECLASSIFIERID, "TYPE", NAME, TEXT,
           CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, NULLTONUM(PRIORITY), PARENTID, BEGVAL, ENDVAL,
           FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
    FROM GET_DISCOUNT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
          :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,
          :IWEEKDAY,:IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,
          :ICARD,:IANYCARD,:ICARDSTATE,:IDESTINATION,
          :IKIND,:ICARDSID,:IPAYMENTSID)
    ORDER BY GRPCODE, PRIORITY
    INTO GRPCODE, VAL, WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
         DISCRATECLASSIFIERID,"TYPE", NAME, TEXT,
         CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, PRIORITY, PARENTID, BEGVAL, ENDVAL,
         FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END

END
^

SET TERM ; ^

ALTER TABLE DOCUMENT ALTER COLUMN ID POSITION 1;

ALTER TABLE DOCUMENT ALTER COLUMN DOCKINDID POSITION 2;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUENUMBER POSITION 3;

ALTER TABLE DOCUMENT ALTER COLUMN OPENDATE POSITION 4;

ALTER TABLE DOCUMENT ALTER COLUMN OPENTIME POSITION 5;

ALTER TABLE DOCUMENT ALTER COLUMN OPENUSERID POSITION 6;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEDATE POSITION 7;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSETIME POSITION 8;

ALTER TABLE DOCUMENT ALTER COLUMN CLOSEUSERID POSITION 9;

ALTER TABLE DOCUMENT ALTER COLUMN DOCUMENTID POSITION 10;

ALTER TABLE DOCUMENT ALTER COLUMN CLIENTID POSITION 11;

ALTER TABLE DOCUMENT ALTER COLUMN STATE POSITION 12;

ALTER TABLE DOCUMENT ALTER COLUMN EDUCATION POSITION 13;

ALTER TABLE DOCUMENT ALTER COLUMN RMKID POSITION 14;

ALTER TABLE DOCUMENT ALTER COLUMN SUMM POSITION 15;

ALTER TABLE DOCUMENT ALTER COLUMN SUMMWD POSITION 16;

ALTER TABLE DOCUMENT ALTER COLUMN ECRSESSION POSITION 17;

ALTER TABLE DOCUMENT ALTER COLUMN CHEQUETYPE POSITION 18;

ALTER TABLE DOCUMENT ALTER COLUMN ORDERIDENTIF POSITION 19;

ALTER TABLE DOCUMENT ALTER COLUMN COMMENTCODE POSITION 20;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTSCHEME POSITION 21;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE1 POSITION 22;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE2 POSITION 23;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE3 POSITION 24;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE4 POSITION 25;

ALTER TABLE DOCUMENT ALTER COLUMN ASPECTVALUE5 POSITION 26;

ALTER TABLE DOCUMENT ALTER COLUMN HALLPLACEID POSITION 27;

ALTER TABLE DOCUMENT ALTER COLUMN SAVED POSITION 28;

ALTER TABLE DOCUMENT ALTER COLUMN INNERDOCORDER POSITION 29;

ALTER TABLE DOCUMENT ALTER COLUMN PRECHEQUE POSITION 30;

ALTER TABLE DOCUMENT ALTER COLUMN OPENRMKID POSITION 31;

ALTER TABLE DOCUMENT ALTER COLUMN OPENSESSION POSITION 32;

ALTER TABLE DOCUMENT ALTER COLUMN CHNG POSITION 33;

ALTER TABLE DOCUMENT ALTER COLUMN BDOCODE POSITION 34;

ALTER TABLE DOCUMENT ALTER COLUMN ISFISCAL POSITION 35;

ALTER TABLE DOCUMENT ALTER COLUMN OWNERBDO POSITION 36;

ALTER TABLE DOCUMENT ALTER COLUMN NSHOP POSITION 37;

ALTER TABLE DOCUMENT ALTER COLUMN USERVALUES POSITION 38;

ALTER TABLE DOCUMENT ALTER COLUMN EMPLOYEECODE POSITION 39;

ALTER TABLE DOCUMENT ALTER COLUMN DOCEMPLID POSITION 40;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEBEG POSITION 41;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEEND POSITION 42;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEINFO POSITION 43;

ALTER TABLE DOCUMENT ALTER COLUMN RESERVEBEF POSITION 44;

ALTER TABLE DOCUMENT ALTER COLUMN OWNERUSERID POSITION 45;

ALTER TABLE DOCUMENT ALTER COLUMN CARDBONUS POSITION 46;

ALTER TABLE DOCUMENT ALTER COLUMN ECRDEPARTMENT POSITION 47;

ALTER TABLE DOCUMENT ALTER COLUMN PREPAYEDDOCID POSITION 48;

ALTER TABLE DOCUMENT ALTER COLUMN GUESTCOUNT POSITION 49;

ALTER TABLE RMK ALTER COLUMN ID POSITION 1;

ALTER TABLE RMK ALTER COLUMN CODE POSITION 2;

ALTER TABLE RMK ALTER COLUMN NAME POSITION 3;

ALTER TABLE RMK ALTER COLUMN TEXT POSITION 4;

ALTER TABLE RMK ALTER COLUMN EDUCATIONMODE POSITION 5;

ALTER TABLE RMK ALTER COLUMN RMKVERSION POSITION 6;

ALTER TABLE RMK ALTER COLUMN HALLID POSITION 7;

ALTER TABLE RMK ALTER COLUMN AUTOREGUSERID POSITION 8;

ALTER TABLE RMK ALTER COLUMN EXITONEXCH POSITION 9;

ALTER TABLE RMK ALTER COLUMN BDOCODE POSITION 10;

ALTER TABLE RMK ALTER COLUMN CHNG POSITION 11;

ALTER TABLE RMK ALTER COLUMN OWNERBDO POSITION 12;

ALTER TABLE RMK ALTER COLUMN NOTIFICATIONGRP POSITION 13;

ALTER TABLE RMK ALTER COLUMN DOCNUM POSITION 14;

ALTER TABLE RMK ALTER COLUMN SESNUM POSITION 15;

ALTER TABLE RMK ALTER COLUMN NOCHNG POSITION 16;

ALTER TABLE TRANZT ALTER COLUMN ID POSITION 1;

ALTER TABLE TRANZT ALTER COLUMN DOCUMENTID POSITION 2;

ALTER TABLE TRANZT ALTER COLUMN TRANZCOUNT POSITION 3;

ALTER TABLE TRANZT ALTER COLUMN TRANZDATE POSITION 4;

ALTER TABLE TRANZT ALTER COLUMN TRANZTIME POSITION 5;

ALTER TABLE TRANZT ALTER COLUMN TRANZHOUR POSITION 6;

ALTER TABLE TRANZT ALTER COLUMN TRANZTYPE POSITION 7;

ALTER TABLE TRANZT ALTER COLUMN SELLER POSITION 8;

ALTER TABLE TRANZT ALTER COLUMN WARECODE POSITION 9;

ALTER TABLE TRANZT ALTER COLUMN WAREMARK POSITION 10;

ALTER TABLE TRANZT ALTER COLUMN ASPECTSCHEME POSITION 11;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE1 POSITION 12;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE2 POSITION 13;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE3 POSITION 14;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE4 POSITION 15;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE5 POSITION 16;

ALTER TABLE TRANZT ALTER COLUMN PRICE POSITION 17;

ALTER TABLE TRANZT ALTER COLUMN QUANTITY POSITION 18;

ALTER TABLE TRANZT ALTER COLUMN SUMM POSITION 19;

ALTER TABLE TRANZT ALTER COLUMN PRICEWD POSITION 20;

ALTER TABLE TRANZT ALTER COLUMN SUMMWD POSITION 21;

ALTER TABLE TRANZT ALTER COLUMN INFO POSITION 22;

ALTER TABLE TRANZT ALTER COLUMN INFOSTR POSITION 23;

ALTER TABLE TRANZT ALTER COLUMN BARCODE POSITION 24;

ALTER TABLE TRANZT ALTER COLUMN FACTOR POSITION 25;

ALTER TABLE TRANZT ALTER COLUMN CURRENCY POSITION 26;

ALTER TABLE TRANZT ALTER COLUMN ECRNUMBER POSITION 27;

ALTER TABLE TRANZT ALTER COLUMN POSID POSITION 28;

ALTER TABLE TRANZT ALTER COLUMN POSNUMB POSITION 29;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCPOS POSITION 30;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCREC POSITION 31;

ALTER TABLE TRANZT ALTER COLUMN COMMENTCODE POSITION 32;

ALTER TABLE TRANZT ALTER COLUMN COUNTFILLS POSITION 33;

ALTER TABLE TRANZT ALTER COLUMN COUNTPRINTS POSITION 34;

ALTER TABLE TRANZT ALTER COLUMN BDOCODE POSITION 35;

ALTER TABLE TRANZT ALTER COLUMN OWNERBDO POSITION 36;

ALTER TABLE TRANZT ALTER COLUMN ORDERPOS POSITION 37;

ALTER TABLE TRANZT ALTER COLUMN TRMKID POSITION 38;

/*MAN*/

UPDATE RMK SET
DOCNUM = (SELECT COALESCE(MAX(CHEQUENUMBER) + 1, 1) FROM DOCUMENT WHERE RMKID = RMK.ID),
SESNUM = (SELECT COALESCE(MAX(ECRSESSION) + 1, 1) FROM DOCUMENT WHERE RMKID = RMK.ID);

SELECT
GEN_ID(GDOCNUMBER, (SELECT COALESCE(MAX(CHEQUENUMBER), 0)  FROM DOCUMENT)),
GEN_ID(GSESSIONNUMBER, (SELECT COALESCE(MAX(ECRSESSION), 1) FROM DOCUMENT))
FROM RDB$DATABASE;

UPDATE SETTINGS
SET SYNCCATEG = 21
WHERE NAME IN
('DinamicVisualFilter', 'BeginTextVisualFilter',
'VisualHotKey', 'VisualPositiveRemainOnly');

/*MAN*/

/* TEXT BLOCK END */

/* Convert 4.8.5 */

SET TERM ^ ;

CREATE PROCEDURE DAYS_IN_MONTH(IYEAR INTEGER,
IMONTH INTEGER)
 RETURNS(DAYS INTEGER)
 AS
 BEGIN SUSPEND; END
^

CREATE PROCEDURE GET_PERIOD_FOR_ALG(IALG INTEGER,
ICURDATE DATE)
 RETURNS(DATE1 DATE,
DATE2 DATE)
 AS
 BEGIN SUSPEND; END
^


/* Alter Procedure... */
/* empty dependent procedure body */
/* Clear: APPENDCCARDDISCS for: APPENDCOUNTERBYTYPE */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERTYPE4 INTEGER,
ICOUNTERTYPE5 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERVAL4 DOUBLE PRECISION,
ICOUNTERVAL5 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ICOUNTERCODE4 NUMERIC(18),
ICOUNTERCODE5 NUMERIC(18))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18),
OCOUNTERCODE4 NUMERIC(18),
OCOUNTERCODE5 NUMERIC(18))
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPENDCLIENT for: APPENDCOUNTERBYTYPE */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ILEGALZIPCODE VARCHAR(10),
ILEGALCITY VARCHAR(100),
ILEGALADDRESS VARCHAR(255))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPENDCOUNTERBYTYPE) */
ALTER PROCEDURE APPENDCOUNTERBYTYPE(ICOUNTERTYPE INTEGER,
ICOUNTERVAL DOUBLE PRECISION,
ICARDID INTEGER,
ICLIENTID INTEGER,
ICOUNTERCODE NUMERIC(18),
IERRORCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE NUMERIC(18))
 AS
DECLARE VARIABLE COUNTERTYPEID INTEGER;
DECLARE VARIABLE COUNTERID INTEGER;
DECLARE VARIABLE CID INTEGER;
DECLARE VARIABLE ABDOCODE INTEGER;
DECLARE VARIABLE AOWNERBDO INTEGER;
DECLARE VARIABLE DELTA DOUBLE PRECISION;
DECLARE VARIABLE CTALG INTEGER;
BEGIN

  OCOUNTERCODE = ICOUNTERCODE;
  SELECT ID
  FROM COUNTERTYPE
  WHERE CODE = :ICOUNTERTYPE
  INTO :COUNTERTYPEID;

  SELECT BDOCODE, DBIDENT FROM CUSTOMDB INTO AOWNERBDO, ABDOCODE;

  IF (:COUNTERTYPEID IS NULL) THEN
  BEGIN
    ERRORCODE = IERRORCODE;
    EXIT;
  END

  IF (ICARDID IS NOT NULL) THEN
  BEGIN
    CID = NULL;
    FOR
      SELECT C.ID, CT.COUNTERALG
      FROM CCARDCOUNTER CC
      JOIN COUNTER C ON CC.COUNTERID = C.ID
      JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
      WHERE CC.CCARDID = :ICARDID AND CT.ID = :COUNTERTYPEID
      INTO :COUNTERID, :CTALG
    DO
    BEGIN
      SELECT SUM(CD.DELTA) FROM COUNTERD CD
      WHERE COUNTERID = :COUNTERID AND ((DTYPE = 1) OR (:CTALG = 0))
      INTO :DELTA;
      IF ((DELTA IS NULL) OR (:DELTA <> :ICOUNTERVAL)) THEN
      BEGIN
        IF (DELTA <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, -:DELTA, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        IF (CID IS NULL) THEN
        BEGIN
          IF (NULLTONUM(ICOUNTERVAL) <> 0) THEN
            INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
            VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

          UPDATE COUNTER SET
            DATECREATE = CURRENT_DATE + CURRENT_TIME,
            BDOCODE = :ABDOCODE
          WHERE ID = :COUNTERID;
        END
      END
      CID = 0;
    END

    IF (:CID IS NULL) THEN
    BEGIN
      COUNTERID = GEN_ID(GID, 1);

      OCOUNTERCODE = OCOUNTERCODE + 1;
      INSERT INTO COUNTER(ID, CODE, COUNTERTYPEID, BDOCODE, OWNERBDO)
      VALUES (:COUNTERID, :OCOUNTERCODE, :COUNTERTYPEID, :ABDOCODE, :AOWNERBDO);

      IF (NULLTONUM(ICOUNTERVAL) <> 0) THEN
        INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
        VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

      INSERT INTO CCARDCOUNTER(ID, CCARDID, COUNTERID, BDOCODE, OWNERBDO)
      VALUES (GEN_ID(GID, 1), :ICARDID, :COUNTERID, :ABDOCODE, :AOWNERBDO);
    END
  END
  ELSE
    IF (ICLIENTID IS NOT NULL) THEN
    BEGIN
      CID = NULL;
      FOR
        SELECT C.ID, CT.COUNTERALG
        FROM CLIENTCOUNTER CC
        JOIN COUNTER C ON CC.COUNTERID = C.ID
        JOIN COUNTERTYPE CT ON CT.ID = C.COUNTERTYPEID
        WHERE CC.CLIENTID = :ICLIENTID AND C.COUNTERTYPEID = :COUNTERTYPEID
        INTO :COUNTERID, :CTALG
      DO
      BEGIN
        SELECT SUM(CD.DELTA) FROM COUNTERD CD
        WHERE COUNTERID = :COUNTERID AND ((DTYPE = 1) OR (:CTALG = 0))
        INTO :DELTA;
        IF ((DELTA IS NULL) OR (:DELTA <> :ICOUNTERVAL)) THEN
        BEGIN
          IF (DELTA <> 0) THEN
            INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
            VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, -:DELTA, CURRENT_DATE, :ABDOCODE,  :AOWNERBDO, 1);

          IF (CID IS NULL) THEN
          BEGIN
            IF (NULLTONUM(:ICOUNTERVAL) <> 0) THEN
              INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
              VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

            UPDATE COUNTER SET
              DATECREATE = CURRENT_DATE + CURRENT_TIME,
              BDOCODE = :ABDOCODE
            WHERE ID = :COUNTERID;
          END
        END
        CID = 0;
      END

      IF (:CID IS NULL) THEN
      BEGIN
        COUNTERID = GEN_ID(GID, 1);
        OCOUNTERCODE = OCOUNTERCODE + 1;
        INSERT INTO COUNTER(ID, CODE, COUNTERTYPEID, BDOCODE, OWNERBDO)
        VALUES (:COUNTERID, :OCOUNTERCODE, :COUNTERTYPEID, :ABDOCODE, :AOWNERBDO);

        IF (NULLTONUM(:ICOUNTERVAL) <> 0) THEN
          INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, BDOCODE, OWNERBDO, DTYPE)
          VALUES (GEN_ID(GCOUNTERD, 1), :COUNTERID, :ICOUNTERVAL, CURRENT_DATE, :ABDOCODE, :AOWNERBDO, 1);

        INSERT INTO CLIENTCOUNTER(ID, CLIENTID, COUNTERID, BDOCODE, OWNERBDO)
        VALUES (GEN_ID(GID, 1), :ICLIENTID, :COUNTERID, :ABDOCODE, :AOWNERBDO);
      END
    END
END
^

/* Alter (CANCELSTORED) */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 AS
DECLARE VARIABLE TRANZCOUNT INTEGER;
DECLARE VARIABLE RMKID INTEGER;
DECLARE VARIABLE DOCID NUMERIC(18,0);
DECLARE VARIABLE WARECODE INTEGER;
DECLARE VARIABLE WAREMARK VARCHAR(100);
DECLARE VARIABLE TRANZTYPE INTEGER;
DECLARE VARIABLE QUANTITY INTEGER;
DECLARE VARIABLE ASPSCHEMECODE INTEGER;
DECLARE VARIABLE ASPSCHEMEID INTEGER;
DECLARE VARIABLE ASPVAL1 INTEGER;
DECLARE VARIABLE ASPVAL2 INTEGER;
DECLARE VARIABLE ASPVAL3 INTEGER;
DECLARE VARIABLE ASPVAL4 INTEGER;
DECLARE VARIABLE ASPVAL5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
DECLARE VARIABLE TRID NUMERIC(18,0);
DECLARE VARIABLE USERCODE INTEGER;
DECLARE VARIABLE TMPID NUMERIC(18,0);
BEGIN
  SELECT ID
  FROM RMK R
  WHERE R.CODE = :APOSNUMBER
  INTO RMKID;

  SELECT CODE
  FROM "USER"
  WHERE ID = :ASELLERID
  INTO USERCODE;

  EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES TRANZCOUNT;

  FOR
    SELECT ID
    FROM DOCUMENT D
    WHERE D.RMKID = :RMKID AND D.STATE = 3
    AND NOT EXISTS(SELECT 1 FROM TRAUTH TR WHERE TR.DOCUMENTID = D.ID)
    AND NOT EXISTS(SELECT 1 FROM TRANZT T WHERE T.DOCUMENTID = D.ID AND T.TRANZTYPE IN (40,41,45))
    AND NOT (D.ORDERIDENTIF IS NOT NULL AND D.ORDERIDENTIF <> '')

    INTO DOCID
    DO
    IF (NOT EXISTS(SELECT 1 FROM DOCUMENT DP
                   JOIN DOCKIND DPDK ON DPDK.ID = DP.DOCKINDID
                   WHERE DP.PREPAYEDDOCID = :DOCID AND DP.STATE = 1 AND DPDK.ECRRECEIPTTYPE = 0 AND
                   NOT EXISTS(
                   SELECT 1 FROM DOCUMENT DPR
                   JOIN DOCKIND DPRDK ON DPRDK.ID = DPR.DOCKINDID
                   WHERE DPR.DOCUMENTID = DP.ID AND DPRDK.ECRRECEIPTTYPE IN (1, 2)))) THEN
    BEGIN
         --    11  12, -   
      FOR
        SELECT WARECODE, WAREMARK, TRANZTYPE, QUANTITY,
        ASPECTSCHEME, ASPECTVALUE1, ASPECTVALUE2, ASPECTVALUE3, ASPECTVALUE4, ASPECTVALUE5
        FROM TRANZT T
        LEFT JOIN SPRT S ON S.CODE = T.WARECODE
        WHERE TRANZTYPE IN (11,12) AND T.DOCUMENTID = :DOCID
      INTO WARECODE, WAREMARK, TRANZTYPE, QUANTITY, ASPSCHEMECODE, ASPVAL1, ASPVAL2, ASPVAL3, ASPVAL4, ASPVAL5
      DO
      BEGIN
        WAREID = NULL;
        FLAGS = NULL;
           --  ID    
        IF (AWARECODETOMARK = 0) THEN
        BEGIN
          SELECT ID, FLAGS
          FROM SPRT
          WHERE CODE = :WARECODE
          INTO WAREID, FLAGS;
        END
        ELSE
        BEGIN
          SELECT FIRST 1 ID, FLAGS
          FROM SPRT
          WHERE MARK = :WAREMARK
          INTO :WAREID, :FLAGS;
        END
        --          ,  -
        IF (:ACONTROLSALEREMAIN = 1 OR :ACONTROLSALEREMAIN = 2 AND :FLAGS/64 <> (:FLAGS/32)/2.0) THEN
        BEGIN
          ASPSCHEMEID = NULL;
          SELECT ID
          FROM ASPSCHM
          WHERE CODE = :ASPSCHEMECODE
          INTO :ASPSCHEMEID;

          REMAINID = NULL;
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL1 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 1)) AND
          R.ASPECTVALUE2ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL2 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 2)) AND
          R.ASPECTVALUE3ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL3 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 3)) AND
          R.ASPECTVALUE4ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL4 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 4)) AND
          R.ASPECTVALUE5ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL5 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 5)) AND
          R.WAREID = :WAREID AND
          R.USEREMAIN = 1
          INTO
          REMAINID;

          IF (:REMAINID IS NULL) THEN
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = 0 AND
          R.ASPECTVALUE2ID = 0 AND
          R.ASPECTVALUE3ID = 0 AND
          R.ASPECTVALUE4ID = 0 AND
          R.ASPECTVALUE5ID = 0 AND
          R.WAREID = :WAREID
          INTO
          REMAINID;

          IF (:REMAINID IS NOT NULL) THEN
          INSERT INTO REMAIND (
           ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
          VALUES (
           GEN_ID(GREMAIND, 1), :REMAINID, -:QUANTITY, :DOCID, 0);
        END
      END

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID AND TRANZTYPE = 54
        INTO TMPID
        DO
          UPDATE TRANZT T SET
            TRANZDATE = :ATRANZDATE,
            TRANZHOUR = :ATRANZHOUR,
            TRANZTIME = :ATRANZTIME,
            TRANZTYPE = 56,
            T.SELLER = :USERCODE
          WHERE ID = :TMPID;

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID
        ORDER BY ID
        INTO TRID
        DO
        BEGIN
          UPDATE TRANZT SET
            TRANZCOUNT = :TRANZCOUNT
          WHERE ID = :TRID;
          TRANZCOUNT = TRANZCOUNT + 1;
        END

      DELETE FROM COUNTERD CD WHERE CD.DOCUMENTID = :DOCID;
      UPDATE DOCUMENT D SET
        STATE = 2,
        CLOSEDATE = :ATRANZDATE,
        CLOSETIME = :ATRANZTIME,
        CLOSEUSERID = :ASELLERID,
        SAVED = :ASAVED
      WHERE ID = :DOCID;
    END
END
^

/* Restore proc. body: APPENDCCARDDISCS */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERTYPE4 INTEGER,
ICOUNTERTYPE5 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERVAL4 DOUBLE PRECISION,
ICOUNTERVAL5 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ICOUNTERCODE4 NUMERIC(18),
ICOUNTERCODE5 NUMERIC(18))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18),
OCOUNTERCODE4 NUMERIC(18),
OCOUNTERCODE5 NUMERIC(18))
 AS
declare variable CARDID integer;
declare variable DOCODE integer;
declare variable GRPCARDID integer;
declare variable OLDCARDFLG integer;
declare variable DISCRATEID integer;
declare variable ACTDISCOBJID integer;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  OCOUNTERCODE4 = ICOUNTERCODE4;
  OCOUNTERCODE5 = ICOUNTERCODE5;

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE VAL = :ICARD
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      IF (EXISTS(SELECT 1 FROM CCARD WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID)) THEN
      BEGIN
        SELECT MAX(CODE) + 1 FROM CCARD WHERE GRPCCARDID = :GRPCARDID INTO ICARDCODE;
        IF (ICARDCODE IS NULL) THEN
          ICARDCODE = 1;
      END
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        CODE = :ICARDCODE,
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
        EXIT;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        PLAN (A INDEX (IDX_ACTDISCOBJ2))
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;

        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCARDFLG = 1) THEN
        FOR SELECT A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID
        DO
          UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE4 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE4, :ICOUNTERVAL4, :CARDID, NULL, ICOUNTERCODE4, 45)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE4;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE5 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE5, :ICOUNTERVAL5, :CARDID, NULL, ICOUNTERCODE5, 46)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE5;
END
^

/* Restore proc. body: APPENDCLIENT */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ILEGALZIPCODE VARCHAR(10),
ILEGALCITY VARCHAR(100),
ILEGALADDRESS VARCHAR(255))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,        CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE,   BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,       WEB,
                          TELEPHONE, INN,       DOCUMENT, OKPO,     OKPD,  DELETED,  LEGALZIPCODE,
                          LEGALCITY, LEGALADDRESS)

      VALUES (:CLIENTID,   :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT, :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE,   :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,       :IWEB,
              :ITELEPHONE, :IINN,       :IDOCUMENT,   :IOKPO,     :IOKPD, :IDELETED,  :ILEGALZIPCODE,
              :ILEGALCITY, :ILEGALADDRESS);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED,
          LEGALZIPCODE = :ILEGALZIPCODE,
          LEGALCITY = :ILEGALCITY,
          LEGALADDRESS = :ILEGALADDRESS
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCLIENT = 1) THEN
      FOR SELECT A.ID
      FROM ACTDISCOBJ A
      WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
            A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
            A.DISCRATEID > 0
      INTO ACTDISCOBJID
      DO
        UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;
END
^

/* Restore proc. body: DAYS_IN_MONTH */
ALTER PROCEDURE DAYS_IN_MONTH(IYEAR INTEGER,
IMONTH INTEGER)
 RETURNS(DAYS INTEGER)
 AS
DECLARE VARIABLE D DATE;
BEGIN
  IF (IMONTH = 12) THEN
    IMONTH = 1;
  ELSE
    IMONTH = IMONTH + 1;

  DAYS = EXTRACT(DAY FROM CAST(IYEAR||'-'||IMONTH||'-01' AS DATE) - 1);
  SUSPEND;
END
^

/* Restore proc. body: GET_PERIOD_FOR_ALG */
ALTER PROCEDURE GET_PERIOD_FOR_ALG(IALG INTEGER,
ICURDATE DATE)
 RETURNS(DATE1 DATE,
DATE2 DATE)
 AS
DECLARE VARIABLE D INTEGER;
DECLARE VARIABLE M INTEGER;
DECLARE VARIABLE Y INTEGER;
BEGIN

  IF (IALG = 1) THEN --cnaLastWeek
  BEGIN
    DATE2 = ICURDATE;
    DATE1 = ICURDATE - 6;
  END
  ELSE IF (IALG = 2) THEN  --cnaLastMonth
  BEGIN
    DATE2 = ICURDATE;
    Y = EXTRACT(YEAR FROM DATE2);
    M = EXTRACT(MONTH FROM DATE2);
    D = EXTRACT(DAY FROM DATE2);
    IF (M = 1) THEN
    BEGIN
      M = 12;
      Y = Y - 1;
    END
    ELSE
      M = M - 1;
    SELECT CASE WHEN :D > DM.DAYS THEN DM.DAYS ELSE :D END FROM DAYS_IN_MONTH(:Y, :M) DM INTO D;
    DATE1 = CAST(D||'.'||M||'.'||Y AS DATE) + 1;
  END
  ELSE IF (IALG = 3) THEN  --cnaLastYear
  BEGIN
    DATE2 = ICURDATE;
    Y = EXTRACT(YEAR FROM DATE2) - 1;
    M = EXTRACT(MONTH FROM DATE2);
    D = EXTRACT(DAY FROM ICURDATE);
    SELECT CASE WHEN :D > DM.DAYS THEN DM.DAYS ELSE :D END FROM DAYS_IN_MONTH(:Y, :M) DM INTO D;
    DATE1 = CAST(D||'.'||M||'.'||Y AS DATE) + 1;
  END
  ELSE IF (IALG = 4) THEN  --cnaCurWeek
  BEGIN
    DATE2 = ICURDATE;
    DATE1 = DATE2 - EXTRACT(WEEKDAY FROM DATE2 - 1); /*  0=    Delphi ()*/
  END
  ELSE IF (IALG = 5) THEN  --cnaCurMonth
  BEGIN
    DATE2 = ICURDATE;
    DATE1 = '01.'||EXTRACT(MONTH FROM DATE2)||'.'||EXTRACT(YEAR FROM DATE2);
  END
  ELSE IF (IALG = 6) THEN  --cnaCurYear
  BEGIN
    DATE2 = ICURDATE;
    DATE1 = '01.01.'||EXTRACT(YEAR FROM DATE2);
  END
  ELSE IF (IALG = 7) THEN  --cnaCurQuarter
  BEGIN
    DATE2 = ICURDATE;
    M = ((EXTRACT(MONTH FROM DATE2) - 1) / 3) * 3 + 1;
    DATE1 = '01.'||M||'.'||EXTRACT(YEAR FROM DATE2);
  END
  ELSE IF (IALG = 8) THEN  --cnaLast3Month
  BEGIN
    DATE2 = ICURDATE;
    Y = EXTRACT(YEAR FROM DATE2);
    M = EXTRACT(MONTH FROM DATE2);
    D = EXTRACT(DAY FROM ICURDATE);
    IF (M < 4) THEN
    BEGIN
      M = M + 9;
      Y = Y - 1;
    END
    ELSE
      M = M - 3;
    SELECT CASE WHEN :D > DM.DAYS THEN DM.DAYS ELSE :D END FROM DAYS_IN_MONTH(:Y, :M) DM INTO D;
    DATE1 = CAST(D||'.'||M||'.'||Y AS DATE) + 1;
  END
  ELSE IF (IALG = 9) THEN  --cnaCurHalfYear
  BEGIN
    DATE2 = ICURDATE;
    DATE1 = '01.'|| IIF(EXTRACT(MONTH FROM DATE2) < 7, 1, 7)||'.'||EXTRACT(YEAR FROM DATE2);
  END
  ELSE IF (IALG = 10) THEN  --cnaLast6Month
  BEGIN
    DATE2 = ICURDATE;
    Y = EXTRACT(YEAR FROM DATE2);
    M = EXTRACT(MONTH FROM DATE2);
    D = EXTRACT(DAY FROM ICURDATE);
    IF (M < 7) THEN
    BEGIN
      M = M + 6;
      Y = Y - 1;
    END
    ELSE
      M = M - 6;
    SELECT CASE WHEN :D > DM.DAYS THEN DM.DAYS ELSE :D END FROM DAYS_IN_MONTH(:Y, :M) DM INTO D;
    DATE1 = CAST(D||'.'||M||'.'||Y AS DATE) + 1;
  END
  ELSE IF (IALG = 11) THEN   --cnaPrevWeek
  BEGIN
    DATE2 = ICURDATE - EXTRACT(WEEKDAY FROM ICURDATE - 1) - 1;
    DATE1 = DATE2 - 6;
  END
  ELSE IF (IALG = 12) THEN   --cnaPrevMonth
  BEGIN
    Y = EXTRACT(YEAR FROM ICURDATE);
    M = EXTRACT(MONTH FROM ICURDATE);
    IF (M = 1) THEN
    BEGIN
      M = 12;
      Y = Y - 1;
    END
    ELSE
      M = M - 1;
    DATE1 = '01.'||M||'.'||Y;
    SELECT DAYS FROM DAYS_IN_MONTH(:Y, :M) INTO D;
    DATE2 = D||'.'||M||'.'||Y;
  END
  ELSE IF (IALG = 13) THEN   --cnaPrevQuarter
  BEGIN
    M = ((EXTRACT(MONTH FROM ICURDATE) - 1) / 3) * 3 + 1;
    DATE1 = '01.'||M||'.'||EXTRACT(YEAR FROM ICURDATE);
    Y = EXTRACT(YEAR FROM DATE1);
    M = EXTRACT(MONTH FROM DATE1);
    IF (M < 4) THEN
    BEGIN
      M = 10;
      Y = Y - 1;
    END
    ELSE
      M = M - 3;
    DATE1 = '01.'||M||'.'||Y;
    M = M + 2;
    SELECT DAYS FROM DAYS_IN_MONTH(:Y, :M) INTO D;
    DATE2 = D||'.'||M||'.'||Y;
  END
  ELSE IF (IALG = 14) THEN   --cnaPrevHalfYear
  BEGIN
    Y = EXTRACT(YEAR FROM ICURDATE);
    M = EXTRACT(MONTH FROM ICURDATE);
    IF (M < 7) THEN
    BEGIN
      M = 7;
      Y = Y - 1;
    END
    ELSE
      M = 1;
    DATE1 = '01.'||M||'.'||Y;
    M = M + 5;
    SELECT DAYS FROM DAYS_IN_MONTH(:Y, :M) INTO D;
    DATE2 = D||'.'||M||'.'||Y;
  END
  ELSE IF (IALG = 15) THEN   --cnaPrevYear
  BEGIN
    Y = EXTRACT(YEAR FROM ICURDATE) - 1;
    DATE1 = '01.01.'||Y;
    DATE2 = '31.12.'||Y;
  END
  ELSE IF (IALG = 16) THEN  --cnaCurDay
  BEGIN
    DATE2 = ICURDATE;
    DATE1 = ICURDATE;
  END
  /*ELSE
    EXCEPTION E_INCORRECT_COUNTER_ALG;  */
  SUSPEND;
END
^

/* Alter Procedure... */
/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERTYPE4 INTEGER,
ICOUNTERTYPE5 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERVAL4 DOUBLE PRECISION,
ICOUNTERVAL5 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ICOUNTERCODE4 NUMERIC(18),
ICOUNTERCODE5 NUMERIC(18))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18),
OCOUNTERCODE4 NUMERIC(18),
OCOUNTERCODE5 NUMERIC(18))
 AS
declare variable CARDID integer;
declare variable DOCODE integer;
declare variable GRPCARDID integer;
declare variable OLDCARDFLG integer;
declare variable DISCRATEID integer;
declare variable ACTDISCOBJID integer;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  OCOUNTERCODE4 = ICOUNTERCODE4;
  OCOUNTERCODE5 = ICOUNTERCODE5;

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE VAL = :ICARD
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      IF (EXISTS(SELECT 1 FROM CCARD WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID)) THEN
      BEGIN
        SELECT MAX(CODE) + 1 FROM CCARD WHERE GRPCCARDID = :GRPCARDID INTO ICARDCODE;
        IF (ICARDCODE IS NULL) THEN
          ICARDCODE = 1;
      END
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        CODE = :ICARDCODE,
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
        EXIT;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        PLAN (A INDEX (IDX_ACTDISCOBJ2))
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;

        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCARDFLG = 1) THEN
        FOR SELECT A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID
        DO
          UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE4 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE4, :ICOUNTERVAL4, :CARDID, NULL, ICOUNTERCODE4, 45)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE4;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE5 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE5, :ICOUNTERVAL5, :CARDID, NULL, ICOUNTERCODE5, 46)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE5;
END
^

/* Alter (APPENDCLIENT) */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ILEGALZIPCODE VARCHAR(10),
ILEGALCITY VARCHAR(100),
ILEGALADDRESS VARCHAR(255))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,        CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE,   BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,       WEB,
                          TELEPHONE, INN,       DOCUMENT, OKPO,     OKPD,  DELETED,  LEGALZIPCODE,
                          LEGALCITY, LEGALADDRESS)

      VALUES (:CLIENTID,   :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT, :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE,   :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,       :IWEB,
              :ITELEPHONE, :IINN,       :IDOCUMENT,   :IOKPO,     :IOKPD, :IDELETED,  :ILEGALZIPCODE,
              :ILEGALCITY, :ILEGALADDRESS);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED,
          LEGALZIPCODE = :ILEGALZIPCODE,
          LEGALCITY = :ILEGALCITY,
          LEGALADDRESS = :ILEGALADDRESS
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCLIENT = 1) THEN
      FOR SELECT A.ID
      FROM ACTDISCOBJ A
      WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
            A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
            A.DISCRATEID > 0
      INTO ACTDISCOBJID
      DO
        UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;
END
^

/* MAN */

EXECUTE BLOCK
AS
DECLARE VARIABLE B INTEGER;
BEGIN
  SELECT FIRST 1 1 FROM HALL INTO B;
  IF (B > 0) THEN
  BEGIN
    EXECUTE PROCEDURE MERGE_SETTING('ViewPartsSelectRec', '5; ;7|6; .;7|7; ;8|14;;10|15;;10|0;;14|1;;5|2;;10|3;;8|4;;9|8;/..;12', NULL, NULL, 21);
    EXECUTE PROCEDURE MERGE_SETTING('ViewPartsRestoreRec', '5; ;7|6; .;7|7; ;8|0;;14|1;;5|2;;10|3;;8|4;;9|8;/..;12|10;;10|9; ;10', NULL, NULL, 21);
  END
END^
COMMIT^
/* MAN */

/* TEXT BLOCK END */

/* Convert 4.8.6 */

ALTER TABLE RMK DROP CONSTRAINT FK_RMK_HALL;

ALTER TABLE ACTDISCOBJ ADD HALLID RREF DEFAULT -1;

ALTER TABLE ACTDISCOBJ ADD HALLPLACEID RREF DEFAULT -1;

ALTER TABLE CLIENT ADD PICTURE FBLOB1024;

ALTER TABLE CUSTOMDB ADD COPYLOGTOBDS FINT;

ALTER TABLE DISCRATE ADD DELETED FLAG DEFAULT 0;

ALTER TABLE DOCUMENT ADD EXTID FVARCHAR40 COLLATE WIN1251;

/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE APPENDACTDISCOBJ(ICODE INTEGER,
ICLIENTCODE INTEGER,
ICLIENTCLASSIFIERCODE INTEGER,
ICARDCODE INTEGER,
ICCARDCLASSIFIERCODE INTEGER,
IPAYMENTCODE INTEGER,
IWARECODE INTEGER,
IWAREMARK VARCHAR(20),
IWARECODETOMARK INTEGER,
IASPECTVALUE1CODE INTEGER,
IASPECTVALUE2CODE INTEGER,
IASPECTVALUE3CODE INTEGER,
IASPECTVALUE4CODE INTEGER,
IASPECTVALUE5CODE INTEGER,
IWARECLASSIFIERCODE INTEGER,
IHALLCODE INTEGER,
IHALLPLACECODE INTEGER,
IDISCRATECODE INTEGER,
IACTSCRIPTCODE INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

CREATE PROCEDURE GET_ASPECTVALUEIDS_BY_CODES(IASPECTSCHEMEID INTEGER,
IASPECTVALUE1CODE INTEGER,
IASPECTVALUE2CODE INTEGER,
IASPECTVALUE3CODE INTEGER,
IASPECTVALUE4CODE INTEGER,
IASPECTVALUE5CODE INTEGER)
 RETURNS(ASPECTVALUE1ID INTEGER,
ASPECTVALUE2ID INTEGER,
ASPECTVALUE3ID INTEGER,
ASPECTVALUE4ID INTEGER,
ASPECTVALUE5ID INTEGER,
ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^


/* Create Foreign Key... */
SET TERM ; ^

RECONNECT;

ALTER TABLE RMK ADD CONSTRAINT FK_RMK_HALL FOREIGN KEY (HALLID) REFERENCES HALL (ID) ON DELETE SET NULL;

/*  Empty APPENDWARE for APPEND_WARE_DISC(param list change)  */
SET TERM ^ ;

ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(100),
ICERTIFICAT VARCHAR(100),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
IGTD VARCHAR(100),
ILOADWAREDISC INTEGER = 1)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/*  Empty APPEND_SUPERMAG_DISC for APPENDDISCRATE(param list change)  */
ALTER PROCEDURE APPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/*  Empty APPEND_WARE_DISC for APPENDDISCRATE(param list change)  */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/*  Empty APPENDACTDISC for APPENDDISCRATE(param list change)  */
ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG DOUBLE PRECISION,
IPRICEEND DOUBLE PRECISION,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IQUANTITYRECBEG DOUBLE PRECISION,
IQUANTITYRECEND DOUBLE PRECISION,
IQUANTITYWAREBEG DOUBLE PRECISION,
IQUANTITYWAREEND DOUBLE PRECISION,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
ISUMMWAREBEG DOUBLE PRECISION,
ISUMMWAREEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/*  Empty APPENDCCARDDISCS for APPENDDISCRATE(param list change)  */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERTYPE4 INTEGER,
ICOUNTERTYPE5 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERVAL4 DOUBLE PRECISION,
ICOUNTERVAL5 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ICOUNTERCODE4 NUMERIC(18),
ICOUNTERCODE5 NUMERIC(18))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18),
OCOUNTERCODE4 NUMERIC(18),
OCOUNTERCODE5 NUMERIC(18))
 AS
 BEGIN SUSPEND; END
^

/*  Empty APPENDCLIENT for APPENDDISCRATE(param list change)  */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ILEGALZIPCODE VARCHAR(10),
ILEGALCITY VARCHAR(100),
ILEGALADDRESS VARCHAR(255))
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
 BEGIN SUSPEND; END
^

/*  Empty APPENDFIXDISCS for APPENDDISCRATE(param list change)  */
ALTER PROCEDURE APPENDFIXDISCS(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IPREFIX VARCHAR(40),
IVAL VARCHAR(100),
ITYPE INTEGER,
IDATERANGEBEG DATE,
IDATERANGEEND DATE,
IDESTINATION INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/*  Empty APPENDREMAIN for APPENDDISCRATE(param list change)  */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER,
ILOADWAREDISC INTEGER = 1)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/*  Empty APPENDPILOT for APPENDWARE(param list change)  */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/*  Empty GET_ACTSCRIPT for GET_ACTSCRIPT_CUSTOM(param list change)  */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN SUSPEND; END
^

/*  Empty GET_DISCOUNT for GET_DISCOUNT_CUSTOM(param list change)  */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255))
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
DISCRATECLASSIFIERID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure APPEND_WARE_DISC with new param-list */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER,
IDELETEDDISCRATE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure APPENDDISCRATE with new param-list */
ALTER PROCEDURE APPENDDISCRATE(IPARENTID INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
IBEGVAL VARCHAR(100),
IENDVAL VARCHAR(100),
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
IISFOLDER INTEGER,
IDISCCOLLOPER INTEGER,
IGRPACTDISCID INTEGER,
ICODE INTEGER,
IDELETED INTEGER,
IPARENTCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure APPENDWARE with new param-list */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(100),
ICERTIFICAT VARCHAR(100),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
IGTD VARCHAR(100),
ILOADWAREDISC INTEGER = 1,
IDELETEDDISCRATE INTEGER = 0)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure GET_ACTSCRIPT_CUSTOM with new param-list */
ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255),
IHALLID INTEGER,
IHALLPLACEID INTEGER)
 RETURNS(CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure GET_DISCOUNT_CUSTOM with new param-list */
ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255),
IHALLID INTEGER,
IHALLPLACEID INTEGER)
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
DISCRATECLASSIFIERID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
 BEGIN SUSPEND; END
^

/* Alter Procedure... */
ALTER PROCEDURE APPENDDISCRATE(IPARENTID INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
IBEGVAL VARCHAR(100),
IENDVAL VARCHAR(100),
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
IISFOLDER INTEGER,
IDISCCOLLOPER INTEGER,
IGRPACTDISCID INTEGER,
ICODE INTEGER,
IDELETED INTEGER,
IPARENTCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
DECLARE VARIABLE DISCRATECODE INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DISTINATION INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE PARENTID INTEGER;
BEGIN

  ERRORCODE = 0;
  WHERECLAUSE = '';

  IF (IVAL = '') THEN
    IVAL = '0';

  IF (IWARECODE <> '') THEN
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID
      FROM SPRT
      WHERE CODE = :IWARECODE
      INTO WAREID;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID
      FROM SPRT
      WHERE MARK = :IWARECODE
      INTO WAREID;
    END

    IF (WAREID IS NULL) THEN
    BEGIN
      ERRORCODE = 16;
      EXIT;
    END
  END

  IF (IPARENTCODE IS NOT NULL) THEN
  BEGIN
    IF (IPARENTCODE = 0) THEN
      PARENTID = 0;
    ELSE
      SELECT ID FROM DISCRATE
      WHERE CODE = :IPARENTCODE
      INTO PARENTID;

    IF (PARENTID IS NULL) THEN
    BEGIN
      ERRORCODE = 54;
      EXIT;
    END
  END
  ELSE
    PARENTID = IPARENTID;

  DISTINATION = IDESTINATION;
  IF (DISTINATION IS NULL) THEN
    IF (IGRPACTDISCID IS NULL) THEN
      DISTINATION = 0;
    ELSE
      BEGIN
        SELECT FIRST 1 D.DESTINATION
        FROM ACTDISC A LEFT JOIN DISCRATE D ON
                       D.ID = A.DISCRATEID
        WHERE A.GRPACTDISCID = :IGRPACTDISCID
        INTO DISTINATION;

        IF (DISTINATION IS NULL) THEN
          DISTINATION = 0;
      END

  IF (ICODE IS NULL OR (ICODE = 0)) THEN
    SELECT FIRST 1 D.ID
    FROM DISCRATE D LEFT JOIN ACTDISC A ON
                    D.ID = A.DISCRATEID
    WHERE D.PARENTID = :IPARENTID AND D.VAL =  :IVAL  AND
          D."TYPE" = :ITYPE       AND D.NAME =  :INAME  AND
          D.KIND = :IKIND         AND D.DESTINATION = :IDESTINATION
    INTO ID;
  ELSE
    SELECT ID FROM DISCRATE
    WHERE CODE = :ICODE
    INTO ID;

  IF (ID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);

    IF (ICODE IS NULL OR (ICODE = 0)) THEN
    BEGIN
      DISCRATECODE = NULL;
      SELECT FIRST 1 CODE
      FROM DISCRATE
      WHERE CODE < 100000000
      ORDER BY CODE DESC
      INTO DISCRATECODE;

      IF (DISCRATECODE IS NULL) then
        DISCRATECODE = 1;
      ELSE
        DISCRATECODE = DISCRATECODE + 1;
    END
    ELSE
      DISCRATECODE = ICODE;

    INSERT INTO DISCRATE (ID, PARENTID, CODE, NAME, TEXT,
                          VAL, BEGVAL, ENDVAL,
                          WAREID, "TYPE", DESTINATION, KIND,
                          ISFOLDER, DISCCOLLOPER, DELETED)
    VALUES (:ID, :PARENTID, :DISCRATECODE, :INAME, :ITEXT,
            :IVAL, :IBEGVAL, :IENDVAL, :WAREID, :ITYPE, :DISTINATION, :IKIND,
            :IISFOLDER, :IDISCCOLLOPER, :IDELETED);
  END
  ELSE
    IF (ICODE > 0) THEN
    BEGIN
      UPDATE DISCRATE
      SET PARENTID = :PARENTID,
          CODE = :ICODE,
          NAME = :INAME,
          TEXT = :ITEXT,
          VAL = :IVAL,
          BEGVAL = :IBEGVAL,
          ENDVAL = :IENDVAL,
          "TYPE" = :ITYPE,
          DESTINATION = :DISTINATION,
          KIND = :IKIND,
          ISFOLDER = :IISFOLDER,
          DISCCOLLOPER = :IDISCCOLLOPER,
          DELETED = :IDELETED
      WHERE (ID = :ID);
    END
END
^

/* Alter (APPEND_SUPERMAG_DISC) */
ALTER PROCEDURE APPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
IDELETEDDISCRATE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IGRPACTDISCCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IGRPACTDISCCODE
    INTO GRPACTDISCID;

    IF (GRPACTDISCID IS NULL) THEN
    BEGIN
      GRPACTDISCID = GEN_ID(GID, 1);
      INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
      VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
    END
    ELSE
      UPDATE GRPACTDISC SET
        DELETED = :IDELETED
      WHERE ID = :GRPACTDISCID;

    IF (IWAREID > 0) THEN
    BEGIN
      SELECT ID, DELETED
      FROM ACTDISCOBJ
      WHERE WAREID = :IWAREID AND GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1
      INTO ACTDISCOBJID, DEL;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), :IWAREID, -1, -1, -1, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :ACTDISCOBJID;
    END
    ELSE
    BEGIN
      SELECT ID, DELETED
      FROM ACTDISCOBJ
      WHERE GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1 AND WAREID = -1
      INTO ACTDISCOBJID, DEL;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), -1, -1, -1, -1, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :ACTDISCOBJID;
    END
  END
  ELSE
    GRPACTDISCID = IGRPACTDISCID;

  IF (IAPPENDTYPE = 0) THEN   -- DiscCli
    BEGIN
      WHERECLAUSE = '';

      IF (ICARDPREFIXBEG IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG = '''|| :ICARDPREFIXBEG ||'''';

      IF (ICARDPREFIXEND IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND = '''|| :ICARDPREFIXEND ||'''';

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.CONDITIONID
                          FROM CONDITION C LEFT JOIN ACTDISC A ON
                                           C.ID = A.CONDITIONID
                          WHERE A.GRPACTDISCID = '|| :GRPACTDISCID ||' AND
                                C.SUMMBEG IS NULL '|| WHERECLAUSE ||'
                          PLAN JOIN (C INDEX (IDX_C_CARDPRBEG,IDX_C_CARDPREND),A INDEX (FK_AD_CONDITION,FK_AD_GRPACTDISC))'
      INTO :ACTDISCID, :CONDITIONID;
    END
  ELSE
    IF (IAPPENDTYPE = 1) THEN   -- CliClass

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                       C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
            C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
            C.QUANTITYBEG IS NULL
      INTO ACTDISCID, CONDITIONID;

    ELSE
      IF (IAPPENDTYPE = 2) THEN   -- DiscSumm
        BEGIN

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.SUMMBEG = :ISUMMBEG AND
                C.TIMEBEG = :ITIMEBEG AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

          IF (IDELETECURRENT = 1) THEN
            IF (ACTDISCID IS NULL) THEN
              EXIT;
            ELSE
              BEGIN
                DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                EXIT;
              END
        END
      ELSE
        IF (IAPPENDTYPE = 3) THEN   -- DiscCard

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.QUANTITYBEG = :IQUANTITYBEG    AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

        ELSE
          IF (IAPPENDTYPE = 4) THEN   -- CliSumm

            SELECT FIRST 1 A.ID, A.CONDITIONID
            FROM CONDITION C LEFT JOIN ACTDISC A ON
                             C.ID = A.CONDITIONID
            WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                  C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                  C.SUMMBEG = :ISUMMBEG             AND
                  C.TIMEBEG IS NULL
            INTO ACTDISCID, CONDITIONID;

          ELSE
            IF (IAPPENDTYPE = 5) THEN  -- PluDisc  ClasDisc

              SELECT FIRST 1 A.ID, A.CONDITIONID
              FROM CONDITION C LEFT JOIN ACTDISC A ON
                               C.ID = A.CONDITIONID
              WHERE A.GRPACTDISCID  = :GRPACTDISCID
              INTO ACTDISCID, CONDITIONID;

            ELSE
              IF (IAPPENDTYPE = 6) THEN  -- DiscSum 
                BEGIN

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                        C.SUMMRECBEG = :ISUMMRECBEG      AND
                        C.TIMEBEG = :ITIMEBEG            AND
                        C.CARDPREFIXBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                  IF (IDELETECURRENT = 1) THEN
                    IF (ACTDISCID IS NULL) THEN
                      EXIT;
                    ELSE
                    BEGIN
                      DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                      EXIT;
                    END
                END
              ELSE
                IF (IAPPENDTYPE = 7) THEN  -- CliSum 

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                        C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                        C.SUMMRECBEG = :ISUMMRECBEG
                  INTO ACTDISCID, CONDITIONID;

                ELSE
                  BEGIN
                    ERRORCODE = 90; --  IAPPENDTYPE
                    EXIT;
                  END

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, NULL, NULL, NULL, NULL, NULL, NULL,
                                    :IQUANTITYBEG, :IQUANTITYEND,  NULL, NULL, NULL, NULL,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,  NULL, NULL,
                                    :ITIMEBEG, :ITIMEEND, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, NULL, NULL,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID, NULL, :IDELETEDDISCRATE, NULL)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      IF (ICODE IS NULL) THEN
      BEGIN
        SELECT FIRST 1 CODE
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        ORDER BY GRPACTDISCID DESC, CODE DESC
        INTO ICODE;

        IF (ICODE IS NULL) THEN
          ICODE = 1;
        ELSE
          ICODE = ICODE + 1;
      END

      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (GEN_ID(GID, 1), :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
       NAME = :INAME,
       CONDITIONID = :CONDITIONID,
       DISCRATEID = :DISCRATEID,
       DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPEND_WARE_DISC) */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER,
IDELETEDDISCRATE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TID INTEGER;
BEGIN

  IF (IDISCVALUE <> '') THEN
  BEGIN

    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, '  ', '  ',
                                     :IDISCTYPE, :IDISCVALUE, NULL, NULL, '', NULL,
                                     0, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
          RETURNING_VALUES ERRORCODE, TDISCRATEID;

    SELECT FIRST 1 A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL
    INTO TACTDISCOBJID;

    IF (TACTDISCOBJID IS NULL) THEN
      INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                               ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                               PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
      VALUES   (GEN_ID(GID, 1), :IWAREID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                -1, :TDISCRATEID, NULL, 0);
    ELSE
    BEGIN
      UPDATE ACTDISCOBJ SET
         DISCRATEID = :TDISCRATEID,
         DELETED = 0
      WHERE ID = :TACTDISCOBJID;

      FOR SELECT A.ID
      FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
      WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
            A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
            A.ASPECTVALUE1ID IS NULL AND
            A.ASPECTVALUE2ID IS NULL AND
            A.ASPECTVALUE3ID IS NULL AND
            A.ASPECTVALUE4ID IS NULL AND
            A.ASPECTVALUE5ID IS NULL AND
            A.ID <> :TACTDISCOBJID AND A.DELETED >= 0
      INTO TID
      DO
        UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :TID;
    END
  END
  ELSE
  BEGIN
    FOR SELECT A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                    D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL AND
          A.DELETED >= 0
    INTO TID
    DO
      UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :TID;
  END
END
^

/* Alter (APPENDACTDISC) */
ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG DOUBLE PRECISION,
IPRICEEND DOUBLE PRECISION,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IQUANTITYRECBEG DOUBLE PRECISION,
IQUANTITYRECEND DOUBLE PRECISION,
IQUANTITYWAREBEG DOUBLE PRECISION,
IQUANTITYWAREEND DOUBLE PRECISION,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
ISUMMWAREBEG DOUBLE PRECISION,
ISUMMWAREEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER,
IDELETEDDISCRATE INTEGER,
IDISCRATECODE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :IGRPACTDISCCODE
  INTO GRPACTDISCID;

  IF (GRPACTDISCID IS NULL) THEN
   BEGIN
      ERRORCODE = 1;
      EXIT;
    END

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :GRPACTDISCID
  PLAN (ACTDISC INDEX (UNQ_ACTDISC))
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, :IDATEBEG, :IDATEEND,
                                    :IDAYBEG, :IDAYEND, :IPRICEBEG, :IPRICEEND,
                                    :IQUANTITYBEG, :IQUANTITYEND,
                                    :IQUANTITYRECBEG, :IQUANTITYRECEND,
                                    :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,
                                    :ISUMMWAREBEG, :ISUMMWAREEND, :ITIMEBEG, :ITIMEEND,
                                    :IWARECODE, :IWARECODETOMARK)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (IDISCRATEPARENTCODE IS NOT NULL) THEN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEPARENTCODE AND ISFOLDER > 0
      INTO IDISCRATEPARENTID;

  IF (IDISCRATECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DISCRATE
    WHERE CODE = :IDISCRATECODE
    INTO DISCRATEID;

    IF (DISCRATEID IS NULL) THEN
    BEGIN
      ERRORCODE = 51;
      EXIT;
    END
  END
  ELSE
    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                     :ITYPE, :IVAL, NULL, NULL, '', 0,
                                     :IDESTINATION, 2, 0, NULL, :GRPACTDISCID, :IDISCRATECODE, :IDELETEDDISCRATE, NULL)
        RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERTYPE4 INTEGER,
ICOUNTERTYPE5 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERVAL4 DOUBLE PRECISION,
ICOUNTERVAL5 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ICOUNTERCODE4 NUMERIC(18),
ICOUNTERCODE5 NUMERIC(18),
IDELETEDDISCRATE INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18),
OCOUNTERCODE4 NUMERIC(18),
OCOUNTERCODE5 NUMERIC(18))
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE DOCODE INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  OCOUNTERCODE4 = ICOUNTERCODE4;
  OCOUNTERCODE5 = ICOUNTERCODE5;

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE VAL = :ICARD
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      IF (EXISTS(SELECT 1 FROM CCARD WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID)) THEN
      BEGIN
        SELECT MAX(CODE) + 1 FROM CCARD WHERE GRPCCARDID = :GRPCARDID INTO ICARDCODE;
        IF (ICARDCODE IS NULL) THEN
          ICARDCODE = 1;
      END
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        CODE = :ICARDCODE,
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
        EXIT;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        PLAN (A INDEX (IDX_ACTDISCOBJ2))
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;

        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCARDFLG = 1) THEN
        FOR SELECT A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID
        DO
          UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE4 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE4, :ICOUNTERVAL4, :CARDID, NULL, ICOUNTERCODE4, 45)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE4;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE5 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE5, :ICOUNTERVAL5, :CARDID, NULL, ICOUNTERCODE5, 46)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE5;
END
^

/* Alter (APPENDCLIENT) */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ILEGALZIPCODE VARCHAR(10),
ILEGALCITY VARCHAR(100),
ILEGALADDRESS VARCHAR(255),
IDELETEDDISCRATE INTEGER,
IPICTURE BLOB SEGMENT SIZE 1024)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,        CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE,   BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,       WEB,
                          TELEPHONE, INN,       DOCUMENT, OKPO,     OKPD,  DELETED,  LEGALZIPCODE,
                          LEGALCITY, LEGALADDRESS, PICTURE)

      VALUES (:CLIENTID,   :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT, :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE,   :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,       :IWEB,
              :ITELEPHONE, :IINN,       :IDOCUMENT,   :IOKPO,     :IOKPD, :IDELETED,  :ILEGALZIPCODE,
              :ILEGALCITY, :ILEGALADDRESS, :IPICTURE);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED,
          LEGALZIPCODE = :ILEGALZIPCODE,
          LEGALCITY = :ILEGALCITY,
          LEGALADDRESS = :ILEGALADDRESS,
          PICTURE = :IPICTURE
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = 0
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCLIENT = 1) THEN
      FOR SELECT A.ID
      FROM ACTDISCOBJ A
      WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
            A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
            A.DISCRATEID > 0
      INTO ACTDISCOBJID
      DO
        UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;
END
^

/* Alter (APPENDFIXDISCS) */
ALTER PROCEDURE APPENDFIXDISCS(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IPREFIX VARCHAR(40),
IVAL VARCHAR(100),
ITYPE INTEGER,
IDATERANGEBEG DATE,
IDATERANGEEND DATE,
IDESTINATION INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDELETEDDISCRATE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN

  ERRORCODE = 0;

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :IGRPACTDISCID
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL,
                                    :IPREFIX, :IPREFIX,
                                    0, :IDATERANGEBEG, :IDATERANGEEND,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME , :ITEXT, :ITYPE,
                                   :IVAL, NULL, NULL, '', 0, :IDESTINATION,
                                   1, 0, NULL, :IGRPACTDISCID, NULL, :IDELETEDDISCRATE, NULL)
        RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :IGRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(100),
ICERTIFICAT VARCHAR(100),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
IGTD VARCHAR(100),
ILOADWAREDISC INTEGER = 1,
IDELETEDDISCRATE INTEGER = 0)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
DECLARE VARIABLE TISWARE INTEGER;
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TDELETED INTEGER;
DECLARE VARIABLE TDELETEDISWARE INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE HIERLEVEL INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE BARC VARCHAR(40);
BEGIN
  ERRORCODE = 0;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      IF (IEXCHANGEFORMAT <> 1) THEN
        BEGIN
          ERRORCODE = 8;
          EXIT;
        END
      ELSE
        IFIRSTASPECTVALUE = 0;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  HIERLEVEL = 0;
  IF (IPARENTCODE <> '') THEN
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (CODE = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (MARK = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
  END
  ELSE
    PARENTID = 0;
  HIERLEVEL = HIERLEVEL + 1;

  IF (IISWARE <> 1) THEN
    BEGIN
      IISWARE = -2147483647 + HIERLEVEL;
    END

  IF ((PARENTID IS NULL) OR (TISWARE > 0)) THEN
  BEGIN
    ERRORCODE = 2;
    EXIT;
  END

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  TISWARE = NULL;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ISWARE, DELETED
    FROM SPRT
    WHERE CODE = :ICODE
    INTO TID, TISWARE, TDELETEDISWARE;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, DELETED, ISWARE, DELETED
    FROM SPRT
    WHERE MARK = :IMARK
    INTO TID, TDELETED, TISWARE, TDELETEDISWARE;
  END

  IF ((((TISWARE > 0) AND (IISWARE <= 0)) OR
       ((TISWARE <= 0) AND (IISWARE > 0))) AND (TDELETEDISWARE >= IDELETED)) THEN
    EXCEPTION E_CANT_CHANGE_ISWARE;

  IF (TID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO SPRT (ID, PARENTID, CODE, MARK, NAME, TEXT, HIERLEVEL,
      MINPRICE, ECRDEVID, TAXGROUPID, RCPPRNDEVID,
      ASPECTSCHEMEID, PRICELABELID,
      MAXDISCOUNT, ISWARE, PRICE, FLAGS, LIFE, SERIES,
      CERTIFICAT, SCALELPDEVID, SCALELPWARECODE, ASPECTTYPE, QUANTITYPREC,
      SCALELPLOADED, PRICELBPRINTED, DELETED, DESCRIPTION, PICTURE, REWARDTYPE, REWARDVAL,
      ECRDEPARTMENT, GTD)
    VALUES (:ID, :PARENTID, :ICODE, :IMARK, :INAME, :ITEXT, :HIERLEVEL,
      :IMINPRICE, :ECRDEVID, :TAXGROUPID, :RCPPRNDEVID,
      :ASPECTSCHEMEID, :PRICELABELID,
      :IMAXDISCOUNT, :IISWARE, :IPRICE, :IFLAGS, :ILIFE, :ISERIES,
      :ICERTIFICAT, :SCALELPDEVID, :ISCALELPWARECODE, :IASPECTTYPE, :IQUANTITYPREC,
      :ISCALELPLOADED, :IPRICELBPRINTED, :IDELETED, :IDESCRIPTION, :IPICTURE, :IREWARDTYPE, :IREWARDVAL,
      :IECRDEPARTMENT, :IGTD);
    INCREMENTCODE = 1;
  END
  ELSE
  BEGIN
    ID = TID;
    IF (TDELETED = IDELETED) THEN
      UPDATE SPRT SET
        ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
        ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
        CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
                                           PRICELABELID = :PRICELABELID,
        DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
        DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
        ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
        ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
        FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
        HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
        ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
        LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
        MARK = :IMARK,                     SERIES = :ISERIES,
        MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
        MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
        NAME = :INAME,
        GTD = :IGTD
      WHERE ID = :ID;
    ELSE
      BEGIN
        UPDATE SPRT SET
          ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
          ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
          CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
          CODE = :ICODE,                     PRICELABELID = :PRICELABELID,
          DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
          DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
          ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
          ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
          FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
          HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
          ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
          LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
          MARK = :IMARK,                     SERIES = :ISERIES,
          MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
          MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
          NAME = :INAME,
          GTD = :IGTD
        WHERE ID = :ID;
        INCREMENTCODE = 1;
      END
  END

  IF (IISWARE = 1) THEN
  BEGIN
    EXECUTE PROCEDURE APPENDREMAINBYWAREID (:ID, :IFIRSTASPECTVALUE, :ASPECTSCHEMEID, :IREMAIN, :IDELETEDREMAIN, :IDELETEDASPECT, :IADDREPLACE)
      RETURNING_VALUES ERRORCODE;

    IF (ERRORCODE > 0) THEN
      EXIT;

    WHILE (IBARCODES <> '') DO
    BEGIN
      BARC = EXTRACTSTR(IBARCODES, ',');

      EXECUTE PROCEDURE APPENDBARCODEBYWAREID (:BARC, :ID, 0, 0, 0, 0, 0, :IFACTOR, 0, :IDELETEDBARCODE)
        RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;

      IBARCODES = PCOPY(IBARCODES, LEN(BARC) + 1, LEN(IBARCODES) - LEN(BARC) - 1);
    END
  END

  IF ((ILOADWAREDISC = 1) AND NOT (IDISCRATEPARENTID IS NULL) AND NOT (IDISCOUNTVALUE IS NULL)) THEN
    BEGIN
      EXECUTE PROCEDURE APPEND_WARE_DISC(:ID, :IDISCOUNTTYPE, :IDISCOUNTVALUE, :IDISCRATEPARENTID, :IDELETEDDISCRATE)
            RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;
    END

  IF (ILOADWAREDISC = 1) THEN
  BEGIN
    IF (TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :ID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID,
          DELETED = 0
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :ID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
    ELSE
    BEGIN
      DELETE FROM ACTDISCOBJ WHERE WAREID = :ID AND CLIENTID = -1 AND CARDID = -1 AND
                                 ASPECTVALUE1ID IS NULL AND ASPECTVALUE2ID IS NULL AND ASPECTVALUE3ID IS NULL AND
                                 ASPECTVALUE4ID IS NULL AND ASPECTVALUE5ID IS NULL AND
                                 PAYMENTID = -1 AND DISCRATEID IS NULL AND ACTSCRIPTID IS NULL;
    END
  END
END
^

/* Alter (APPENDPILOT) */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
IMINPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE DORMANTVAR INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;
  IF (IPTYPE = 2) THEN
     FLAGS = 511;
  ELSE
     FLAGS = 1535;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, :IMINPRICE, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            SELECT ID
            FROM SPRT
            WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
            INTO MAINID;

            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, :IMINPRICE, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, :IMINPRICE, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

/* Alter (APPENDREMAIN) */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER,
ILOADWAREDISC INTEGER = 1,
IDELETEDDISCRATE INTEGER = 0)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE WARENAME VARCHAR(100);
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCCODE INTEGER;
DECLARE VARIABLE USEREMAIN INTEGER;
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (AD1 + AD2 + AD3 + AD4 + AD5 = 0) THEN
  BEGIN
    ASPECTSCHEMEID = NULL;
    IF (NOT IPRICE IS NULL) THEN
      UPDATE SPRT SET PRICE = :IPRICE WHERE ID = :WAREID;
  END

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
    BEGIN
      IF (ASPCODE = 1)  THEN
        IF (IASPV1 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
          INTO AD1;
        ELSE
        BEGIN
          ERRORCODE = 10;
          EXIT;
        END

      IF (ASPCODE = 2)  THEN
        IF (IASPV2 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
          INTO AD2;
        ELSE
        BEGIN
          ERRORCODE = 11;
          EXIT;
        END

      IF (ASPCODE = 3)  THEN
        IF (IASPV3 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
          INTO AD3;
        ELSE
        BEGIN
          ERRORCODE = 12;
          EXIT;
        END

      IF (ASPCODE = 4)  THEN
        IF (IASPV4 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
          INTO AD4;
        ELSE
        BEGIN
          ERRORCODE = 13;
          EXIT;
        END

      IF (ASPCODE = 5)  THEN
        IF (IASPV5 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
          INTO AD5;
        ELSE
        BEGIN
          ERRORCODE = 14;
          EXIT;
        END
    END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR (AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    REMAINID = GEN_ID(GID, 1);

    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, PRICE,
       DELETED, USEREMAIN)
    VALUES
      (:REMAINID, :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5,
      :IPRICE, :IDELETED, :USEREMAIN);

    IF (NOT :IREMAIN IS NULL) THEN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE <> 1) THEN
    BEGIN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 1;

      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;
    END

    UPDATE REMAIN SET
      PRICE = :IPRICE,
      DELETED = :IDELETED
    WHERE ID = :REMAINID;

    IF (NOT :IREMAIN IS NULL) THEN
    BEGIN
      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
     END

    IF (IADDREPLACE = 2) THEN
      DELETE FROM REMAIND WHERE REMAINID = :REMAINID AND DTYPE = 0;
  END

  IF ((ILOADWAREDISC = 1) AND NOT IDISCOUNTVALUE IS NULL) THEN
  BEGIN
    IF (IDISCOUNTVALUE <> '') THEN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       0, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
      RETURNING_VALUES ERRORCODE, TDISCRATEID;

    WHERECLAUSE = '';

    IF (AD1 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
    ELSE
    BEGIN
      AD1 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID IS NULL ';
    END

    IF (AD2 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
    ELSE
    BEGIN
      AD2 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID IS NULL ';
    END

    IF (AD3 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
    ELSE
    BEGIN
      AD3 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID IS NULL ';
    END

    IF (AD4 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
    ELSE
    BEGIN
      AD4 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID IS NULL ';
    END

    IF (AD5 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
    ELSE
    BEGIN
      AD5 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID IS NULL ';
    END

    IF (IUSEGRPACTDISC <> 0) THEN
    BEGIN

      SELECT ID
      FROM GRPACTDISC
      WHERE CODE = :IGRPACTDISCCODE
      INTO :GRPACTDISCID;

      IF (GRPACTDISCID IS NULL) THEN
      BEGIN
        GRPACTDISCID = GEN_ID(GID, 1);
        INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
        VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
      END

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.DELETED ' ||
                        ' FROM ACTDISCOBJ A JOIN GRPACTDISC G ON ' ||
                                          ' G.ID = A.GRPACTDISCID AND G.ID = '|| :GRPACTDISCID ||
                        ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                        '      A.PAYMENTID = -1 AND A.CARDID = -1 '|| WHERECLAUSE
      INTO TACTDISCOBJID, DEL;

      IF (TACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, NULL, NULL, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :TACTDISCOBJID;

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                         C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID
      INTO ACTDISCID, CONDITIONID;

      EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL,
                                          NULL, NULL,  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  NULL, NULL,
                                          NULL, NULL, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

      IF (ACTDISCID IS NULL) THEN
      BEGIN
        SELECT NULLTONUM(MAX(CODE)) + 1
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        INTO ACTDISCCODE;

        INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                              CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
        VALUES     (GEN_ID(GID, 1), :ACTDISCCODE, :GRPACTDISCID, :WARENAME,
                    :CONDITIONID, :TDISCRATEID, NULL, 0, :IDELETEDACTDISC);
      END
      ELSE
        UPDATE ACTDISC SET
          NAME = :WARENAME,
          CONDITIONID = :CONDITIONID,
          DISCRATEID = :TDISCRATEID,
          DELETED = :IDELETEDACTDISC
        WHERE ID = :ACTDISCID;
    END
    ELSE
    BEGIN
      IF (IDISCOUNTVALUE <> '') THEN
      BEGIN
        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID ' ||
                          ' FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                          ' D.ID = A.DISCRATEID AND D.KIND = 2 '||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '       A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
        INTO TACTDISCOBJID;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, :TDISCRATEID, NULL, NULL);
        ELSE
          UPDATE ACTDISCOBJ SET
             DISCRATEID = :TDISCRATEID,
             DELETED = 0
          WHERE ID = :TACTDISCOBJID;
      END
      ELSE
        FOR EXECUTE STATEMENT
          'SELECT A.ID FROM ACTDISCOBJ A JOIN DISCRATE D ON ' ||
          '    D.ID = A.DISCRATEID AND D.KIND = 2 ' ||
          '    WHERE A.WAREID = ' || :WAREID || ' AND A.CLIENTID = -1 AND ' ||
          '          A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 ' || WHERECLAUSE
          INTO ACTDISCID
          DO
            UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCID;
        /*EXECUTE STATEMENT
          'UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID IN ' ||
          '(SELECT A.ID FROM ACTDISCOBJ A JOIN DISCRATE D ON ' ||
          '    D.ID = A.DISCRATEID AND D.KIND = 2 ' ||
          '    WHERE A.WAREID = ' || :WAREID || ' AND A.CLIENTID = -1 AND ' ||
          '          A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 ' || WHERECLAUSE || ')';*/
    END
  END
END
^

ALTER PROCEDURE GET_ACTSCRIPT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255),
IHALLID INTEGER,
IHALLPLACEID INTEGER)
 RETURNS(CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
DECLARE VARIABLE CARD VARCHAR(255);
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
DECLARE VARIABLE AWARECLASSIFIERID INTEGER;
DECLARE VARIABLE ACLIENTCLASSIFIERID INTEGER;
DECLARE VARIABLE ACCARDCLASSIFIERID INTEGER;
DECLARE VARIABLE ACONTINUE INTEGER;
DECLARE VARIABLE AHALLID INTEGER;
DECLARE VARIABLE AHALLPLACEID INTEGER;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID, AC.WARECLASSIFIERID,
      AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
      AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3,
      A.WARECLASSIFIERID, A.CLIENTCLASSIFIERID, A.CCARDCLASSIFIERID, A.HALLID, A.HALLPLACEID
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND

      (
       NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                       AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:REGDATE,
                     AC.REGDATECOND,
                     AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                     AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

      (
       NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                       AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:MEMDATE,
                     AC.MEMDATECOND,
                     AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                     AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
      (
       NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                         AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:BIRTHDATE,
                     AC.BIRTHDATECOND,
                     AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                     AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

      (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
      (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
      (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
      (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
      (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
      (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)
    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC)))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,
      AWARECLASSIFIERID, ACLIENTCLASSIFIERID, ACCARDCLASSIFIERID, AHALLID, AHALLPLACEID
    DO
    BEGIN
      ACONTINUE = 0;
      IF (AHALLID <> - 1) THEN
      BEGIN
        IF (IHALLID <> AHALLID) THEN
          ACONTINUE = 1;
      END

      IF (ACONTINUE = 0) THEN
      BEGIN
      IF (AHALLPLACEID <> - 1) THEN
      BEGIN
        IF (IHALLPLACEID <> AHALLPLACEID) THEN
          ACONTINUE = 1;
      END
      END

      IF (ACONTINUE = 0) THEN
      BEGIN
      IF (AWARECLASSIFIERID <> -1) THEN
      BEGIN
        IF (AWARECLASSIFIERID = 0) THEN
        BEGIN
          IF (EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE)) THEN
            ACONTINUE = 1;
        END
        ELSE
        BEGIN
          IF (NOT EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE AND CL.CLASSIFIERID = :AWARECLASSIFIERID)) THEN
            ACONTINUE = 1;
        END
      END
      END

      IF (ACONTINUE = 0) THEN
      BEGIN
      IF (ACLIENTCLASSIFIERID <> -1) THEN
      BEGIN
        IF (ACLIENTCLASSIFIERID = 0) THEN
        BEGIN
          IF (EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT)) THEN
            ACONTINUE = 1;
        END
        ELSE
        BEGIN
          IF (NOT EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT AND CL.CLASSIFIERID = :ACLIENTCLASSIFIERID)) THEN
            ACONTINUE = 1;
        END
      END
      END

      IF (ACONTINUE = 0) THEN
      BEGIN
      IF (ACCARDCLASSIFIERID <> -1) THEN
      BEGIN
        IF (ACCARDCLASSIFIERID = 0) THEN
        BEGIN
          IF (EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID)) THEN
            ACONTINUE = 1;
        END
        ELSE
        BEGIN
          IF (NOT EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID AND CL.CLASSIFIERID = :ACCARDCLASSIFIERID)) THEN
            ACONTINUE = 1;
        END
      END
      END
      IF (ACONTINUE = 0) THEN
        SUSPEND;
    END


  WHILE (ICARD <> '') DO
  BEGIN
    CARD = EXTRACTSTR(:ICARD, ',');
    CARDLEN = LEN(CARD);
    CARD = ADDRIGHT(CARD, 1, 40);

    FOR
      SELECT ACS.DATA, ACS.CODE, GD.CODE, AD.PRIORITY, AC.WAREID, AC.WARECLASSIFIERID,
        AC.SUMMWAREBEG, AC.SUMMWAREEND, AC.QUANTITYWAREBEG, AC.QUANTITYWAREEND,
        AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3,
        A.WARECLASSIFIERID, A.CLIENTCLASSIFIERID, A.CCARDCLASSIFIERID, A.HALLID, A.HALLPLACEID
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
              UNION
              SELECT COALESCE(WRCL.CLASSIFIERID, 0) AS CLASSIFIERID
              FROM RDB$DATABASE LEFT JOIN SPRTCLASSIFIER WRCL ON WRCL.WAREID = :IWARE) WRCL1 ON WRCL1.CLASSIFIERID = A.WARECLASSIFIERID
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
              UNION
              SELECT COALESCE(CLCL.CLASSIFIERID, 0) AS CLASSIFIERID
              FROM RDB$DATABASE LEFT JOIN CLIENTCLASSIFIER CLCL ON CLCL.CLIENTID = :ICLIENT) CLCL1 ON CLCL1.CLASSIFIERID = A.CLIENTCLASSIFIERID
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
              AND (A.CCARDCLASSIFIERID = -1 OR A.CCARDCLASSIFIERID IN (
                      SELECT COALESCE(CCL.CLASSIFIERID, 0)
                      FROM RDB$DATABASE GCL LEFT JOIN CCARDCLASSIFIER CCL ON CCL.CCARDID = A.CARDID))
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL AND CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN ACTSCRIPT ACS ON ACS.ID = AD.ACTSCRIPTID
      WHERE
        ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND

        (
         NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                         AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:REGDATE,
                       AC.REGDATECOND,
                       AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                       AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

        (
         NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                         AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:MEMDATE,
                       AC.MEMDATECOND,
                       AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                       AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
        (
         NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                           AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:BIRTHDATE,
                       AC.BIRTHDATECOND,
                       AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                       AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

        (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
        (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
        (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
        (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
        (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
        (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
     PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),ACS INDEX (PK_ACTSCRIPT),GD INDEX (PK_GRPACTDISC)))
     ORDER BY GD.CODE, AD.PRIORITY
     INTO DATA, CODE, GRPCODE, PRIORITY, WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,
       AWARECLASSIFIERID, ACLIENTCLASSIFIERID, ACCARDCLASSIFIERID, AHALLID, AHALLPLACEID
     DO
     BEGIN
       ACONTINUE = 0;
       IF (AHALLID <> - 1) THEN
       BEGIN
         IF (IHALLID <> AHALLID) THEN
           ACONTINUE = 1;
       END

       IF (ACONTINUE = 0) THEN
       BEGIN
       IF (AHALLPLACEID <> - 1) THEN
       BEGIN
         IF (IHALLPLACEID <> AHALLPLACEID) THEN
           ACONTINUE = 1;
       END
       END

       IF (ACONTINUE = 0) THEN
       BEGIN
       IF (AWARECLASSIFIERID <> -1) THEN
       BEGIN
         IF (AWARECLASSIFIERID = 0) THEN
         BEGIN
           IF (EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE)) THEN
             ACONTINUE = 1;
         END
         ELSE
         BEGIN
           IF (NOT EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE AND CL.CLASSIFIERID = :AWARECLASSIFIERID)) THEN
             ACONTINUE = 1;
         END
       END
       END

       IF (ACONTINUE = 0) THEN
       BEGIN
         IF (ACLIENTCLASSIFIERID <> -1) THEN
         BEGIN
           IF (ACLIENTCLASSIFIERID = 0) THEN
           BEGIN
             IF (EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT)) THEN
               ACONTINUE = 1;
           END
           ELSE
           BEGIN
             IF (NOT EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT AND CL.CLASSIFIERID = :ACLIENTCLASSIFIERID)) THEN
               ACONTINUE = 1;
           END
         END
       END

       IF (ACONTINUE = 0) THEN
       BEGIN
         IF (ACCARDCLASSIFIERID <> -1) THEN
         BEGIN
           IF (ACCARDCLASSIFIERID = 0) THEN
           BEGIN
             IF (EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID)) THEN
               ACONTINUE = 1;
           END
           ELSE
           BEGIN
             IF (NOT EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID AND CL.CLASSIFIERID = :ACCARDCLASSIFIERID)) THEN
               ACONTINUE = 1;
           END
         END
       END
       IF (ACONTINUE = 0) THEN
        SUSPEND;
     END
   ICARD = PCOPY(ICARD, CARDLEN + 1, LEN(ICARD) - CARDLEN - 1);
  END

  GRPCODE = NULL;
  PRIORITY = 0;
  WAREID = NULL;
  WARECLASSIFIERID = NULL;
  FORMULA1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  FORMULA2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  FORMULA3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;

  FOR
    SELECT ACS.DATA, ACS.CODE, A.WARECLASSIFIERID, A.CLIENTCLASSIFIERID, A.CCARDCLASSIFIERID, A.HALLID, A.HALLPLACEID
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTSCRIPT ACS ON ACS.ID = A.ACTSCRIPTID
    WHERE
      ((ACS.ACTEVENT = :IACTEVENT) OR (ACS.ACTEVENT = 0)) AND
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
  INTO DATA, CODE, AWARECLASSIFIERID, ACLIENTCLASSIFIERID, ACCARDCLASSIFIERID, AHALLID, AHALLPLACEID
  DO
  BEGIN
    ACONTINUE = 0;
    IF (AHALLID <> - 1) THEN
    BEGIN
      IF (IHALLID <> AHALLID) THEN
        ACONTINUE = 1;
    END

    IF (ACONTINUE = 0) THEN
    BEGIN
    IF (AHALLPLACEID <> - 1) THEN
    BEGIN
      IF (IHALLPLACEID <> AHALLPLACEID) THEN
        ACONTINUE = 1;
    END
    END

    IF (ACONTINUE = 0) THEN
    BEGIN
    IF (AWARECLASSIFIERID <> -1) THEN
    BEGIN
      IF (AWARECLASSIFIERID = 0) THEN
      BEGIN
        IF (EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE)) THEN
          ACONTINUE = 1;
      END
      ELSE
      BEGIN
        IF (NOT EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE AND CL.CLASSIFIERID = :AWARECLASSIFIERID)) THEN
          ACONTINUE = 1;
      END
    END
    END

    IF (ACONTINUE = 0) THEN
    BEGIN
    IF (ACLIENTCLASSIFIERID <> -1) THEN
    BEGIN
      IF (ACLIENTCLASSIFIERID = 0) THEN
      BEGIN
        IF (EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT)) THEN
          ACONTINUE = 1;
      END
      ELSE
      BEGIN
        IF (NOT EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT AND CL.CLASSIFIERID = :ACLIENTCLASSIFIERID)) THEN
          ACONTINUE = 1;
      END
    END
    END

    IF (ACONTINUE = 0) THEN
    BEGIN
    IF (ACCARDCLASSIFIERID <> -1) THEN
    BEGIN
      IF (ACCARDCLASSIFIERID = 0) THEN
      BEGIN
        IF (EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID)) THEN
          ACONTINUE = 1;
      END
      ELSE
      BEGIN
        IF (NOT EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID AND CL.CLASSIFIERID = :ACCARDCLASSIFIERID)) THEN
          ACONTINUE = 1;
      END
    END
    END
    IF (ACONTINUE = 0) THEN
      SUSPEND;
  END

END
^

/* Alter (GET_ACTSCRIPT) */
ALTER PROCEDURE GET_ACTSCRIPT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IACTEVENT INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255),
IHALLID INTEGER,
IHALLPLACEID INTEGER)
 RETURNS(ID INTEGER,
CODE INTEGER,
DATA BLOB,
GRPCODE INTEGER,
PRIORITY INTEGER,
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION)
 AS
BEGIN
  ID = 1;

  FOR
    SELECT  CODE, DATA, NULLTONUM(GRPCODE), NULLTONUM(PRIORITY), WAREID, WARECLASSIFIERID,
      SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,
      CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
    FROM GET_ACTSCRIPT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
      :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,:IWEEKDAY,
      :IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,:ICARD,
      :IANYCARD,:ICARDSTATE,:IACTEVENT,:ICARDSID,:IPAYMENTSID,:IHALLID,:IHALLPLACEID)
    ORDER BY GRPCODE, PRIORITY, CODE
    INTO CODE, DATA, GRPCODE, PRIORITY,WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END
END
^

ALTER PROCEDURE GET_DISCOUNT_CUSTOM(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(1024),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255),
IHALLID INTEGER,
IHALLPLACEID INTEGER)
 RETURNS(GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
DISCRATECLASSIFIERID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
DECLARE VARIABLE CARDLEN INTEGER;
DECLARE VARIABLE SEX INTEGER;
DECLARE VARIABLE REGDATE DATE;
DECLARE VARIABLE MEMDATE DATE;
DECLARE VARIABLE BIRTHDATE DATE;
DECLARE VARIABLE AWARECLASSIFIERID INTEGER;
DECLARE VARIABLE ACLIENTCLASSIFIERID INTEGER;
DECLARE VARIABLE ACCARDCLASSIFIERID INTEGER;
DECLARE VARIABLE ACONTINUE INTEGER;
DECLARE VARIABLE AHALLID INTEGER;
DECLARE VARIABLE AHALLPLACEID INTEGER;
BEGIN

  IF (NOT ICLIENT IS NULL) THEN
    SELECT SEX, REGDATE, MEMDATE, BIRTHDATE FROM CLIENT WHERE ID = :ICLIENT INTO SEX, REGDATE, MEMDATE, BIRTHDATE;

  FOR
    SELECT GD.CODE, AR.VAL, AC.WAREID, AC.WARECLASSIFIERID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
      AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
      AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3, AR.CODE,
      (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID), AR.WAREID, AR.WARECLASSIFIERID,
      A.WARECLASSIFIERID, A.CLIENTCLASSIFIERID, A.CCARDCLASSIFIERID, A.HALLID, A.HALLPLACEID
    FROM GRPACTDISC GD
      JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
      JOIN CONDITION AC ON
        (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL) AND
        (CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
        (AC.ID = AD.CONDITIONID)
      JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (
       NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                       AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:REGDATE,
                     AC.REGDATECOND,
                     AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                     AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

      (
       NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                       AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:MEMDATE,
                     AC.MEMDATECOND,
                     AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                     AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
      (
       NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                         AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
       AND
       (INDATERANGE1(:BIRTHDATE,
                     AC.BIRTHDATECOND,
                     AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                     AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

      (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
      (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
      (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
      (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
      (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
      (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND
      (GD.ACTV = 1) AND
      (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
      (DATEEND IS NULL OR DATEEND >= :IDATE) AND

      (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
      (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

      (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
      (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

      (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
      (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

      (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
      (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

      (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
      (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

      (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
      (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

      (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
      (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

      (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
      (AC.SEX = 0 OR AC.SEX = :SEX)

      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC)))
-- OLD    PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
    ORDER BY GD.CODE, AD.PRIORITY
    INTO GRPCODE, VAL, WAREID, WARECLASSIFIERID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,DISCRATECODE,CARD, DISCRATEWAREID, DISCRATECLASSIFIERID,
      AWARECLASSIFIERID, ACLIENTCLASSIFIERID, ACCARDCLASSIFIERID, AHALLID, AHALLPLACEID
    DO
    BEGIN
      ACONTINUE = 0;
      IF (AHALLID <> - 1) THEN
      BEGIN
        IF (IHALLID <> AHALLID) THEN
          ACONTINUE = 1;
      END

      IF (ACONTINUE = 0) THEN
      BEGIN
      IF (AHALLPLACEID <> - 1) THEN
      BEGIN
        IF (IHALLPLACEID <> AHALLPLACEID) THEN
          ACONTINUE = 1;
      END
      END

      IF (ACONTINUE = 0) THEN
      BEGIN
      IF (AWARECLASSIFIERID <> -1) THEN
      BEGIN
        IF (AWARECLASSIFIERID = 0) THEN
        BEGIN
          IF (EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE)) THEN
            ACONTINUE = 1;
        END
        ELSE
        BEGIN
          IF (NOT EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE AND CL.CLASSIFIERID = :AWARECLASSIFIERID)) THEN
            ACONTINUE = 1;
        END
      END
      END

      IF (ACONTINUE = 0) THEN
      BEGIN
      IF (ACLIENTCLASSIFIERID <> -1) THEN
      BEGIN
        IF (ACLIENTCLASSIFIERID = 0) THEN
        BEGIN
          IF (EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT)) THEN
            ACONTINUE = 1;
        END
        ELSE
        BEGIN
          IF (NOT EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT AND CL.CLASSIFIERID = :ACLIENTCLASSIFIERID)) THEN
            ACONTINUE = 1;
        END
      END
      END

      IF (ACONTINUE = 0) THEN
      BEGIN
      IF (ACCARDCLASSIFIERID <> -1) THEN
      BEGIN
        IF (ACCARDCLASSIFIERID = 0) THEN
        BEGIN
          IF (EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID)) THEN
            ACONTINUE = 1;
        END
        ELSE
        BEGIN
          IF (NOT EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID AND CL.CLASSIFIERID = :ACCARDCLASSIFIERID)) THEN
            ACONTINUE = 1;
        END
      END
      END
      IF (ACONTINUE = 0) THEN
        SUSPEND;
    END


  WHILE (ICARD <> '') DO
  BEGIN
    CARD = EXTRACTSTR(:ICARD, ',');
    CARDLEN = LEN(CARD);
    CARD = ADDRIGHT(CARD, 1, 40);

    FOR
      SELECT GD.CODE, AR.VAL, AC.WAREID, AC.WARECLASSIFIERID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
        QUANTITYWAREEND, "TYPE", AR.NAME, AR.TEXT,AD.CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,AD.PRIORITY,AR.PARENTID,AR.BEGVAL,AR.ENDVAL,
        AC.FORMULA1, AC.COUNTERBEG1, AC.COUNTEREND1,
        AC.FORMULA2, AC.COUNTERBEG2, AC.COUNTEREND2,
        AC.FORMULA3, AC.COUNTERBEG3, AC.COUNTEREND3,AR.CODE, AR.WAREID, AR.WARECLASSIFIERID,
        A.WARECLASSIFIERID, A.CLIENTCLASSIFIERID, A.CCARDCLASSIFIERID, A.HALLID, A.HALLPLACEID
      FROM GRPACTDISC GD
        JOIN ACTDISCOBJ A ON A.GRPACTDISCID = GD.ID
        JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
        JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
              UNION
              SELECT COALESCE(WRCL.CLASSIFIERID, 0) AS CLASSIFIERID
              FROM RDB$DATABASE LEFT JOIN SPRTCLASSIFIER WRCL ON WRCL.WAREID = :IWARE) WRCL1 ON WRCL1.CLASSIFIERID = A.WARECLASSIFIERID
        JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
        JOIN (SELECT -1 AS CLASSIFIERID FROM RDB$DATABASE
              UNION
              SELECT COALESCE(CLCL.CLASSIFIERID, 0) AS CLASSIFIERID
              FROM RDB$DATABASE LEFT JOIN CLIENTCLASSIFIER CLCL ON CLCL.CLIENTID = :ICLIENT) CLCL1 ON CLCL1.CLASSIFIERID = A.CLIENTCLASSIFIERID
        JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
              AND (A.CCARDCLASSIFIERID = -1 OR A.CCARDCLASSIFIERID IN (
                      SELECT COALESCE(CCL.CLASSIFIERID, 0)
                      FROM RDB$DATABASE GCL LEFT JOIN CCARDCLASSIFIER CCL ON CCL.CCARDID = A.CARDID))
        JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
        JOIN ACTDISC AD ON AD.GRPACTDISCID = GD.ID
        JOIN CONDITION AC ON
          (CARDPREFIXBEG IS NULL OR CARDPREFIXBEG <= :CARD) AND
          (CARDPREFIXEND IS NULL OR CARDPREFIXEND >= :CARD) AND
          NOT (CARDPREFIXBEG IS NULL AND CARDPREFIXEND IS NULL AND CARDLENBEG IS NULL AND CARDLENEND IS NULL) AND
          (AC.ID = AD.CONDITIONID)
        JOIN DISCRATE AR ON AR.ID = AD.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
      WHERE
        (
         NOT ((CAST(:REGDATE AS TIMESTAMP) IS NULL) AND (AC.REGDAYBEG IS NOT NULL OR AC.REGMONTHBEG IS NOT NULL OR AC.REGYEARBEG IS NOT NULL OR
                                                         AC.REGDAYEND IS NOT NULL OR AC.REGMONTHEND IS NOT NULL OR AC.REGYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:REGDATE,
                       AC.REGDATECOND,
                       AC.REGDAYBEG, AC.REGMONTHBEG, AC.REGYEARBEG,
                       AC.REGDAYEND, AC.REGMONTHEND, AC.REGYEAREND, :IDATE) > 0)) AND

        (
         NOT ((CAST(:MEMDATE AS TIMESTAMP) IS NULL) AND (AC.MEMDAYBEG IS NOT NULL OR AC.MEMMONTHBEG IS NOT NULL OR AC.MEMYEARBEG IS NOT NULL OR
                                                         AC.MEMDAYEND IS NOT NULL OR AC.MEMMONTHEND IS NOT NULL OR AC.MEMYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:MEMDATE,
                       AC.MEMDATECOND,
                       AC.MEMDAYBEG, AC.MEMMONTHBEG, AC.MEMYEARBEG,
                       AC.MEMDAYEND, AC.MEMMONTHEND, AC.MEMYEAREND, :IDATE) > 0)) AND
        (
         NOT ((CAST(:BIRTHDATE AS TIMESTAMP) IS NULL) AND (AC.BIRTHDAYBEG IS NOT NULL OR AC.BIRTHMONTHBEG IS NOT NULL OR AC.BIRTHYEARBEG IS NOT NULL OR
                                                           AC.BIRTHDAYEND IS NOT NULL OR AC.BIRTHMONTHEND IS NOT NULL OR AC.BIRTHYEAREND IS NOT NULL))
         AND
         (INDATERANGE1(:BIRTHDATE,
                       AC.BIRTHDATECOND,
                       AC.BIRTHDAYBEG, AC.BIRTHMONTHBEG, AC.BIRTHYEARBEG,
                       AC.BIRTHDAYEND, AC.BIRTHMONTHEND, AC.BIRTHYEAREND, :IDATE) > 0)) AND

        (AC.REGDATEBEG IS NULL OR :REGDATE >= AC.REGDATEBEG) AND
        (AC.REGDATEEND IS NULL OR :REGDATE <= AC.REGDATEEND) AND
        (AC.MEMDATEBEG IS NULL OR :MEMDATE >= AC.MEMDATEBEG) AND
        (AC.MEMDATEEND IS NULL OR :MEMDATE <= AC.MEMDATEEND) AND
        (AC.BIRTHDATEBEG IS NULL OR :BIRTHDATE >= AC.BIRTHDATEBEG) AND
        (AC.BIRTHDATEEND IS NULL OR :BIRTHDATE <= AC.BIRTHDATEEND) AND

        (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
        (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
        (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
        (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
        (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL) AND

        (GD.ACTV = 1) AND
        (DATEBEG IS NULL OR DATEBEG <= :IDATE) AND
        (DATEEND IS NULL OR DATEEND >= :IDATE) AND

        (TIMEBEG IS NULL OR TIMEBEG <= :ITIME) AND
        (TIMEEND IS NULL OR TIMEEND >= :ITIME) AND

        (DAYBEG IS NULL OR DAYBEG <= :IWEEKDAY) AND
        (DAYEND IS NULL OR DAYEND >= :IWEEKDAY) AND

        (QUANTITYBEG IS NULL OR QUANTITYBEG <= :IQUANTITY) AND
        (QUANTITYEND IS NULL OR QUANTITYEND >= :IQUANTITY) AND

        (SUMMBEG IS NULL OR SUMMBEG <= :ISUMM) AND
        (SUMMEND IS NULL OR SUMMEND >= :ISUMM) AND

        (PRICEBEG IS NULL OR PRICEBEG <= :IPRICE) AND
        (PRICEEND IS NULL OR PRICEEND >= :IPRICE) AND

        (SUMMRECBEG IS NULL OR SUMMRECBEG <= :ISUMMREC) AND
        (SUMMRECEND IS NULL OR SUMMRECEND >= :ISUMMREC) AND

        (QUANTITYRECBEG IS NULL OR QUANTITYRECBEG <= :IQUANTITYREC) AND
        (QUANTITYRECEND IS NULL OR QUANTITYRECEND >= :IQUANTITYREC) AND

        (CARDLENBEG IS NULL OR CARDLENBEG <= :CARDLEN) AND
        (CARDLENEND IS NULL OR CARDLENEND >= :CARDLEN) AND

        (CARDSTATE = :IANYCARD OR CARDSTATE = :ICARDSTATE) AND
        (AC.SEX = 0 OR AC.SEX = :SEX)
      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2), AC INDEX (IDX_C_CARDPREND,IDX_C_CARDPRBEG), AD INDEX (IDX_ACTDISCCND),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC)))
-- OLD      PLAN JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ2),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG)))
--    PLAN SORT (JOIN (JOIN (A INDEX (IDX_ACTDISCOBJ1),AD INDEX (FK_AD_GRPACTDISC),AR INDEX (PRI_DISCRATE),GD INDEX (PK_GRPACTDISC),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG))))
--    PLAN SORT (JOIN (JOIN (AR NATURAL,AD INDEX (FK_AD_DISCRATE),AC INDEX (PRI_CONDITION,IDX_C_CARDPREND,IDX_C_CARDPREND,IDX_C_CARDPRBEG,IDX_C_CARDPRBEG),A INDEX (IDX_ACTDISCOBJ1),GD INDEX (PK_GRPACTDISC))))
      ORDER BY GD.CODE, AD.PRIORITY
      INTO GRPCODE, VAL, WAREID, WARECLASSIFIERID, SUMMWAREBEG,SUMMWAREEND,QUANTITYWAREBEG,
      QUANTITYWAREEND, "TYPE", NAME, TEXT,CODE,CARDPREFIXBEG,CARDPREFIXEND,DEPENDOTHERPOS,PRIORITY,PARENTID,BEGVAL,ENDVAL,
      FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,DISCRATECODE, DISCRATEWAREID, DISCRATECLASSIFIERID,
      AWARECLASSIFIERID, ACLIENTCLASSIFIERID, ACCARDCLASSIFIERID, AHALLID, AHALLPLACEID
      DO
      BEGIN
        ACONTINUE = 0;
        IF (AHALLID <> - 1) THEN
        BEGIN
          IF (IHALLID <> AHALLID) THEN
            ACONTINUE = 1;
        END

        IF (ACONTINUE = 0) THEN
        BEGIN
        IF (AHALLPLACEID <> - 1) THEN
        BEGIN
          IF (IHALLPLACEID <> AHALLPLACEID) THEN
            ACONTINUE = 1;
        END
        END

        IF (ACONTINUE = 0) THEN
        BEGIN
        IF (AWARECLASSIFIERID <> -1) THEN
        BEGIN
          IF (AWARECLASSIFIERID = 0) THEN
          BEGIN
            IF (EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE)) THEN
              ACONTINUE = 1;
          END
          ELSE
          BEGIN
            IF (NOT EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE AND CL.CLASSIFIERID = :AWARECLASSIFIERID)) THEN
              ACONTINUE = 1;
          END
        END
        END

        IF (ACONTINUE = 0) THEN
        BEGIN
        IF (ACLIENTCLASSIFIERID <> -1) THEN
        BEGIN
          IF (ACLIENTCLASSIFIERID = 0) THEN
          BEGIN
            IF (EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT)) THEN
              ACONTINUE = 1;
          END
          ELSE
          BEGIN
            IF (NOT EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT AND CL.CLASSIFIERID = :ACLIENTCLASSIFIERID)) THEN
              ACONTINUE = 1;
          END
        END
        END

        IF (ACONTINUE = 0) THEN
        BEGIN
        IF (ACCARDCLASSIFIERID <> -1) THEN
        BEGIN
          IF (ACCARDCLASSIFIERID = 0) THEN
          BEGIN
            IF (EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID)) THEN
              ACONTINUE = 1;
          END
          ELSE
          BEGIN
            IF (NOT EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID AND CL.CLASSIFIERID = :ACCARDCLASSIFIERID)) THEN
              ACONTINUE = 1;
          END
        END
        END
        IF (ACONTINUE = 0) THEN
          SUSPEND;
      END

   ICARD = PCOPY(ICARD, CARDLEN + 1, LEN(ICARD) - CARDLEN - 1);
  END

  GRPCODE = NULL;
  VAL = NULL;
  WAREID = NULL;
  WARECLASSIFIERID = NULL;
  SUMMWAREBEG = NULL;
  SUMMWAREEND = NULL;
  QUANTITYWAREBEG = NULL;
  QUANTITYWAREEND = NULL;
  "TYPE" = NULL;
  TEXT = NULL;
  CODE = NULL;
  CARDPREFIXBEG = NULL;
  CARDPREFIXEND = NULL;
  DEPENDOTHERPOS = NULL;
  BEGVAL = NULL;
  ENDVAL = NULL;
  FORMULA1 = NULL;
  CNTBEG1 = NULL;
  CNTEND1 = NULL;
  FORMULA2 = NULL;
  CNTBEG2 = NULL;
  CNTEND2 = NULL;
  FORMULA3 = NULL;
  CNTBEG3 = NULL;
  CNTEND3 = NULL;
  PRIORITY = 0;
  CARD = NULL;

  FOR
    SELECT AR.VAL, AR.WAREID, AR.WARECLASSIFIERID, AR."TYPE", AR.NAME, AR.TEXT,AR.PARENTID, AR.BEGVAL, AR.ENDVAL,
      AR.CODE, (SELECT VAL FROM CCARD CC WHERE CC.ID = CD.ID), A.WARECLASSIFIERID, A.CLIENTCLASSIFIERID, A.CCARDCLASSIFIERID, A.HALLID, A.HALLPLACEID
    FROM ACTDISCOBJ A
      JOIN GET_WARE_PARENTS0(:IWARE) W ON A.WAREID = W.ID_PARENT
      JOIN GET_CLIENT_PARENTS0(:ICLIENT) C ON A.CLIENTID = C.ID_PARENT
      JOIN GET_IDLIST(:ICARDSID) CD ON CD.ID = A.CARDID
      JOIN GET_IDLIST(:IPAYMENTSID) PM ON PM.ID = A.PAYMENTID
      JOIN DISCRATE AR ON AR.ID = A.DISCRATEID AND AR.DESTINATION = :IDESTINATION AND AR.KIND = :IKIND
    WHERE
      (A.ASPECTVALUE1ID = :IASPECTVALUE1ID OR A.ASPECTVALUE1ID IS NULL) AND
      (A.ASPECTVALUE2ID = :IASPECTVALUE2ID OR A.ASPECTVALUE2ID IS NULL) AND
      (A.ASPECTVALUE3ID = :IASPECTVALUE3ID OR A.ASPECTVALUE3ID IS NULL) AND
      (A.ASPECTVALUE4ID = :IASPECTVALUE4ID OR A.ASPECTVALUE4ID IS NULL) AND
      (A.ASPECTVALUE5ID = :IASPECTVALUE5ID OR A.ASPECTVALUE5ID IS NULL)
--    PLAN SORT (JOIN (JOIN (AR NATURAL,A INDEX (IDX_ACTDISCOBJ2,FK_ADO_DISCRATE))))
  INTO VAL, DISCRATEWAREID, DISCRATECLASSIFIERID, "TYPE", NAME, TEXT, PARENTID, BEGVAL, ENDVAL, DISCRATECODE, CARD,
    AWARECLASSIFIERID, ACLIENTCLASSIFIERID, ACCARDCLASSIFIERID, AHALLID, AHALLPLACEID
  DO
  BEGIN
    ACONTINUE = 0;
    IF (AHALLID <> - 1) THEN
    BEGIN
      IF (IHALLID <> AHALLID) THEN
        ACONTINUE = 1;
    END

    IF (ACONTINUE = 0) THEN
    BEGIN
    IF (AHALLPLACEID <> - 1) THEN
    BEGIN
      IF (IHALLPLACEID <> AHALLPLACEID) THEN
        ACONTINUE = 1;
    END
    END

    IF (ACONTINUE = 0) THEN
    BEGIN
    IF (AWARECLASSIFIERID <> -1) THEN
    BEGIN
      IF (AWARECLASSIFIERID = 0) THEN
      BEGIN
        IF (EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE)) THEN
          ACONTINUE = 1;
      END
      ELSE
      BEGIN
        IF (NOT EXISTS(SELECT 1 FROM SPRTCLASSIFIER CL WHERE CL.WAREID = :IWARE AND CL.CLASSIFIERID = :AWARECLASSIFIERID)) THEN
          ACONTINUE = 1;
      END
    END
    END

    IF (ACONTINUE = 0) THEN
    BEGIN
    IF (ACLIENTCLASSIFIERID <> -1) THEN
    BEGIN
      IF (ACLIENTCLASSIFIERID = 0) THEN
      BEGIN
        IF (EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT)) THEN
          ACONTINUE = 1;
      END
      ELSE
      BEGIN
        IF (NOT EXISTS(SELECT 1 FROM CLIENTCLASSIFIER CL WHERE CL.CLIENTID = :ICLIENT AND CL.CLASSIFIERID = :ACLIENTCLASSIFIERID)) THEN
          ACONTINUE = 1;
      END
    END
    END

    IF (ACONTINUE = 0) THEN
    BEGIN
    IF (ACCARDCLASSIFIERID <> -1) THEN
    BEGIN
      IF (ACCARDCLASSIFIERID = 0) THEN
      BEGIN
        IF (EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID)) THEN
          ACONTINUE = 1;
      END
      ELSE
      BEGIN
        IF (NOT EXISTS(SELECT 1 FROM GET_IDLIST(:ICARDSID) CD JOIN CCARDCLASSIFIER CL ON CD.ID <> -1 AND CL.CCARDID = CD.ID AND CL.CLASSIFIERID = :ACCARDCLASSIFIERID)) THEN
          ACONTINUE = 1;
      END
    END
    END
    IF (ACONTINUE = 0) THEN
      SUSPEND;
  END
END
^

/* Alter (GET_DISCOUNT) */
ALTER PROCEDURE GET_DISCOUNT(IWARE INTEGER,
IASPECTVALUE1ID INTEGER,
IASPECTVALUE2ID INTEGER,
IASPECTVALUE3ID INTEGER,
IASPECTVALUE4ID INTEGER,
IASPECTVALUE5ID INTEGER,
ICLIENT INTEGER,
IDATE DATE,
ITIME TIME,
IWEEKDAY INTEGER,
IQUANTITY DOUBLE PRECISION,
ISUMM DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
ISUMMREC DOUBLE PRECISION,
IQUANTITYREC DOUBLE PRECISION,
ICARD VARCHAR(255),
IANYCARD INTEGER,
ICARDSTATE INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
ICARDSID VARCHAR(255),
IPAYMENTSID VARCHAR(255),
IHALLID INTEGER,
IHALLPLACEID INTEGER)
 RETURNS(ID INTEGER,
GRPCODE INTEGER,
VAL VARCHAR(100),
WAREID INTEGER,
WARECLASSIFIERID INTEGER,
DISCRATECODE INTEGER,
SUMMWAREBEG DOUBLE PRECISION,
SUMMWAREEND DOUBLE PRECISION,
QUANTITYWAREBEG DOUBLE PRECISION,
QUANTITYWAREEND DOUBLE PRECISION,
DISCRATEWAREID INTEGER,
DISCRATECLASSIFIERID INTEGER,
"TYPE" INTEGER,
NAME VARCHAR(100),
TEXT VARCHAR(100),
CODE INTEGER,
CARDPREFIXBEG VARCHAR(40),
CARDPREFIXEND VARCHAR(40),
DEPENDOTHERPOS INTEGER,
PRIORITY INTEGER,
PARENTID INTEGER,
BEGVAL VARCHAR(100),
ENDVAL VARCHAR(100),
FORMULA1 VARCHAR(100),
CNTBEG1 DOUBLE PRECISION,
CNTEND1 DOUBLE PRECISION,
FORMULA2 VARCHAR(100),
CNTBEG2 DOUBLE PRECISION,
CNTEND2 DOUBLE PRECISION,
FORMULA3 VARCHAR(100),
CNTBEG3 DOUBLE PRECISION,
CNTEND3 DOUBLE PRECISION,
CARD VARCHAR(50))
 AS
BEGIN
  ID = 1;

  FOR
    SELECT NULLTONUM(GRPCODE), VAL, WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
           DISCRATECLASSIFIERID, "TYPE", NAME, TEXT,
           CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, NULLTONUM(PRIORITY), PARENTID, BEGVAL, ENDVAL,
           FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
    FROM GET_DISCOUNT_CUSTOM(:IWARE,:IASPECTVALUE1ID,:IASPECTVALUE2ID,:IASPECTVALUE3ID,
          :IASPECTVALUE4ID,:IASPECTVALUE5ID,:ICLIENT,:IDATE,:ITIME,
          :IWEEKDAY,:IQUANTITY,:ISUMM,:IPRICE,:ISUMMREC,:IQUANTITYREC,
          :ICARD,:IANYCARD,:ICARDSTATE,:IDESTINATION,
          :IKIND,:ICARDSID,:IPAYMENTSID,:IHALLID,:IHALLPLACEID)
    ORDER BY GRPCODE, PRIORITY
    INTO GRPCODE, VAL, WAREID, WARECLASSIFIERID, SUMMWAREBEG, SUMMWAREEND, QUANTITYWAREBEG, QUANTITYWAREEND, DISCRATEWAREID,
         DISCRATECLASSIFIERID,"TYPE", NAME, TEXT,
         CODE, CARDPREFIXBEG, CARDPREFIXEND, DEPENDOTHERPOS, PRIORITY, PARENTID, BEGVAL, ENDVAL,
         FORMULA1,CNTBEG1,CNTEND1,FORMULA2,CNTBEG2,CNTEND2,FORMULA3,CNTBEG3,CNTEND3,CARD,DISCRATECODE
  DO
  BEGIN
    SUSPEND;
    ID = ID + 1;
  END

END
^

/* Alter (SYNC_CONDITION) */
ALTER PROCEDURE SYNC_CONDITION(IACTDISCID INTEGER,
IBIRTHDATEBEG DATE,
IBIRTHDATECOND INTEGER,
IBIRTHDATEEND DATE,
IBIRTHDAYBEG INTEGER,
IBIRTHDAYEND INTEGER,
IBIRTHMONTHBEG INTEGER,
IBIRTHMONTHEND INTEGER,
IBIRTHYEARBEG INTEGER,
IBIRTHYEAREND INTEGER,
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ICOUNTERBEG1 DOUBLE PRECISION,
ICOUNTERBEG2 DOUBLE PRECISION,
ICOUNTERBEG3 DOUBLE PRECISION,
ICOUNTEREND1 DOUBLE PRECISION,
ICOUNTEREND2 DOUBLE PRECISION,
ICOUNTEREND3 DOUBLE PRECISION,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IFORMULA1 VARCHAR(100),
IFORMULA2 VARCHAR(100),
IFORMULA3 VARCHAR(100),
IMEMDATEBEG DATE,
IMEMDATECOND INTEGER,
IMEMDATEEND DATE,
IMEMDAYBEG INTEGER,
IMEMDAYEND INTEGER,
IMEMMONTHBEG INTEGER,
IMEMMONTHEND INTEGER,
IMEMYEARBEG INTEGER,
IMEMYEAREND INTEGER,
IPRICEBEG DOUBLE PRECISION,
IPRICEEND DOUBLE PRECISION,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IQUANTITYRECBEG DOUBLE PRECISION,
IQUANTITYRECEND DOUBLE PRECISION,
IQUANTITYWAREBEG DOUBLE PRECISION,
IQUANTITYWAREEND DOUBLE PRECISION,
IREGDATEBEG DATE,
IREGDATECOND INTEGER,
IREGDATEEND DATE,
IREGDAYBEG INTEGER,
IREGDAYEND INTEGER,
IREGMONTHBEG INTEGER,
IREGMONTHEND INTEGER,
IREGYEARBEG INTEGER,
IREGYEAREND INTEGER,
ISEX INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
ISUMMWAREBEG DOUBLE PRECISION,
ISUMMWAREEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IWAREID INTEGER,
IWARECLASSIFIERID INTEGER)
 RETURNS(CONDITIONID INTEGER)
 AS
BEGIN
  SELECT CONDITIONID FROM ACTDISC
  WHERE ID = :IACTDISCID
  INTO :CONDITIONID;
  IF (CONDITIONID IS NULL) THEN
  BEGIN
    SELECT GEN_ID(GID, 1) FROM RDB$DATABASE INTO :CONDITIONID;

    INSERT INTO CONDITION
     (
      BIRTHDATEBEG,
      BIRTHDATECOND,
      BIRTHDATEEND,
      BIRTHDAYBEG,
      BIRTHDAYEND,
      BIRTHMONTHBEG,
      BIRTHMONTHEND,
      BIRTHYEARBEG,
      BIRTHYEAREND,
      CARDLENBEG,
      CARDLENEND,
      CARDPREFIXBEG,
      CARDPREFIXEND,
      CARDSTATE,
      COUNTERBEG1,
      COUNTERBEG2,
      COUNTERBEG3,
      COUNTEREND1,
      COUNTEREND2,
      COUNTEREND3,
      DATEBEG,
      DATEEND,
      DAYBEG,
      DAYEND,
      FORMULA1,
      FORMULA2,
      FORMULA3,
      ID,
      MEMDATEBEG,
      MEMDATECOND,
      MEMDATEEND,
      MEMDAYBEG,
      MEMDAYEND,
      MEMMONTHBEG,
      MEMMONTHEND,
      MEMYEARBEG,
      MEMYEAREND,
      PRICEBEG,
      PRICEEND,
      QUANTITYBEG,
      QUANTITYEND,
      QUANTITYRECBEG,
      QUANTITYRECEND,
      QUANTITYWAREBEG,
      QUANTITYWAREEND,
      REGDATEBEG,
      REGDATECOND,
      REGDATEEND,
      REGDAYBEG,
      REGDAYEND,
      REGMONTHBEG,
      REGMONTHEND,
      REGYEARBEG,
      REGYEAREND,
      SEX,
      SUMMBEG,
      SUMMEND,
      SUMMRECBEG,
      SUMMRECEND,
      SUMMWAREBEG,
      SUMMWAREEND,
      TIMEBEG,
      TIMEEND,
      WAREID,
      WARECLASSIFIERID
      )
    VALUES(
      :IBIRTHDATEBEG,
      :IBIRTHDATECOND,
      :IBIRTHDATEEND,
      :IBIRTHDAYBEG,
      :IBIRTHDAYEND,
      :IBIRTHMONTHBEG,
      :IBIRTHMONTHEND,
      :IBIRTHYEARBEG,
      :IBIRTHYEAREND,
      :ICARDLENBEG,
      :ICARDLENEND,
      :ICARDPREFIXBEG,
      :ICARDPREFIXEND,
      :ICARDSTATE,
      :ICOUNTERBEG1,
      :ICOUNTERBEG2,
      :ICOUNTERBEG3,
      :ICOUNTEREND1,
      :ICOUNTEREND2,
      :ICOUNTEREND3,
      :IDATEBEG,
      :IDATEEND,
      :IDAYBEG,
      :IDAYEND,
      :IFORMULA1,
      :IFORMULA2,
      :IFORMULA3,
      :CONDITIONID,
      :IMEMDATEBEG,
      :IMEMDATECOND,
      :IMEMDATEEND,
      :IMEMDAYBEG,
      :IMEMDAYEND,
      :IMEMMONTHBEG,
      :IMEMMONTHEND,
      :IMEMYEARBEG,
      :IMEMYEAREND,
      :IPRICEBEG,
      :IPRICEEND,
      :IQUANTITYBEG,
      :IQUANTITYEND,
      :IQUANTITYRECBEG,
      :IQUANTITYRECEND,
      :IQUANTITYWAREBEG,
      :IQUANTITYWAREEND,
      :IREGDATEBEG,
      :IREGDATECOND,
      :IREGDATEEND,
      :IREGDAYBEG,
      :IREGDAYEND,
      :IREGMONTHBEG,
      :IREGMONTHEND,
      :IREGYEARBEG,
      :IREGYEAREND,
      :ISEX,
      :ISUMMBEG,
      :ISUMMEND,
      :ISUMMRECBEG,
      :ISUMMRECEND,
      :ISUMMWAREBEG,
      :ISUMMWAREEND,
      :ITIMEBEG,
      :ITIMEEND,
      :IWAREID,
      :IWARECLASSIFIERID
    );
  END
  ELSE
    UPDATE CONDITION SET
      BIRTHDATEBEG = :IBIRTHDATEBEG,
      BIRTHDATECOND = :IBIRTHDATECOND,
      BIRTHDATEEND = :IBIRTHDATEEND,
      BIRTHDAYBEG = :IBIRTHDAYBEG,
      BIRTHDAYEND = :IBIRTHDAYEND,
      BIRTHMONTHBEG = :IBIRTHMONTHBEG,
      BIRTHMONTHEND = :IBIRTHMONTHEND,
      BIRTHYEARBEG = :IBIRTHYEARBEG,
      BIRTHYEAREND = :IBIRTHYEAREND,
      CARDLENBEG = :ICARDLENBEG,
      CARDLENEND = :ICARDLENEND,
      CARDPREFIXBEG = :ICARDPREFIXBEG,
      CARDPREFIXEND = :ICARDPREFIXEND,
      CARDSTATE = :ICARDSTATE,
      COUNTERBEG1 = :ICOUNTERBEG1,
      COUNTERBEG2 = :ICOUNTERBEG2,
      COUNTERBEG3 = :ICOUNTERBEG3,
      COUNTEREND1 = :ICOUNTEREND1,
      COUNTEREND2 = :ICOUNTEREND2,
      COUNTEREND3 = :ICOUNTEREND3,
      DATEBEG = :IDATEBEG,
      DATEEND = :IDATEEND,
      DAYBEG = :IDAYBEG,
      DAYEND = :IDAYEND,
      FORMULA1 = :IFORMULA1,
      FORMULA2 = :IFORMULA2,
      FORMULA3 = :IFORMULA3,
      MEMDATEBEG = :IMEMDATEBEG,
      MEMDATECOND = :IMEMDATECOND,
      MEMDATEEND = :IMEMDATEEND,
      MEMDAYBEG = :IMEMDAYBEG,
      MEMDAYEND = :IMEMDAYEND,
      MEMMONTHBEG = :IMEMMONTHBEG,
      MEMMONTHEND = :IMEMMONTHEND,
      MEMYEARBEG = :IMEMYEARBEG,
      MEMYEAREND = :IMEMYEAREND,
      PRICEBEG = :IPRICEBEG,
      PRICEEND = :IPRICEEND,
      QUANTITYBEG = :IQUANTITYBEG,
      QUANTITYEND = :IQUANTITYEND,
      QUANTITYRECBEG = :IQUANTITYRECBEG,
      QUANTITYRECEND = :IQUANTITYRECEND,
      QUANTITYWAREBEG = :IQUANTITYWAREBEG,
      QUANTITYWAREEND = :IQUANTITYWAREEND,
      REGDATEBEG = :IREGDATEBEG,
      REGDATECOND = :IREGDATECOND,
      REGDATEEND = :IREGDATEEND,
      REGDAYBEG = :IREGDAYBEG,
      REGDAYEND = :IREGDAYEND,
      REGMONTHBEG = :IREGMONTHBEG,
      REGMONTHEND = :IREGMONTHEND,
      REGYEARBEG = :IREGYEARBEG,
      REGYEAREND = :IREGYEAREND,
      SEX = :ISEX,
      SUMMBEG = :ISUMMBEG,
      SUMMEND = :ISUMMEND,
      SUMMRECBEG = :ISUMMRECBEG,
      SUMMRECEND = :ISUMMRECEND,
      SUMMWAREBEG = :ISUMMWAREBEG,
      SUMMWAREEND = :ISUMMWAREEND,
      TIMEBEG = :ITIMEBEG,
      TIMEEND = :ITIMEEND,
      WAREID = :IWAREID,
      WARECLASSIFIERID = :IWARECLASSIFIERID
    WHERE 
      ID = :CONDITIONID;
END
^

/* Restore proc. body: APPENDACTDISCOBJ */
ALTER PROCEDURE APPENDACTDISCOBJ(ICODE INTEGER,
ICLIENTCODE INTEGER,
ICLIENTCLASSIFIERCODE INTEGER,
ICARDCODE INTEGER,
ICCARDCLASSIFIERCODE INTEGER,
IPAYMENTCODE INTEGER,
IWARECODE INTEGER,
IWAREMARK VARCHAR(20),
IWARECODETOMARK INTEGER,
IASPECTVALUE1CODE INTEGER,
IASPECTVALUE2CODE INTEGER,
IASPECTVALUE3CODE INTEGER,
IASPECTVALUE4CODE INTEGER,
IASPECTVALUE5CODE INTEGER,
IWARECLASSIFIERCODE INTEGER,
IHALLCODE INTEGER,
IHALLPLACECODE INTEGER,
IDISCRATECODE INTEGER,
IACTSCRIPTCODE INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
declare variable ID integer;
declare variable CLIENTID integer;
declare variable CLIENTCLASSIFIERID integer;
declare variable CCARDID integer;
declare variable CCARDCLASSIFIERID integer;
declare variable PAYMENTID integer;
declare variable WAREID integer;
declare variable ASPSCHEMEID integer;
declare variable ASPECTVALUE1ID integer;
declare variable ASPECTVALUE2ID integer;
declare variable ASPECTVALUE3ID integer;
declare variable ASPECTVALUE4ID integer;
declare variable ASPECTVALUE5ID integer;
declare variable WARECLASSIFIERID integer;
declare variable HALLID integer;
declare variable HALLPLACEID integer;
declare variable DISCRATEID integer;
declare variable ACTSCRIPTID integer;
declare variable GRPACTDISCID integer;
BEGIN
  ERRORCODE = 0;

  IF (IACTSCRIPTCODE IS NULL AND IGRPACTDISCCODE IS NULL AND IDISCRATECODE IS NULL) THEN
  BEGIN
    ERRORCODE = 52;
    EXIT;
  END

  IF (IHALLPLACECODE > 0 AND (IHALLCODE IS NULL OR (IHALLCODE = 0) )) THEN
  BEGIN
    ERRORCODE = 53;
    EXIT;
  END

  IF (ICLIENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :ICLIENTCODE
    INTO CLIENTID;

    IF (CLIENTID IS NULL) THEN
    BEGIN
      ERRORCODE = 33;
      EXIT;
    END
  END
  ELSE
    IF (ICLIENTCODE = 0) THEN
      CLIENTID = 0;
    ELSE
      CLIENTID = -1;

  IF (ICLIENTCLASSIFIERCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLASSIFIER
    WHERE CODE = :ICLIENTCLASSIFIERCODE
    INTO CLIENTCLASSIFIERID;

    IF (CLIENTCLASSIFIERID IS NULL) THEN
    BEGIN
      ERRORCODE = 41;
      EXIT;
    END
  END
  ELSE
    IF (ICLIENTCLASSIFIERCODE = 0) THEN
      CLIENTCLASSIFIERID = 0;
    ELSE
      CLIENTCLASSIFIERID = -1;

  IF (ICARDCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CCARD
    WHERE CODE = :ICARDCODE
    INTO CCARDID;

    IF (CCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 42;
      EXIT;
    END
  END
  ELSE
    IF (ICARDCODE = 0) THEN
      CCARDID = 0;
    ELSE
      CCARDID = -1;

  IF (ICCARDCLASSIFIERCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLASSIFIER
    WHERE CODE = :ICCARDCLASSIFIERCODE
    INTO CCARDCLASSIFIERID;

    IF (CCARDCLASSIFIERID IS NULL) THEN
    BEGIN
      ERRORCODE = 41;
      EXIT;
    END
  END
  ELSE
    IF (ICCARDCLASSIFIERCODE = 0) THEN
      CCARDCLASSIFIERID = 0;
    ELSE
      CCARDCLASSIFIERID = -1;

  IF (IPAYMENTCODE IS NOT NULL) THEN
  BEGIN
    SELECT ID
    FROM PAYMENT
    WHERE CODE = :IPAYMENTCODE
    INTO PAYMENTID;

    IF (PAYMENTID IS NULL) THEN
    BEGIN
      ERRORCODE = 47;
      EXIT;
    END
  END
  ELSE
    PAYMENTID = -1;

  IF (IWARECODETOMARK = 1) THEN
  BEGIN
    IF (IWAREMARK IS NULL) THEN
      WAREID = -1;
    ELSE
      IF (IWAREMARK = '0') THEN
        WAREID = 0;
      ELSE
      BEGIN
        SELECT ID, ASPECTSCHEMEID
        FROM SPRT
        WHERE MARK = :IWARECODE
        INTO WAREID, ASPSCHEMEID;

        IF (WAREID IS NULL) THEN
        BEGIN
          ERRORCODE = 16;
          EXIT;
        END
      END
  END
  ELSE
  BEGIN
    IF (IWARECODE > 0) THEN
    BEGIN
      SELECT ID, ASPECTSCHEMEID
      FROM SPRT
      WHERE CODE = :IWARECODE
      INTO WAREID, ASPSCHEMEID;

      IF (WAREID IS NULL) THEN
      BEGIN
        ERRORCODE = 16;
        EXIT;
      END
    END
    ELSE
      IF (IWARECODE = 0) THEN
        WAREID = 0;
      ELSE
        WAREID = -1;
  END

  IF (IWARECLASSIFIERCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLASSIFIER
    WHERE CODE = :IWARECLASSIFIERCODE
    INTO WARECLASSIFIERID;

    IF (WARECLASSIFIERID IS NULL) THEN
    BEGIN
      ERRORCODE = 41;
      EXIT;
    END
  END
  ELSE
    IF (IWARECLASSIFIERCODE = 0) THEN
      WARECLASSIFIERID = 0;
    ELSE
      WARECLASSIFIERID = -1;

  IF (IACTSCRIPTCODE IS NOT NULL) THEN
  BEGIN
    SELECT ID
    FROM ACTSCRIPT
    WHERE CODE = :IACTSCRIPTCODE
    INTO ACTSCRIPTID;

    IF (ACTSCRIPTID IS NULL) THEN
    BEGIN
      ERRORCODE = 48;
      EXIT;
    END
  END

  IF (IHALLCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM HALL
    WHERE CODE = :IHALLCODE
    INTO HALLID;

    IF (HALLID IS NULL) THEN
    BEGIN
      ERRORCODE = 49;
      EXIT;
    END
  END
  ELSE
    IF (IHALLCODE = 0) THEN
      HALLID = 0;
    ELSE
      HALLID = -1;

  IF (IHALLPLACECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM HALLPLACE
    WHERE CODE = :IHALLPLACECODE AND HALLID = :HALLID
    INTO HALLPLACEID;

    IF (HALLPLACEID IS NULL) THEN
    BEGIN
      ERRORCODE = 50;
      EXIT;
    END
  END
  ELSE
    IF (IHALLPLACECODE = 0) THEN
      HALLPLACEID = 0;
    ELSE
      HALLPLACEID = -1;

  IF (IDISCRATECODE IS NOT NULL) THEN
  BEGIN
    SELECT ID
    FROM DISCRATE
    WHERE CODE = :IDISCRATECODE
    INTO DISCRATEID;

    IF (DISCRATEID IS NULL) THEN
    BEGIN
      ERRORCODE = 51;
      EXIT;
    END
  END

  IF (IGRPACTDISCCODE IS NOT NULL) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IGRPACTDISCCODE
    INTO GRPACTDISCID;

    IF (GRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 01;
      EXIT;
    END
  END

  IF (NOT ASPSCHEMEID IS NULL AND
       (IASPECTVALUE1CODE > 0 OR
        IASPECTVALUE2CODE > 0 OR
        IASPECTVALUE3CODE > 0 OR
        IASPECTVALUE4CODE > 0 OR
        IASPECTVALUE5CODE > 0)) THEN
    EXECUTE PROCEDURE GET_ASPECTVALUEIDS_BY_CODES (:ASPSCHEMEID, :IASPECTVALUE1CODE, :IASPECTVALUE2CODE, :IASPECTVALUE3CODE, :IASPECTVALUE4CODE, :IASPECTVALUE5CODE)
    RETURNING_VALUES ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID, ERRORCODE;

  IF (ERRORCODE <> 0) THEN
    EXIT;

  SELECT ID
  FROM ACTDISCOBJ
  WHERE CODE = :ICODE
  INTO ID;

  IF (ID IS NULL) THEN
    BEGIN
      ID = GEN_ID(GID, 1);
      INSERT INTO ACTDISCOBJ (ID, CLIENTID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID,
                              ASPECTVALUE5ID, PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID, CARDID, CODE,
                              CCARDCLASSIFIERID, CLIENTCLASSIFIERID, WARECLASSIFIERID, HALLID,
                              HALLPLACEID, DELETED)
      VALUES (:ID, :CLIENTID, :WAREID, :ASPECTVALUE1ID, :ASPECTVALUE2ID, :ASPECTVALUE3ID, :ASPECTVALUE4ID, :ASPECTVALUE5ID,
              :PAYMENTID, :DISCRATEID, :ACTSCRIPTID, :GRPACTDISCID, :CCARDID, :ICODE,
              :CCARDCLASSIFIERID, :CLIENTCLASSIFIERID, :WARECLASSIFIERID, :HALLID, :HALLPLACEID, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE ACTDISCOBJ
      SET CLIENTID = :CLIENTID,
          WAREID = :WAREID,
          ASPECTVALUE1ID = :ASPECTVALUE1ID,
          ASPECTVALUE2ID = :ASPECTVALUE2ID,
          ASPECTVALUE3ID = :ASPECTVALUE3ID,
          ASPECTVALUE4ID = :ASPECTVALUE4ID,
          ASPECTVALUE5ID = :ASPECTVALUE5ID,
          PAYMENTID = :PAYMENTID,
          DISCRATEID = :DISCRATEID,
          ACTSCRIPTID = :ACTSCRIPTID,
          GRPACTDISCID = :GRPACTDISCID,
          CARDID = :CCARDID,
          CCARDCLASSIFIERID = :CCARDCLASSIFIERID,
          CLIENTCLASSIFIERID = :CLIENTCLASSIFIERID,
          WARECLASSIFIERID = :WARECLASSIFIERID,
          HALLID = :HALLID,
          HALLPLACEID = :HALLPLACEID,
          DELETED = :IDELETED
      WHERE (ID = :ID);
    END

END
^

/* Restore proc. body: GET_ASPECTVALUEIDS_BY_CODES */
ALTER PROCEDURE GET_ASPECTVALUEIDS_BY_CODES(IASPECTSCHEMEID INTEGER,
IASPECTVALUE1CODE INTEGER,
IASPECTVALUE2CODE INTEGER,
IASPECTVALUE3CODE INTEGER,
IASPECTVALUE4CODE INTEGER,
IASPECTVALUE5CODE INTEGER)
 RETURNS(ASPECTVALUE1ID INTEGER,
ASPECTVALUE2ID INTEGER,
ASPECTVALUE3ID INTEGER,
ASPECTVALUE4ID INTEGER,
ASPECTVALUE5ID INTEGER,
ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
BEGIN
  ERRORCODE = 0;

  IF (IASPECTVALUE1CODE > 0) THEN
    ASPECTVALUE1ID = NULL;
  ELSE
    ASPECTVALUE1ID = 0;

  IF (IASPECTVALUE2CODE > 0) THEN
    ASPECTVALUE2ID = NULL;
  ELSE
    ASPECTVALUE2ID = 0;

  IF (IASPECTVALUE3CODE > 0) THEN
    ASPECTVALUE3ID = NULL;
  ELSE
    ASPECTVALUE3ID = 0;

  IF (IASPECTVALUE4CODE > 0) THEN
    ASPECTVALUE4ID = NULL;
  ELSE
    ASPECTVALUE4ID = 0;

  IF (IASPECTVALUE5CODE > 0) THEN
    ASPECTVALUE5ID = NULL;
  ELSE
    ASPECTVALUE5ID = 0;

  IF (IASPECTSCHEMEID > 0) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :IASPECTSCHEMEID
      INTO ASPID, ASPCODE
    DO
      BEGIN
        IF ((ASPCODE = 1) AND (IASPECTVALUE1CODE > 0)) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPECTVALUE1CODE) AND (ASPECTID = :ASPID)
          INTO ASPECTVALUE1ID;
        IF ((ASPCODE = 2) AND (IASPECTVALUE2CODE > 0)) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPECTVALUE2CODE) AND (ASPECTID = :ASPID)
          INTO ASPECTVALUE2ID;
        IF ((ASPCODE = 3) AND (IASPECTVALUE3CODE > 0)) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPECTVALUE3CODE) AND (ASPECTID = :ASPID)
          INTO ASPECTVALUE3ID;
        IF ((ASPCODE = 4) AND (IASPECTVALUE4CODE > 0)) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPECTVALUE4CODE) AND (ASPECTID = :ASPID)
          INTO ASPECTVALUE4ID;
        IF ((ASPCODE = 5) AND (IASPECTVALUE5CODE > 0)) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPECTVALUE5CODE) AND (ASPECTID = :ASPID)
          INTO ASPECTVALUE5ID;
      END

  IF (ASPECTVALUE1ID IS NULL) THEN
    BEGIN
      ERRORCODE = 10;
      EXIT;
    END

  IF (ASPECTVALUE2ID IS NULL) THEN
    BEGIN
      ERRORCODE = 11;
      EXIT;
    END

  IF (ASPECTVALUE3ID IS NULL) THEN
    BEGIN
      ERRORCODE = 12;
      EXIT;
    END

  IF (ASPECTVALUE4ID IS NULL) THEN
    BEGIN
      ERRORCODE = 13;
      EXIT;
    END

  IF (ASPECTVALUE5ID IS NULL) THEN
    BEGIN
      ERRORCODE = 14;
      EXIT;
    END
END
^

/* MAN */

UPDATE ACTDISCOBJ SET HALLID = -1, HALLPLACEID = -1^

/* MAN */

/* TEXT BLOCK END */

/* Convert 4.8.7 */

/* MAN */
UPDATE DOCKIND
SET ECRRECEIPTTYPE = CASE REMAINOPERATION
                       WHEN 1 THEN 14
                       WHEN 2 THEN 15
                       WHEN 3 THEN 16
                     END
WHERE ECRRECEIPTTYPE = 6 AND REMAINOPERATION > 0;

UPDATE SETTINGS
SET
VAL = (SELECT VAL FROM SETTINGS S
  WHERE S.OWNERBDO = SETTINGS.OWNERBDO AND S.NAME = 'TouchScreenVisualID')
WHERE NAME = 'TouchScreenVisualClientID' AND
EXISTS (SELECT CASE VAL WHEN '1' THEN '1' ELSE '0' END FROM SETTINGS S2
  WHERE S2.OWNERBDO = SETTINGS.OWNERBDO AND S2.NAME = 'TouchScreenVisualID');

INSERT INTO SETTINGS
(ID, NAME, VAL, OWNERBDO, SYNCCATEG)
SELECT
GEN_ID(GID, 1), 'TouchScreenVisualClientID', VAL, OWNERBDO, SYNCCATEG
FROM SETTINGS S1 WHERE NAME = 'TouchScreenVisualID' AND NOT EXISTS
(SELECT FIRST 1 1 FROM SETTINGS S2 WHERE S2.NAME = 'TouchScreenVisualClientID' AND
  S1.OWNERBDO = S2.OWNERBDO);
/* MAN */

/* Declare UDF */
DECLARE EXTERNAL FUNCTION BITAND
INTEGER, INTEGER
RETURNS INTEGER BY VALUE
ENTRY_POINT 'BitAnd' MODULE_NAME 'UDFAtol';


/* Drop table-fields... */
ALTER TABLE DOCKIND DROP REMAINOPERATION;


/* Create trigger... */
SET TERM ^ ;

CREATE TRIGGER UPD_AFT_DISCRATE FOR DISCRATE
ACTIVE AFTER UPDATE POSITION 10 
AS
BEGIN
  IF (OLD.ISFOLDER = 1 AND OLD.DISCCOLLOPER <> NEW.DISCCOLLOPER) THEN
    POST_EVENT 'DISCRATE_GRP_CHANGED';
END
^


/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_ACTDISC
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_ACTDISCOBJ
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_ACTSCRIPT
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_ANALOG
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_ASPECT
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_ASPSCHM
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_ASPVALUE
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_BARCODE
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_CARD
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_CARDGROUP
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_CCARD
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_CCARDCLASSIFIER
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_CCARDCOUNTER
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_CLASSIFIER
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_CLIENT
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_CLIENTCARD
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_CLIENTCLASSIFIER
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_CLIENTCOUNTER
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_COMMENT
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_COUNTER
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_COUNTERD
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_COUNTERTYPE
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_CURRENCY
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_DENOMIN
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_DEVICES
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_DISCRATE
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_DOCKIND
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_DOCKINDRECTMPL
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_DOCKINDTMPL
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_DOCTEMPLATE
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_DOCUMENT
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_EMPLOYEE
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_GRPACTDISC
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_GRPCCARD
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_HALL
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_HALLPLACE
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_INPDEVFLT
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_INTBARCS
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_KEYBLAYT
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_KEYBMAP
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_KEYBMAPF
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_KEYBMODE
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_MONEYBOX
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_PAYMENT
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_PRICELABEL
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_PROFILE
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_RECTEMPLATE
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_REMAIN
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_REMAIND
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_RMK
AS 
BEGIN
  IF (NEW.NOCHNG = 1) THEN
  BEGIN
    NEW.NOCHNG = 0;
    EXIT;
  END
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_RMKDEV
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_SECURITY
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_SETTINGS
AS
BEGIN
  IF (NEW.VAL = OLD.VAL) THEN
    NEW.CHNG = OLD.CHNG;
  ELSE
    NEW.CHNG = GEN_ID(GCHNG, 1);

  IF (NEW.CHNG IS NULL) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);

  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_SETTINGS_INS
AS 
BEGIN
  IF (EXISTS(SELECT 1
             FROM SETTINGS S
             WHERE S.NAME = NEW.NAME AND
                  (SELECT FIRST 1 ST.SYNCKIND
                   FROM SYNCTABLE ST
                   JOIN SYNCBASE SB ON
                     SB.PARENTID = ST.SYNCBASEID
                   WHERE ST.CATEG = NEW.SYNCCATEG AND SB.CODE = NEW.OWNERBDO) <> 1)) THEN
    EXCEPTION E_AMBIGUOUS_SETTING;

  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_SPRT
AS 
BEGIN
  NEW.INSCHNG = OLD.INSCHNG;
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
  BEGIN
    NEW.CHNG = GEN_ID(GCHNG, 1);
    IF (OLD.INSCHNG IS NULL) THEN
      NEW.INSCHNG = NEW.CHNG;
  END
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_SPRTCLASSIFIER
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_TAXGROUP
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_TAXGRPRT
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_TAXRATE
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_TOUCHLAYT
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_USER
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER CHNG_BEF_WINREPORTS
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_BEF_SPRT0
AS
DECLARE VARIABLE RID INTEGER;
BEGIN
  IF (NEW.NAME IS NULL) THEN
    NEW.NAME = '';
  IF (NEW.MARK IS NULL) THEN
    NEW.MARK = '';
  IF (NEW.SCALELPLOADED IS NULL) THEN
    NEW.SCALELPLOADED = 0;
  IF (NEW.PRICELBPRINTED IS NULL) THEN
    NEW.PRICELBPRINTED = 0;
  IF (NEW.CHNG > 0 AND OLD.CHNG < 0) THEN
  BEGIN
    UPDATE REMAIN R SET
      CHNG = NULL
    WHERE WAREID = OLD.ID AND R.ASPECTVALUE1ID = 0 AND R.ASPECTVALUE2ID = 0 AND
      R.ASPECTVALUE3ID = 0 AND R.ASPECTVALUE4ID = 0 AND R.ASPECTVALUE5ID = 0;
  END
  IF (NEW.DELETED > OLD.DELETED) THEN
  BEGIN
    DELETE FROM REMAIN R WHERE WAREID = OLD.ID AND (R.ASPECTVALUE1ID <> 0 OR R.ASPECTVALUE2ID <> 0 OR
      R.ASPECTVALUE3ID <> 0 OR R.ASPECTVALUE4ID <> 0 OR R.ASPECTVALUE5ID <> 0);

    SELECT ID
    FROM REMAIN R
    WHERE WAREID = OLD.ID AND R.ASPECTVALUE1ID = 0 AND R.ASPECTVALUE2ID = 0 AND
      R.ASPECTVALUE3ID = 0 AND R.ASPECTVALUE4ID = 0 AND R.ASPECTVALUE5ID = 0
    INTO RID;

    UPDATE REMAIN R SET
      R.PRICE = NULL,
      R.USEREMAIN = 0
    WHERE ID = :RID;
    DELETE FROM REMAIND RD WHERE RD.REMAINID = :RID;
  END
END
^

/* TEXT BLOCK END */

/* Convert 4.8.8 */

/* Alter Procedure (Before Drop)... */
SET TERM ^ ;

ALTER PROCEDURE UPDATE_ALL_REMAIN AS
 BEGIN EXIT; END
^

/* Drop Procedure... */
SET TERM ; ^

DROP PROCEDURE UPDATE_ALL_REMAIN;


ALTER TABLE TRANZT ADD SALETYPE FINT;

/* Create Procedure... */
SET TERM ^ ;

CREATE PROCEDURE CLEARDOCCOUNTER(ADOCID NUMERIC(18))
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE CLEARDOCREMAIN(ADOCID NUMERIC(18))
 AS
 BEGIN EXIT; END
^

CREATE PROCEDURE COUNTERD_COLLAPSE AS
 BEGIN EXIT; END
^

CREATE PROCEDURE REMAIND_COLLAPSE AS
 BEGIN EXIT; END
^


/* Create Exception... */
SET TERM ; ^

CREATE EXCEPTION E_EDIT_FORBIDDEN ' ';


/* Alter Procedure... */
/* Alter (APPENDACTDISC) */
SET TERM ^ ;

ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG DOUBLE PRECISION,
IPRICEEND DOUBLE PRECISION,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IQUANTITYRECBEG DOUBLE PRECISION,
IQUANTITYRECEND DOUBLE PRECISION,
IQUANTITYWAREBEG DOUBLE PRECISION,
IQUANTITYWAREEND DOUBLE PRECISION,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
ISUMMWAREBEG DOUBLE PRECISION,
ISUMMWAREEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER,
IDELETEDDISCRATE INTEGER,
IDISCRATECODE INTEGER,
IACTSCRIPTCODE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE ACTSCRIPTID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :IGRPACTDISCCODE
  INTO GRPACTDISCID;

  IF (GRPACTDISCID IS NULL) THEN
   BEGIN
      ERRORCODE = 1;
      EXIT;
    END

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :GRPACTDISCID
  PLAN (ACTDISC INDEX (UNQ_ACTDISC))
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, :IDATEBEG, :IDATEEND,
                                    :IDAYBEG, :IDAYEND, :IPRICEBEG, :IPRICEEND,
                                    :IQUANTITYBEG, :IQUANTITYEND,
                                    :IQUANTITYRECBEG, :IQUANTITYRECEND,
                                    :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,
                                    :ISUMMWAREBEG, :ISUMMWAREEND, :ITIMEBEG, :ITIMEEND,
                                    :IWARECODE, :IWARECODETOMARK)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (IDISCRATEPARENTCODE IS NOT NULL) THEN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEPARENTCODE AND ISFOLDER > 0
      INTO IDISCRATEPARENTID;

  IF (IDISCRATECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DISCRATE
    WHERE CODE = :IDISCRATECODE
    INTO DISCRATEID;

    IF (DISCRATEID IS NULL) THEN
    BEGIN
      ERRORCODE = 51;
      EXIT;
    END
  END
  ELSE
    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                     :ITYPE, :IVAL, NULL, NULL, '', 0,
                                     :IDESTINATION, 2, 0, NULL, :GRPACTDISCID, :IDISCRATECODE, :IDELETEDDISCRATE, NULL)
        RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  ACTSCRIPTID = NULL;
  IF (IACTSCRIPTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ACTSCRIPT
    WHERE CODE = :IACTSCRIPTCODE
    INTO ACTSCRIPTID;

    IF (ACTSCRIPTID IS NULL) THEN
    BEGIN
      ERRORCODE = 48;
      EXIT;
    END
  END

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, :ACTSCRIPTID, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         ACTSCRIPTID = :ACTSCRIPTID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPENDREMAIN) */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER,
ILOADWAREDISC INTEGER = 1,
IDELETEDDISCRATE INTEGER = 0)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE WARENAME VARCHAR(100);
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCCODE INTEGER;
DECLARE VARIABLE USEREMAIN INTEGER;
DECLARE VARIABLE SUMMR DOUBLE PRECISION;
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (AD1 + AD2 + AD3 + AD4 + AD5 = 0) THEN
  BEGIN
    ASPECTSCHEMEID = NULL;
    IF (NOT IPRICE IS NULL) THEN
      UPDATE SPRT SET PRICE = :IPRICE WHERE ID = :WAREID;
  END

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
    BEGIN
      IF (ASPCODE = 1)  THEN
        IF (IASPV1 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
          INTO AD1;
        ELSE
        BEGIN
          ERRORCODE = 10;
          EXIT;
        END

      IF (ASPCODE = 2)  THEN
        IF (IASPV2 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
          INTO AD2;
        ELSE
        BEGIN
          ERRORCODE = 11;
          EXIT;
        END

      IF (ASPCODE = 3)  THEN
        IF (IASPV3 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
          INTO AD3;
        ELSE
        BEGIN
          ERRORCODE = 12;
          EXIT;
        END

      IF (ASPCODE = 4)  THEN
        IF (IASPV4 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
          INTO AD4;
        ELSE
        BEGIN
          ERRORCODE = 13;
          EXIT;
        END

      IF (ASPCODE = 5)  THEN
        IF (IASPV5 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
          INTO AD5;
        ELSE
        BEGIN
          ERRORCODE = 14;
          EXIT;
        END
    END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR (AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    REMAINID = GEN_ID(GID, 1);

    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, PRICE,
       DELETED, USEREMAIN)
    VALUES
      (:REMAINID, :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5,
      :IPRICE, :IDELETED, :USEREMAIN);

    IF (NOT :IREMAIN IS NULL) THEN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE <> 1) THEN
    BEGIN
      SUMMR = 0;
      SELECT SUM(DELTA)
      FROM REMAIND
      WHERE REMAINID = :REMAINID AND DTYPE = 1
      INTO SUMMR;

      IF (SUMMR <> 0) THEN
        INSERT INTO REMAIND(ID, REMAINID, DELTA, DTYPE)
        VALUES (GEN_ID(GREMAIND, 1), :REMAINID, -:SUMMR, 1);

      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;
    END

    UPDATE REMAIN SET
      PRICE = :IPRICE,
      DELETED = :IDELETED
    WHERE ID = :REMAINID;

    IF (NOT :IREMAIN IS NULL) THEN
    BEGIN
      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
     END

    IF (IADDREPLACE = 2) THEN
    BEGIN
      SUMMR = 0;
      SELECT SUM(DELTA)
      FROM REMAIND
      WHERE REMAINID = :REMAINID AND DTYPE = 0
      INTO SUMMR;

      IF (SUMMR <> 0) THEN
        INSERT INTO REMAIND(ID, REMAINID, DELTA, DTYPE)
        VALUES (GEN_ID(GREMAIND, 1), :REMAINID, -:SUMMR, 0);
    END
  END

  IF ((ILOADWAREDISC = 1) AND NOT IDISCOUNTVALUE IS NULL) THEN
  BEGIN
    IF (IDISCOUNTVALUE <> '') THEN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       0, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
      RETURNING_VALUES ERRORCODE, TDISCRATEID;

    WHERECLAUSE = '';

    IF (AD1 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
    ELSE
    BEGIN
      AD1 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID IS NULL ';
    END

    IF (AD2 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
    ELSE
    BEGIN
      AD2 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID IS NULL ';
    END

    IF (AD3 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
    ELSE
    BEGIN
      AD3 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID IS NULL ';
    END

    IF (AD4 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
    ELSE
    BEGIN
      AD4 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID IS NULL ';
    END

    IF (AD5 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
    ELSE
    BEGIN
      AD5 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID IS NULL ';
    END

    IF (IUSEGRPACTDISC <> 0) THEN
    BEGIN

      SELECT ID
      FROM GRPACTDISC
      WHERE CODE = :IGRPACTDISCCODE
      INTO :GRPACTDISCID;

      IF (GRPACTDISCID IS NULL) THEN
      BEGIN
        GRPACTDISCID = GEN_ID(GID, 1);
        INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
        VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
      END

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.DELETED ' ||
                        ' FROM ACTDISCOBJ A JOIN GRPACTDISC G ON ' ||
                                          ' G.ID = A.GRPACTDISCID AND G.ID = '|| :GRPACTDISCID ||
                        ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                        '      A.PAYMENTID = -1 AND A.CARDID = -1 '|| WHERECLAUSE
      INTO TACTDISCOBJID, DEL;

      IF (TACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, NULL, NULL, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :TACTDISCOBJID;

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                         C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID
      INTO ACTDISCID, CONDITIONID;

      EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL,
                                          NULL, NULL,  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  NULL, NULL,
                                          NULL, NULL, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

      IF (ACTDISCID IS NULL) THEN
      BEGIN
        SELECT NULLTONUM(MAX(CODE)) + 1
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        INTO ACTDISCCODE;

        INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                              CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
        VALUES     (GEN_ID(GID, 1), :ACTDISCCODE, :GRPACTDISCID, :WARENAME,
                    :CONDITIONID, :TDISCRATEID, NULL, 0, :IDELETEDACTDISC);
      END
      ELSE
        UPDATE ACTDISC SET
          NAME = :WARENAME,
          CONDITIONID = :CONDITIONID,
          DISCRATEID = :TDISCRATEID,
          DELETED = :IDELETEDACTDISC
        WHERE ID = :ACTDISCID;
    END
    ELSE
    BEGIN
      IF (IDISCOUNTVALUE <> '') THEN
      BEGIN
        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID ' ||
                          ' FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                          ' D.ID = A.DISCRATEID AND D.KIND = 2 '||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '       A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
        INTO TACTDISCOBJID;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, :TDISCRATEID, NULL, NULL);
        ELSE
          UPDATE ACTDISCOBJ SET
             DISCRATEID = :TDISCRATEID,
             DELETED = 0
          WHERE ID = :TACTDISCOBJID;
      END
      ELSE
        FOR EXECUTE STATEMENT
          'SELECT A.ID FROM ACTDISCOBJ A JOIN DISCRATE D ON ' ||
          '    D.ID = A.DISCRATEID AND D.KIND = 2 ' ||
          '    WHERE A.WAREID = ' || :WAREID || ' AND A.CLIENTID = -1 AND ' ||
          '          A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 ' || WHERECLAUSE
          INTO ACTDISCID
          DO
            UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID = :ACTDISCID;
        /*EXECUTE STATEMENT
          'UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID IN ' ||
          '(SELECT A.ID FROM ACTDISCOBJ A JOIN DISCRATE D ON ' ||
          '    D.ID = A.DISCRATEID AND D.KIND = 2 ' ||
          '    WHERE A.WAREID = ' || :WAREID || ' AND A.CLIENTID = -1 AND ' ||
          '          A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 ' || WHERECLAUSE || ')';*/
    END
  END
END
^

/* empty dependent procedure body */
/* Clear: APPENDWARE for: APPENDREMAINBYWAREID */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(100),
ICERTIFICAT VARCHAR(100),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
IGTD VARCHAR(100),
ILOADWAREDISC INTEGER = 1,
IDELETEDDISCRATE INTEGER = 0)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPENDREMAINBYWAREID) */
ALTER PROCEDURE APPENDREMAINBYWAREID(IWAREID INTEGER,
IASPV1 INTEGER,
IASPECTSCHEMEID INTEGER,
IREMAIN DOUBLE PRECISION,
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IADDREPLACE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE USEREMAIN INTEGER;
DECLARE VARIABLE SUMMR DOUBLE PRECISION;
BEGIN
  ERRORCODE = 0;

  AD1 = 0;

  IF ((IASPECTSCHEMEID > 0) AND (IASPV1 > 0)) THEN
  BEGIN
    FOR
      SELECT ID, CODE
      FROM ASPECT A
      WHERE A.ASPECTSCHEMEID = :IASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
      DO
      BEGIN
        IF (ASPCODE > 1) THEN
        BEGIN
          ERRORCODE = 15;
          EXIT;
        END
        SELECT ID
        FROM ASPVALUE AV
        WHERE AV.CODE = :IASPV1 AND AV.ASPECTID = :ASPID
        INTO AD1;

        IF (AD1 = 0) THEN
        BEGIN
          ERRORCODE = 10;
          EXIT;
        END
      END
      IF (ASPID IS NULL) THEN
      BEGIN
        ERRORCODE = 9;
        EXIT;
      END
  END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :IWAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = 0 AND
    ASPECTVALUE3ID = 0 AND
    ASPECTVALUE4ID = 0 AND
    ASPECTVALUE5ID = 0
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    REMAINID = GEN_ID(GID, 1);
    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
          ASPECTVALUE4ID, ASPECTVALUE5ID, DELETED, USEREMAIN)
    VALUES
      (:REMAINID, :IWAREID, :AD1, 0, 0, 0, 0, :IDELETED, :USEREMAIN);

    IF ((NOT :IREMAIN IS NULL) AND (:IREMAIN <> 0)) THEN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE <> 1) THEN
    BEGIN
      SUMMR = 0;
      SELECT SUM(DELTA)
      FROM REMAIND
      WHERE REMAINID = :REMAINID AND DTYPE = 1
      INTO SUMMR;

      IF (SUMMR <> 0) THEN
        INSERT INTO REMAIND(ID, REMAINID, DELTA, DTYPE)
        VALUES (GEN_ID(GREMAIND, 1), :REMAINID, -:SUMMR, 1);

      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;
    END

    UPDATE REMAIN SET
      DELETED = :IDELETED
    WHERE ID = :REMAINID;

    IF ((NOT :IREMAIN IS NULL) AND (:IREMAIN <> 0)) THEN
    BEGIN
      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
    END

    IF (IADDREPLACE = 2) THEN
    BEGIN
      SUMMR = 0;
      SELECT SUM(DELTA)
      FROM REMAIND
      WHERE REMAINID = :REMAINID AND DTYPE = 0
      INTO SUMMR;

      IF (SUMMR <> 0) THEN
        INSERT INTO REMAIND(ID, REMAINID, DELTA, DTYPE)
        VALUES (GEN_ID(GREMAIND, 1), :REMAINID, -:SUMMR, 0);
    END
  END
END
^

/* empty dependent procedure body */
/* Clear: APPENDPILOT for: APPENDWARE */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
IMINPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPENDWARE) */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(100),
ICERTIFICAT VARCHAR(100),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
IGTD VARCHAR(100),
ILOADWAREDISC INTEGER = 1,
IDELETEDDISCRATE INTEGER = 0)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
DECLARE VARIABLE TISWARE INTEGER;
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TDELETED INTEGER;
DECLARE VARIABLE TDELETEDISWARE INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE HIERLEVEL INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE BARC VARCHAR(40);
BEGIN
  ERRORCODE = 0;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      IF (IEXCHANGEFORMAT <> 1) THEN
        BEGIN
          ERRORCODE = 8;
          EXIT;
        END
      ELSE
        IFIRSTASPECTVALUE = 0;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  HIERLEVEL = 0;
  IF (IPARENTCODE <> '') THEN
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (CODE = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (MARK = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
  END
  ELSE
    PARENTID = 0;
  HIERLEVEL = HIERLEVEL + 1;

  IF (IISWARE <> 1) THEN
    BEGIN
      IISWARE = -2147483647 + HIERLEVEL;
    END

  IF ((PARENTID IS NULL) OR (TISWARE > 0)) THEN
  BEGIN
    ERRORCODE = 2;
    EXIT;
  END

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  TISWARE = NULL;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ISWARE, DELETED
    FROM SPRT
    WHERE CODE = :ICODE
    INTO TID, TISWARE, TDELETEDISWARE;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, DELETED, ISWARE, DELETED
    FROM SPRT
    WHERE MARK = :IMARK
    INTO TID, TDELETED, TISWARE, TDELETEDISWARE;
  END

  IF ((((TISWARE > 0) AND (IISWARE <= 0)) OR
       ((TISWARE <= 0) AND (IISWARE > 0))) AND (TDELETEDISWARE >= IDELETED)) THEN
    EXCEPTION E_CANT_CHANGE_ISWARE;

  IF (TID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO SPRT (ID, PARENTID, CODE, MARK, NAME, TEXT, HIERLEVEL,
      MINPRICE, ECRDEVID, TAXGROUPID, RCPPRNDEVID,
      ASPECTSCHEMEID, PRICELABELID,
      MAXDISCOUNT, ISWARE, PRICE, FLAGS, LIFE, SERIES,
      CERTIFICAT, SCALELPDEVID, SCALELPWARECODE, ASPECTTYPE, QUANTITYPREC,
      SCALELPLOADED, PRICELBPRINTED, DELETED, DESCRIPTION, PICTURE, REWARDTYPE, REWARDVAL,
      ECRDEPARTMENT, GTD)
    VALUES (:ID, :PARENTID, :ICODE, :IMARK, :INAME, :ITEXT, :HIERLEVEL,
      :IMINPRICE, :ECRDEVID, :TAXGROUPID, :RCPPRNDEVID,
      :ASPECTSCHEMEID, :PRICELABELID,
      :IMAXDISCOUNT, :IISWARE, :IPRICE, :IFLAGS, :ILIFE, :ISERIES,
      :ICERTIFICAT, :SCALELPDEVID, :ISCALELPWARECODE, :IASPECTTYPE, :IQUANTITYPREC,
      :ISCALELPLOADED, :IPRICELBPRINTED, :IDELETED, :IDESCRIPTION, :IPICTURE, :IREWARDTYPE, :IREWARDVAL,
      :IECRDEPARTMENT, :IGTD);
    INCREMENTCODE = 1;
  END
  ELSE
  BEGIN
    ID = TID;
    IF (TDELETED = IDELETED) THEN
      UPDATE SPRT SET
        ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
        ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
        CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
                                           PRICELABELID = :PRICELABELID,
        DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
        DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
        ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
        ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
        FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
        HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
        ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
        LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
        MARK = :IMARK,                     SERIES = :ISERIES,
        MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
        MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
        NAME = :INAME,
        GTD = :IGTD
      WHERE ID = :ID;
    ELSE
      BEGIN
        UPDATE SPRT SET
          ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
          ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
          CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
          CODE = :ICODE,                     PRICELABELID = :PRICELABELID,
          DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
          DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
          ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
          ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
          FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
          HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
          ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
          LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
          MARK = :IMARK,                     SERIES = :ISERIES,
          MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
          MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
          NAME = :INAME,
          GTD = :IGTD
        WHERE ID = :ID;
        INCREMENTCODE = 1;
      END
  END

  IF (IISWARE = 1) THEN
  BEGIN
    EXECUTE PROCEDURE APPENDREMAINBYWAREID (:ID, :IFIRSTASPECTVALUE, :ASPECTSCHEMEID, :IREMAIN, :IDELETEDREMAIN, :IDELETEDASPECT, :IADDREPLACE)
      RETURNING_VALUES ERRORCODE;

    IF (ERRORCODE > 0) THEN
      EXIT;

    WHILE (IBARCODES <> '') DO
    BEGIN
      BARC = EXTRACTSTR(IBARCODES, ',');

      EXECUTE PROCEDURE APPENDBARCODEBYWAREID (:BARC, :ID, 0, 0, 0, 0, 0, :IFACTOR, 0, :IDELETEDBARCODE)
        RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;

      IBARCODES = PCOPY(IBARCODES, LEN(BARC) + 1, LEN(IBARCODES) - LEN(BARC) - 1);
    END
  END

  IF ((ILOADWAREDISC = 1) AND NOT (IDISCRATEPARENTID IS NULL) AND NOT (IDISCOUNTVALUE IS NULL)) THEN
    BEGIN
      EXECUTE PROCEDURE APPEND_WARE_DISC(:ID, :IDISCOUNTTYPE, :IDISCOUNTVALUE, :IDISCRATEPARENTID, :IDELETEDDISCRATE)
            RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;
    END

  IF (ILOADWAREDISC = 1) THEN
  BEGIN
    IF (TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :ID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID,
          DELETED = 0
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID)
        VALUES   (GEN_ID(GID, 1), :ID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID);
    END
    ELSE
    BEGIN
      DELETE FROM ACTDISCOBJ WHERE WAREID = :ID AND CLIENTID = -1 AND CARDID = -1 AND
                                 ASPECTVALUE1ID IS NULL AND ASPECTVALUE2ID IS NULL AND ASPECTVALUE3ID IS NULL AND
                                 ASPECTVALUE4ID IS NULL AND ASPECTVALUE5ID IS NULL AND
                                 PAYMENTID = -1 AND DISCRATEID IS NULL AND ACTSCRIPTID IS NULL;
    END
  END
END
^

/* Alter (CANCELSTORED) */
ALTER PROCEDURE CANCELSTORED(ATRANZDATE DATE,
ATRANZTIME TIME,
ATRANZHOUR INTEGER,
APOSNUMBER INTEGER,
ASELLERID INTEGER,
ASAVED INTEGER,
AWARECODETOMARK INTEGER,
ACONTROLSALEREMAIN INTEGER)
 AS
DECLARE VARIABLE TRANZCOUNT INTEGER;
DECLARE VARIABLE RMKID INTEGER;
DECLARE VARIABLE DOCID NUMERIC(18,0);
DECLARE VARIABLE WARECODE INTEGER;
DECLARE VARIABLE WAREMARK VARCHAR(100);
DECLARE VARIABLE TRANZTYPE INTEGER;
DECLARE VARIABLE QUANTITY INTEGER;
DECLARE VARIABLE ASPSCHEMECODE INTEGER;
DECLARE VARIABLE ASPSCHEMEID INTEGER;
DECLARE VARIABLE ASPVAL1 INTEGER;
DECLARE VARIABLE ASPVAL2 INTEGER;
DECLARE VARIABLE ASPVAL3 INTEGER;
DECLARE VARIABLE ASPVAL4 INTEGER;
DECLARE VARIABLE ASPVAL5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
DECLARE VARIABLE TRID NUMERIC(18,0);
DECLARE VARIABLE USERCODE INTEGER;
DECLARE VARIABLE TMPID NUMERIC(18,0);
BEGIN
  SELECT ID
  FROM RMK R
  WHERE R.CODE = :APOSNUMBER
  INTO RMKID;

  SELECT CODE
  FROM "USER"
  WHERE ID = :ASELLERID
  INTO USERCODE;

  EXECUTE PROCEDURE GET_TRANZCOUNT(:RMKID) RETURNING_VALUES TRANZCOUNT;

  FOR
    SELECT ID
    FROM DOCUMENT D
    WHERE D.RMKID = :RMKID AND D.STATE = 3
    AND NOT EXISTS(SELECT 1 FROM TRAUTH TR WHERE TR.DOCUMENTID = D.ID)
    AND NOT EXISTS(SELECT 1 FROM TRANZT T WHERE T.DOCUMENTID = D.ID AND T.TRANZTYPE IN (40,41,45))
    AND NOT (D.ORDERIDENTIF IS NOT NULL AND D.ORDERIDENTIF <> '')

    INTO DOCID
    DO
    IF (NOT EXISTS(SELECT 1 FROM DOCUMENT DP
                   JOIN DOCKIND DPDK ON DPDK.ID = DP.DOCKINDID
                   WHERE DP.PREPAYEDDOCID = :DOCID AND DP.STATE = 1 AND DPDK.ECRRECEIPTTYPE = 0 AND
                   NOT EXISTS(
                   SELECT 1 FROM DOCUMENT DPR
                   JOIN DOCKIND DPRDK ON DPRDK.ID = DPR.DOCKINDID
                   WHERE DPR.DOCUMENTID = DP.ID AND DPRDK.ECRRECEIPTTYPE IN (1, 2)))) THEN
    BEGIN
         --    11  12, -   
      FOR
        SELECT WARECODE, WAREMARK, TRANZTYPE, QUANTITY,
        ASPECTSCHEME, ASPECTVALUE1, ASPECTVALUE2, ASPECTVALUE3, ASPECTVALUE4, ASPECTVALUE5
        FROM TRANZT T
        LEFT JOIN SPRT S ON S.CODE = T.WARECODE
        WHERE TRANZTYPE IN (11,12) AND T.DOCUMENTID = :DOCID
      INTO WARECODE, WAREMARK, TRANZTYPE, QUANTITY, ASPSCHEMECODE, ASPVAL1, ASPVAL2, ASPVAL3, ASPVAL4, ASPVAL5
      DO
      BEGIN
        WAREID = NULL;
        FLAGS = NULL;
           --  ID    
        IF (AWARECODETOMARK = 0) THEN
        BEGIN
          SELECT ID, FLAGS
          FROM SPRT
          WHERE CODE = :WARECODE
          INTO WAREID, FLAGS;
        END
        ELSE
        BEGIN
          SELECT FIRST 1 ID, FLAGS
          FROM SPRT
          WHERE MARK = :WAREMARK
          INTO :WAREID, :FLAGS;
        END
        --          ,  -
        IF (:ACONTROLSALEREMAIN = 1 OR :ACONTROLSALEREMAIN = 2 AND :FLAGS/64 <> (:FLAGS/32)/2.0) THEN
        BEGIN
          ASPSCHEMEID = NULL;
          SELECT ID
          FROM ASPSCHM
          WHERE CODE = :ASPSCHEMECODE
          INTO :ASPSCHEMEID;

          REMAINID = NULL;
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL1 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 1)) AND
          R.ASPECTVALUE2ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL2 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 2)) AND
          R.ASPECTVALUE3ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL3 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 3)) AND
          R.ASPECTVALUE4ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL4 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 4)) AND
          R.ASPECTVALUE5ID = NULLTOINT((SELECT AV.ID FROM ASPVALUE AV JOIN ASPECT AP ON AV.ASPECTID = AP.ID WHERE AV.CODE = :ASPVAL5 AND AV.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.ASPECTSCHEMEID = :ASPSCHEMEID AND AP.CODE = 5)) AND
          R.WAREID = :WAREID AND
          R.USEREMAIN = 1
          INTO
          REMAINID;

          IF (:REMAINID IS NULL) THEN
          SELECT ID
          FROM REMAIN R
          WHERE
          R.ASPECTVALUE1ID = 0 AND
          R.ASPECTVALUE2ID = 0 AND
          R.ASPECTVALUE3ID = 0 AND
          R.ASPECTVALUE4ID = 0 AND
          R.ASPECTVALUE5ID = 0 AND
          R.WAREID = :WAREID
          INTO
          REMAINID;

          IF (:REMAINID IS NOT NULL) THEN
          INSERT INTO REMAIND (
           ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
          VALUES (
           GEN_ID(GREMAIND, 1), :REMAINID, -:QUANTITY, :DOCID, 0);
        END
      END

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID AND TRANZTYPE = 54
        INTO TMPID
        DO
          UPDATE TRANZT T SET
            TRANZDATE = :ATRANZDATE,
            TRANZHOUR = :ATRANZHOUR,
            TRANZTIME = :ATRANZTIME,
            TRANZTYPE = 56,
            T.SELLER = :USERCODE
          WHERE ID = :TMPID;

      FOR
        SELECT ID
        FROM TRANZT T
        WHERE T.DOCUMENTID = :DOCID
        ORDER BY ID
        INTO TRID
        DO
        BEGIN
          UPDATE TRANZT SET
            TRANZCOUNT = :TRANZCOUNT
          WHERE ID = :TRID;
          TRANZCOUNT = TRANZCOUNT + 1;
        END

      EXECUTE PROCEDURE CLEARDOCCOUNTER(:DOCID);
      UPDATE DOCUMENT D SET
        STATE = 2,
        CLOSEDATE = :ATRANZDATE,
        CLOSETIME = :ATRANZTIME,
        CLOSEUSERID = :ASELLERID,
        SAVED = :ASAVED
      WHERE ID = :DOCID;
    END
END
^

/* Restore proc. body: APPENDPILOT */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
IMINPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE DORMANTVAR INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;
  IF (IPTYPE = 2) THEN
     FLAGS = 511;
  ELSE
     FLAGS = 1535;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, :IMINPRICE, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            SELECT ID
            FROM SPRT
            WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
            INTO MAINID;

            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, :IMINPRICE, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, :IMINPRICE, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

/* Restore proc. body: CLEARDOCCOUNTER */
ALTER PROCEDURE CLEARDOCCOUNTER(ADOCID NUMERIC(18))
 AS
BEGIN
  INSERT INTO COUNTERD (ID, COUNTERID, DELTA, DELTADATE, DOCUMENTID, DTYPE)
  SELECT GEN_ID(GCOUNTERD, 1), COUNTERID, -DELTA, DELTADATE, DOCUMENTID, DTYPE
  FROM COUNTERD CD
  WHERE CD.DOCUMENTID = :ADOCID;
END
^

/* Restore proc. body: CLEARDOCREMAIN */
ALTER PROCEDURE CLEARDOCREMAIN(ADOCID NUMERIC(18))
 AS
DECLARE VARIABLE SUMM0 DOUBLE PRECISION;
DECLARE VARIABLE SUMM1 DOUBLE PRECISION;
DECLARE VARIABLE RID INTEGER;
BEGIN
  FOR
    SELECT REMAINID, SUM(IIF(DTYPE = 0, DELTA, 0)), SUM(IIF(DTYPE = 1, DELTA, 0))
    FROM REMAIND RD
    WHERE RD.DOCUMENTID = :ADOCID
    GROUP BY REMAINID
    INTO RID, SUMM0, SUMM1
    DO
    BEGIN
      IF (SUMM0 <> 0) THEN
        INSERT INTO REMAIND(ID, REMAINID, DELTA, DTYPE)
        VALUES (GEN_ID(GREMAIND, 1), :RID, -:SUMM0, 0);
      IF (SUMM1 <> 0) THEN
        INSERT INTO REMAIND(ID, REMAINID, DELTA, DTYPE)
        VALUES (GEN_ID(GREMAIND, 1), :RID, -:SUMM1, 1);
    END
END
^

/* Restore proc. body: COUNTERD_COLLAPSE */
ALTER PROCEDURE COUNTERD_COLLAPSE AS
DECLARE VARIABLE COLLAPSEDEPTH INTEGER;
DECLARE VARIABLE BDOCODE INTEGER;
DECLARE VARIABLE CID INTEGER;
DECLARE VARIABLE CTID INTEGER;
DECLARE VARIABLE SUMM0 DOUBLE PRECISION;
DECLARE VARIABLE SUMM1 DOUBLE PRECISION;
DECLARE VARIABLE CHNG NUMERIC(18,0);
DECLARE VARIABLE CHNGMAX NUMERIC(18,0);
DECLARE VARIABLE ALG INTEGER;
DECLARE VARIABLE DATE1 DATE;
DECLARE VARIABLE COUNTERDCOLLAPSE INTEGER;
BEGIN

  SELECT BDOCODE
  FROM CUSTOMDB
  INTO BDOCODE;

  BDOCODE = COALESCE(BDOCODE, 0);

  IF (BDOCODE = 0) THEN
  BEGIN
    SELECT MAX(VAL)
    FROM SETTINGS
    WHERE NAME = 'CounterdCollapseDepth'
    INTO COLLAPSEDEPTH;

    SELECT MAX(VAL)
    FROM SETTINGS
    WHERE NAME = 'CounterdCollapse'
    INTO COUNTERDCOLLAPSE;
  END
  ELSE
  BEGIN
    SELECT MAX(VAL)
    FROM SETTINGS
    WHERE NAME = 'CounterdCollapseDepth' AND OWNERBDO = :BDOCODE
    INTO COLLAPSEDEPTH;

    SELECT MAX(VAL)
    FROM SETTINGS
    WHERE NAME = 'CounterdCollapse' AND OWNERBDO = :BDOCODE
    INTO COUNTERDCOLLAPSE;
  END

  COLLAPSEDEPTH = COALESCE(COLLAPSEDEPTH, 0);
  COUNTERDCOLLAPSE = COALESCE(COUNTERDCOLLAPSE, 0);

  IF (COUNTERDCOLLAPSE <> 0) THEN
  BEGIN
    SELECT MAX(CHNG)
    FROM COUNTERD
    INTO CHNGMAX;
    IF (CHNGMAX IS NULL) THEN
      CHNGMAX = 0;

    IF (BDOCODE <> 0) THEN
    BEGIN
      IF (EXISTS(SELECT 1 FROM SYNCBASE SB1
        WHERE SB1.ID = (SELECT PARENTID FROM SYNCBASE SB2 WHERE SB2.CODE = :BDOCODE))) THEN
      BEGIN
        SELECT CHNGVAL
        FROM TBLINFO
        WHERE TABLENAME = 'COUNTERD'
        INTO CHNG;
        CHNG = COALESCE(CHNG, 0);
        IF (CHNG < CHNGMAX) THEN
          CHNGMAX = CHNG;
      END

      IF (EXISTS(SELECT 1 FROM SYNCBASE SB1
        WHERE SB1.PARENTID = (SELECT ID FROM SYNCBASE SB2 WHERE SB2.CODE = :BDOCODE))) THEN
      BEGIN
        SELECT MIN(CHNGVAL)
        FROM TBLLOADINFO
        WHERE TABLENAME = 'COUNTERD'
        INTO CHNG;
        CHNG = COALESCE(CHNG, 0);
        IF (CHNG < CHNGMAX) THEN
          CHNGMAX = CHNG;
      END
    END

    FOR
      SELECT CT.COUNTERALG, CT.ID
      FROM COUNTERTYPE CT
      INTO ALG, CTID
      DO
      BEGIN
        SELECT DATE1
        FROM GET_PERIOD_FOR_ALG(:ALG, CURRENT_DATE)
        INTO DATE1;

        FOR
          SELECT CD.COUNTERID, SUM(IIF(DTYPE = 0, DELTA, 0)), SUM(IIF(DTYPE = 1, DELTA, 0))
          FROM COUNTER C
            JOIN COUNTERD CD ON C.ID = CD.COUNTERID
          WHERE C.COUNTERTYPEID = :CTID AND (:ALG = 0 OR CD.DTYPE = 1 OR CD.DELTADATE < :DATE1)
            AND (CD.DELTADATE <= CURRENT_DATE - :COLLAPSEDEPTH OR DELTADATE IS NULL) AND CD.DOCUMENTID IS NULL AND CD.CHNG <= :CHNGMAX
          GROUP BY CD.COUNTERID
          HAVING COUNT(CD.ID) > 1
          INTO CID, SUMM0, SUMM1
          DO
          BEGIN
            DELETE FROM COUNTERD WHERE COUNTERID = :CID AND (:ALG = 0 OR DTYPE = 1 OR DELTADATE < :DATE1)
              AND (DELTADATE <= CURRENT_DATE - :COLLAPSEDEPTH OR DELTADATE IS NULL) AND DOCUMENTID IS NULL AND CHNG <= :CHNGMAX;
            IF (ALG = 0) THEN
            BEGIN
              IF (SUMM0 <> 0) THEN
                INSERT INTO COUNTERD(ID, COUNTERID, DELTA, DELTADATE, CHNG, DTYPE)
                VALUES (GEN_ID(GCOUNTERD, 1), :CID, :SUMM0, CURRENT_DATE, -1, 0);
            END
            IF (SUMM1 <> 0) THEN
              INSERT INTO COUNTERD(ID, COUNTERID, DELTA, DELTADATE, CHNG, DTYPE)
              VALUES (GEN_ID(GCOUNTERD, 1), :CID, :SUMM1, CURRENT_DATE, -1, 1);
          END
      END
  END
  DELETE FROM COUNTERD WHERE DTYPE = 2 AND CHNG <= :CHNGMAX;
END
^

/* Restore proc. body: REMAIND_COLLAPSE */
ALTER PROCEDURE REMAIND_COLLAPSE AS
DECLARE VARIABLE RID INTEGER;
DECLARE VARIABLE SUMM0 DOUBLE PRECISION;
DECLARE VARIABLE SUMM1 DOUBLE PRECISION;
DECLARE VARIABLE CHNG NUMERIC(18,0);
DECLARE VARIABLE CHNGMAX NUMERIC(18,0);
DECLARE VARIABLE BDOCODE INTEGER;
DECLARE VARIABLE REMAINDCOLLAPSE INTEGER;
BEGIN
  SELECT BDOCODE
  FROM CUSTOMDB
  INTO BDOCODE;
  BDOCODE = COALESCE(BDOCODE, 0);

  IF (BDOCODE = 0) THEN
    SELECT MAX(VAL)
    FROM SETTINGS
    WHERE NAME = 'RemainDCollapse'
    INTO REMAINDCOLLAPSE;
  ELSE
    SELECT MAX(VAL)
    FROM SETTINGS
    WHERE NAME = 'RemainDCollapse' AND OWNERBDO = :BDOCODE
    INTO REMAINDCOLLAPSE;
  REMAINDCOLLAPSE = COALESCE(REMAINDCOLLAPSE, 0);

  IF (REMAINDCOLLAPSE <> 0) THEN
  BEGIN
    SELECT MAX(CHNG)
    FROM REMAIND
    INTO CHNGMAX;
    IF (CHNGMAX IS NULL) THEN
      CHNGMAX = 0;

    IF (BDOCODE <> 0) THEN
    BEGIN
      IF (EXISTS(SELECT 1 FROM SYNCBASE SB1
        WHERE SB1.ID = (SELECT PARENTID FROM SYNCBASE SB2 WHERE SB2.CODE = :BDOCODE))) THEN
      BEGIN
        SELECT CHNGVAL
        FROM TBLINFO
        WHERE TABLENAME = 'REMAIND'
        INTO CHNG;
        CHNG = COALESCE(CHNG, 0);
        IF (CHNG < CHNGMAX) THEN
          CHNGMAX = CHNG;
      END

      IF (EXISTS(SELECT 1 FROM SYNCBASE SB1
        WHERE SB1.PARENTID = (SELECT ID FROM SYNCBASE SB2 WHERE SB2.CODE = :BDOCODE))) THEN
      BEGIN
        SELECT MIN(CHNGVAL)
        FROM TBLLOADINFO
        WHERE TABLENAME = 'REMAIND'
        INTO CHNG;
        CHNG = COALESCE(CHNG, 0);
        IF (CHNG < CHNGMAX) THEN
          CHNGMAX = CHNG;
      END
    END
    FOR
      SELECT REMAINID, SUM(IIF(DTYPE = 0, DELTA, 0)), SUM(IIF(DTYPE = 1, DELTA, 0))
      FROM REMAIND RD
      WHERE RD.DOCUMENTID IS NULL AND RD.CHNG <= :CHNGMAX
      GROUP BY REMAINID
      HAVING COUNT(ID) > 1
      ORDER BY 1, 2
      INTO RID, SUMM0, SUMM1 DO
      BEGIN
        DELETE FROM REMAIND WHERE REMAINID = :RID AND DOCUMENTID IS NULL AND CHNG <= :CHNGMAX;
        IF (SUMM0 <> 0) THEN
          INSERT INTO REMAIND(ID, REMAINID, DELTA, CHNG, DTYPE)
          VALUES (GEN_ID(GREMAIND, 1), :RID, :SUMM0, -1, 0);
        IF (SUMM1 <> 0) THEN
          INSERT INTO REMAIND(ID, REMAINID, DELTA, CHNG, DTYPE)
          VALUES (GEN_ID(GREMAIND, 1), :RID, :SUMM1, -1, 1);
      END
  END
  DELETE FROM REMAIND WHERE DTYPE = 2 AND CHNG <= :CHNGMAX;
END
^

/* Create trigger... */
CREATE TRIGGER INS_AFT_COUNTERD_COLLAPSE FOR COUNTERD
ACTIVE AFTER INSERT POSITION 100 
AS
BEGIN
  IF (NEW.DTYPE = 2) THEN
    EXECUTE PROCEDURE COUNTERD_COLLAPSE;
END
^

CREATE TRIGGER INS_AFT_REMAIND_COLLAPSE FOR REMAIND
ACTIVE AFTER INSERT POSITION 0 
AS
BEGIN
  IF (NEW.DTYPE = 2) THEN
    EXECUTE PROCEDURE REMAIND_COLLAPSE;
END
^

CREATE TRIGGER UPD_BEF_COUNTERD0 FOR COUNTERD
ACTIVE BEFORE UPDATE POSITION 0 
AS 
BEGIN
  IF (OLD.DELTA <> NEW.DELTA) THEN
    EXCEPTION E_EDIT_FORBIDDEN;
END
^

CREATE TRIGGER UPD_BEF_REMAIND0 FOR REMAIND
ACTIVE BEFORE UPDATE POSITION 0 
AS 
BEGIN
  IF (OLD.DELTA <> NEW.DELTA) THEN
    EXCEPTION E_EDIT_FORBIDDEN;
END
^


/* Alter exist trigger... */
SET TERM ; ^

DROP TRIGGER CHNG_BEF_COUNTERD;

SET TERM ^ ;

CREATE TRIGGER CHNG_BEF_COUNTERD FOR COUNTERD
ACTIVE BEFORE INSERT OR UPDATE POSITION 1 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
SET TERM ; ^

DROP TRIGGER CHNG_BEF_REMAIND;

SET TERM ^ ;

CREATE TRIGGER CHNG_BEF_REMAIND FOR REMAIND
ACTIVE BEFORE INSERT OR UPDATE POSITION 1 
AS 
BEGIN
  IF ((NEW.CHNG > 0) OR (NEW.CHNG IS NULL)) THEN
    NEW.CHNG = GEN_ID(GCHNG, 1);
  IF (NEW.BDOCODE < 0) THEN
    NEW.BDOCODE = -NEW.BDOCODE;
  ELSE
    SELECT FIRST 1 DBIDENT FROM CUSTOMDB INTO NEW.BDOCODE;
END
^

/* Alter exist trigger... */
ALTER TRIGGER DEL_BEF_DOCUMENT
AS
BEGIN
  IF (OLD.EDUCATION = 1) THEN
  BEGIN
    EXECUTE PROCEDURE CLEARDOCREMAIN(OLD.ID);
    EXECUTE PROCEDURE CLEARDOCCOUNTER(OLD.ID);
  END
END
^

/* Alter exist trigger... */
ALTER TRIGGER SYNCDEL_COUNTERD
AS
BEGIN
--  EXECUTE PROCEDURE APPEND_DELQUEUE(60, OLD.ID);
END
^

/* Alter exist trigger... */
ALTER TRIGGER SYNCDEL_REMAIND
AS
BEGIN
--  EXECUTE PROCEDURE APPEND_DELQUEUE(61, OLD.ID);
END
^

/* Alter exist trigger... */
ALTER TRIGGER UPD_BEF_SPRT0
AS
DECLARE VARIABLE RID INTEGER;
DECLARE VARIABLE SUMM0 DOUBLE PRECISION;
DECLARE VARIABLE SUMM1 DOUBLE PRECISION;
BEGIN
  IF (NEW.NAME IS NULL) THEN
    NEW.NAME = '';
  IF (NEW.MARK IS NULL) THEN
    NEW.MARK = '';
  IF (NEW.SCALELPLOADED IS NULL) THEN
    NEW.SCALELPLOADED = 0;
  IF (NEW.PRICELBPRINTED IS NULL) THEN
    NEW.PRICELBPRINTED = 0;
  IF (NEW.CHNG > 0 AND OLD.CHNG < 0) THEN
  BEGIN
    UPDATE REMAIN R SET
      CHNG = NULL
    WHERE WAREID = OLD.ID AND R.ASPECTVALUE1ID = 0 AND R.ASPECTVALUE2ID = 0 AND
      R.ASPECTVALUE3ID = 0 AND R.ASPECTVALUE4ID = 0 AND R.ASPECTVALUE5ID = 0;
  END
  IF (NEW.DELETED > OLD.DELETED) THEN
  BEGIN
    UPDATE REMAIN R SET
      DELETED = - 1
    WHERE WAREID = OLD.ID AND (R.ASPECTVALUE1ID <> 0 OR R.ASPECTVALUE2ID <> 0 OR
      R.ASPECTVALUE3ID <> 0 OR R.ASPECTVALUE4ID <> 0 OR R.ASPECTVALUE5ID <> 0);

    SELECT ID
    FROM REMAIN R
    WHERE WAREID = OLD.ID AND R.ASPECTVALUE1ID = 0 AND R.ASPECTVALUE2ID = 0 AND
      R.ASPECTVALUE3ID = 0 AND R.ASPECTVALUE4ID = 0 AND R.ASPECTVALUE5ID = 0
    INTO RID;

    UPDATE REMAIN R SET
      R.PRICE = NULL,
      R.USEREMAIN = 0
    WHERE ID = :RID;
    
    FOR
      SELECT R.ID, SUM(IIF(DTYPE = 0, DELTA, 0)), SUM(IIF(DTYPE = 1, DELTA, 0))
      FROM REMAIN R LEFT JOIN REMAIND RD ON RD.REMAINID = R.ID
      WHERE R.WAREID = OLD.ID
      GROUP BY R.ID
      INTO RID, SUMM0, SUMM1
      DO
      BEGIN
        IF (SUMM0 <> 0) THEN
          INSERT INTO REMAIND(ID, REMAINID, DELTA, DTYPE)
          VALUES (GEN_ID(GREMAIND, 1), :RID, -:SUMM0, 0);
        IF (SUMM1 <> 0) THEN
          INSERT INTO REMAIND(ID, REMAINID, DELTA, DTYPE)
          VALUES (GEN_ID(GREMAIND, 1), :RID, -:SUMM1, 1);
      END
  END
END
^

/* Alter Procedure... */
/* Alter (APPENDPILOT) */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
IMINPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE DORMANTVAR INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;
  IF (IPTYPE = 2) THEN
     FLAGS = 511;
  ELSE
     FLAGS = 1535;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, :IMINPRICE, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            SELECT ID
            FROM SPRT
            WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
            INTO MAINID;

            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, :IMINPRICE, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, :IMINPRICE, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

SET TERM ; ^

ALTER TABLE TRANZT ALTER COLUMN ID POSITION 1;

ALTER TABLE TRANZT ALTER COLUMN DOCUMENTID POSITION 2;

ALTER TABLE TRANZT ALTER COLUMN TRANZCOUNT POSITION 3;

ALTER TABLE TRANZT ALTER COLUMN TRANZDATE POSITION 4;

ALTER TABLE TRANZT ALTER COLUMN TRANZTIME POSITION 5;

ALTER TABLE TRANZT ALTER COLUMN TRANZHOUR POSITION 6;

ALTER TABLE TRANZT ALTER COLUMN TRANZTYPE POSITION 7;

ALTER TABLE TRANZT ALTER COLUMN SELLER POSITION 8;

ALTER TABLE TRANZT ALTER COLUMN WARECODE POSITION 9;

ALTER TABLE TRANZT ALTER COLUMN WAREMARK POSITION 10;

ALTER TABLE TRANZT ALTER COLUMN ASPECTSCHEME POSITION 11;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE1 POSITION 12;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE2 POSITION 13;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE3 POSITION 14;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE4 POSITION 15;

ALTER TABLE TRANZT ALTER COLUMN ASPECTVALUE5 POSITION 16;

ALTER TABLE TRANZT ALTER COLUMN PRICE POSITION 17;

ALTER TABLE TRANZT ALTER COLUMN QUANTITY POSITION 18;

ALTER TABLE TRANZT ALTER COLUMN SUMM POSITION 19;

ALTER TABLE TRANZT ALTER COLUMN PRICEWD POSITION 20;

ALTER TABLE TRANZT ALTER COLUMN SUMMWD POSITION 21;

ALTER TABLE TRANZT ALTER COLUMN INFO POSITION 22;

ALTER TABLE TRANZT ALTER COLUMN INFOSTR POSITION 23;

ALTER TABLE TRANZT ALTER COLUMN BARCODE POSITION 24;

ALTER TABLE TRANZT ALTER COLUMN FACTOR POSITION 25;

ALTER TABLE TRANZT ALTER COLUMN CURRENCY POSITION 26;

ALTER TABLE TRANZT ALTER COLUMN ECRNUMBER POSITION 27;

ALTER TABLE TRANZT ALTER COLUMN POSID POSITION 28;

ALTER TABLE TRANZT ALTER COLUMN POSNUMB POSITION 29;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCPOS POSITION 30;

ALTER TABLE TRANZT ALTER COLUMN SUMMDISCREC POSITION 31;

ALTER TABLE TRANZT ALTER COLUMN COMMENTCODE POSITION 32;

ALTER TABLE TRANZT ALTER COLUMN COUNTFILLS POSITION 33;

ALTER TABLE TRANZT ALTER COLUMN COUNTPRINTS POSITION 34;

ALTER TABLE TRANZT ALTER COLUMN BDOCODE POSITION 35;

ALTER TABLE TRANZT ALTER COLUMN OWNERBDO POSITION 36;

ALTER TABLE TRANZT ALTER COLUMN ORDERPOS POSITION 37;

ALTER TABLE TRANZT ALTER COLUMN TRMKID POSITION 38;

ALTER TABLE TRANZT ALTER COLUMN SALETYPE POSITION 39;

/* DROP: -- GRANT EXECUTE ON PROCEDURE SET_WAREREMAIN TO PUBLIC */
REVOKE EXECUTE ON PROCEDURE SET_WAREREMAIN FROM PUBLIC;

/* DROP: -- GRANT EXECUTE ON PROCEDURE SET_WAREREMAIN TO SYNCSRV */
REVOKE EXECUTE ON PROCEDURE SET_WAREREMAIN FROM SYNCSRV;

/* MAN */

SET TERM ^;

UPDATE SETTINGS
SET
VAL = (SELECT CASE VAL WHEN '1' THEN '1' ELSE '0' END FROM SETTINGS S
  WHERE S.OWNERBDO = SETTINGS.OWNERBDO AND S.NAME = 'ConcatePositions')
WHERE NAME = 'ConcatePositionsFracSaleWares' AND
EXISTS (SELECT CASE VAL WHEN '1' THEN '1' ELSE '0' END FROM SETTINGS S2
  WHERE S2.OWNERBDO = SETTINGS.OWNERBDO AND S2.NAME = 'ConcatePositions')^

INSERT INTO SETTINGS
(ID, NAME, VAL, OWNERBDO, SYNCCATEG)
SELECT
GEN_ID(GID, 1), 'ConcatePositionsFracSaleWares',
CASE VAL WHEN '1' THEN '1' ELSE '0' END,
OWNERBDO, SYNCCATEG
FROM SETTINGS S1 WHERE NAME = 'ConcatePositions' AND NOT EXISTS
(SELECT FIRST 1 1 FROM SETTINGS S2 WHERE S2.NAME = 'ConcatePositionsFracSaleWares' AND
  S1.OWNERBDO = S2.OWNERBDO)^

UPDATE SETTINGS SET VAL = CASE WHEN VAL = '1' THEN '0' WHEN (VAL = '0' OR VAL IS NULL) THEN '1' END
WHERE NAME = 'ConcatePositionsWithBarcode'^

UPDATE SETTINGS SET VAL = '1'
WHERE NAME = 'ConcatePositions' AND VAL = '2'^

CREATE PROCEDURE CHANGE_SECURITY AS
DECLARE VARIABLE PROFILEID INTEGER;
DECLARE VARIABLE SECURITYVALUE INTEGER;
DECLARE VARIABLE SECURITYVALUE2 INTEGER;
DECLARE VARIABLE OWNERBDO INTEGER;
BEGIN
  FOR SELECT PROFILEID, SECURITYVALUE, COALESCE(OWNERBDO, 0) FROM SECURITY
  WHERE SECURITY = 347 /* S_OPERWITHCHQ_EDITEMPLOYEE = 347; */
  INTO PROFILEID, SECURITYVALUE, OWNERBDO DO
  BEGIN
    EXECUTE PROCEDURE MERGE_SECURITY(:PROFILEID, 358, :SECURITYVALUE, 0, :OWNERBDO); /* S_EDITEMPLOYEE_VISUAL = 358; */
    EXECUTE PROCEDURE MERGE_SECURITY(:PROFILEID, 359, :SECURITYVALUE, 0, :OWNERBDO); /* S_EDITEMPLOYEE_READ = 359; */
    EXECUTE PROCEDURE MERGE_SECURITY(:PROFILEID, 360, :SECURITYVALUE, 0, :OWNERBDO); /* S_EDITEMPLOYEE_SCAN = 360; */
    EXECUTE PROCEDURE MERGE_SECURITY(:PROFILEID, 361, :SECURITYVALUE, 0, :OWNERBDO); /* S_EDITEMPLOYEE_MANU = 361; */
  END

  FOR SELECT PROFILEID, SECURITYVALUE, COALESCE(OWNERBDO, 0) FROM SECURITY
  WHERE SECURITY = 324 /* S_CHQUSERDOC_OPENNEW = 324; */
  INTO PROFILEID, SECURITYVALUE, OWNERBDO DO
  BEGIN
    SELECT SECURITYVALUE FROM SECURITY
    WHERE (PROFILEID = :PROFILEID) AND (OWNERBDO = :OWNERBDO) AND (SECURITY = 917) /* S_EXTEND_EMPLOYEELIST = 917; */
    INTO SECURITYVALUE2;
    
    IF (:SECURITYVALUE = :SECURITYVALUE2) THEN
    BEGIN
      EXECUTE PROCEDURE MERGE_SECURITY(:PROFILEID, 363, :SECURITYVALUE, 0, :OWNERBDO); /* S_EDITEMPLOYEELIST_OPENNEW = 363; */
      EXECUTE PROCEDURE MERGE_SECURITY(:PROFILEID, 364, :SECURITYVALUE, 0, :OWNERBDO); /* S_EDITEMPLOYEELIST_OPENNEWBYNO = 364; */
    END
  END

  FOR SELECT PROFILEID, SECURITYVALUE, COALESCE(OWNERBDO, 0) FROM SECURITY
  WHERE SECURITY = 917 /* S_EXTEND_EMPLOYEELIST = 917; */
  INTO PROFILEID, SECURITYVALUE, OWNERBDO DO
  BEGIN
    EXECUTE PROCEDURE MERGE_SECURITY(:PROFILEID, 367, :SECURITYVALUE, 0, :OWNERBDO); /* S_EDITEMPLOYEELIST_REGISTR_CODE = 367; */
    EXECUTE PROCEDURE MERGE_SECURITY(:PROFILEID, 372, :SECURITYVALUE, 0, :OWNERBDO); /* S_EDITEMPLOYEELIST_REGISTR_VISUAL = 372; */
    EXECUTE PROCEDURE MERGE_SECURITY(:PROFILEID, 369, :SECURITYVALUE, 0, :OWNERBDO); /* S_EDITEMPLOYEELIST_REGISTR_VISUAL_READ = 369; */
    EXECUTE PROCEDURE MERGE_SECURITY(:PROFILEID, 370, :SECURITYVALUE, 0, :OWNERBDO); /* S_EDITEMPLOYEELIST_REGISTR_VISUAL_SCAN = 370; */
    EXECUTE PROCEDURE MERGE_SECURITY(:PROFILEID, 371, :SECURITYVALUE, 0, :OWNERBDO); /* S_EDITEMPLOYEELIST_STORNO = 371; */
  END

  FOR SELECT PROFILEID, SECURITYVALUE, COALESCE(OWNERBDO, 0) FROM SECURITY
  WHERE SECURITY = 344 /* S_CHQUSERDOC_CLOSE = 344; */
  INTO PROFILEID, SECURITYVALUE, OWNERBDO DO
    EXECUTE PROCEDURE MERGE_SECURITY(:PROFILEID, 365, :SECURITYVALUE, 0, :OWNERBDO); /* S_EDITEMPLOYEELIST_CLOSE = 365; */

END^

EXECUTE PROCEDURE CHANGE_SECURITY^

DROP PROCEDURE CHANGE_SECURITY^

SET TERM ; ^

UPDATE TRANZT SET SALETYPE = 0 WHERE SALETYPE IS NULL;

/* MAN */

/* TEXT BLOCK END */

/* Convert 4.8.8.1 */

/*  Empty APPENDWARE for APPEND_WARE_DISC(param list change)  */
SET TERM ^ ;

ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(100),
ICERTIFICAT VARCHAR(100),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
IGTD VARCHAR(100),
ILOADWAREDISC INTEGER = 1,
IDELETEDDISCRATE INTEGER = 0)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/*  Empty APPENDPILOT for APPENDWARE(param list change)  */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
IMINPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure APPEND_WARE_DISC with new param-list */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER,
IDELETEDDISCRATE INTEGER,
IDELETEDACTDISCOBJ INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter empty procedure APPENDWARE with new param-list */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(100),
ICERTIFICAT VARCHAR(100),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
IGTD VARCHAR(100),
ILOADWAREDISC INTEGER = 1,
IDELETEDDISCRATE INTEGER = 0,
IDELETEDACTDISCOBJ INTEGER = 0)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter Procedure... */
/* Alter (APPEND_WARE_DISC) */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER,
IDELETEDDISCRATE INTEGER,
IDELETEDACTDISCOBJ INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TID INTEGER;
BEGIN

  IF (IDISCVALUE <> '') THEN
  BEGIN

    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, '  ', '  ',
                                     :IDISCTYPE, :IDISCVALUE, NULL, NULL, '', NULL,
                                     0, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
          RETURNING_VALUES ERRORCODE, TDISCRATEID;

    SELECT FIRST 1 A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL
    INTO TACTDISCOBJID;

    IF (TACTDISCOBJID IS NULL) THEN
      INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                               ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                               PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID, DELETED)
      VALUES   (GEN_ID(GID, 1), :IWAREID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                -1, :TDISCRATEID, NULL, 0, :IDELETEDACTDISCOBJ);
    ELSE
    BEGIN
      UPDATE ACTDISCOBJ SET
         DISCRATEID = :TDISCRATEID,
         DELETED = :IDELETEDACTDISCOBJ
      WHERE ID = :TACTDISCOBJID;

      FOR SELECT A.ID
      FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
      WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
            A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
            A.ASPECTVALUE1ID IS NULL AND
            A.ASPECTVALUE2ID IS NULL AND
            A.ASPECTVALUE3ID IS NULL AND
            A.ASPECTVALUE4ID IS NULL AND
            A.ASPECTVALUE5ID IS NULL AND
            A.ID <> :TACTDISCOBJID AND A.DELETED >= 0
      INTO TID
      DO
        UPDATE ACTDISCOBJ SET DELETED = :IDELETEDACTDISCOBJ - 1 WHERE ID = :TID;
    END
  END
  ELSE
  BEGIN
    FOR SELECT A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                    D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL AND
          A.DELETED >= 0
    INTO TID
    DO
      UPDATE ACTDISCOBJ SET DELETED = :IDELETEDACTDISCOBJ - 1 WHERE ID = :TID;
  END
END
^

/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERTYPE4 INTEGER,
ICOUNTERTYPE5 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERVAL4 DOUBLE PRECISION,
ICOUNTERVAL5 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ICOUNTERCODE4 NUMERIC(18),
ICOUNTERCODE5 NUMERIC(18),
IDELETEDDISCRATE INTEGER,
IDELETEDACTDISCOBJ INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18),
OCOUNTERCODE4 NUMERIC(18),
OCOUNTERCODE5 NUMERIC(18))
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE DOCODE INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  OCOUNTERCODE4 = ICOUNTERCODE4;
  OCOUNTERCODE5 = ICOUNTERCODE5;

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE VAL = :ICARD
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      IF (EXISTS(SELECT 1 FROM CCARD WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID)) THEN
      BEGIN
        SELECT MAX(CODE) + 1 FROM CCARD WHERE GRPCCARDID = :GRPCARDID INTO ICARDCODE;
        IF (ICARDCODE IS NULL) THEN
          ICARDCODE = 1;
      END
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        CODE = :ICARDCODE,
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
        EXIT;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        PLAN (A INDEX (IDX_ACTDISCOBJ2))
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;

        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID, DELETED)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID, :IDELETEDACTDISCOBJ);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = :IDELETEDACTDISCOBJ
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCARDFLG = 1) THEN
        FOR SELECT A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID
        DO
          UPDATE ACTDISCOBJ SET DELETED = :IDELETEDACTDISCOBJ - 1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE4 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE4, :ICOUNTERVAL4, :CARDID, NULL, ICOUNTERCODE4, 45)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE4;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE5 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE5, :ICOUNTERVAL5, :CARDID, NULL, ICOUNTERCODE5, 46)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE5;
END
^

/* Alter (APPENDCLIENT) */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ILEGALZIPCODE VARCHAR(10),
ILEGALCITY VARCHAR(100),
ILEGALADDRESS VARCHAR(255),
IDELETEDDISCRATE INTEGER,
IPICTURE BLOB SEGMENT SIZE 1024,
IDELETEDACTDISCOBJ INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,        CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE,   BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,       WEB,
                          TELEPHONE, INN,       DOCUMENT, OKPO,     OKPD,  DELETED,  LEGALZIPCODE,
                          LEGALCITY, LEGALADDRESS, PICTURE)

      VALUES (:CLIENTID,   :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT, :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE,   :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,       :IWEB,
              :ITELEPHONE, :IINN,       :IDOCUMENT,   :IOKPO,     :IOKPD, :IDELETED,  :ILEGALZIPCODE,
              :ILEGALCITY, :ILEGALADDRESS, :IPICTURE);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED,
          LEGALZIPCODE = :ILEGALZIPCODE,
          LEGALCITY = :ILEGALCITY,
          LEGALADDRESS = :ILEGALADDRESS,
          PICTURE = :IPICTURE
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID, DELETED)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID, :IDELETEDACTDISCOBJ);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = :IDELETEDACTDISCOBJ
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCLIENT = 1) THEN
      FOR SELECT A.ID
      FROM ACTDISCOBJ A
      WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
            A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
            A.DISCRATEID > 0
      INTO ACTDISCOBJID
      DO
        UPDATE ACTDISCOBJ SET DELETED = :IDELETEDACTDISCOBJ - 1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;
END
^

/* Alter (APPENDDEFAULTGRPDISC) */
ALTER PROCEDURE APPENDDEFAULTGRPDISC(ITYPE INTEGER,
ICODE INTEGER,
IWARE INTEGER,
IDELETEDACTDISCOBJ INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE NEWID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE ADOID INTEGER;
DECLARE VARIABLE SETTING VARCHAR(100);
DECLARE VARIABLE TEMPID INTEGER;
DECLARE VARIABLE TEMPNAME VARCHAR(100);
BEGIN

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :ICODE
  INTO  NEWID;

  IF (NEWID IS NULL) THEN
    BEGIN
      ERRORCODE = 1; /*   */
      EXIT;
    END

  IF (ITYPE = 1) THEN
    SETTING = 'InternalDefaultSchmRecID';
  ELSE
    IF (IWARE = 0) THEN
      SETTING = 'InternalDefaultSchmFreeID';
    ELSE
      SETTING = 'InternalDefaultSchmCodeID';

  IF (ITYPE = 1)  THEN
    FOR SELECT VAL, NAME
    FROM SETTINGS
    WHERE ((NAME = 'InternalDefaultSchmFreeID') OR (NAME = 'InternalDefaultSchmCodeID')) AND
          (VAL = :NEWID) AND (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB))
    INTO TEMPID, TEMPNAME
    DO
      BEGIN
        DELETE FROM ACTDISCOBJ
        WHERE CLIENTID = -1 AND WAREID <= 0 AND CARDID = -1 AND
              PAYMENTID = -1 AND GRPACTDISCID = :TEMPID;

        EXECUTE PROCEDURE MERGE_SETTING(TEMPNAME, 0, NULL, NULL, 9);
      END
  ELSE
    FOR SELECT VAL
    FROM SETTINGS
    WHERE (NAME = 'InternalDefaultSchmRecID') AND (VAL = :NEWID) AND (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB))
    INTO TEMPID
    DO
      BEGIN
         DELETE FROM ACTDISCOBJ
            WHERE CLIENTID = -1 AND WAREID <= 0 AND CARDID = -1 AND
                  PAYMENTID = -1 AND GRPACTDISCID = :TEMPID;

         EXECUTE PROCEDURE MERGE_SETTING('InternalDefaultSchmRecID', 0, NULL, NULL, 9);
      END

  UPDATE ACTDISCOBJ SET
    GRPACTDISCID = :NEWID,
    DELETED = :IDELETEDACTDISCOBJ
  WHERE
    CLIENTID = -1 AND WAREID = :IWARE AND CARDID = -1 AND
    PAYMENTID = -1 AND GRPACTDISCID = (SELECT VAL FROM SETTINGS WHERE (NAME = :SETTING) AND (OWNERBDO = (SELECT BDOCODE FROM CUSTOMDB)));

  SELECT FIRST 1 ID, DELETED
  FROM ACTDISCOBJ
  WHERE CLIENTID = -1 AND WAREID = :IWARE AND
        CARDID = -1 AND PAYMENTID = -1 AND GRPACTDISCID = :NEWID
  INTO ADOID, DEL;

  IF (ADOID IS NULL) THEN
    INSERT INTO ACTDISCOBJ (ID, WAREID, CLIENTID, PAYMENTID, CARDID, GRPACTDISCID, DELETED)
    VALUES (GEN_ID(GID, 1), :IWARE, -1, -1, -1, :NEWID, :IDELETEDACTDISCOBJ);
  ELSE
    IF (DEL < 0) THEN
      UPDATE ACTDISCOBJ SET
        DELETED = :IDELETEDACTDISCOBJ
      WHERE ID = :ADOID;

  UPDATE DISCRATE DR SET
    DR.DESTINATION = :ITYPE
  WHERE DR.ID IN (select AD.DISCRATEID from ACTDISC AD where AD.GRPACTDISCID = :NEWID);

  EXECUTE PROCEDURE MERGE_SETTING(SETTING, NEWID, NULL, NULL, 9);

END
^

ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(100),
ICERTIFICAT VARCHAR(100),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
IGTD VARCHAR(100),
ILOADWAREDISC INTEGER = 1,
IDELETEDDISCRATE INTEGER = 0,
IDELETEDACTDISCOBJ INTEGER = 0)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
DECLARE VARIABLE TISWARE INTEGER;
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TDELETED INTEGER;
DECLARE VARIABLE TDELETEDISWARE INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE HIERLEVEL INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE BARC VARCHAR(40);
BEGIN
  ERRORCODE = 0;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      IF (IEXCHANGEFORMAT <> 1) THEN
        BEGIN
          ERRORCODE = 8;
          EXIT;
        END
      ELSE
        IFIRSTASPECTVALUE = 0;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  HIERLEVEL = 0;
  IF (IPARENTCODE <> '') THEN
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (CODE = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (MARK = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
  END
  ELSE
    PARENTID = 0;
  HIERLEVEL = HIERLEVEL + 1;

  IF (IISWARE <> 1) THEN
    BEGIN
      IISWARE = -2147483647 + HIERLEVEL;
    END

  IF ((PARENTID IS NULL) OR (TISWARE > 0)) THEN
  BEGIN
    ERRORCODE = 2;
    EXIT;
  END

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  TISWARE = NULL;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ISWARE, DELETED
    FROM SPRT
    WHERE CODE = :ICODE
    INTO TID, TISWARE, TDELETEDISWARE;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, DELETED, ISWARE, DELETED
    FROM SPRT
    WHERE MARK = :IMARK
    INTO TID, TDELETED, TISWARE, TDELETEDISWARE;
  END

  IF ((((TISWARE > 0) AND (IISWARE <= 0)) OR
       ((TISWARE <= 0) AND (IISWARE > 0))) AND (TDELETEDISWARE >= IDELETED)) THEN
    EXCEPTION E_CANT_CHANGE_ISWARE;

  IF (TID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO SPRT (ID, PARENTID, CODE, MARK, NAME, TEXT, HIERLEVEL,
      MINPRICE, ECRDEVID, TAXGROUPID, RCPPRNDEVID,
      ASPECTSCHEMEID, PRICELABELID,
      MAXDISCOUNT, ISWARE, PRICE, FLAGS, LIFE, SERIES,
      CERTIFICAT, SCALELPDEVID, SCALELPWARECODE, ASPECTTYPE, QUANTITYPREC,
      SCALELPLOADED, PRICELBPRINTED, DELETED, DESCRIPTION, PICTURE, REWARDTYPE, REWARDVAL,
      ECRDEPARTMENT, GTD)
    VALUES (:ID, :PARENTID, :ICODE, :IMARK, :INAME, :ITEXT, :HIERLEVEL,
      :IMINPRICE, :ECRDEVID, :TAXGROUPID, :RCPPRNDEVID,
      :ASPECTSCHEMEID, :PRICELABELID,
      :IMAXDISCOUNT, :IISWARE, :IPRICE, :IFLAGS, :ILIFE, :ISERIES,
      :ICERTIFICAT, :SCALELPDEVID, :ISCALELPWARECODE, :IASPECTTYPE, :IQUANTITYPREC,
      :ISCALELPLOADED, :IPRICELBPRINTED, :IDELETED, :IDESCRIPTION, :IPICTURE, :IREWARDTYPE, :IREWARDVAL,
      :IECRDEPARTMENT, :IGTD);
    INCREMENTCODE = 1;
  END
  ELSE
  BEGIN
    ID = TID;
    IF (TDELETED = IDELETED) THEN
      UPDATE SPRT SET
        ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
        ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
        CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
                                           PRICELABELID = :PRICELABELID,
        DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
        DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
        ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
        ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
        FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
        HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
        ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
        LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
        MARK = :IMARK,                     SERIES = :ISERIES,
        MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
        MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
        NAME = :INAME,
        GTD = :IGTD
      WHERE ID = :ID;
    ELSE
      BEGIN
        UPDATE SPRT SET
          ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
          ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
          CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
          CODE = :ICODE,                     PRICELABELID = :PRICELABELID,
          DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
          DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
          ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
          ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
          FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
          HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
          ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
          LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
          MARK = :IMARK,                     SERIES = :ISERIES,
          MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
          MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
          NAME = :INAME,
          GTD = :IGTD
        WHERE ID = :ID;
        INCREMENTCODE = 1;
      END
  END

  IF (IISWARE = 1) THEN
  BEGIN
    EXECUTE PROCEDURE APPENDREMAINBYWAREID (:ID, :IFIRSTASPECTVALUE, :ASPECTSCHEMEID, :IREMAIN, :IDELETEDREMAIN, :IDELETEDASPECT, :IADDREPLACE)
      RETURNING_VALUES ERRORCODE;

    IF (ERRORCODE > 0) THEN
      EXIT;

    WHILE (IBARCODES <> '') DO
    BEGIN
      BARC = EXTRACTSTR(IBARCODES, ',');

      EXECUTE PROCEDURE APPENDBARCODEBYWAREID (:BARC, :ID, 0, 0, 0, 0, 0, :IFACTOR, 0, :IDELETEDBARCODE)
        RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;

      IBARCODES = PCOPY(IBARCODES, LEN(BARC) + 1, LEN(IBARCODES) - LEN(BARC) - 1);
    END
  END

  IF ((ILOADWAREDISC = 1) AND NOT (IDISCRATEPARENTID IS NULL) AND NOT (IDISCOUNTVALUE IS NULL)) THEN
    BEGIN
      EXECUTE PROCEDURE APPEND_WARE_DISC(:ID, :IDISCOUNTTYPE, :IDISCOUNTVALUE, :IDISCRATEPARENTID, :IDELETEDDISCRATE, :IDELETEDACTDISCOBJ)
            RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;
    END

  IF (ILOADWAREDISC = 1) THEN
  BEGIN
    IF (TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :ID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID,
          DELETED = :IDELETEDACTDISCOBJ
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID, DELETED)
        VALUES   (GEN_ID(GID, 1), :ID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID, :IDELETEDACTDISCOBJ);
    END
    ELSE
    BEGIN
      DELETE FROM ACTDISCOBJ WHERE WAREID = :ID AND CLIENTID = -1 AND CARDID = -1 AND
                                 ASPECTVALUE1ID IS NULL AND ASPECTVALUE2ID IS NULL AND ASPECTVALUE3ID IS NULL AND
                                 ASPECTVALUE4ID IS NULL AND ASPECTVALUE5ID IS NULL AND
                                 PAYMENTID = -1 AND DISCRATEID IS NULL AND ACTSCRIPTID IS NULL;
    END
  END
END
^

/* Alter (APPENDPILOT) */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
IMINPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE DORMANTVAR INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;
  IF (IPTYPE = 2) THEN
     FLAGS = 511;
  ELSE
     FLAGS = 1535;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, :IMINPRICE, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            SELECT ID
            FROM SPRT
            WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
            INTO MAINID;

            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, :IMINPRICE, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, '', NULL, :IMINPRICE, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

/* Alter (APPENDREMAIN) */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER,
ILOADWAREDISC INTEGER = 1,
IDELETEDDISCRATE INTEGER = 0,
IDELETEDACTDISCOBJ INTEGER = 0)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE WARENAME VARCHAR(100);
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCCODE INTEGER;
DECLARE VARIABLE USEREMAIN INTEGER;
DECLARE VARIABLE SUMMR DOUBLE PRECISION;
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (AD1 + AD2 + AD3 + AD4 + AD5 = 0) THEN
  BEGIN
    ASPECTSCHEMEID = NULL;
    IF (NOT IPRICE IS NULL) THEN
      UPDATE SPRT SET PRICE = :IPRICE WHERE ID = :WAREID;
  END

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
    BEGIN
      IF (ASPCODE = 1)  THEN
        IF (IASPV1 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
          INTO AD1;
        ELSE
        BEGIN
          ERRORCODE = 10;
          EXIT;
        END

      IF (ASPCODE = 2)  THEN
        IF (IASPV2 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
          INTO AD2;
        ELSE
        BEGIN
          ERRORCODE = 11;
          EXIT;
        END

      IF (ASPCODE = 3)  THEN
        IF (IASPV3 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
          INTO AD3;
        ELSE
        BEGIN
          ERRORCODE = 12;
          EXIT;
        END

      IF (ASPCODE = 4)  THEN
        IF (IASPV4 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
          INTO AD4;
        ELSE
        BEGIN
          ERRORCODE = 13;
          EXIT;
        END

      IF (ASPCODE = 5)  THEN
        IF (IASPV5 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
          INTO AD5;
        ELSE
        BEGIN
          ERRORCODE = 14;
          EXIT;
        END
    END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR (AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    REMAINID = GEN_ID(GID, 1);

    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, PRICE,
       DELETED, USEREMAIN)
    VALUES
      (:REMAINID, :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5,
      :IPRICE, :IDELETED, :USEREMAIN);

    IF (NOT :IREMAIN IS NULL) THEN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE <> 1) THEN
    BEGIN
      SUMMR = 0;
      SELECT SUM(DELTA)
      FROM REMAIND
      WHERE REMAINID = :REMAINID AND DTYPE = 1
      INTO SUMMR;

      IF (SUMMR <> 0) THEN
        INSERT INTO REMAIND(ID, REMAINID, DELTA, DTYPE)
        VALUES (GEN_ID(GREMAIND, 1), :REMAINID, -:SUMMR, 1);

      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;
    END

    UPDATE REMAIN SET
      PRICE = :IPRICE,
      DELETED = :IDELETED
    WHERE ID = :REMAINID;

    IF (NOT :IREMAIN IS NULL) THEN
    BEGIN
      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
     END

    IF (IADDREPLACE = 2) THEN
    BEGIN
      SUMMR = 0;
      SELECT SUM(DELTA)
      FROM REMAIND
      WHERE REMAINID = :REMAINID AND DTYPE = 0
      INTO SUMMR;

      IF (SUMMR <> 0) THEN
        INSERT INTO REMAIND(ID, REMAINID, DELTA, DTYPE)
        VALUES (GEN_ID(GREMAIND, 1), :REMAINID, -:SUMMR, 0);
    END
  END

  IF ((ILOADWAREDISC = 1) AND NOT IDISCOUNTVALUE IS NULL) THEN
  BEGIN
    IF (IDISCOUNTVALUE <> '') THEN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       0, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
      RETURNING_VALUES ERRORCODE, TDISCRATEID;

    WHERECLAUSE = '';

    IF (AD1 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
    ELSE
    BEGIN
      AD1 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID IS NULL ';
    END

    IF (AD2 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
    ELSE
    BEGIN
      AD2 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID IS NULL ';
    END

    IF (AD3 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
    ELSE
    BEGIN
      AD3 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID IS NULL ';
    END

    IF (AD4 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
    ELSE
    BEGIN
      AD4 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID IS NULL ';
    END

    IF (AD5 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
    ELSE
    BEGIN
      AD5 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID IS NULL ';
    END

    IF (IUSEGRPACTDISC <> 0) THEN
    BEGIN

      SELECT ID
      FROM GRPACTDISC
      WHERE CODE = :IGRPACTDISCCODE
      INTO :GRPACTDISCID;

      IF (GRPACTDISCID IS NULL) THEN
      BEGIN
        GRPACTDISCID = GEN_ID(GID, 1);
        INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
        VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
      END

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.DELETED ' ||
                        ' FROM ACTDISCOBJ A JOIN GRPACTDISC G ON ' ||
                                          ' G.ID = A.GRPACTDISCID AND G.ID = '|| :GRPACTDISCID ||
                        ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                        '      A.PAYMENTID = -1 AND A.CARDID = -1 '|| WHERECLAUSE
      INTO TACTDISCOBJID, DEL;

      IF (TACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID, DELETED)
        VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, NULL, NULL, :GRPACTDISCID, :IDELETEDACTDISCOBJ);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = :IDELETEDACTDISCOBJ
          WHERE ID = :TACTDISCOBJID;

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                         C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID
      INTO ACTDISCID, CONDITIONID;

      EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL,
                                          NULL, NULL,  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  NULL, NULL,
                                          NULL, NULL, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

      IF (ACTDISCID IS NULL) THEN
      BEGIN
        SELECT NULLTONUM(MAX(CODE)) + 1
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        INTO ACTDISCCODE;

        INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                              CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
        VALUES     (GEN_ID(GID, 1), :ACTDISCCODE, :GRPACTDISCID, :WARENAME,
                    :CONDITIONID, :TDISCRATEID, NULL, 0, :IDELETEDACTDISC);
      END
      ELSE
        UPDATE ACTDISC SET
          NAME = :WARENAME,
          CONDITIONID = :CONDITIONID,
          DISCRATEID = :TDISCRATEID,
          DELETED = :IDELETEDACTDISC
        WHERE ID = :ACTDISCID;
    END
    ELSE
    BEGIN
      IF (IDISCOUNTVALUE <> '') THEN
      BEGIN
        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID ' ||
                          ' FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                          ' D.ID = A.DISCRATEID AND D.KIND = 2 '||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '       A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
        INTO TACTDISCOBJID;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID, DELETED)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, :TDISCRATEID, NULL, NULL, :IDELETEDACTDISCOBJ);
        ELSE
          UPDATE ACTDISCOBJ SET
             DISCRATEID = :TDISCRATEID,
             DELETED = :IDELETEDACTDISCOBJ
          WHERE ID = :TACTDISCOBJID;
      END
      ELSE
        FOR EXECUTE STATEMENT
          'SELECT A.ID FROM ACTDISCOBJ A JOIN DISCRATE D ON ' ||
          '    D.ID = A.DISCRATEID AND D.KIND = 2 ' ||
          '    WHERE A.WAREID = ' || :WAREID || ' AND A.CLIENTID = -1 AND ' ||
          '          A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 ' || WHERECLAUSE
          INTO ACTDISCID
          DO
            UPDATE ACTDISCOBJ SET DELETED = :IDELETEDACTDISCOBJ - 1 WHERE ID = :ACTDISCID;
        /*EXECUTE STATEMENT
          'UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID IN ' ||
          '(SELECT A.ID FROM ACTDISCOBJ A JOIN DISCRATE D ON ' ||
          '    D.ID = A.DISCRATEID AND D.KIND = 2 ' ||
          '    WHERE A.WAREID = ' || :WAREID || ' AND A.CLIENTID = -1 AND ' ||
          '          A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 ' || WHERECLAUSE || ')';*/
    END
  END
END
^

/* Alter (APPENDWAREPARAMS) */
ALTER PROCEDURE APPENDWAREPARAMS(ICODE VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IASPECTSCHEMECODE INTEGER,
IASPECTTYPE INTEGER,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IPRICELABEL INTEGER,
IDELETED INTEGER,
IWARECODETOMARK INTEGER,
ILOADWAREDISC INTEGER = 1,
IDELETEDACTDISCOBJ INTEGER = 0)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE UPDATESTR VARCHAR(255);
BEGIN

  ERRORCODE = 0;
  UPDATESTR = '';

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID
    FROM SPRT
    WHERE CODE = :ICODE AND DELETED = :IDELETED
    INTO TID;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID
    FROM SPRT
    WHERE MARK = :ICODE AND DELETED = :IDELETED
    INTO TID;
  END

  IF (TID IS NULL) THEN
    EXIT;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      ERRORCODE = 8;
      EXIT;
    END
  END
  ELSE ASPECTSCHEMEID = 0;

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
     PRICELABELID = NULL;

  UPDATE SPRT SET
      ASPECTSCHEMEID =  CASE WHEN (:IASPECTSCHEMECODE IS NULL) THEN ASPECTSCHEMEID  ELSE :ASPECTSCHEMEID   END,
      ASPECTTYPE =      CASE WHEN (:IASPECTTYPE IS NULL)       THEN ASPECTTYPE      ELSE :IASPECTTYPE      END,
      ECRDEVID =        CASE WHEN (:IECRDEVCODE IS NULL)       THEN ECRDEVID        ELSE :ECRDEVID         END,
      TAXGROUPID =      CASE WHEN (:ITAXGROUPCODE IS NULL)     THEN TAXGROUPID      ELSE :TAXGROUPID       END,
      SCALELPDEVID =    CASE WHEN (:ISCALELPDEVCODE IS NULL)   THEN SCALELPDEVID    ELSE :SCALELPDEVID     END,
      SCALELPWARECODE = CASE WHEN (:ISCALELPWARECODE IS NULL)  THEN SCALELPWARECODE ELSE :ISCALELPWARECODE END,
      RCPPRNDEVID =     CASE WHEN (:IRCPPRNDEVCODE IS NULL)    THEN RCPPRNDEVID     ELSE :RCPPRNDEVID      END,
      PRICELABELID =    CASE WHEN (:IPRICELABEL IS NULL)       THEN PRICELABELID    ELSE :PRICELABELID     END
  WHERE ID = :TID;       

  IF (ILOADWAREDISC = 1 AND TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :TID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID,
          DELETED = :IDELETEDACTDISCOBJ
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID, DELETED)
        VALUES   (GEN_ID(GID, 1), :TID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID, :IDELETEDACTDISCOBJ);
    END
  ELSE
    IF (IINTDISCSCHMCODE IS NOT NULL) THEN
      DELETE FROM ACTDISCOBJ
      WHERE WAREID = :TID AND CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1 AND DISCRATEID IS NULL AND GRPACTDISCID > 0;
END
^

SET TERM ; ^

/* TEXT BLOCK END */

/* Convert 4.8.9 */

SET TERM ^ ;

ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG DOUBLE PRECISION,
IPRICEEND DOUBLE PRECISION,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IQUANTITYRECBEG DOUBLE PRECISION,
IQUANTITYRECEND DOUBLE PRECISION,
IQUANTITYWAREBEG DOUBLE PRECISION,
IQUANTITYWAREEND DOUBLE PRECISION,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
ISUMMWAREBEG DOUBLE PRECISION,
ISUMMWAREEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER,
IDELETEDDISCRATE INTEGER,
IDISCRATECODE INTEGER,
IACTSCRIPTCODE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE ACTSCRIPTID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :IGRPACTDISCCODE
  INTO GRPACTDISCID;

  IF (GRPACTDISCID IS NULL) THEN
   BEGIN
      ERRORCODE = 1;
      EXIT;
    END

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :GRPACTDISCID
  PLAN (ACTDISC INDEX (UNQ_ACTDISC))
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, :IDATEBEG, :IDATEEND,
                                    :IDAYBEG, :IDAYEND, :IPRICEBEG, :IPRICEEND,
                                    :IQUANTITYBEG, :IQUANTITYEND,
                                    :IQUANTITYRECBEG, :IQUANTITYRECEND,
                                    :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,
                                    :ISUMMWAREBEG, :ISUMMWAREEND, :ITIMEBEG, :ITIMEEND,
                                    :IWARECODE, :IWARECODETOMARK)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (IDISCRATEPARENTCODE IS NOT NULL) THEN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEPARENTCODE AND ISFOLDER > 0
      INTO IDISCRATEPARENTID;

  IF (IDISCRATECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DISCRATE
    WHERE CODE = :IDISCRATECODE
    INTO DISCRATEID;

    IF (DISCRATEID IS NULL) THEN
    BEGIN
      ERRORCODE = 51;
      EXIT;
    END
  END
  ELSE
    EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, :INAME, :ITEXT,
                                     :ITYPE, :IVAL, NULL, NULL, '', 0,
                                     :IDESTINATION, 2, 0, NULL, :GRPACTDISCID, :IDISCRATECODE, :IDELETEDDISCRATE, NULL)
        RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  ACTSCRIPTID = NULL;
  IF (IACTSCRIPTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ACTSCRIPT
    WHERE CODE = :IACTSCRIPTCODE
    INTO ACTSCRIPTID;

    IF (ACTSCRIPTID IS NULL) THEN
    BEGIN
      ERRORCODE = 48;
      EXIT;
    END
  END

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, :ACTSCRIPTID, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         ACTSCRIPTID = :ACTSCRIPTID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPENDACTDISCOBJ) */
ALTER PROCEDURE APPENDACTDISCOBJ(ICODE INTEGER,
ICLIENTCODE INTEGER,
ICLIENTCLASSIFIERCODE INTEGER,
ICARDCODE INTEGER,
ICCARDCLASSIFIERCODE INTEGER,
IPAYMENTCODE INTEGER,
IWARECODE INTEGER,
IWAREMARK VARCHAR(20),
IWARECODETOMARK INTEGER,
IASPECTVALUE1CODE INTEGER,
IASPECTVALUE2CODE INTEGER,
IASPECTVALUE3CODE INTEGER,
IASPECTVALUE4CODE INTEGER,
IASPECTVALUE5CODE INTEGER,
IWARECLASSIFIERCODE INTEGER,
IHALLCODE INTEGER,
IHALLPLACECODE INTEGER,
IDISCRATECODE INTEGER,
IACTSCRIPTCODE INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETED INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ID INTEGER;
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE CLIENTCLASSIFIERID INTEGER;
DECLARE VARIABLE CCARDID INTEGER;
DECLARE VARIABLE CCARDCLASSIFIERID INTEGER;
DECLARE VARIABLE PAYMENTID INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE ASPSCHEMEID INTEGER;
DECLARE VARIABLE ASPECTVALUE1ID INTEGER;
DECLARE VARIABLE ASPECTVALUE2ID INTEGER;
DECLARE VARIABLE ASPECTVALUE3ID INTEGER;
DECLARE VARIABLE ASPECTVALUE4ID INTEGER;
DECLARE VARIABLE ASPECTVALUE5ID INTEGER;
DECLARE VARIABLE WARECLASSIFIERID INTEGER;
DECLARE VARIABLE HALLID INTEGER;
DECLARE VARIABLE HALLPLACEID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTSCRIPTID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
BEGIN
  ERRORCODE = 0;

  IF (IACTSCRIPTCODE IS NULL AND IGRPACTDISCCODE IS NULL AND IDISCRATECODE IS NULL) THEN
  BEGIN
    ERRORCODE = 52;
    EXIT;
  END

  IF (IHALLPLACECODE > 0 AND (IHALLCODE IS NULL OR (IHALLCODE = 0) )) THEN
  BEGIN
    ERRORCODE = 53;
    EXIT;
  END

  IF (ICLIENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :ICLIENTCODE
    INTO CLIENTID;

    IF (CLIENTID IS NULL) THEN
    BEGIN
      ERRORCODE = 33;
      EXIT;
    END
  END
  ELSE
    IF (ICLIENTCODE = 0) THEN
      CLIENTID = 0;
    ELSE
      CLIENTID = -1;

  IF (ICLIENTCLASSIFIERCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLASSIFIER
    WHERE CODE = :ICLIENTCLASSIFIERCODE
    INTO CLIENTCLASSIFIERID;

    IF (CLIENTCLASSIFIERID IS NULL) THEN
    BEGIN
      ERRORCODE = 41;
      EXIT;
    END
  END
  ELSE
    IF (ICLIENTCLASSIFIERCODE = 0) THEN
      CLIENTCLASSIFIERID = 0;
    ELSE
      CLIENTCLASSIFIERID = -1;

  IF (ICARDCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CCARD
    WHERE CODE = :ICARDCODE
    INTO CCARDID;

    IF (CCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 42;
      EXIT;
    END
  END
  ELSE
    IF (ICARDCODE = 0) THEN
      CCARDID = 0;
    ELSE
      CCARDID = -1;

  IF (ICCARDCLASSIFIERCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLASSIFIER
    WHERE CODE = :ICCARDCLASSIFIERCODE
    INTO CCARDCLASSIFIERID;

    IF (CCARDCLASSIFIERID IS NULL) THEN
    BEGIN
      ERRORCODE = 41;
      EXIT;
    END
  END
  ELSE
    IF (ICCARDCLASSIFIERCODE = 0) THEN
      CCARDCLASSIFIERID = 0;
    ELSE
      CCARDCLASSIFIERID = -1;

  IF (IPAYMENTCODE IS NOT NULL) THEN
  BEGIN
    SELECT ID
    FROM PAYMENT
    WHERE CODE = :IPAYMENTCODE
    INTO PAYMENTID;

    IF (PAYMENTID IS NULL) THEN
    BEGIN
      ERRORCODE = 47;
      EXIT;
    END
  END
  ELSE
    PAYMENTID = -1;

  IF (IWARECODETOMARK = 1) THEN
  BEGIN
    IF (IWAREMARK IS NULL OR IWAREMARK = '') THEN
      WAREID = -1;
    ELSE
      IF (IWAREMARK = '0') THEN
        WAREID = 0;
      ELSE
      BEGIN
        SELECT ID, ASPECTSCHEMEID
        FROM SPRT
        WHERE MARK = :IWAREMARK
        INTO WAREID, ASPSCHEMEID;

        IF (WAREID IS NULL) THEN
        BEGIN
          ERRORCODE = 16;
          EXIT;
        END
      END
  END
  ELSE
  BEGIN
    IF (IWARECODE > 0) THEN
    BEGIN
      SELECT ID, ASPECTSCHEMEID
      FROM SPRT
      WHERE CODE = :IWARECODE
      INTO WAREID, ASPSCHEMEID;

      IF (WAREID IS NULL) THEN
      BEGIN
        ERRORCODE = 16;
        EXIT;
      END
    END
    ELSE
      IF (IWARECODE = 0) THEN
        WAREID = 0;
      ELSE
        WAREID = -1;
  END

  IF (IWARECLASSIFIERCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLASSIFIER
    WHERE CODE = :IWARECLASSIFIERCODE
    INTO WARECLASSIFIERID;

    IF (WARECLASSIFIERID IS NULL) THEN
    BEGIN
      ERRORCODE = 41;
      EXIT;
    END
  END
  ELSE
    IF (IWARECLASSIFIERCODE = 0) THEN
      WARECLASSIFIERID = 0;
    ELSE
      WARECLASSIFIERID = -1;

  IF (IACTSCRIPTCODE IS NOT NULL) THEN
  BEGIN
    SELECT ID
    FROM ACTSCRIPT
    WHERE CODE = :IACTSCRIPTCODE
    INTO ACTSCRIPTID;

    IF (ACTSCRIPTID IS NULL) THEN
    BEGIN
      ERRORCODE = 48;
      EXIT;
    END
  END

  IF (IHALLCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM HALL
    WHERE CODE = :IHALLCODE
    INTO HALLID;

    IF (HALLID IS NULL) THEN
    BEGIN
      ERRORCODE = 49;
      EXIT;
    END
  END
  ELSE
    IF (IHALLCODE = 0) THEN
      HALLID = 0;
    ELSE
      HALLID = -1;

  IF (IHALLPLACECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM HALLPLACE
    WHERE CODE = :IHALLPLACECODE AND HALLID = :HALLID
    INTO HALLPLACEID;

    IF (HALLPLACEID IS NULL) THEN
    BEGIN
      ERRORCODE = 50;
      EXIT;
    END
  END
  ELSE
    IF (IHALLPLACECODE = 0) THEN
      HALLPLACEID = 0;
    ELSE
      HALLPLACEID = -1;

  IF (IDISCRATECODE IS NOT NULL) THEN
  BEGIN
    SELECT ID
    FROM DISCRATE
    WHERE CODE = :IDISCRATECODE
    INTO DISCRATEID;

    IF (DISCRATEID IS NULL) THEN
    BEGIN
      ERRORCODE = 51;
      EXIT;
    END
  END

  IF (IGRPACTDISCCODE IS NOT NULL) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IGRPACTDISCCODE
    INTO GRPACTDISCID;

    IF (GRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 01;
      EXIT;
    END
  END

  IF (NOT ASPSCHEMEID IS NULL AND
       (IASPECTVALUE1CODE > 0 OR
        IASPECTVALUE2CODE > 0 OR
        IASPECTVALUE3CODE > 0 OR
        IASPECTVALUE4CODE > 0 OR
        IASPECTVALUE5CODE > 0)) THEN
    EXECUTE PROCEDURE GET_ASPECTVALUEIDS_BY_CODES (:ASPSCHEMEID, :IASPECTVALUE1CODE, :IASPECTVALUE2CODE, :IASPECTVALUE3CODE, :IASPECTVALUE4CODE, :IASPECTVALUE5CODE)
    RETURNING_VALUES ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID, ERRORCODE;

  IF (ERRORCODE <> 0) THEN
    EXIT;

  SELECT ID
  FROM ACTDISCOBJ
  WHERE CODE = :ICODE
  INTO ID;

  IF (ID IS NULL) THEN
    BEGIN
      ID = GEN_ID(GID, 1);
      INSERT INTO ACTDISCOBJ (ID, CLIENTID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID,
                              ASPECTVALUE5ID, PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID, CARDID, CODE,
                              CCARDCLASSIFIERID, CLIENTCLASSIFIERID, WARECLASSIFIERID, HALLID,
                              HALLPLACEID, DELETED)
      VALUES (:ID, :CLIENTID, :WAREID, :ASPECTVALUE1ID, :ASPECTVALUE2ID, :ASPECTVALUE3ID, :ASPECTVALUE4ID, :ASPECTVALUE5ID,
              :PAYMENTID, :DISCRATEID, :ACTSCRIPTID, :GRPACTDISCID, :CCARDID, :ICODE,
              :CCARDCLASSIFIERID, :CLIENTCLASSIFIERID, :WARECLASSIFIERID, :HALLID, :HALLPLACEID, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE ACTDISCOBJ
      SET CLIENTID = :CLIENTID,
          WAREID = :WAREID,
          ASPECTVALUE1ID = :ASPECTVALUE1ID,
          ASPECTVALUE2ID = :ASPECTVALUE2ID,
          ASPECTVALUE3ID = :ASPECTVALUE3ID,
          ASPECTVALUE4ID = :ASPECTVALUE4ID,
          ASPECTVALUE5ID = :ASPECTVALUE5ID,
          PAYMENTID = :PAYMENTID,
          DISCRATEID = :DISCRATEID,
          ACTSCRIPTID = :ACTSCRIPTID,
          GRPACTDISCID = :GRPACTDISCID,
          CARDID = :CCARDID,
          CCARDCLASSIFIERID = :CCARDCLASSIFIERID,
          CLIENTCLASSIFIERID = :CLIENTCLASSIFIERID,
          WARECLASSIFIERID = :WARECLASSIFIERID,
          HALLID = :HALLID,
          HALLPLACEID = :HALLPLACEID,
          DELETED = :IDELETED
      WHERE (ID = :ID);
    END

END
^

/* empty dependent procedure body */
/* Clear: APPEND_SUPERMAG_DISC for: APPENDDISCRATE */
ALTER PROCEDURE APPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
IDELETEDDISCRATE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPEND_WARE_DISC for: APPENDDISCRATE */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER,
IDELETEDDISCRATE INTEGER,
IDELETEDACTDISCOBJ INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPENDACTDISC for: APPENDDISCRATE */
ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG DOUBLE PRECISION,
IPRICEEND DOUBLE PRECISION,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IQUANTITYRECBEG DOUBLE PRECISION,
IQUANTITYRECEND DOUBLE PRECISION,
IQUANTITYWAREBEG DOUBLE PRECISION,
IQUANTITYWAREEND DOUBLE PRECISION,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
ISUMMWAREBEG DOUBLE PRECISION,
ISUMMWAREEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER,
IDELETEDDISCRATE INTEGER,
IDISCRATECODE INTEGER,
IACTSCRIPTCODE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPENDCCARDDISCS for: APPENDDISCRATE */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERTYPE4 INTEGER,
ICOUNTERTYPE5 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERVAL4 DOUBLE PRECISION,
ICOUNTERVAL5 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ICOUNTERCODE4 NUMERIC(18),
ICOUNTERCODE5 NUMERIC(18),
IDELETEDDISCRATE INTEGER,
IDELETEDACTDISCOBJ INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18),
OCOUNTERCODE4 NUMERIC(18),
OCOUNTERCODE5 NUMERIC(18))
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPENDCLIENT for: APPENDDISCRATE */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ILEGALZIPCODE VARCHAR(10),
ILEGALCITY VARCHAR(100),
ILEGALADDRESS VARCHAR(255),
IDELETEDDISCRATE INTEGER,
IPICTURE BLOB SEGMENT SIZE 1024,
IDELETEDACTDISCOBJ INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPENDFIXDISCS for: APPENDDISCRATE */
ALTER PROCEDURE APPENDFIXDISCS(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IPREFIX VARCHAR(40),
IVAL VARCHAR(100),
ITYPE INTEGER,
IDATERANGEBEG DATE,
IDATERANGEEND DATE,
IDESTINATION INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDELETEDDISCRATE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* empty dependent procedure body */
/* Clear: APPENDREMAIN for: APPENDDISCRATE */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER,
ILOADWAREDISC INTEGER = 1,
IDELETEDDISCRATE INTEGER = 0,
IDELETEDACTDISCOBJ INTEGER = 0)
 RETURNS(ERRORCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPENDDISCRATE) */
ALTER PROCEDURE APPENDDISCRATE(IPARENTID INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
IBEGVAL VARCHAR(100),
IENDVAL VARCHAR(100),
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDESTINATION INTEGER,
IKIND INTEGER,
IISFOLDER INTEGER,
IDISCCOLLOPER INTEGER,
IGRPACTDISCID INTEGER,
ICODE INTEGER,
IDELETED INTEGER,
IPARENTCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
ID INTEGER)
 AS
DECLARE VARIABLE DISCRATECODE INTEGER;
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DESTINATION INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
BEGIN

  ERRORCODE = 0;

  IF (IVAL = '') THEN
    IVAL = '0';

  IF (IWARECODE <> '') THEN
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID
      FROM SPRT
      WHERE CODE = :IWARECODE
      INTO WAREID;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID
      FROM SPRT
      WHERE MARK = :IWARECODE
      INTO WAREID;
    END

    IF (WAREID IS NULL) THEN
    BEGIN
      ERRORCODE = 16;
      EXIT;
    END
  END

  IF (IPARENTCODE IS NOT NULL) THEN
  BEGIN
    IF (IPARENTCODE = 0) THEN
      PARENTID = 0;
    ELSE
      SELECT ID FROM DISCRATE
      WHERE CODE = :IPARENTCODE
      INTO PARENTID;

    IF (PARENTID IS NULL) THEN
    BEGIN
      ERRORCODE = 54;
      EXIT;
    END
  END
  ELSE
    PARENTID = IPARENTID;

  DESTINATION = IDESTINATION;
  IF (DESTINATION IS NULL) THEN
    IF (IGRPACTDISCID IS NULL) THEN
      DESTINATION = 0;
    ELSE
      BEGIN
        SELECT FIRST 1 D.DESTINATION
        FROM ACTDISC A LEFT JOIN DISCRATE D ON
                       D.ID = A.DISCRATEID
        WHERE A.GRPACTDISCID = :IGRPACTDISCID
        INTO DESTINATION;

        IF (DESTINATION IS NULL) THEN
          DESTINATION = 0;
      END

  IF (ICODE IS NULL OR (ICODE = 0)) THEN
    SELECT FIRST 1 D.ID
    FROM DISCRATE D
    WHERE D.PARENTID = :IPARENTID AND D.VAL =  :IVAL  AND
          D."TYPE" = :ITYPE       AND D.NAME =  :INAME  AND
          D.KIND = :IKIND         AND D.DESTINATION = :DESTINATION
    INTO ID;
  ELSE
    SELECT ID FROM DISCRATE
    WHERE CODE = :ICODE
    INTO ID;

  IF (ID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);

    IF (ICODE IS NULL OR (ICODE = 0)) THEN
    BEGIN
      DISCRATECODE = NULL;
      SELECT FIRST 1 CODE
      FROM DISCRATE
      WHERE CODE < 100000000
      ORDER BY CODE DESC
      INTO DISCRATECODE;

      IF (DISCRATECODE IS NULL) then
        DISCRATECODE = 1;
      ELSE
        DISCRATECODE = DISCRATECODE + 1;
    END
    ELSE
      DISCRATECODE = ICODE;

    INSERT INTO DISCRATE (ID, PARENTID, CODE, NAME, TEXT,
                          VAL, BEGVAL, ENDVAL,
                          WAREID, "TYPE", DESTINATION, KIND,
                          ISFOLDER, DISCCOLLOPER, DELETED)
    VALUES (:ID, :PARENTID, :DISCRATECODE, :INAME, :ITEXT,
            :IVAL, :IBEGVAL, :IENDVAL, :WAREID, :ITYPE, :DESTINATION, :IKIND,
            :IISFOLDER, :IDISCCOLLOPER, :IDELETED);
  END
  ELSE
    IF (ICODE > 0) THEN
    BEGIN
      UPDATE DISCRATE
      SET PARENTID = :PARENTID,
          CODE = :ICODE,
          NAME = :INAME,
          TEXT = :ITEXT,
          VAL = :IVAL,
          BEGVAL = :IBEGVAL,
          ENDVAL = :IENDVAL,
          "TYPE" = :ITYPE,
          DESTINATION = :DESTINATION,
          KIND = :IKIND,
          ISFOLDER = :IISFOLDER,
          DISCCOLLOPER = :IDISCCOLLOPER,
          DELETED = :IDELETED
      WHERE (ID = :ID);
    END
END
^

/* Alter (APPENDFIXDISCS) */
ALTER PROCEDURE APPENDFIXDISCS(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IPREFIX VARCHAR(40),
IVAL VARCHAR(100),
ITYPE INTEGER,
IDATERANGEBEG DATE,
IDATERANGEEND DATE,
IDESTINATION INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDELETEDDISCRATE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
BEGIN

  ERRORCODE = 0;

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :IGRPACTDISCID
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL,
                                    :IPREFIX, :IPREFIX,
                                    0, :IDATERANGEBEG, :IDATERANGEEND,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL,
                                    NULL, NULL, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, :INAME , :ITEXT, :ITYPE,
                                   :IVAL, NULL, NULL, '', 0, :IDESTINATION,
                                   1, 0, NULL, :IGRPACTDISCID, NULL, :IDELETEDDISCRATE, NULL)
        RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :IGRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPENDPILOT) */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
IMINPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER,
IARTICUL VARCHAR(40))
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE DORMANTVAR INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;
  IF (IPTYPE = 2) THEN
     FLAGS = 511;
  ELSE
     FLAGS = 1535;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, :IARTICUL, NULL, :IMINPRICE, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            SELECT ID
            FROM SPRT
            WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
            INTO MAINID;

            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, :IARTICUL, NULL, :IMINPRICE, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, :IARTICUL, NULL, :IMINPRICE, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^

/* Alter (APPENDREMAIN) */
ALTER PROCEDURE APPENDREMAIN(IWARECODE VARCHAR(20),
IASPV1 INTEGER,
IASPV2 INTEGER,
IASPV3 INTEGER,
IASPV4 INTEGER,
IASPV5 INTEGER,
IREMAIN DOUBLE PRECISION,
IPRICE DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDISCOUNTTYPE INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IDELETED INTEGER,
IDELETEDASPECT INTEGER,
IWARECODETOMARK INTEGER,
IDISCRATEPARENTID INTEGER,
IUSEGRPACTDISC INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IDELETEDACTDISC INTEGER,
ILOADWAREDISC INTEGER = 1,
IDELETEDDISCRATE INTEGER = 0,
IDELETEDACTDISCOBJ INTEGER = 0)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE WAREID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE WARENAME VARCHAR(100);
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE ASPCODE INTEGER;
DECLARE VARIABLE ASPID INTEGER;
DECLARE VARIABLE AD1 INTEGER;
DECLARE VARIABLE AD2 INTEGER;
DECLARE VARIABLE AD3 INTEGER;
DECLARE VARIABLE AD4 INTEGER;
DECLARE VARIABLE AD5 INTEGER;
DECLARE VARIABLE REMAINID INTEGER;
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCCODE INTEGER;
DECLARE VARIABLE USEREMAIN INTEGER;
DECLARE VARIABLE SUMMR DOUBLE PRECISION;
BEGIN
  ERRORCODE = 0;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE CODE = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, ASPECTSCHEMEID, NAME
    FROM SPRT
    WHERE MARK = :IWARECODE
    INTO WAREID, ASPECTSCHEMEID, WARENAME;
  END

  IF (WAREID IS NULL) THEN
  BEGIN
    ERRORCODE = 16;
    EXIT;
  END

  IF (IASPV1 > 0) THEN
    AD1 = NULL;
  ELSE
    AD1 = 0;

  IF (IASPV2 > 0) THEN
    AD2 = NULL;
  ELSE
    AD2 = 0;

  IF (IASPV3 > 0) THEN
    AD3 = NULL;
  ELSE
    AD3 = 0;

  IF (IASPV4 > 0) THEN
    AD4 = NULL;
  ELSE
    AD4 = 0;

  IF (IASPV5 > 0) THEN
    AD5 = NULL;
  ELSE
    AD5 = 0;

  IF (AD1 + AD2 + AD3 + AD4 + AD5 = 0) THEN
  BEGIN
    ASPECTSCHEMEID = NULL;
    IF (NOT IPRICE IS NULL) THEN
      UPDATE SPRT SET PRICE = :IPRICE WHERE ID = :WAREID;
  END

  IF (NOT :ASPECTSCHEMEID IS NULL) THEN
    FOR
      SELECT ID, CODE
      FROM ASPECT
      WHERE ASPECTSCHEMEID = :ASPECTSCHEMEID AND DELETED = :IDELETEDASPECT
      INTO ASPID, ASPCODE
    DO
    BEGIN
      IF (ASPCODE = 1)  THEN
        IF (IASPV1 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV1) AND (ASPECTID = :ASPID)
          INTO AD1;
        ELSE
        BEGIN
          ERRORCODE = 10;
          EXIT;
        END

      IF (ASPCODE = 2)  THEN
        IF (IASPV2 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV2) AND (ASPECTID = :ASPID)
          INTO AD2;
        ELSE
        BEGIN
          ERRORCODE = 11;
          EXIT;
        END

      IF (ASPCODE = 3)  THEN
        IF (IASPV3 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV3) AND (ASPECTID = :ASPID)
          INTO AD3;
        ELSE
        BEGIN
          ERRORCODE = 12;
          EXIT;
        END

      IF (ASPCODE = 4)  THEN
        IF (IASPV4 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV4) AND (ASPECTID = :ASPID)
          INTO AD4;
        ELSE
        BEGIN
          ERRORCODE = 13;
          EXIT;
        END

      IF (ASPCODE = 5)  THEN
        IF (IASPV5 <> 0) THEN
          SELECT ID
          FROM ASPVALUE
          WHERE (CODE = :IASPV5) AND (ASPECTID = :ASPID)
          INTO AD5;
        ELSE
        BEGIN
          ERRORCODE = 14;
          EXIT;
        END
    END

  IF ((AD1 IS NULL) OR (AD2 IS NULL) OR (AD3 IS NULL) OR (AD4 IS NULL) OR (AD5 IS NULL)) THEN
  BEGIN
    ERRORCODE = 15;
    EXIT;
  END

  IF (IREMAIN IS NULL) THEN
    USEREMAIN = 0;
  ELSE
    USEREMAIN = 1;

  SELECT ID
  FROM REMAIN R
  WHERE WAREID = :WAREID AND
    ASPECTVALUE1ID = :AD1 AND
    ASPECTVALUE2ID = :AD2 AND
    ASPECTVALUE3ID = :AD3 AND
    ASPECTVALUE4ID = :AD4 AND
    ASPECTVALUE5ID = :AD5
  INTO REMAINID;

  IF (REMAINID IS NULL) THEN
  BEGIN
    REMAINID = GEN_ID(GID, 1);

    INSERT INTO REMAIN
      (ID, WAREID, ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID,
       ASPECTVALUE4ID, ASPECTVALUE5ID, PRICE,
       DELETED, USEREMAIN)
    VALUES
      (:REMAINID, :WAREID, :AD1, :AD2, :AD3, :AD4, :AD5,
      :IPRICE, :IDELETED, :USEREMAIN);

    IF (NOT :IREMAIN IS NULL) THEN
      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, 1);
  END
  ELSE
  BEGIN
    IF (IADDREPLACE <> 1) THEN
    BEGIN
      SUMMR = 0;
      SELECT SUM(DELTA)
      FROM REMAIND
      WHERE REMAINID = :REMAINID AND DTYPE = 1
      INTO SUMMR;

      IF (SUMMR <> 0) THEN
        INSERT INTO REMAIND(ID, REMAINID, DELTA, DTYPE)
        VALUES (GEN_ID(GREMAIND, 1), :REMAINID, -:SUMMR, 1);

      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;
    END

    UPDATE REMAIN SET
      PRICE = :IPRICE,
      DELETED = :IDELETED
    WHERE ID = :REMAINID;

    IF (NOT :IREMAIN IS NULL) THEN
    BEGIN
      UPDATE REMAIN SET
        USEREMAIN = :USEREMAIN
      WHERE ID = :REMAINID;

      INSERT INTO REMAIND
        (ID, REMAINID, DELTA, DOCUMENTID, DTYPE)
      VALUES
        (GEN_ID(GREMAIND, 1), :REMAINID, - :IREMAIN, NULL, 1);
     END

    IF (IADDREPLACE = 2) THEN
    BEGIN
      SUMMR = 0;
      SELECT SUM(DELTA)
      FROM REMAIND
      WHERE REMAINID = :REMAINID AND DTYPE = 0
      INTO SUMMR;

      IF (SUMMR <> 0) THEN
        INSERT INTO REMAIND(ID, REMAINID, DELTA, DTYPE)
        VALUES (GEN_ID(GREMAIND, 1), :REMAINID, -:SUMMR, 0);
    END
  END

  IF ((ILOADWAREDISC = 1) AND NOT IDISCOUNTVALUE IS NULL) THEN
  BEGIN
    IF (IDISCOUNTVALUE <> '') THEN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '  ', '  ',
                                       :IDISCOUNTTYPE, :IDISCOUNTVALUE, NULL, NULL, '', NULL,
                                       0, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
      RETURNING_VALUES ERRORCODE, TDISCRATEID;

    WHERECLAUSE = '';

    IF (AD1 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID = ' || :AD1;
    ELSE
    BEGIN
      AD1 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE1ID IS NULL ';
    END

    IF (AD2 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID = ' || :AD2;
    ELSE
    BEGIN
      AD2 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE2ID IS NULL ';
    END

    IF (AD3 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID = ' || :AD3;
    ELSE
    BEGIN
      AD3 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE3ID IS NULL ';
    END

    IF (AD4 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID = ' || :AD4;
    ELSE
    BEGIN
      AD4 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE4ID IS NULL ';
    END

    IF (AD5 > 0) THEN
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID = ' || :AD5;
    ELSE
    BEGIN
      AD5 = NULL;
      WHERECLAUSE = WHERECLAUSE || ' AND A.ASPECTVALUE5ID IS NULL ';
    END

    IF (IUSEGRPACTDISC <> 0) THEN
    BEGIN

      SELECT ID
      FROM GRPACTDISC
      WHERE CODE = :IGRPACTDISCCODE
      INTO :GRPACTDISCID;

      IF (GRPACTDISCID IS NULL) THEN
      BEGIN
        GRPACTDISCID = GEN_ID(GID, 1);
        INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
        VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
      END

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.DELETED ' ||
                        ' FROM ACTDISCOBJ A JOIN GRPACTDISC G ON ' ||
                                          ' G.ID = A.GRPACTDISCID AND G.ID = '|| :GRPACTDISCID ||
                        ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                        '      A.PAYMENTID = -1 AND A.CARDID = -1 '|| WHERECLAUSE
      INTO TACTDISCOBJID, DEL;

      IF (TACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID, DELETED)
        VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, NULL, NULL, :GRPACTDISCID, :IDELETEDACTDISCOBJ);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = :IDELETEDACTDISCOBJ
          WHERE ID = :TACTDISCOBJID;

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                         C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID
      INTO ACTDISCID, CONDITIONID;

      EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL,
                                          NULL, NULL,  NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL,  NULL, NULL,
                                          NULL, NULL, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

      IF (ACTDISCID IS NULL) THEN
      BEGIN
        SELECT NULLTONUM(MAX(CODE)) + 1
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        INTO ACTDISCCODE;

        INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                              CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
        VALUES     (GEN_ID(GID, 1), :ACTDISCCODE, :GRPACTDISCID, :WARENAME,
                    :CONDITIONID, :TDISCRATEID, NULL, 0, :IDELETEDACTDISC);
      END
      ELSE
        UPDATE ACTDISC SET
          NAME = :WARENAME,
          CONDITIONID = :CONDITIONID,
          DISCRATEID = :TDISCRATEID,
          DELETED = :IDELETEDACTDISC
        WHERE ID = :ACTDISCID;
    END
    ELSE
    BEGIN
      IF (IDISCOUNTVALUE <> '') THEN
      BEGIN
        EXECUTE STATEMENT ' SELECT FIRST 1 A.ID ' ||
                          ' FROM ACTDISCOBJ A JOIN DISCRATE D ON '||
                                          ' D.ID = A.DISCRATEID AND D.KIND = 2 '||
                          ' WHERE A.WAREID = '||:WAREID||' AND A.CLIENTID = -1 AND '||
                          '       A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 '|| WHERECLAUSE
        INTO TACTDISCOBJID;

        IF (TACTDISCOBJID IS NULL) THEN
          INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                   ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                   PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID, DELETED)
          VALUES   (GEN_ID(GID, 1), :WAREID, -1, -1, :AD1, :AD2, :AD3, :AD4, :AD5,
                    -1, :TDISCRATEID, NULL, NULL, :IDELETEDACTDISCOBJ);
        ELSE
          UPDATE ACTDISCOBJ SET
             DISCRATEID = :TDISCRATEID,
             DELETED = :IDELETEDACTDISCOBJ
          WHERE ID = :TACTDISCOBJID;
      END
      ELSE
        FOR EXECUTE STATEMENT
          'SELECT A.ID FROM ACTDISCOBJ A JOIN DISCRATE D ON ' ||
          '    D.ID = A.DISCRATEID AND D.KIND = 2 ' ||
          '    WHERE A.WAREID = ' || :WAREID || ' AND A.CLIENTID = -1 AND ' ||
          '          A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 ' || WHERECLAUSE
          INTO ACTDISCID
          DO
            UPDATE ACTDISCOBJ SET DELETED = :IDELETEDACTDISCOBJ - 1 WHERE ID = :ACTDISCID;
        /*EXECUTE STATEMENT
          'UPDATE ACTDISCOBJ SET DELETED = -1 WHERE ID IN ' ||
          '(SELECT A.ID FROM ACTDISCOBJ A JOIN DISCRATE D ON ' ||
          '    D.ID = A.DISCRATEID AND D.KIND = 2 ' ||
          '    WHERE A.WAREID = ' || :WAREID || ' AND A.CLIENTID = -1 AND ' ||
          '          A.PAYMENTID = -1 AND A.CARDID = -1 AND A.DISCRATEID <> 0 ' || WHERECLAUSE || ')';*/
    END
  END
END
^

/* Restore proc. body: APPEND_SUPERMAG_DISC */
ALTER PROCEDURE APPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
IDELETEDDISCRATE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IGRPACTDISCCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IGRPACTDISCCODE
    INTO GRPACTDISCID;

    IF (GRPACTDISCID IS NULL) THEN
    BEGIN
      GRPACTDISCID = GEN_ID(GID, 1);
      INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
      VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
    END
    ELSE
      UPDATE GRPACTDISC SET
        DELETED = :IDELETED
      WHERE ID = :GRPACTDISCID;

    IF (IWAREID > 0) THEN
    BEGIN
      SELECT ID, DELETED
      FROM ACTDISCOBJ
      WHERE WAREID = :IWAREID AND GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1
      INTO ACTDISCOBJID, DEL;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), :IWAREID, -1, -1, -1, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :ACTDISCOBJID;
    END
    ELSE
    BEGIN
      SELECT ID, DELETED
      FROM ACTDISCOBJ
      WHERE GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1 AND WAREID = -1
      INTO ACTDISCOBJID, DEL;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), -1, -1, -1, -1, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :ACTDISCOBJID;
    END
  END
  ELSE
    GRPACTDISCID = IGRPACTDISCID;

  IF (IAPPENDTYPE = 0) THEN   -- DiscCli
    BEGIN
      WHERECLAUSE = '';

      IF (ICARDPREFIXBEG IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG = '''|| :ICARDPREFIXBEG ||'''';

      IF (ICARDPREFIXEND IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND = '''|| :ICARDPREFIXEND ||'''';

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.CONDITIONID
                          FROM CONDITION C LEFT JOIN ACTDISC A ON
                                           C.ID = A.CONDITIONID
                          WHERE A.GRPACTDISCID = '|| :GRPACTDISCID ||' AND
                                C.SUMMBEG IS NULL '|| WHERECLAUSE ||'
                          PLAN JOIN (C INDEX (IDX_C_CARDPRBEG,IDX_C_CARDPREND),A INDEX (FK_AD_CONDITION,FK_AD_GRPACTDISC))'
      INTO :ACTDISCID, :CONDITIONID;
    END
  ELSE
    IF (IAPPENDTYPE = 1) THEN   -- CliClass

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                       C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
            C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
            C.QUANTITYBEG IS NULL
      INTO ACTDISCID, CONDITIONID;

    ELSE
      IF (IAPPENDTYPE = 2) THEN   -- DiscSumm
        BEGIN

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.SUMMBEG = :ISUMMBEG AND
                C.TIMEBEG = :ITIMEBEG AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

          IF (IDELETECURRENT = 1) THEN
            IF (ACTDISCID IS NULL) THEN
              EXIT;
            ELSE
              BEGIN
                DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                EXIT;
              END
        END
      ELSE
        IF (IAPPENDTYPE = 3) THEN   -- DiscCard

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.QUANTITYBEG = :IQUANTITYBEG    AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

        ELSE
          IF (IAPPENDTYPE = 4) THEN   -- CliSumm

            SELECT FIRST 1 A.ID, A.CONDITIONID
            FROM CONDITION C LEFT JOIN ACTDISC A ON
                             C.ID = A.CONDITIONID
            WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                  C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                  C.SUMMBEG = :ISUMMBEG             AND
                  C.TIMEBEG IS NULL
            INTO ACTDISCID, CONDITIONID;

          ELSE
            IF (IAPPENDTYPE = 5) THEN  -- PluDisc  ClasDisc

              SELECT FIRST 1 A.ID, A.CONDITIONID
              FROM CONDITION C LEFT JOIN ACTDISC A ON
                               C.ID = A.CONDITIONID
              WHERE A.GRPACTDISCID  = :GRPACTDISCID
              INTO ACTDISCID, CONDITIONID;

            ELSE
              IF (IAPPENDTYPE = 6) THEN  -- DiscSum 
                BEGIN

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                        C.SUMMRECBEG = :ISUMMRECBEG      AND
                        C.TIMEBEG = :ITIMEBEG            AND
                        C.CARDPREFIXBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                  IF (IDELETECURRENT = 1) THEN
                    IF (ACTDISCID IS NULL) THEN
                      EXIT;
                    ELSE
                    BEGIN
                      DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                      EXIT;
                    END
                END
              ELSE
                IF (IAPPENDTYPE = 7) THEN  -- CliSum 

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                        C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                        C.SUMMRECBEG = :ISUMMRECBEG
                  INTO ACTDISCID, CONDITIONID;

                ELSE
                  BEGIN
                    ERRORCODE = 90; --  IAPPENDTYPE
                    EXIT;
                  END

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, NULL, NULL, NULL, NULL, NULL, NULL,
                                    :IQUANTITYBEG, :IQUANTITYEND,  NULL, NULL, NULL, NULL,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,  NULL, NULL,
                                    :ITIMEBEG, :ITIMEEND, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, NULL, NULL,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID, NULL, :IDELETEDDISCRATE, NULL)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      IF (ICODE IS NULL) THEN
      BEGIN
        SELECT FIRST 1 CODE
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        ORDER BY GRPACTDISCID DESC, CODE DESC
        INTO ICODE;

        IF (ICODE IS NULL) THEN
          ICODE = 1;
        ELSE
          ICODE = ICODE + 1;
      END

      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (GEN_ID(GID, 1), :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
       NAME = :INAME,
       CONDITIONID = :CONDITIONID,
       DISCRATEID = :DISCRATEID,
       DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Restore proc. body: APPEND_WARE_DISC */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER,
IDELETEDDISCRATE INTEGER,
IDELETEDACTDISCOBJ INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TID INTEGER;
BEGIN

  IF (IDISCVALUE <> '') THEN
  BEGIN

    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, '  ', '  ',
                                     :IDISCTYPE, :IDISCVALUE, NULL, NULL, '', NULL,
                                     0, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
          RETURNING_VALUES ERRORCODE, TDISCRATEID;

    SELECT FIRST 1 A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL
    INTO TACTDISCOBJID;

    IF (TACTDISCOBJID IS NULL) THEN
      INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                               ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                               PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID, DELETED)
      VALUES   (GEN_ID(GID, 1), :IWAREID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                -1, :TDISCRATEID, NULL, 0, :IDELETEDACTDISCOBJ);
    ELSE
    BEGIN
      UPDATE ACTDISCOBJ SET
         DISCRATEID = :TDISCRATEID,
         DELETED = :IDELETEDACTDISCOBJ
      WHERE ID = :TACTDISCOBJID;

      FOR SELECT A.ID
      FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
      WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
            A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
            A.ASPECTVALUE1ID IS NULL AND
            A.ASPECTVALUE2ID IS NULL AND
            A.ASPECTVALUE3ID IS NULL AND
            A.ASPECTVALUE4ID IS NULL AND
            A.ASPECTVALUE5ID IS NULL AND
            A.ID <> :TACTDISCOBJID AND A.DELETED >= 0
      INTO TID
      DO
        UPDATE ACTDISCOBJ SET DELETED = :IDELETEDACTDISCOBJ - 1 WHERE ID = :TID;
    END
  END
  ELSE
  BEGIN
    FOR SELECT A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                    D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL AND
          A.DELETED >= 0
    INTO TID
    DO
      UPDATE ACTDISCOBJ SET DELETED = :IDELETEDACTDISCOBJ - 1 WHERE ID = :TID;
  END
END
^

/* Restore proc. body: APPENDACTDISC */
ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG DOUBLE PRECISION,
IPRICEEND DOUBLE PRECISION,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IQUANTITYRECBEG DOUBLE PRECISION,
IQUANTITYRECEND DOUBLE PRECISION,
IQUANTITYWAREBEG DOUBLE PRECISION,
IQUANTITYWAREEND DOUBLE PRECISION,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
ISUMMWAREBEG DOUBLE PRECISION,
ISUMMWAREEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER,
IDELETEDDISCRATE INTEGER,
IDISCRATECODE INTEGER,
IACTSCRIPTCODE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE ACTSCRIPTID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :IGRPACTDISCCODE
  INTO GRPACTDISCID;

  IF (GRPACTDISCID IS NULL) THEN
   BEGIN
      ERRORCODE = 1;
      EXIT;
    END

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :GRPACTDISCID
  PLAN (ACTDISC INDEX (UNQ_ACTDISC))
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, :IDATEBEG, :IDATEEND,
                                    :IDAYBEG, :IDAYEND, :IPRICEBEG, :IPRICEEND,
                                    :IQUANTITYBEG, :IQUANTITYEND,
                                    :IQUANTITYRECBEG, :IQUANTITYRECEND,
                                    :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,
                                    :ISUMMWAREBEG, :ISUMMWAREEND, :ITIMEBEG, :ITIMEEND,
                                    :IWARECODE, :IWARECODETOMARK)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (IDISCRATEPARENTCODE IS NOT NULL) THEN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEPARENTCODE AND ISFOLDER > 0
      INTO IDISCRATEPARENTID;

  IF (IDISCRATECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DISCRATE
    WHERE CODE = :IDISCRATECODE
    INTO DISCRATEID;

    IF (DISCRATEID IS NULL) THEN
    BEGIN
      ERRORCODE = 51;
      EXIT;
    END
  END
  ELSE
    EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, :INAME, :ITEXT,
                                     :ITYPE, :IVAL, NULL, NULL, '', 0,
                                     :IDESTINATION, 2, 0, NULL, :GRPACTDISCID, :IDISCRATECODE, :IDELETEDDISCRATE, NULL)
        RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  ACTSCRIPTID = NULL;
  IF (IACTSCRIPTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ACTSCRIPT
    WHERE CODE = :IACTSCRIPTCODE
    INTO ACTSCRIPTID;

    IF (ACTSCRIPTID IS NULL) THEN
    BEGIN
      ERRORCODE = 48;
      EXIT;
    END
  END

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, :ACTSCRIPTID, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         ACTSCRIPTID = :ACTSCRIPTID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Restore proc. body: APPENDCCARDDISCS */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERTYPE4 INTEGER,
ICOUNTERTYPE5 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERVAL4 DOUBLE PRECISION,
ICOUNTERVAL5 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ICOUNTERCODE4 NUMERIC(18),
ICOUNTERCODE5 NUMERIC(18),
IDELETEDDISCRATE INTEGER,
IDELETEDACTDISCOBJ INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18),
OCOUNTERCODE4 NUMERIC(18),
OCOUNTERCODE5 NUMERIC(18))
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE DOCODE INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  OCOUNTERCODE4 = ICOUNTERCODE4;
  OCOUNTERCODE5 = ICOUNTERCODE5;

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE VAL = :ICARD
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      IF (EXISTS(SELECT 1 FROM CCARD WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID)) THEN
      BEGIN
        SELECT MAX(CODE) + 1 FROM CCARD WHERE GRPCCARDID = :GRPCARDID INTO ICARDCODE;
        IF (ICARDCODE IS NULL) THEN
          ICARDCODE = 1;
      END
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        CODE = :ICARDCODE,
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
        EXIT;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        PLAN (A INDEX (IDX_ACTDISCOBJ2))
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;

        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID, DELETED)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID, :IDELETEDACTDISCOBJ);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = :IDELETEDACTDISCOBJ
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCARDFLG = 1) THEN
        FOR SELECT A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID
        DO
          UPDATE ACTDISCOBJ SET DELETED = :IDELETEDACTDISCOBJ - 1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE4 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE4, :ICOUNTERVAL4, :CARDID, NULL, ICOUNTERCODE4, 45)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE4;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE5 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE5, :ICOUNTERVAL5, :CARDID, NULL, ICOUNTERCODE5, 46)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE5;
END
^

/* Restore proc. body: APPENDCLIENT */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ILEGALZIPCODE VARCHAR(10),
ILEGALCITY VARCHAR(100),
ILEGALADDRESS VARCHAR(255),
IDELETEDDISCRATE INTEGER,
IPICTURE BLOB SEGMENT SIZE 1024,
IDELETEDACTDISCOBJ INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,        CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE,   BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,       WEB,
                          TELEPHONE, INN,       DOCUMENT, OKPO,     OKPD,  DELETED,  LEGALZIPCODE,
                          LEGALCITY, LEGALADDRESS, PICTURE)

      VALUES (:CLIENTID,   :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT, :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE,   :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,       :IWEB,
              :ITELEPHONE, :IINN,       :IDOCUMENT,   :IOKPO,     :IOKPD, :IDELETED,  :ILEGALZIPCODE,
              :ILEGALCITY, :ILEGALADDRESS, :IPICTURE);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED,
          LEGALZIPCODE = :ILEGALZIPCODE,
          LEGALCITY = :ILEGALCITY,
          LEGALADDRESS = :ILEGALADDRESS,
          PICTURE = :IPICTURE
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID, DELETED)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID, :IDELETEDACTDISCOBJ);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = :IDELETEDACTDISCOBJ
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCLIENT = 1) THEN
      FOR SELECT A.ID
      FROM ACTDISCOBJ A
      WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
            A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
            A.DISCRATEID > 0
      INTO ACTDISCOBJID
      DO
        UPDATE ACTDISCOBJ SET DELETED = :IDELETEDACTDISCOBJ - 1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;
END
^

/* Alter Procedure... */
/* Alter (APPEND_SUPERMAG_DISC) */
ALTER PROCEDURE APPEND_SUPERMAG_DISC(IGRPACTDISCID INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IDELETED INTEGER,
IAPPENDTYPE INTEGER,
IDELETECURRENT INTEGER,
IDISCRATEPARENTID INTEGER,
IDESTINATION INTEGER,
IGRPACTDISCCODE INTEGER,
IDELETEDGRPACTDISC INTEGER,
IWAREID INTEGER,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
IDELETEDDISCRATE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE DEL INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE WHERECLAUSE VARCHAR(255);
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  IF (IGRPACTDISCCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IGRPACTDISCCODE
    INTO GRPACTDISCID;

    IF (GRPACTDISCID IS NULL) THEN
    BEGIN
      GRPACTDISCID = GEN_ID(GID, 1);
      INSERT INTO GRPACTDISC (ID, CODE, NAME, ACTV, DEPENDOTHERPOS, DELETED)
      VALUES (:GRPACTDISCID, :IGRPACTDISCCODE, ' ' || :IGRPACTDISCCODE, 1, 1, :IDELETEDGRPACTDISC);
    END
    ELSE
      UPDATE GRPACTDISC SET
        DELETED = :IDELETED
      WHERE ID = :GRPACTDISCID;

    IF (IWAREID > 0) THEN
    BEGIN
      SELECT ID, DELETED
      FROM ACTDISCOBJ
      WHERE WAREID = :IWAREID AND GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1
      INTO ACTDISCOBJID, DEL;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), :IWAREID, -1, -1, -1, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :ACTDISCOBJID;
    END
    ELSE
    BEGIN
      SELECT ID, DELETED
      FROM ACTDISCOBJ
      WHERE GRPACTDISCID = :GRPACTDISCID AND
            CARDID = -1 AND CLIENTID = -1 AND PAYMENTID = -1 AND WAREID = -1
      INTO ACTDISCOBJID, DEL;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ (ID, WAREID, CARDID, CLIENTID, PAYMENTID, GRPACTDISCID)
        VALUES (GEN_ID(GID, 1), -1, -1, -1, -1, :GRPACTDISCID);
      ELSE
        IF (DEL < 0) THEN
          UPDATE ACTDISCOBJ SET
            DELETED = 0
          WHERE ID = :ACTDISCOBJID;
    END
  END
  ELSE
    GRPACTDISCID = IGRPACTDISCID;

  IF (IAPPENDTYPE = 0) THEN   -- DiscCli
    BEGIN
      WHERECLAUSE = '';

      IF (ICARDPREFIXBEG IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXBEG = '''|| :ICARDPREFIXBEG ||'''';

      IF (ICARDPREFIXEND IS NULL) THEN
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND IS NULL ';
      ELSE
        WHERECLAUSE = WHERECLAUSE || ' AND C.CARDPREFIXEND = '''|| :ICARDPREFIXEND ||'''';

      EXECUTE STATEMENT ' SELECT FIRST 1 A.ID, A.CONDITIONID
                          FROM CONDITION C LEFT JOIN ACTDISC A ON
                                           C.ID = A.CONDITIONID
                          WHERE A.GRPACTDISCID = '|| :GRPACTDISCID ||' AND
                                C.SUMMBEG IS NULL '|| WHERECLAUSE ||'
                          PLAN JOIN (C INDEX (IDX_C_CARDPRBEG,IDX_C_CARDPREND),A INDEX (FK_AD_CONDITION,FK_AD_GRPACTDISC))'
      INTO :ACTDISCID, :CONDITIONID;
    END
  ELSE
    IF (IAPPENDTYPE = 1) THEN   -- CliClass

      SELECT FIRST 1 A.ID, A.CONDITIONID
      FROM CONDITION C LEFT JOIN ACTDISC A ON
                       C.ID = A.CONDITIONID
      WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
            C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
            C.QUANTITYBEG IS NULL
      INTO ACTDISCID, CONDITIONID;

    ELSE
      IF (IAPPENDTYPE = 2) THEN   -- DiscSumm
        BEGIN

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.SUMMBEG = :ISUMMBEG AND
                C.TIMEBEG = :ITIMEBEG AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

          IF (IDELETECURRENT = 1) THEN
            IF (ACTDISCID IS NULL) THEN
              EXIT;
            ELSE
              BEGIN
                DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                EXIT;
              END
        END
      ELSE
        IF (IAPPENDTYPE = 3) THEN   -- DiscCard

          SELECT FIRST 1 A.ID, A.CONDITIONID
          FROM CONDITION C LEFT JOIN ACTDISC A ON
                           C.ID = A.CONDITIONID
          WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                C.QUANTITYBEG = :IQUANTITYBEG    AND
                C.CARDPREFIXBEG IS NULL
          INTO ACTDISCID, CONDITIONID;

        ELSE
          IF (IAPPENDTYPE = 4) THEN   -- CliSumm

            SELECT FIRST 1 A.ID, A.CONDITIONID
            FROM CONDITION C LEFT JOIN ACTDISC A ON
                             C.ID = A.CONDITIONID
            WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                  C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                  C.SUMMBEG = :ISUMMBEG             AND
                  C.TIMEBEG IS NULL
            INTO ACTDISCID, CONDITIONID;

          ELSE
            IF (IAPPENDTYPE = 5) THEN  -- PluDisc  ClasDisc

              SELECT FIRST 1 A.ID, A.CONDITIONID
              FROM CONDITION C LEFT JOIN ACTDISC A ON
                               C.ID = A.CONDITIONID
              WHERE A.GRPACTDISCID  = :GRPACTDISCID
              INTO ACTDISCID, CONDITIONID;

            ELSE
              IF (IAPPENDTYPE = 6) THEN  -- DiscSum 
                BEGIN

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID  AND
                        C.SUMMRECBEG = :ISUMMRECBEG      AND
                        C.TIMEBEG = :ITIMEBEG            AND
                        C.CARDPREFIXBEG IS NULL
                  INTO ACTDISCID, CONDITIONID;

                  IF (IDELETECURRENT = 1) THEN
                    IF (ACTDISCID IS NULL) THEN
                      EXIT;
                    ELSE
                    BEGIN
                      DELETE FROM ACTDISC WHERE ID = :ACTDISCID;
                      EXIT;
                    END
                END
              ELSE
                IF (IAPPENDTYPE = 7) THEN  -- CliSum 

                  SELECT FIRST 1 A.ID, A.CONDITIONID
                  FROM CONDITION C LEFT JOIN ACTDISC A ON
                                   C.ID = A.CONDITIONID
                  WHERE A.GRPACTDISCID  = :GRPACTDISCID   AND
                        C.CARDPREFIXBEG = :ICARDPREFIXBEG AND
                        C.SUMMRECBEG = :ISUMMRECBEG
                  INTO ACTDISCID, CONDITIONID;

                ELSE
                  BEGIN
                    ERRORCODE = 90; --  IAPPENDTYPE
                    EXIT;
                  END

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, NULL, NULL, NULL, NULL, NULL, NULL,
                                    :IQUANTITYBEG, :IQUANTITYEND,  NULL, NULL, NULL, NULL,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,  NULL, NULL,
                                    :ITIMEBEG, :ITIMEEND, NULL, NULL)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, :INAME, :ITEXT,
                                   :ITYPE, :IVAL, NULL, NULL, NULL, NULL,
                                   :IDESTINATION, 2, 0, NULL, :GRPACTDISCID, NULL, :IDELETEDDISCRATE, NULL)
      RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      IF (ICODE IS NULL) THEN
      BEGIN
        SELECT FIRST 1 CODE
        FROM ACTDISC
        WHERE GRPACTDISCID  = :GRPACTDISCID
        ORDER BY GRPACTDISCID DESC, CODE DESC
        INTO ICODE;

        IF (ICODE IS NULL) THEN
          ICODE = 1;
        ELSE
          ICODE = ICODE + 1;
      END

      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (GEN_ID(GID, 1), :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, NULL, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
       NAME = :INAME,
       CONDITIONID = :CONDITIONID,
       DISCRATEID = :DISCRATEID,
       DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* empty dependent procedure body */
/* Clear: APPENDWARE for: APPEND_WARE_DISC */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(100),
ICERTIFICAT VARCHAR(100),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
IGTD VARCHAR(100),
ILOADWAREDISC INTEGER = 1,
IDELETEDDISCRATE INTEGER = 0,
IDELETEDACTDISCOBJ INTEGER = 0)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPEND_WARE_DISC) */
ALTER PROCEDURE APPEND_WARE_DISC(IWAREID INTEGER,
IDISCTYPE INTEGER,
IDISCVALUE VARCHAR(100),
IDISCRATEPARENTID INTEGER,
IDELETEDDISCRATE INTEGER,
IDELETEDACTDISCOBJ INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE TDISCRATEID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TID INTEGER;
BEGIN

  IF (IDISCVALUE <> '') THEN
  BEGIN

    EXECUTE PROCEDURE APPENDDISCRATE(IDISCRATEPARENTID, '  ', '  ',
                                     :IDISCTYPE, :IDISCVALUE, NULL, NULL, '', NULL,
                                     0, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
          RETURNING_VALUES ERRORCODE, TDISCRATEID;

    SELECT FIRST 1 A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL
    INTO TACTDISCOBJID;

    IF (TACTDISCOBJID IS NULL) THEN
      INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                               ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                               PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID, DELETED)
      VALUES   (GEN_ID(GID, 1), :IWAREID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                -1, :TDISCRATEID, NULL, 0, :IDELETEDACTDISCOBJ);
    ELSE
    BEGIN
      UPDATE ACTDISCOBJ SET
         DISCRATEID = :TDISCRATEID,
         DELETED = :IDELETEDACTDISCOBJ
      WHERE ID = :TACTDISCOBJID;

      FOR SELECT A.ID
      FROM ACTDISCOBJ A JOIN DISCRATE D ON
                      D.ID = A.DISCRATEID AND D.KIND = 2
      WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
            A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
            A.ASPECTVALUE1ID IS NULL AND
            A.ASPECTVALUE2ID IS NULL AND
            A.ASPECTVALUE3ID IS NULL AND
            A.ASPECTVALUE4ID IS NULL AND
            A.ASPECTVALUE5ID IS NULL AND
            A.ID <> :TACTDISCOBJID AND A.DELETED >= 0
      INTO TID
      DO
        UPDATE ACTDISCOBJ SET DELETED = :IDELETEDACTDISCOBJ - 1 WHERE ID = :TID;
    END
  END
  ELSE
  BEGIN
    FOR SELECT A.ID
    FROM ACTDISCOBJ A JOIN DISCRATE D ON
                    D.ID = A.DISCRATEID AND D.KIND = 2
    WHERE A.WAREID = :IWAREID AND A.CLIENTID = -1 AND A.CARDID = -1 AND
          A.PAYMENTID = -1 AND A.DISCRATEID <> 0 AND
          A.ASPECTVALUE1ID IS NULL AND
          A.ASPECTVALUE2ID IS NULL AND
          A.ASPECTVALUE3ID IS NULL AND
          A.ASPECTVALUE4ID IS NULL AND
          A.ASPECTVALUE5ID IS NULL AND
          A.DELETED >= 0
    INTO TID
    DO
      UPDATE ACTDISCOBJ SET DELETED = :IDELETEDACTDISCOBJ - 1 WHERE ID = :TID;
  END
END
^

/* Alter (APPENDACTDISC) */
ALTER PROCEDURE APPENDACTDISC(IGRPACTDISCCODE INTEGER,
ICODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
ITYPE INTEGER,
IVAL VARCHAR(100),
ICARDLENBEG INTEGER,
ICARDLENEND INTEGER,
ICARDPREFIXBEG VARCHAR(40),
ICARDPREFIXEND VARCHAR(40),
ICARDSTATE INTEGER,
IDATEBEG DATE,
IDATEEND DATE,
IDAYBEG INTEGER,
IDAYEND INTEGER,
IPRICEBEG DOUBLE PRECISION,
IPRICEEND DOUBLE PRECISION,
IQUANTITYBEG DOUBLE PRECISION,
IQUANTITYEND DOUBLE PRECISION,
IQUANTITYRECBEG DOUBLE PRECISION,
IQUANTITYRECEND DOUBLE PRECISION,
IQUANTITYWAREBEG DOUBLE PRECISION,
IQUANTITYWAREEND DOUBLE PRECISION,
ISUMMBEG DOUBLE PRECISION,
ISUMMEND DOUBLE PRECISION,
ISUMMRECBEG DOUBLE PRECISION,
ISUMMRECEND DOUBLE PRECISION,
ISUMMWAREBEG DOUBLE PRECISION,
ISUMMWAREEND DOUBLE PRECISION,
ITIMEBEG TIME,
ITIMEEND TIME,
IWARECODE VARCHAR(20),
IWARECODETOMARK INTEGER,
IDELETED INTEGER,
IDISCRATEPARENTID INTEGER,
IDISCRATEPARENTCODE INTEGER,
IDESTINATION INTEGER,
IDELETEDDISCRATE INTEGER,
IDISCRATECODE INTEGER,
IACTSCRIPTCODE INTEGER)
 RETURNS(ERRORCODE INTEGER)
 AS
DECLARE VARIABLE ACTDISCID INTEGER;
DECLARE VARIABLE GRPACTDISCID INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE CONDITIONID INTEGER;
DECLARE VARIABLE ACTSCRIPTID INTEGER;
BEGIN
  ERRORCODE = 0;

  SELECT ID
  FROM GRPACTDISC
  WHERE CODE = :IGRPACTDISCCODE
  INTO GRPACTDISCID;

  IF (GRPACTDISCID IS NULL) THEN
   BEGIN
      ERRORCODE = 1;
      EXIT;
    END

  SELECT ID, CONDITIONID
  FROM ACTDISC
  WHERE CODE = :ICODE AND GRPACTDISCID = :GRPACTDISCID
  PLAN (ACTDISC INDEX (UNQ_ACTDISC))
  INTO ACTDISCID, CONDITIONID;

  EXECUTE PROCEDURE APPENDCONDITION(:CONDITIONID, :ICARDLENBEG, :ICARDLENEND,
                                    :ICARDPREFIXBEG, :ICARDPREFIXEND,
                                    :ICARDSTATE, :IDATEBEG, :IDATEEND,
                                    :IDAYBEG, :IDAYEND, :IPRICEBEG, :IPRICEEND,
                                    :IQUANTITYBEG, :IQUANTITYEND,
                                    :IQUANTITYRECBEG, :IQUANTITYRECEND,
                                    :IQUANTITYWAREBEG, :IQUANTITYWAREEND,
                                    :ISUMMBEG, :ISUMMEND, :ISUMMRECBEG, :ISUMMRECEND,
                                    :ISUMMWAREBEG, :ISUMMWAREEND, :ITIMEBEG, :ITIMEEND,
                                    :IWARECODE, :IWARECODETOMARK)
      RETURNING_VALUES ERRORCODE, CONDITIONID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  IF (IDISCRATEPARENTCODE IS NOT NULL) THEN
      SELECT ID
      FROM DISCRATE
      WHERE CODE = :IDISCRATEPARENTCODE AND ISFOLDER > 0
      INTO IDISCRATEPARENTID;

  IF (IDISCRATECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DISCRATE
    WHERE CODE = :IDISCRATECODE
    INTO DISCRATEID;

    IF (DISCRATEID IS NULL) THEN
    BEGIN
      ERRORCODE = 51;
      EXIT;
    END
  END
  ELSE
    EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, :INAME, :ITEXT,
                                     :ITYPE, :IVAL, NULL, NULL, '', 0,
                                     :IDESTINATION, 2, 0, NULL, :GRPACTDISCID, :IDISCRATECODE, :IDELETEDDISCRATE, NULL)
        RETURNING_VALUES ERRORCODE, DISCRATEID;

  IF (ERRORCODE > 0) THEN
    EXIT;

  ACTSCRIPTID = NULL;
  IF (IACTSCRIPTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ACTSCRIPT
    WHERE CODE = :IACTSCRIPTCODE
    INTO ACTSCRIPTID;

    IF (ACTSCRIPTID IS NULL) THEN
    BEGIN
      ERRORCODE = 48;
      EXIT;
    END
  END

  IF (ACTDISCID IS NULL) THEN
    BEGIN
      ACTDISCID = GEN_ID(GID, 1);
      INSERT INTO ACTDISC (ID, CODE, GRPACTDISCID, NAME,
                           CONDITIONID, DISCRATEID, ACTSCRIPTID, PRIORITY, DELETED)
      VALUES     (:ACTDISCID, :ICODE, :GRPACTDISCID, :INAME,
                  :CONDITIONID, :DISCRATEID, :ACTSCRIPTID, 0, :IDELETED);
    END
  ELSE
    UPDATE ACTDISC SET
         NAME = :INAME,
         CONDITIONID = :CONDITIONID,
         DISCRATEID = :DISCRATEID,
         ACTSCRIPTID = :ACTSCRIPTID,
         DELETED = :IDELETED
    WHERE ID = :ACTDISCID;

END
^

/* Alter (APPENDCCARDDISCS) */
ALTER PROCEDURE APPENDCCARDDISCS(ICARDCODE INTEGER,
ICARDGRPCODE INTEGER,
ICARD VARCHAR(40),
ICARDEXPDATEBEG DATE,
ICARDEXPDATEEND DATE,
ICARDSTATE INTEGER,
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERTYPE4 INTEGER,
ICOUNTERTYPE5 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERVAL4 DOUBLE PRECISION,
ICOUNTERVAL5 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ICOUNTERCODE4 NUMERIC(18),
ICOUNTERCODE5 NUMERIC(18),
IDELETEDDISCRATE INTEGER,
IDELETEDACTDISCOBJ INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18),
OCOUNTERCODE4 NUMERIC(18),
OCOUNTERCODE5 NUMERIC(18))
 AS
DECLARE VARIABLE CARDID INTEGER;
DECLARE VARIABLE DOCODE INTEGER;
DECLARE VARIABLE GRPCARDID INTEGER;
DECLARE VARIABLE OLDCARDFLG INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  OCOUNTERCODE4 = ICOUNTERCODE4;
  OCOUNTERCODE5 = ICOUNTERCODE5;

  SELECT ID
  FROM GRPCCARD
  WHERE CODE = :ICARDGRPCODE
  INTO GRPCARDID;

  IF (GRPCARDID IS NULL) THEN
    BEGIN
      ERRORCODE = 26;
      EXIT;
    END

  SELECT ID
  FROM CCARD
  WHERE VAL = :ICARD
  INTO CARDID;

  IF (CARDID IS NULL) THEN
    BEGIN
      IF (EXISTS(SELECT 1 FROM CCARD WHERE CODE = :ICARDCODE AND GRPCCARDID = :GRPCARDID)) THEN
      BEGIN
        SELECT MAX(CODE) + 1 FROM CCARD WHERE GRPCCARDID = :GRPCARDID INTO ICARDCODE;
        IF (ICARDCODE IS NULL) THEN
          ICARDCODE = 1;
      END
      CARDID = GEN_ID(GID, 1);
      INSERT INTO CCARD (ID, CODE, GRPCCARDID, VAL, EXPDATEBEG, EXPDATEEND, STATE, DELETED)
      VALUES (:CARDID, :ICARDCODE, :GRPCARDID, :ICARD, :ICARDEXPDATEBEG, :ICARDEXPDATEEND, :ICARDSTATE, :IDELETED);
    END
  ELSE
    BEGIN
      UPDATE CCARD SET
        CODE = :ICARDCODE,
        GRPCCARDID = :GRPCARDID,
        VAL = :ICARD,
        EXPDATEBEG = :ICARDEXPDATEBEG,
        EXPDATEEND = :ICARDEXPDATEEND,
        STATE = :ICARDSTATE,
        DELETED = :IDELETED
      WHERE ID = :CARDID;
      OLDCARDFLG = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
        EXIT;

      IF (OLDCARDFLG = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        PLAN (A INDEX (IDX_ACTDISCOBJ2))
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
      BEGIN
        DOCODE = NULL;
        SELECT FIRST 1 CODE FROM ACTDISCOBJ ORDER BY CODE DESC INTO DOCODE;
        IF (DOCODE IS NULL) THEN
          DOCODE = 1;
        ELSE
          DOCODE = DOCODE + 1;

        INSERT INTO ACTDISCOBJ(ID, CODE, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID, DELETED)
        VALUES (GEN_ID(GID, 1), :DOCODE, -1, -1, :CARDID, -1, :DISCRATEID, :IDELETEDACTDISCOBJ);
      END
      ELSE
        UPDATE ACTDISCOBJ SET
          CARDID = :CARDID,
          DISCRATEID = :DISCRATEID,
          DELETED = :IDELETEDACTDISCOBJ
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCARDFLG = 1) THEN
        FOR SELECT A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = -1 AND A.CARDID = :CARDID AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID
        DO
          UPDATE ACTDISCOBJ SET DELETED = :IDELETEDACTDISCOBJ - 1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, :CARDID, NULL, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, :CARDID, NULL, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, :CARDID, NULL, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE4 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE4, :ICOUNTERVAL4, :CARDID, NULL, ICOUNTERCODE4, 45)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE4;

  IF (ERRORCODE IS NOT NULL AND ERRORCODE <> 0) THEN
    EXIT;

  IF (NOT ICOUNTERTYPE5 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE5, :ICOUNTERVAL5, :CARDID, NULL, ICOUNTERCODE5, 46)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE5;
END
^

/* Alter (APPENDCLIENT) */
ALTER PROCEDURE APPENDCLIENT(ICODE INTEGER,
IPARENTCODE INTEGER,
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IISFOLDER INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
ISEX INTEGER,
IMEMDATE DATE,
IBIRTHDATE DATE,
IREGDATE DATE,
IZIPCODE VARCHAR(10),
ICITY VARCHAR(100),
IADDRESS VARCHAR(255),
IEMAIL VARCHAR(30),
IWEB VARCHAR(30),
ITELEPHONE VARCHAR(30),
IINN VARCHAR(20),
IDOCUMENT VARCHAR(100),
IOKPO VARCHAR(13),
IOKPD VARCHAR(4),
IDELETED INTEGER,
IDISCRATEVALUE VARCHAR(100),
IDISCRATETYPE INTEGER,
IDISCRATEDESTINATION INTEGER,
IDISCRATEPARENTID INTEGER,
ICOUNTERTYPE1 INTEGER,
ICOUNTERTYPE2 INTEGER,
ICOUNTERTYPE3 INTEGER,
ICOUNTERVAL1 DOUBLE PRECISION,
ICOUNTERVAL2 DOUBLE PRECISION,
ICOUNTERVAL3 DOUBLE PRECISION,
ICOUNTERCODE1 NUMERIC(18),
ICOUNTERCODE2 NUMERIC(18),
ICOUNTERCODE3 NUMERIC(18),
ILEGALZIPCODE VARCHAR(10),
ILEGALCITY VARCHAR(100),
ILEGALADDRESS VARCHAR(255),
IDELETEDDISCRATE INTEGER,
IPICTURE BLOB SEGMENT SIZE 1024,
IDELETEDACTDISCOBJ INTEGER)
 RETURNS(ERRORCODE INTEGER,
OCOUNTERCODE1 NUMERIC(18),
OCOUNTERCODE2 NUMERIC(18),
OCOUNTERCODE3 NUMERIC(18))
 AS
DECLARE VARIABLE CLIENTID INTEGER;
DECLARE VARIABLE GRPCLIENTID INTEGER;
DECLARE VARIABLE OLDCLIENT INTEGER;
DECLARE VARIABLE DISCRATEID INTEGER;
DECLARE VARIABLE ACTDISCOBJID INTEGER;
BEGIN

  OCOUNTERCODE1 = ICOUNTERCODE1;
  OCOUNTERCODE2 = ICOUNTERCODE2;
  OCOUNTERCODE3 = ICOUNTERCODE3;
  IF (IPARENTCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM CLIENT
    WHERE CODE = :IPARENTCODE AND DELETED = :IDELETED AND ISFOLDER = 1
    INTO GRPCLIENTID;

    IF (GRPCLIENTID IS NULL) THEN
      BEGIN
        ERRORCODE = 32;
        EXIT;
      END
  END
  ELSE
    GRPCLIENTID = 0;

  SELECT ID
  FROM CLIENT
  WHERE CODE = :ICODE
  INTO CLIENTID;

  IF (CLIENTID IS NULL) THEN
    BEGIN
      CLIENTID = GEN_ID(GID, 1);
      INSERT INTO CLIENT (ID,        CODE,      PARENTID, NAME,     TEXT,  ISFOLDER, DESCRIPTION, SEX,
                          MEMDATE,   BIRTHDATE, REGDATE,  ZIPCODE,  CITY,  ADDRESS,  EMAIL,       WEB,
                          TELEPHONE, INN,       DOCUMENT, OKPO,     OKPD,  DELETED,  LEGALZIPCODE,
                          LEGALCITY, LEGALADDRESS, PICTURE)

      VALUES (:CLIENTID,   :ICODE,      :GRPCLIENTID, :INAME,     :ITEXT, :IISFOLDER, :IDESCRIPTION, :ISEX,
              :IMEMDATE,   :IBIRTHDATE, :IREGDATE,    :IZIPCODE,  :ICITY, :IADDRESS,  :IEMAIL,       :IWEB,
              :ITELEPHONE, :IINN,       :IDOCUMENT,   :IOKPO,     :IOKPD, :IDELETED,  :ILEGALZIPCODE,
              :ILEGALCITY, :ILEGALADDRESS, :IPICTURE);
    END
  ELSE
    BEGIN
      UPDATE CLIENT SET
          PARENTID = :GRPCLIENTID,
          NAME = :INAME,
          TEXT = :ITEXT,
          ISFOLDER = :IISFOLDER,
          DESCRIPTION = :IDESCRIPTION,
          SEX = :ISEX,
          MEMDATE = :IMEMDATE,
          BIRTHDATE = :IBIRTHDATE,
          REGDATE = :IREGDATE,
          ZIPCODE = :IZIPCODE,
          CITY = :ICITY,
          ADDRESS = :IADDRESS,
          EMAIL = :IEMAIL,
          WEB = :IWEB,
          TELEPHONE = :ITELEPHONE,
          INN = :IINN,
          DOCUMENT = :IDOCUMENT,
          OKPO = :IOKPO,
          OKPD = :IOKPD,
          DELETED = :IDELETED,
          LEGALZIPCODE = :ILEGALZIPCODE,
          LEGALCITY = :ILEGALCITY,
          LEGALADDRESS = :ILEGALADDRESS,
          PICTURE = :IPICTURE
      WHERE ID = :CLIENTID;

      OLDCLIENT = 1;
    END

  IF (IDISCRATEVALUE <> '') THEN
    BEGIN
      EXECUTE PROCEDURE APPENDDISCRATE(:IDISCRATEPARENTID, '', '',
                                       :IDISCRATETYPE, :IDISCRATEVALUE, NULL, NULL, '', NULL,
                                       :IDISCRATEDESTINATION, 2, 0, NULL, NULL, NULL, :IDELETEDDISCRATE, NULL)
              RETURNING_VALUES ERRORCODE, DISCRATEID;

      IF (OLDCLIENT = 1) THEN
        SELECT FIRST 1 A.ID
        FROM ACTDISCOBJ A
        WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
              A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
              A.DISCRATEID > 0
        INTO ACTDISCOBJID;

      IF (ACTDISCOBJID IS NULL) THEN
        INSERT INTO ACTDISCOBJ(ID, CLIENTID, WAREID, CARDID, PAYMENTID, DISCRATEID, DELETED)
        VALUES (GEN_ID(GID, 1), :CLIENTID, -1, -1, -1, :DISCRATEID, :IDELETEDACTDISCOBJ);
      ELSE
        UPDATE ACTDISCOBJ SET
          DISCRATEID = :DISCRATEID,
          DELETED = :IDELETEDACTDISCOBJ
        WHERE ID = :ACTDISCOBJID;
    END
  ELSE
    BEGIN
      IF (OLDCLIENT = 1) THEN
      FOR SELECT A.ID
      FROM ACTDISCOBJ A
      WHERE A.CLIENTID = :CLIENTID AND A.CARDID = -1 AND
            A.WAREID = -1 AND A.PAYMENTID = -1 AND GRPACTDISCID IS NULL AND
            A.DISCRATEID > 0
      INTO ACTDISCOBJID
      DO
        UPDATE ACTDISCOBJ SET DELETED = :IDELETEDACTDISCOBJ - 1 WHERE ID = :ACTDISCOBJID;
    END

  IF (NOT ICOUNTERTYPE1 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE1, :ICOUNTERVAL1, NULL, :CLIENTID, ICOUNTERCODE1, 28)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE1;

  IF (NOT ICOUNTERTYPE2 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE2, :ICOUNTERVAL2, NULL, :CLIENTID, ICOUNTERCODE2, 39)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE2;

  IF (NOT ICOUNTERTYPE3 IS NULL) THEN
    EXECUTE PROCEDURE APPENDCOUNTERBYTYPE (:ICOUNTERTYPE3, :ICOUNTERVAL3, NULL, :CLIENTID, ICOUNTERCODE3, 40)
    RETURNING_VALUES ERRORCODE, OCOUNTERCODE3;
END
^

/* empty dependent procedure body */
/* Clear: APPENDPILOT for: APPENDWARE */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
IMINPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER)
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
 BEGIN SUSPEND; END
^

/* Alter (APPENDWARE) */
ALTER PROCEDURE APPENDWARE(ICODE INTEGER,
IPARENTCODE VARCHAR(20),
INAME VARCHAR(100),
ITEXT VARCHAR(100),
IMARK VARCHAR(20),
IINTDISCSCHMCODE INTEGER,
IMINPRICE DOUBLE PRECISION,
IECRDEVCODE INTEGER,
ITAXGROUPCODE INTEGER,
IRCPPRNDEVCODE INTEGER,
IDISCOUNTTYPE INTEGER,
IASPECTSCHEMECODE INTEGER,
IPRICELABEL INTEGER,
IDISCOUNTVALUE VARCHAR(100),
IMAXDISCOUNT DOUBLE PRECISION,
IISWARE INTEGER,
IPRICE DOUBLE PRECISION,
IFLAGS INTEGER,
ILIFE DATE,
ISERIES VARCHAR(100),
ICERTIFICAT VARCHAR(100),
ISCALELPDEVCODE INTEGER,
ISCALELPWARECODE INTEGER,
IASPECTTYPE INTEGER,
IQUANTITYPREC DOUBLE PRECISION,
ISCALELPLOADED INTEGER,
IPRICELBPRINTED INTEGER,
IDELETED INTEGER,
IDESCRIPTION BLOB SUB_TYPE 1 SEGMENT SIZE 1024,
IPICTURE BLOB SEGMENT SIZE 1024,
IWARECODETOMARK INTEGER,
IEXCHANGEFORMAT INTEGER,
IREMAIN DOUBLE PRECISION,
IADDREPLACE INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDASPECT INTEGER,
IFIRSTASPECTVALUE INTEGER,
IBARCODES VARCHAR(1024),
IDELETEDBARCODE INTEGER,
IDISCRATEPARENTID INTEGER,
IREWARDTYPE INTEGER,
IREWARDVAL DOUBLE PRECISION,
IECRDEPARTMENT INTEGER,
IFACTOR DOUBLE PRECISION,
IGTD VARCHAR(100),
ILOADWAREDISC INTEGER = 1,
IDELETEDDISCRATE INTEGER = 0,
IDELETEDACTDISCOBJ INTEGER = 0)
 RETURNS(ID INTEGER,
ERRORCODE INTEGER,
INCREMENTCODE INTEGER)
 AS
DECLARE VARIABLE TISWARE INTEGER;
DECLARE VARIABLE TID INTEGER;
DECLARE VARIABLE TACTDISCOBJID INTEGER;
DECLARE VARIABLE TDELETED INTEGER;
DECLARE VARIABLE TDELETEDISWARE INTEGER;
DECLARE VARIABLE TGRPACTDISCID INTEGER;
DECLARE VARIABLE HIERLEVEL INTEGER;
DECLARE VARIABLE ASPECTSCHEMEID INTEGER;
DECLARE VARIABLE PARENTID INTEGER;
DECLARE VARIABLE ECRDEVID INTEGER;
DECLARE VARIABLE TAXGROUPID INTEGER;
DECLARE VARIABLE RCPPRNDEVID INTEGER;
DECLARE VARIABLE PRICELABELID INTEGER;
DECLARE VARIABLE SCALELPDEVID INTEGER;
DECLARE VARIABLE BARC VARCHAR(40);
BEGIN
  ERRORCODE = 0;

  IF (IINTDISCSCHMCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM GRPACTDISC
    WHERE CODE = :IINTDISCSCHMCODE
    INTO TGRPACTDISCID;

    IF (TGRPACTDISCID IS NULL) THEN
    BEGIN
      ERRORCODE = 1;
      EXIT;
    END
  END
  ELSE TGRPACTDISCID = 0;

  IF (IASPECTSCHEMECODE > 0) THEN
  BEGIN
    SELECT ID
    FROM ASPSCHM
    WHERE CODE = :IASPECTSCHEMECODE
    INTO ASPECTSCHEMEID;

    IF (ASPECTSCHEMEID IS NULL) THEN
    BEGIN
      IF (IEXCHANGEFORMAT <> 1) THEN
        BEGIN
          ERRORCODE = 8;
          EXIT;
        END
      ELSE
        IFIRSTASPECTVALUE = 0;
    END
  END
  ELSE
    ASPECTSCHEMEID = 0;

  HIERLEVEL = 0;
  IF (IPARENTCODE <> '') THEN
  BEGIN
    IF (IWARECODETOMARK = 0) THEN
    BEGIN
      SELECT ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (CODE = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
    ELSE
    BEGIN
      SELECT FIRST 1 ID, ISWARE, HIERLEVEL
      FROM SPRT
      WHERE (MARK = :IPARENTCODE) AND (DELETED = :IDELETED)
      INTO PARENTID, TISWARE, HIERLEVEL;
    END
  END
  ELSE
    PARENTID = 0;
  HIERLEVEL = HIERLEVEL + 1;

  IF (IISWARE <> 1) THEN
    BEGIN
      IISWARE = -2147483647 + HIERLEVEL;
    END

  IF ((PARENTID IS NULL) OR (TISWARE > 0)) THEN
  BEGIN
    ERRORCODE = 2;
    EXIT;
  END

  IF (IECRDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 1 AND CODE = :IECRDEVCODE
    INTO ECRDEVID;

    IF (ECRDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 3;
      EXIT;
    END
  END
  ELSE
    ECRDEVID = 0;

  IF (ITAXGROUPCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM TAXGROUP
    WHERE CODE = :ITAXGROUPCODE
    INTO TAXGROUPID;

    IF (TAXGROUPID IS NULL) THEN
    BEGIN
      ERRORCODE = 4;
      EXIT;
    END
  END
  ELSE
    TAXGROUPID = 0;

  IF (ISCALELPDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 8 AND CODE = :ISCALELPDEVCODE
    INTO SCALELPDEVID;

    IF (SCALELPDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 5;
      EXIT;
    END
  END
  ELSE
    SCALELPDEVID = 0;

  IF (IRCPPRNDEVCODE > 0) THEN
  BEGIN
    SELECT ID
    FROM DEVICES D
    WHERE D.TYPEDEV = 9 AND CODE = :IRCPPRNDEVCODE
    INTO RCPPRNDEVID;

    IF (RCPPRNDEVID IS NULL) THEN
    BEGIN
      ERRORCODE = 6;
      EXIT;
    END
  END
  ELSE
    RCPPRNDEVID = 0;

  IF (IPRICELABEL > 0) THEN
  BEGIN
    SELECT ID
    FROM PRICELABEL
    WHERE CODE = :IPRICELABEL
    INTO PRICELABELID;

    IF (PRICELABELID IS NULL) THEN
    BEGIN
      ERRORCODE = 7;
      EXIT;
    END
  END
  ELSE
    PRICELABELID = NULL;

  TISWARE = NULL;

  IF (IWARECODETOMARK = 0) THEN
  BEGIN
    SELECT ID, ISWARE, DELETED
    FROM SPRT
    WHERE CODE = :ICODE
    INTO TID, TISWARE, TDELETEDISWARE;
  END
  ELSE
  BEGIN
    SELECT FIRST 1 ID, DELETED, ISWARE, DELETED
    FROM SPRT
    WHERE MARK = :IMARK
    INTO TID, TDELETED, TISWARE, TDELETEDISWARE;
  END

  IF ((((TISWARE > 0) AND (IISWARE <= 0)) OR
       ((TISWARE <= 0) AND (IISWARE > 0))) AND (TDELETEDISWARE >= IDELETED)) THEN
    EXCEPTION E_CANT_CHANGE_ISWARE;

  IF (TID IS NULL) THEN
  BEGIN
    ID = GEN_ID(GID, 1);
    INSERT INTO SPRT (ID, PARENTID, CODE, MARK, NAME, TEXT, HIERLEVEL,
      MINPRICE, ECRDEVID, TAXGROUPID, RCPPRNDEVID,
      ASPECTSCHEMEID, PRICELABELID,
      MAXDISCOUNT, ISWARE, PRICE, FLAGS, LIFE, SERIES,
      CERTIFICAT, SCALELPDEVID, SCALELPWARECODE, ASPECTTYPE, QUANTITYPREC,
      SCALELPLOADED, PRICELBPRINTED, DELETED, DESCRIPTION, PICTURE, REWARDTYPE, REWARDVAL,
      ECRDEPARTMENT, GTD)
    VALUES (:ID, :PARENTID, :ICODE, :IMARK, :INAME, :ITEXT, :HIERLEVEL,
      :IMINPRICE, :ECRDEVID, :TAXGROUPID, :RCPPRNDEVID,
      :ASPECTSCHEMEID, :PRICELABELID,
      :IMAXDISCOUNT, :IISWARE, :IPRICE, :IFLAGS, :ILIFE, :ISERIES,
      :ICERTIFICAT, :SCALELPDEVID, :ISCALELPWARECODE, :IASPECTTYPE, :IQUANTITYPREC,
      :ISCALELPLOADED, :IPRICELBPRINTED, :IDELETED, :IDESCRIPTION, :IPICTURE, :IREWARDTYPE, :IREWARDVAL,
      :IECRDEPARTMENT, :IGTD);
    INCREMENTCODE = 1;
  END
  ELSE
  BEGIN
    ID = TID;
    IF (TDELETED = IDELETED) THEN
      UPDATE SPRT SET
        ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
        ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
        CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
                                           PRICELABELID = :PRICELABELID,
        DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
        DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
        ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
        ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
        FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
        HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
        ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
        LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
        MARK = :IMARK,                     SERIES = :ISERIES,
        MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
        MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
        NAME = :INAME,
        GTD = :IGTD
      WHERE ID = :ID;
    ELSE
      BEGIN
        UPDATE SPRT SET
          ASPECTSCHEMEID = :ASPECTSCHEMEID,  PARENTID = :PARENTID,
          ASPECTTYPE = :IASPECTTYPE,         PICTURE = :IPICTURE,
          CERTIFICAT = :ICERTIFICAT,         PRICE = :IPRICE,
          CODE = :ICODE,                     PRICELABELID = :PRICELABELID,
          DELETED = :IDELETED,               PRICELBPRINTED = :IPRICELBPRINTED,
          DESCRIPTION = :IDESCRIPTION,       QUANTITYPREC = :IQUANTITYPREC,
          ECRDEPARTMENT = :IECRDEPARTMENT,   REWARDTYPE = :IREWARDTYPE,
          ECRDEVID = :ECRDEVID,              REWARDVAL = :IREWARDVAL,
          FLAGS = :IFLAGS,                   RCPPRNDEVID = :RCPPRNDEVID,
          HIERLEVEL = :HIERLEVEL,            SCALELPDEVID = :SCALELPDEVID,
          ISWARE = :IISWARE,                 SCALELPLOADED = :ISCALELPLOADED,
          LIFE = :ILIFE,                     SCALELPWARECODE = :ISCALELPWARECODE,
          MARK = :IMARK,                     SERIES = :ISERIES,
          MAXDISCOUNT = :IMAXDISCOUNT,       TAXGROUPID = :TAXGROUPID,
          MINPRICE = :IMINPRICE,             TEXT = :ITEXT,
          NAME = :INAME,
          GTD = :IGTD
        WHERE ID = :ID;
        INCREMENTCODE = 1;
      END
  END

  IF (IISWARE = 1) THEN
  BEGIN
    EXECUTE PROCEDURE APPENDREMAINBYWAREID (:ID, :IFIRSTASPECTVALUE, :ASPECTSCHEMEID, :IREMAIN, :IDELETEDREMAIN, :IDELETEDASPECT, :IADDREPLACE)
      RETURNING_VALUES ERRORCODE;

    IF (ERRORCODE > 0) THEN
      EXIT;

    WHILE (IBARCODES <> '') DO
    BEGIN
      BARC = EXTRACTSTR(IBARCODES, ',');

      EXECUTE PROCEDURE APPENDBARCODEBYWAREID (:BARC, :ID, 0, 0, 0, 0, 0, :IFACTOR, 0, :IDELETEDBARCODE)
        RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;

      IBARCODES = PCOPY(IBARCODES, LEN(BARC) + 1, LEN(IBARCODES) - LEN(BARC) - 1);
    END
  END

  IF ((ILOADWAREDISC = 1) AND NOT (IDISCRATEPARENTID IS NULL) AND NOT (IDISCOUNTVALUE IS NULL)) THEN
    BEGIN
      EXECUTE PROCEDURE APPEND_WARE_DISC(:ID, :IDISCOUNTTYPE, :IDISCOUNTVALUE, :IDISCRATEPARENTID, :IDELETEDDISCRATE, :IDELETEDACTDISCOBJ)
            RETURNING_VALUES ERRORCODE;

      IF (ERRORCODE > 0) THEN
        EXIT;
    END

  IF (ILOADWAREDISC = 1) THEN
  BEGIN
    IF (TGRPACTDISCID > 0) THEN
    BEGIN
      SELECT FIRST 1 A.ID
      FROM ACTDISCOBJ A
      WHERE A.WAREID = :ID AND A.CARDID = -1 AND A.CLIENTID = -1 AND A.PAYMENTID = -1 AND A.DISCRATEID IS NULL
      INTO TACTDISCOBJID;

      IF (TACTDISCOBJID IS NOT NULL) THEN
        UPDATE ACTDISCOBJ SET
          GRPACTDISCID = :TGRPACTDISCID,
          DELETED = :IDELETEDACTDISCOBJ
        WHERE ID = :TACTDISCOBJID;
      ELSE
        INSERT INTO ACTDISCOBJ  (ID, WAREID, CLIENTID, CARDID,
                                 ASPECTVALUE1ID, ASPECTVALUE2ID, ASPECTVALUE3ID, ASPECTVALUE4ID, ASPECTVALUE5ID,
                                 PAYMENTID, DISCRATEID, ACTSCRIPTID, GRPACTDISCID, DELETED)
        VALUES   (GEN_ID(GID, 1), :ID, -1, -1, NULL, NULL, NULL, NULL, NULL,
                  -1, NULL, NULL, :TGRPACTDISCID, :IDELETEDACTDISCOBJ);
    END
    ELSE
    BEGIN
      DELETE FROM ACTDISCOBJ WHERE WAREID = :ID AND CLIENTID = -1 AND CARDID = -1 AND
                                 ASPECTVALUE1ID IS NULL AND ASPECTVALUE2ID IS NULL AND ASPECTVALUE3ID IS NULL AND
                                 ASPECTVALUE4ID IS NULL AND ASPECTVALUE5ID IS NULL AND
                                 PAYMENTID = -1 AND DISCRATEID IS NULL AND ACTSCRIPTID IS NULL;
    END
  END
END
^

/* Restore proc. body: APPENDPILOT */
ALTER PROCEDURE APPENDPILOT(ITABLETYPE VARCHAR(3),
IMODE VARCHAR(5),
ICODE INTEGER,
IBC VARCHAR(40),
IVCODE INTEGER,
IPRICE DOUBLE PRECISION,
IMINPRICE DOUBLE PRECISION,
INAME VARCHAR(100),
IPTYPE INTEGER,
IMEASURE INTEGER,
IQMODE INTEGER,
IBMODE INTEGER,
IDELETEDSPRT INTEGER,
IDELETEDREMAIN INTEGER,
IDELETEDBARCODE INTEGER,
IARTICUL VARCHAR(40))
 RETURNS(ERRORCODE INTEGER,
DELETEDSPRT INTEGER,
DELETEDREMAIN INTEGER,
DELETEDBARCODE INTEGER)
 AS
DECLARE VARIABLE MAINID INTEGER;
DECLARE VARIABLE DORMANTVAR INTEGER;
DECLARE VARIABLE FLAGS INTEGER;
BEGIN

  DELETEDSPRT = IDELETEDSPRT;
  DELETEDREMAIN = IDELETEDREMAIN;
  DELETEDBARCODE = IDELETEDBARCODE;
  IF (IPTYPE = 2) THEN
     FLAGS = 511;
  ELSE
     FLAGS = 1535;

  IF (ITABLETYPE = 'TMC') THEN
    BEGIN
      IF (IMODE = 'MOD') THEN
        BEGIN
          EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, :IARTICUL, NULL, :IMINPRICE, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
              RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
        END
      ELSE
        IF (IMODE = 'EMPTY') THEN
          BEGIN
            DELETEDSPRT = DELETEDSPRT + 1;
            DELETEDREMAIN = DELETEDREMAIN + 1;
            DELETEDBARCODE = DELETEDBARCODE + 1;
            UPDATE ACTDISCOBJ SET DELETED = - 1 WHERE WAREID > 0;
          END
        ELSE
          BEGIN
            SELECT ID
            FROM SPRT
            WHERE CODE = :ICODE AND DELETED = :DELETEDSPRT
            INTO MAINID;

            IF (IMODE = 'DEL') THEN
              BEGIN
                IF (MAINID IS NOT NULL) THEN
                  BEGIN
                    UPDATE BARCODE SET DELETED = :DELETEDBARCODE - 1 WHERE WAREID = :MAINID;
                    UPDATE REMAIN  SET DELETED = :DELETEDREMAIN - 1 WHERE WAREID = :MAINID;
                    UPDATE SPRT    SET DELETED = :DELETEDSPRT - 1 WHERE ID = :MAINID;
                    UPDATE ACTDISCOBJ SET DELETED = -1 WHERE WAREID = :MAINID;
                  END
              END
            ELSE
              IF (IMODE = 'ADD') THEN
                BEGIN
                  IF (MAINID IS NULL) THEN
                     EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, :IARTICUL, NULL, :IMINPRICE, NULL,
                                        NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                        :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                        NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                        NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                END
              ELSE
                IF (IMODE = 'PUT') THEN
                  BEGIN
                    IF (MAINID IS NOT NULL) THEN
                      EXECUTE PROCEDURE APPENDWARE (:ICODE, NULL, :INAME, :INAME, :IARTICUL, NULL, :IMINPRICE, NULL,
                                                    NULL, NULL, NULL, NULL, NULL, NULL, NULL, 1,
                                                    :IPRICE, :FLAGS, NULL, NULL, NULL, NULL, NULL, NULL,
                                                    NULL, 0, 0, :DELETEDSPRT, NULL, NULL, 0, 0, NULL, 0, :DELETEDREMAIN, 0,
                                                    NULL, :IBC, :DELETEDBARCODE, NULL, NULL, 0, NULL, NULL, NULL)
                        RETURNING_VALUES DORMANTVAR, ERRORCODE, DORMANTVAR;
                  END
          END
    END

END
^
/* TEXT BLOCK END */

/* Convert 4.8.10 */

ALTER TABLE COUNTERTYPE ADD PERIODVAL FINT;

ALTER TABLE COUNTERTYPE ADD PERIODTYPE FRINT;

/* MAN */
UPDATE COUNTERTYPE SET
PERIODTYPE = IIF(COUNTERALG IN (1, 16), 0,
             IIF(COUNTERALG IN (4, 11), 1,
             IIF(COUNTERALG IN (2, 3, 5, 8, 10, 12), 2,
             IIF(COUNTERALG IN (7, 13), 3,
             IIF(COUNTERALG IN (9, 14), 4,
             IIF(COUNTERALG IN (6, 15), 5, 0
             )))))),
PERIODVAL = IIF(COUNTERALG IN (2, 4, 5, 6, 7, 9, 11, 12, 13, 14, 15, 16), 1,
            IIF(COUNTERALG IN (1), 7,
            IIF(COUNTERALG IN (3), 12,
            IIF(COUNTERALG IN (8), 3,
            IIF(COUNTERALG IN (10), 6, 0))))),
COUNTERALG = IIF(COUNTERALG IN (1, 2, 3, 8, 10), 1,
             IIF(COUNTERALG IN (4, 5, 6, 7, 9, 16), 2,
             IIF(COUNTERALG IN (11, 12, 13, 14, 15), 3, 0)));
/* MAN */

/* Create Procedure... */
SET TERM ^ ;

CREATE OR ALTER PROCEDURE UPDATE_ALL_REMAIN AS
 BEGIN EXIT; END
^


/*  Empty COUNTERD_COLLAPSE for GET_PERIOD_FOR_ALG(param list change)  */
ALTER PROCEDURE COUNTERD_COLLAPSE AS
 BEGIN EXIT; END
^

/* Alter empty procedure GET_PERIOD_FOR_ALG with new param-list */
ALTER PROCEDURE GET_PERIOD_FOR_ALG(IALG INTEGER,
IPERIODTYPE INTEGER,
IPERIODVAL INTEGER,
ICURDATE DATE)
 RETURNS(DATE1 DATE,
DATE2 DATE)
 AS
 BEGIN SUSPEND; END
^

/* Alter Procedure... */
ALTER PROCEDURE GET_PERIOD_FOR_ALG(IALG INTEGER,
IPERIODTYPE INTEGER,
IPERIODVAL INTEGER,
ICURDATE DATE)
 RETURNS(DATE1 DATE,
DATE2 DATE)
 AS
DECLARE VARIABLE D INTEGER;
DECLARE VARIABLE M INTEGER;
DECLARE VARIABLE Y INTEGER;
BEGIN

  IF (IALG = 1 AND IPERIODTYPE = 0) THEN --LastDays
  BEGIN
    IF (IPERIODVAL > 0) THEN
    BEGIN
      DATE2 = ICURDATE;
      DATE1 = ICURDATE - (IPERIODVAL - 1);
    END
  END
  ELSE
  IF (IALG = 1 AND IPERIODTYPE = 1) THEN --LastWeeks
  BEGIN
    IF (IPERIODVAL > 0) THEN
    BEGIN
      DATE2 = ICURDATE;
      DATE1 = ICURDATE - (IPERIODVAL * 7 - 1);
    END
  END
  ELSE IF (IALG = 1 AND IPERIODTYPE = 2) THEN  --LastMonths
  BEGIN
    IF (IPERIODVAL > 0) THEN
    BEGIN
      DATE2 = ICURDATE;
      Y = EXTRACT(YEAR FROM DATE2);
      M = EXTRACT(MONTH FROM DATE2);
      D = EXTRACT(DAY FROM DATE2);
      Y = Y - CAST(IPERIODVAL / 12 AS INT);
      IPERIODVAL = IPERIODVAL - 12*CAST(IPERIODVAL / 12 AS INT);
      IF (M <= IPERIODVAL) THEN
      BEGIN
        M = 12 + M - IPERIODVAL;
        Y = Y - 1;
      END
      ELSE
        M = M - IPERIODVAL;
      SELECT CASE WHEN :D > DM.DAYS THEN DM.DAYS ELSE :D END FROM DAYS_IN_MONTH(:Y, :M) DM INTO D;
      DATE1 = CAST(D||'.'||M||'.'||Y AS DATE) + 1;
    END
  END
  ELSE IF (IALG = 1 AND IPERIODTYPE = 3) THEN  --LastQuarterYears
  BEGIN
    IF (IPERIODVAL > 0) THEN
    BEGIN
      DATE2 = ICURDATE;
      Y = EXTRACT(YEAR FROM DATE2);
      M = EXTRACT(MONTH FROM DATE2);
      D = EXTRACT(DAY FROM DATE2);
      IPERIODVAL = 3*IPERIODVAL;
      Y = Y - CAST(IPERIODVAL / 12 AS INT);
      IPERIODVAL = IPERIODVAL - 12*CAST(IPERIODVAL / 12 AS INT);
      IF (M <= IPERIODVAL) THEN
      BEGIN
        M = 12 + M - IPERIODVAL;
        Y = Y - 1;
      END
      ELSE
        M = M - IPERIODVAL;
      SELECT CASE WHEN :D > DM.DAYS THEN DM.DAYS ELSE :D END FROM DAYS_IN_MONTH(:Y, :M) DM INTO D;
      DATE1 = CAST(D||'.'||M||'.'||Y AS DATE) + 1;
    END
  END
  ELSE IF (IALG = 1 AND IPERIODTYPE = 4) THEN  --LastHalfYears
  BEGIN
    IF (IPERIODVAL > 0) THEN
    BEGIN
      DATE2 = ICURDATE;
      Y = EXTRACT(YEAR FROM DATE2);
      M = EXTRACT(MONTH FROM DATE2);
      D = EXTRACT(DAY FROM DATE2);
      IPERIODVAL = 6*IPERIODVAL;
      Y = Y - CAST(IPERIODVAL / 12 AS INT);
      IPERIODVAL = IPERIODVAL - 12*CAST(IPERIODVAL / 12 AS INT);
      IF (M <= IPERIODVAL) THEN
      BEGIN
        M = 12 + M - IPERIODVAL;
        Y = Y - 1;
      END
      ELSE
        M = M - IPERIODVAL;
      SELECT CASE WHEN :D > DM.DAYS THEN DM.DAYS ELSE :D END FROM DAYS_IN_MONTH(:Y, :M) DM INTO D;
      DATE1 = CAST(D||'.'||M||'.'||Y AS DATE) + 1;
    END
  END
  ELSE IF (IALG = 1 AND IPERIODTYPE = 5) THEN  --cnaLastYears
  BEGIN
    IF (IPERIODVAL > 0) THEN
    BEGIN
      DATE2 = ICURDATE;
      Y = EXTRACT(YEAR FROM DATE2) - IPERIODVAL;
      M = EXTRACT(MONTH FROM DATE2);
      D = EXTRACT(DAY FROM ICURDATE);
      SELECT CASE WHEN :D > DM.DAYS THEN DM.DAYS ELSE :D END FROM DAYS_IN_MONTH(:Y, :M) DM INTO D;
      DATE1 = CAST(D||'.'||M||'.'||Y AS DATE) + 1;
    END
  END
--++++++++++++++++++++++++++++++++++++++++++++++++++++
  ELSE IF (IALG = 2 AND IPERIODTYPE = 0) THEN  --cnaCurDay
  BEGIN
    DATE2 = ICURDATE;
    DATE1 = ICURDATE;
  END
  ELSE IF (IALG = 2 AND IPERIODTYPE = 1) THEN  --cnaCurWeek
  BEGIN
    DATE2 = ICURDATE;
    DATE1 = DATE2 - EXTRACT(WEEKDAY FROM DATE2 - 1); /*  0=    Delphi ()*/
  END
  ELSE IF (IALG = 2 AND IPERIODTYPE = 2) THEN  --cnaCurMonth
  BEGIN
    DATE2 = ICURDATE;
    DATE1 = '01.'||EXTRACT(MONTH FROM DATE2)||'.'||EXTRACT(YEAR FROM DATE2);
  END
  ELSE IF (IALG = 2 AND IPERIODTYPE = 3) THEN  --cnaCurQuarterYear
  BEGIN
    DATE2 = ICURDATE;
    M = ((EXTRACT(MONTH FROM DATE2) - 1) / 3) * 3 + 1;
    DATE1 = '01.'||M||'.'||EXTRACT(YEAR FROM DATE2);
  END
  ELSE IF (IALG = 2 AND IPERIODTYPE = 4) THEN  --cnaCurHalfYear
  BEGIN
    DATE2 = ICURDATE;
    DATE1 = '01.'|| IIF(EXTRACT(MONTH FROM DATE2) < 7, 1, 7)||'.'||EXTRACT(YEAR FROM DATE2);
  END
  ELSE IF (IALG = 2 AND IPERIODTYPE = 5) THEN  --cnaCurYear
  BEGIN
    DATE2 = ICURDATE;
    DATE1 = '01.01.'||EXTRACT(YEAR FROM DATE2);
  END
--++++++++++++++++++++++++++++++++++++++++++++++++++++
  ELSE IF (IALG = 3 AND IPERIODTYPE = 0) THEN   --cnaPrevDays
  BEGIN
    IF (IPERIODVAL > 0) THEN
    BEGIN
      DATE2 = ICURDATE - 1;
      DATE1 = DATE2 - (IPERIODVAL - 1);
    END
  END
  ELSE IF (IALG = 3 AND IPERIODTYPE = 1) THEN   --cnaPrevWeeks
  BEGIN
    IF (IPERIODVAL > 0) THEN
    BEGIN
      DATE2 = ICURDATE - EXTRACT(WEEKDAY FROM ICURDATE - 1) - 1;
      DATE1 = DATE2 - (7*IPERIODVAL - 1);
    END
  END
  ELSE IF (IALG = 3 AND IPERIODTYPE = 2) THEN   --cnaPrevMonths
  BEGIN
    IF (IPERIODVAL > 0) THEN
    BEGIN
      Y = EXTRACT(YEAR FROM ICURDATE);
      M = EXTRACT(MONTH FROM ICURDATE);
      IF (M = 1) THEN
        DATE2 = '31'||'.'||'12'||'.'||(Y - 1);
      ELSE
      BEGIN
        SELECT DAYS FROM DAYS_IN_MONTH(:Y, :M - 1) INTO D;
        DATE2 = D||'.'||(M - 1)||'.'||Y;
      END
      Y = Y - CAST(IPERIODVAL / 12 AS INT);
      IPERIODVAL = IPERIODVAL - 12*CAST(IPERIODVAL / 12 AS INT);
      IF (M <= IPERIODVAL) THEN
      BEGIN
        M = 12 + M - IPERIODVAL;
        Y = Y - 1;
      END
      ELSE
        M = M - IPERIODVAL;
      DATE1 = '01.'||M||'.'||Y;
    END
  END
  ELSE IF (IALG = 3 AND IPERIODTYPE = 3) THEN   --cnaPrevQuarter
  BEGIN
    IF (IPERIODVAL > 0) THEN
    BEGIN
      Y = EXTRACT(YEAR FROM ICURDATE);
      M = EXTRACT(MONTH FROM ICURDATE);
      M = 3 * CAST(M / 3 AS INT) + 1;
      DATE2 = '01.'||M||'.'||Y;
      DATE2 = DATE2 - 1;

      IPERIODVAL = 3*IPERIODVAL;
      Y = Y - CAST(IPERIODVAL / 12 AS INT);
      IPERIODVAL = IPERIODVAL - 12*CAST(IPERIODVAL / 12 AS INT);
      IF (M <= IPERIODVAL) THEN
      BEGIN
        M = 12 + M - IPERIODVAL;
        Y = Y - 1;
      END
      ELSE
        M = M - IPERIODVAL;
      DATE1 = '01.'||M||'.'||Y;
    END
  END
  ELSE IF (IALG = 3 AND IPERIODTYPE = 4) THEN   --cnaPrevHalfYear
  BEGIN
    IF (IPERIODVAL > 0) THEN
    BEGIN
      Y = EXTRACT(YEAR FROM ICURDATE);
      M = EXTRACT(MONTH FROM ICURDATE);
      M = 6 * CAST(M / 6 AS INT) + 1;
      DATE2 = '01.'||M||'.'||Y;
      DATE2 = DATE2 - 1;

      IPERIODVAL = 6*IPERIODVAL;
      Y = Y - CAST(IPERIODVAL / 12 AS INT);
      IPERIODVAL = IPERIODVAL - 12*CAST(IPERIODVAL / 12 AS INT);
      IF (M <= IPERIODVAL) THEN
      BEGIN
        M = 12 + M - IPERIODVAL;
        Y = Y - 1;
      END
      ELSE
        M = M - IPERIODVAL;
      DATE1 = '01.'||M||'.'||Y;
    END
  END
  ELSE IF (IALG = 3 AND IPERIODTYPE = 5) THEN   --cnaPrevYear
  BEGIN
    IF (IPERIODVAL > 0) THEN
    BEGIN
      Y = EXTRACT(YEAR FROM ICURDATE);
      DATE1 = '01.01.'||(Y - IPERIODVAL);
      DATE2 = '31.12.'||(Y - 1);
    END
  END
  SUSPEND;
END
^

/* Alter (COUNTERD_COLLAPSE) */
ALTER PROCEDURE COUNTERD_COLLAPSE AS
DECLARE VARIABLE COLLAPSEDEPTH INTEGER;
DECLARE VARIABLE BDOCODE INTEGER;
DECLARE VARIABLE CID INTEGER;
DECLARE VARIABLE CTID INTEGER;
DECLARE VARIABLE SUMM0 DOUBLE PRECISION;
DECLARE VARIABLE SUMM1 DOUBLE PRECISION;
DECLARE VARIABLE CHNG NUMERIC(18,0);
DECLARE VARIABLE CHNGMAX NUMERIC(18,0);
DECLARE VARIABLE ALG INTEGER;
DECLARE VARIABLE PERIODTYPE INTEGER;
DECLARE VARIABLE PERIODVAL INTEGER;
DECLARE VARIABLE DATE1 DATE;
DECLARE VARIABLE COUNTERDCOLLAPSE INTEGER;
BEGIN

  SELECT BDOCODE
  FROM CUSTOMDB
  INTO BDOCODE;

  BDOCODE = COALESCE(BDOCODE, 0);

  IF (BDOCODE = 0) THEN
  BEGIN
    SELECT MAX(VAL)
    FROM SETTINGS
    WHERE NAME = 'CounterdCollapseDepth'
    INTO COLLAPSEDEPTH;

    SELECT MAX(VAL)
    FROM SETTINGS
    WHERE NAME = 'CounterdCollapse'
    INTO COUNTERDCOLLAPSE;
  END
  ELSE
  BEGIN
    SELECT MAX(VAL)
    FROM SETTINGS
    WHERE NAME = 'CounterdCollapseDepth' AND OWNERBDO = :BDOCODE
    INTO COLLAPSEDEPTH;

    SELECT MAX(VAL)
    FROM SETTINGS
    WHERE NAME = 'CounterdCollapse' AND OWNERBDO = :BDOCODE
    INTO COUNTERDCOLLAPSE;
  END

  COLLAPSEDEPTH = COALESCE(COLLAPSEDEPTH, 0);
  COUNTERDCOLLAPSE = COALESCE(COUNTERDCOLLAPSE, 0);

  IF (COUNTERDCOLLAPSE <> 0) THEN
  BEGIN
    SELECT MAX(CHNG)
    FROM COUNTERD
    INTO CHNGMAX;
    IF (CHNGMAX IS NULL) THEN
      CHNGMAX = 0;

    IF (BDOCODE <> 0) THEN
    BEGIN
      IF (EXISTS(SELECT 1 FROM SYNCBASE SB1
        WHERE SB1.ID = (SELECT PARENTID FROM SYNCBASE SB2 WHERE SB2.CODE = :BDOCODE))) THEN
      BEGIN
        SELECT CHNGVAL
        FROM TBLINFO
        WHERE TABLENAME = 'COUNTERD'
        INTO CHNG;
        CHNG = COALESCE(CHNG, 0);
        IF (CHNG < CHNGMAX) THEN
          CHNGMAX = CHNG;
      END

      IF (EXISTS(SELECT 1 FROM SYNCBASE SB1
        WHERE SB1.PARENTID = (SELECT ID FROM SYNCBASE SB2 WHERE SB2.CODE = :BDOCODE))) THEN
      BEGIN
        SELECT MIN(CHNGVAL)
        FROM TBLLOADINFO
        WHERE TABLENAME = 'COUNTERD'
        INTO CHNG;
        CHNG = COALESCE(CHNG, 0);
        IF (CHNG < CHNGMAX) THEN
          CHNGMAX = CHNG;
      END
    END

    FOR
      SELECT CT.COUNTERALG, CT.PERIODTYPE, CT.PERIODVAL, CT.ID
      FROM COUNTERTYPE CT
      INTO ALG, PERIODTYPE, PERIODVAL, CTID
      DO
      BEGIN
        SELECT DATE1
        FROM GET_PERIOD_FOR_ALG(:ALG, :PERIODTYPE, :PERIODVAL, CURRENT_DATE)
        INTO DATE1;

        FOR
          SELECT CD.COUNTERID, SUM(IIF(DTYPE = 0, DELTA, 0)), SUM(IIF(DTYPE = 1, DELTA, 0))
          FROM COUNTER C
            JOIN COUNTERD CD ON C.ID = CD.COUNTERID
          WHERE C.COUNTERTYPEID = :CTID AND (:ALG = 0 OR CD.DTYPE = 1 OR CD.DELTADATE < :DATE1)
            AND (CD.DELTADATE <= CURRENT_DATE - :COLLAPSEDEPTH OR DELTADATE IS NULL) AND CD.DOCUMENTID IS NULL AND CD.CHNG <= :CHNGMAX
          GROUP BY CD.COUNTERID
          HAVING COUNT(CD.ID) > 1
          INTO CID, SUMM0, SUMM1
          DO
          BEGIN
            DELETE FROM COUNTERD WHERE COUNTERID = :CID AND (:ALG = 0 OR DTYPE = 1 OR DELTADATE < :DATE1)
              AND (DELTADATE <= CURRENT_DATE - :COLLAPSEDEPTH OR DELTADATE IS NULL) AND DOCUMENTID IS NULL AND CHNG <= :CHNGMAX;
            IF (ALG = 0) THEN
            BEGIN
              IF (SUMM0 <> 0) THEN
                INSERT INTO COUNTERD(ID, COUNTERID, DELTA, DELTADATE, CHNG, DTYPE)
                VALUES (GEN_ID(GCOUNTERD, 1), :CID, :SUMM0, CURRENT_DATE, -1, 0);
            END
            IF (SUMM1 <> 0) THEN
              INSERT INTO COUNTERD(ID, COUNTERID, DELTA, DELTADATE, CHNG, DTYPE)
              VALUES (GEN_ID(GCOUNTERD, 1), :CID, :SUMM1, CURRENT_DATE, -1, 1);
          END
      END
  END
  DELETE FROM COUNTERD WHERE DTYPE = 2 AND CHNG <= :CHNGMAX;
END
^

/* Restore proc. body: UPDATE_ALL_REMAIN */
ALTER PROCEDURE UPDATE_ALL_REMAIN AS
DECLARE VARIABLE VREMAINID INTEGER;
DECLARE VARIABLE RID NUMERIC(18,0);
DECLARE VARIABLE VSUMDELTA DOUBLE PRECISION;
DECLARE VARIABLE BDOCODE INTEGER;
BEGIN
  SELECT BDOCODE FROM CUSTOMDB INTO :BDOCODE;
  IF (BDOCODE <> 0) THEN EXIT;

  VSUMDELTA = 0;
  SELECT GEN_ID(GREMAIND, 0) FROM RDB$DATABASE INTO :RID;
  FOR
    SELECT R.REMAINID, SUM(R.DELTA)
    FROM REMAIND R
    LEFT JOIN DOCUMENT D ON R.DOCUMENTID = D.ID
    WHERE ((R.DOCUMENTID IS NULL) OR (D.STATE = 1) OR (D.STATE = 2)) AND R.ID <= :RID
    GROUP BY R.REMAINID
    HAVING COUNT(*) > 1
    ORDER BY R.REMAINID
    INTO :VREMAINID, :VSUMDELTA
  DO
  BEGIN
    DELETE FROM REMAIND R
    WHERE
      R.REMAINID = :VREMAINID AND
      R.ID <= :RID AND
      (R.DOCUMENTID IS NULL OR EXISTS
        (SELECT * FROM DOCUMENT D
         WHERE D.ID = R.DOCUMENTID AND ((D.STATE = 1) OR (D.STATE = 2))));

    IF (VSUMDELTA <> 0) THEN
      INSERT INTO REMAIND (ID, DELTA, DTYPE, REMAINID) VALUES (GEN_ID(GREMAIND, 1), :VSUMDELTA, 1, :VREMAINID);
  END
END
^

/* Alter Procedure... */
SET TERM ; ^

/* TEXT BLOCK END */