Установка ЕГАИС — различия между версиями

Материал из wiki.standart-n.ru
Перейти к: навигация, поиск
(Настройка Меенеджера)
(Частые вопросы по ЕГАИС)
 
(не показана одна промежуточная версия 9 участников)
Строка 1: Строка 1:
==Заменить версию Менеджера==
+
=Настройка jacarta-ключа=
Заменить '''ManagerXP2.exe''' на версию '''2.272.55''' от декабря 2015 г. или более новую.
+
Предварительно нужно установить Единый клиент джакарты
 +
[[Медиа:Получение_КЭП_для_ЕГАИС.docx]]
  
==Выполнить скрипт==
+
=Установка или обновление сертификата для jacarta-ключа=
-создаёт и изменяет нужные таблица/триггеры и т.д.
+
[[Медиа:Обновление_сертификата_для_jacarta.doc]]
 +
 
 +
 
 +
=Установка Этап 1 (выполняется для '''ВСЕХ''' клиентов)=
 +
 
 +
==Установить процедуру PR_ALTER_VIEW==
 +
[[Изменения представления| '''PR_ALTER_VIEW''']]
 +
 
 +
==Заменить версию Менеджера==
 +
Для скриптов ниже актуальная версия Менеджера ManagerXP2_272_62(20160321_155233)
 +
кассира zkassa 2.2.1.22.exe
  
 +
==Выполнить скрипт (для всех)==
 
<pre>
 
<pre>
 +
SET TERM ^ ;
 +
/*создание доменов если их нет*/
 +
execute procedure PR_ALTER_VIEW('DM_ID_NULL','','BIGINT','DOMAIN');^
 +
execute procedure PR_ALTER_VIEW('DM_ID','','BIGINT NOT NULL','DOMAIN');^
 +
execute procedure PR_ALTER_VIEW('DM_STATUS','','INTEGER','DOMAIN');^
 +
execute procedure PR_ALTER_VIEW('DM_DATETIME','','TIMESTAMP','DOMAIN');^
 +
execute procedure PR_ALTER_VIEW('DM_TEXT1024','','VARCHAR(1024) CHARACTER SET WIN1251 COLLATE WIN1251','DOMAIN');^
 +
execute procedure PR_ALTER_VIEW('DM_DOUBLE','','DOUBLE PRECISION','DOMAIN');^
 +
execute procedure PR_ALTER_VIEW('DM_ID_NULL','','BIGINT','DOMAIN');^
 +
execute procedure PR_ALTER_VIEW('DM_ID_NULL','','BIGINT','DOMAIN');^
 +
 +
/*не относится к ЕГАИС*/
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL','FIO_ID','DM_ID_NULL','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL','FIO_BOLNOY_ID','DM_ID_NULL','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL','TYPE_LGOTA','DM_ID_NULL','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL','RECEPT','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','SUM_NDSR','DM_DOUBLE','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL','SUM_NDSR','DM_DOUBLE','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOCS','FIO_ID','DM_ID_NULL','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOCS','SUM_NDSR','DM_DOUBLE','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL','SUM_NDSR','DM_DOUBLE','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','MOTHERPART_UUID','DM_UUID_NULL','TABLE');^
 +
execute procedure PR_ALTER_VIEW('PARTS','MOTHERPART_UUID','DM_UUID_NULL','TABLE');^
 +
execute procedure PR_ALTER_VIEW('VALS','D$UUID','DM_UUID_NULL','TABLE');^
 +
execute procedure PR_ALTER_VIEW('VALS','L_ID','DM_ID_NULL','TABLE');^
 +
 +
execute procedure PR_ALTER_VIEW('AGENTS','EGAIS_ID','DM_UUID_NULL','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOCS','EGAIS_NUM','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOCS','EGAIS_ID','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOCS','EGAIS_UNITTYPE','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOCS','EGAIS_STATUS','DM_STATUS','TABLE');^
 +
 +
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_ID','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_REGID','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_BREGID','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_ALCCODE','DM_TEXT1024','TABLE');^
 +
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_QUANT','DM_DOUBLE','TABLE');^
 +
execute procedure PR_ALTER_VIEW('PARTS','CAPACITY','DM_DOUBLE','TABLE');^
 +
execute procedure PR_ALTER_VIEW('PARTS','ALC_VOLUME','DM_DOUBLE','TABLE');^
 +
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_PRODUCER_ID','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_BARCODE','DM_TEXT1024','TABLE');^
 +
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_TYPE','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('PARTS','PRODUCER_INN','DM_TEXT1024','TABLE');^
 +
execute procedure PR_ALTER_VIEW('PARTS','PRODUCER_KPP','DM_TEXT1024','TABLE');^
 +
execute procedure PR_ALTER_VIEW('PARTS','BOTTLINGDATE','DM_DATETIME','TABLE');^
 +
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_PRODUCT_VCODE','DM_TEXT','TABLE');^
 +
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_ID','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_BREGID','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_REGID','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_ALCCODE','DM_TEXT1024','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_PRODUCT_VCODE','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','CAPACITY','DM_DOUBLE','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','ALC_VOLUME','DM_DOUBLE','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_PRODUCER_ID','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_QUANT','DM_DOUBLE','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_BARCODE','DM_TEXT1024','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_TYPE','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','PRODUCER_INN','DM_TEXT1024','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','PRODUCER_KPP','DM_TEXT1024','TABLE');^
 +
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','BOTTLINGDATE','DM_DATETIME','TABLE');^
 +
 +
set term ; ^
 +
 +
/******************************************************************************/
 +
/***              Generated by IBExpert 22.11.2019 11:21:53                ***/
 +
/******************************************************************************/
 +
 +
/******************************************************************************/
 +
/***      Following SET SQL DIALECT is just for the Database Comparer      ***/
 +
/******************************************************************************/
 
SET SQL DIALECT 3;
 
SET SQL DIALECT 3;
  
ALTER TABLE DOC_DETAIL ADD FIO_ID DM_ID_NULL;
 
ALTER TABLE DOC_DETAIL ADD FIO_BOLNOY_ID DM_ID_NULL;
 
ALTER TABLE DOC_DETAIL ADD TYPE_LGOTA DM_ID_NULL;
 
ALTER TABLE DOC_DETAIL ADD RECEPT DM_TEXT;
 
ALTER TABLE DOC_DETAIL_ACTIVE ADD SUM_NDSR DM_DOUBLE;
 
ALTER TABLE DOC_DETAIL ADD SUM_NDSR DM_DOUBLE;
 
ALTER TABLE DOCS ADD SUM_NDSR DM_DOUBLE;
 
ALTER TABLE DOC_DETAIL_ACTIVE ADD MOTHERPART_UUID DM_UUID_NULL;
 
ALTER TABLE PARTS ADD MOTHERPART_UUID DM_UUID_NULL;
 
ALTER TABLE VALS ADD D$UUID DM_UUID_NULL;
 
ALTER TABLE VALS ADD L_ID DM_ID_NULL;
 
  
ALTER TABLE AGENTS ADD EGAIS_ID DM_UUID_NULL;
 
ALTER TABLE DOCS ADD EGAIS_NUM DM_TEXT;
 
ALTER TABLE DOCS ADD EGAIS_ID DM_TEXT;
 
ALTER TABLE DOCS ADD EGAIS_UNITTYPE DM_TEXT;
 
ALTER TABLE DOCS ADD EGAIS_STATUS DM_STATUS;
 
DESCRIBE FIELD EGAIS_STATUS TABLE DOCS
 
'1 - Accept акт принятия
 
2 - Reject акт принятия
 
3 - Accept акт отказа
 
4 - Reject акт отказа
 
5 - Accept акт расхождения
 
6 - Reject акт расхождения';
 
  
ALTER TABLE PARTS ADD EGAIS_ID DM_TEXT;
+
/******************************************************************************/
ALTER TABLE PARTS ADD EGAIS_REGID DM_TEXT;
+
/***                                Tables                                ***/
ALTER TABLE PARTS ADD EGAIS_BREGID DM_TEXT;
+
/******************************************************************************/
ALTER TABLE PARTS ADD EGAIS_ALCCODE DM_TEXT1024;
+
ALTER TABLE PARTS ADD EGAIS_QUANT DM_DOUBLE;
+
ALTER TABLE PARTS ADD CAPACITY DM_DOUBLE;
+
ALTER TABLE PARTS ADD ALC_VOLUME DM_DOUBLE;
+
ALTER TABLE PARTS ADD EGAIS_PRODUCER_ID DM_TEXT;
+
  
ALTER TABLE DOC_DETAIL_ACTIVE ADD EGAIS_ID DM_TEXT;
 
ALTER TABLE DOC_DETAIL_ACTIVE ADD EGAIS_BREGID DM_TEXT;
 
ALTER TABLE DOC_DETAIL_ACTIVE ADD EGAIS_REGID DM_TEXT;
 
ALTER TABLE DOC_DETAIL_ACTIVE ADD EGAIS_ALCCODE DM_TEXT1024;
 
ALTER TABLE DOC_DETAIL_ACTIVE ADD EGAIS_PRODUCT_VCODE DM_TEXT;
 
ALTER TABLE DOC_DETAIL_ACTIVE ADD CAPACITY DM_DOUBLE;
 
ALTER TABLE DOC_DETAIL_ACTIVE ADD ALC_VOLUME DM_DOUBLE;
 
ALTER TABLE DOC_DETAIL_ACTIVE ADD EGAIS_PRODUCER_ID DM_TEXT;
 
ALTER TABLE DOC_DETAIL_ACTIVE ADD EGAIS_QUANT DM_DOUBLE;
 
  
 
CREATE GENERATOR GEN_EGAIS_REQUESTS_ID;
 
CREATE GENERATOR GEN_EGAIS_REQUESTS_ID;
Строка 66: Строка 112:
 
     REPLY_DATE  DM_DATETIME /* DM_DATETIME = TIMESTAMP */,
 
     REPLY_DATE  DM_DATETIME /* DM_DATETIME = TIMESTAMP */,
 
     EGAIS_ID    DM_TEXT1024 /* DM_TEXT1024 = VARCHAR(1024) */,
 
     EGAIS_ID    DM_TEXT1024 /* DM_TEXT1024 = VARCHAR(1024) */,
     QUERY_OUT    DM_TEXT1024 /* DM_TEXT1024 = VARCHAR(1024) */
+
     QUERY_OUT    DM_TEXT1024 /* DM_TEXT1024 = VARCHAR(1024) */,
 +
    USER_ID      DM_ID_NULL /* DM_ID_NULL = BIGINT */
 
);
 
);
 +
 +
 +
 +
 +
/******************************************************************************/
 +
/***                              Primary keys                              ***/
 +
/******************************************************************************/
  
 
ALTER TABLE EGAIS_REQUESTS ADD CONSTRAINT PK_EGAIS_REQUESTS PRIMARY KEY (ID);
 
ALTER TABLE EGAIS_REQUESTS ADD CONSTRAINT PK_EGAIS_REQUESTS PRIMARY KEY (ID);
 +
 +
 +
/******************************************************************************/
 +
/***                                Indices                                ***/
 +
/******************************************************************************/
 +
 
CREATE INDEX EGAIS_REQUESTS_IDX1 ON EGAIS_REQUESTS (REPLY_ID);
 
CREATE INDEX EGAIS_REQUESTS_IDX1 ON EGAIS_REQUESTS (REPLY_ID);
 +
 +
 +
/******************************************************************************/
 +
/***                                Triggers                                ***/
 +
/******************************************************************************/
 +
 +
  
 
SET TERM ^ ;
 
SET TERM ^ ;
 +
 +
 +
 +
/******************************************************************************/
 +
/***                          Triggers for tables                          ***/
 +
/******************************************************************************/
 +
 +
  
 
/* Trigger: EGAIS_REQUESTS_BI */
 
/* Trigger: EGAIS_REQUESTS_BI */
Строка 85: Строка 160:
 
end
 
end
 
^
 
^
SET TERM ; ^
 
  
SET TERM ^ ;
+
 
 
/* Trigger: EGAIS_REQUESTS_BU0 */
 
/* Trigger: EGAIS_REQUESTS_BU0 */
 
CREATE OR ALTER TRIGGER EGAIS_REQUESTS_BU0 FOR EGAIS_REQUESTS
 
CREATE OR ALTER TRIGGER EGAIS_REQUESTS_BU0 FOR EGAIS_REQUESTS
Строка 97: Строка 171:
 
end
 
end
 
^
 
^
 +
 
SET TERM ; ^
 
SET TERM ; ^
 +
 +
 +
 +
/******************************************************************************/
 +
/***                          Fields descriptions                          ***/
 +
/******************************************************************************/
  
 
COMMENT ON COLUMN EGAIS_REQUESTS.QUERY_TYPE IS  
 
COMMENT ON COLUMN EGAIS_REQUESTS.QUERY_TYPE IS  
Строка 105: Строка 186:
 
4 - акт расхождения по ТТН';
 
4 - акт расхождения по ТТН';
  
 +
 +
 +
/******************************************************************************/
 +
/***                              Privileges                              ***/
 +
/******************************************************************************/
 +
</pre>
 +
 +
==Выполнить скрипт (для фармы не обязательно)==
 +
<pre>
 
SET TERM ^ ;
 
SET TERM ^ ;
 +
execute procedure PR_ALTER_VIEW('','','GEN_EGAIS_REQUESTS_ID','generator');^
 +
 +
/*таблица EGAIS_PRODUCERS*/
 +
EXECUTE BLOCK AS BEGIN
 +
if (not exists(select 1 from rdb$relations where rdb$relation_name = 'EGAIS_PRODUCERS')) then
 +
execute statement 'CREATE TABLE EGAIS_PRODUCERS(ID DM_ID NOT NULL);';
 +
END^
 +
 +
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','INN','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','KPP','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','FULLNAME','DM_TEXT1024','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','SHORTNAME','DM_TEXT1024','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','COUNTRY','DM_TEXT1024','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','POSTINDEX','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','REGIONCODE','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','DESCRIPTION','DM_TEXT1024','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','CITY','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','STREET','DM_TEXT','TABLE');^
 +
 +
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','ID','EGAIS_PRODUCERS_IDX1','INDEX');^
 +
 +
/* таблица EGAIS_REQUESTS*/
 +
EXECUTE BLOCK AS BEGIN
 +
if (not exists(select 1 from rdb$relations where rdb$relation_name = 'EGAIS_REQUESTS')) then
 +
execute statement 'CREATE TABLE EGAIS_REQUESTS (ID  DM_ID NOT NULL);';
 +
END^
 +
 +
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','REPLY_ID','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','REPLY_URL','DM_TEXT1024','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','QUERY_TYPE','DM_STATUS','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','QUERY_URL','DM_TEXT','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','QUERY_DATA','DM_BLOBBIN','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','REPLY_DATA','DM_BLOBBIN','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','STATUS','DM_STATUS','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','INSERT_DATE','DM_DATETIME','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','REPLY_DATE','DM_DATETIME','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','EGAIS_ID','DM_TEXT1024','TABLE');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','QUERY_OUT','DM_TEXT1024','TABLE');^
 +
 +
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','ID','','PRIMARY KEY');^
 +
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','REPLY_ID','EGAIS_REQUESTS_IDX1','index');^
 +
 +
/* Trigger: EGAIS_REQUESTS_BI */
 +
CREATE OR ALTER TRIGGER EGAIS_REQUESTS_BI FOR EGAIS_REQUESTS
 +
ACTIVE BEFORE INSERT POSITION 0
 +
as
 +
begin
 +
  if (new.id is null) then
 +
    new.id = gen_id(gen_egais_REQUESTS_id,1);
 +
  if (new.insert_date is null) then
 +
    new.insert_date = 'now';
 +
end;^
 +
 +
/* Trigger: EGAIS_REQUESTS_BU0 */
 +
CREATE OR ALTER TRIGGER EGAIS_REQUESTS_BU0 FOR EGAIS_REQUESTS
 +
ACTIVE BEFORE UPDATE POSITION 0
 +
AS
 +
begin
 +
  if (new.reply_url <> '') then
 +
    new.reply_date = 'now';
 +
end;^
  
 
create or alter procedure PR_NEW_PART (
 
create or alter procedure PR_NEW_PART (
Строка 139: Строка 290:
 
     GROUP_ID DM_ID,
 
     GROUP_ID DM_ID,
 
     MOTHERPART_UUID DM_UUID_NULL = 0,
 
     MOTHERPART_UUID DM_UUID_NULL = 0,
     EGAIS_ID DM_ID_NULL = null,
+
     EGAIS_ID DM_TEXT = null,
 
     EGAIS_REGID DM_TEXT1024 = null,
 
     EGAIS_REGID DM_TEXT1024 = null,
 
     EGAIS_BREGID DM_TEXT1024 = null,
 
     EGAIS_BREGID DM_TEXT1024 = null,
Строка 146: Строка 297:
 
     CAPACITY DM_DOUBLE = 0,
 
     CAPACITY DM_DOUBLE = 0,
 
     ALC_VOLUME DM_DOUBLE = 0,
 
     ALC_VOLUME DM_DOUBLE = 0,
     EGAIS_PRODUCER_ID DM_TEXT1024 = null)
+
     EGAIS_PRODUCER_ID DM_TEXT1024 = null,
 +
    EGAIS_BARCODE DM_TEXT1024 = null,
 +
    EGAIS_TYPE DM_TEXT = null,
 +
    PRODUCER_INN DM_TEXT1024 = null,
 +
    PRODUCER_KPP DM_TEXT1024 = null,
 +
    BOTTLINGDATE DM_DATETIME = null,
 +
    EGAIS_PRODUCT_VCODE DM_TEXT = null)
 
returns (
 
returns (
 
     P_ID type of DM_ID)
 
     P_ID type of DM_ID)
Строка 155: Строка 312:
 
     (ID,parent_id,doc_id,WARE_ID,PRICE,PRICE_O,PRICE_Z,PRICE_R,QUANT,BARCODE,BARCODE1,DEP,/*KRITK,*/GODENDO,SERIA,NDS,SUM_NDSO,SERT,DATESERT,KEMVSERT,SDSERT,REGN,NGTD,
 
     (ID,parent_id,doc_id,WARE_ID,PRICE,PRICE_O,PRICE_Z,PRICE_R,QUANT,BARCODE,BARCODE1,DEP,/*KRITK,*/GODENDO,SERIA,NDS,SUM_NDSO,SERT,DATESERT,KEMVSERT,SDSERT,REGN,NGTD,
 
     EDIZM,NAC,motherpart_id,sklad_id,part_type,BASE_AGENT_ID,contract_id, doc_detail_active_id, group_id, motherpart_uuid,
 
     EDIZM,NAC,motherpart_id,sklad_id,part_type,BASE_AGENT_ID,contract_id, doc_detail_active_id, group_id, motherpart_uuid,
     EGAIS_ID, EGAIS_BREGID, EGAIS_REGID, EGAIS_ALCCODE, EGAIS_QUANT, CAPACITY, ALC_VOLUME, EGAIS_PRODUCER_ID)
+
     EGAIS_ID, EGAIS_BREGID, EGAIS_REGID, EGAIS_ALCCODE, EGAIS_QUANT, CAPACITY, ALC_VOLUME, EGAIS_PRODUCER_ID, EGAIS_BARCODE,
 +
    EGAIS_TYPE, PRODUCER_INN, PRODUCER_KPP, BOTTLINGDATE, EGAIS_PRODUCT_VCODE)
 
   values
 
   values
 
     (:p_id,:parent_id,:doc_id,:WARE_ID,:PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE,:BARCODE1,:DEP,/*:KRITK,*/:GODENDO,:SERIA,:NDS,:SUM_NDSO,:SERT,:DATESERT,:KEMVSERT,
 
     (:p_id,:parent_id,:doc_id,:WARE_ID,:PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE,:BARCODE1,:DEP,/*:KRITK,*/:GODENDO,:SERIA,:NDS,:SUM_NDSO,:SERT,:DATESERT,:KEMVSERT,
 
     :SDSERT,:REGN,:NGTD,:EDIZM,:NAC,:motherpart_id,:sklad_id,:part_type,:BASE_AGENT_ID,:contract_id,:doc_detail_active_id, :group_id, :motherpart_uuid,
 
     :SDSERT,:REGN,:NGTD,:EDIZM,:NAC,:motherpart_id,:sklad_id,:part_type,:BASE_AGENT_ID,:contract_id,:doc_detail_active_id, :group_id, :motherpart_uuid,
     :EGAIS_ID, :EGAIS_BREGID, :EGAIS_REGID, :EGAIS_ALCCODE, :EGAIS_QUANT, :CAPACITY, :ALC_VOLUME, :EGAIS_PRODUCER_ID);
+
     :EGAIS_ID, :EGAIS_BREGID, :EGAIS_REGID, :EGAIS_ALCCODE, :EGAIS_QUANT, :CAPACITY, :ALC_VOLUME, :EGAIS_PRODUCER_ID, :EGAIS_BARCODE,
 +
    :EGAIS_TYPE, :PRODUCER_INN, :PRODUCER_KPP, :BOTTLINGDATE, :EGAIS_PRODUCT_VCODE);
 
   suspend;
 
   suspend;
end
+
end;^
^
+
SET TERM ; ^
+
  
/* Following GRANT statetements are generated automatically */
+
GRANT INSERT ON PARTS TO PROCEDURE PR_NEW_PART;^
  
GRANT INSERT ON PARTS TO PROCEDURE PR_NEW_PART;
+
GRANT EXECUTE ON PROCEDURE PR_NEW_PART TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;^
 +
GRANT EXECUTE ON PROCEDURE PR_NEW_PART TO "PUBLIC";^
 +
GRANT EXECUTE ON PROCEDURE PR_NEW_PART TO STANDART;^
 +
GRANT EXECUTE ON PROCEDURE PR_NEW_PART TO SYSDBA;^
  
/* Existing privileges on this procedure */
+
create or alter procedure PR_GET_EGAIS_STATUS (
 +
    ID DM_STATUS)
 +
returns (
 +
    OUT_TEXT DM_TEXT1024)
 +
as
 +
begin
 +
  if ( (id is null) or (id = 0) )  then out_text = 'Не установлен';
 +
  else if (id = 1) then out_text = 'Акт принятия принят';
 +
  else if (id = 2) then out_text = 'Акт принятия отклонен';
 +
  else if (id = 3) then out_text = 'Акт отказа принят';
 +
  else if (id = 4) then out_text = 'Акт отказа отклонен';
 +
  else if (id = 5) then out_text = 'Акт расхождений принят';
 +
  else if (id = 6) then out_text = 'Акт расхождений отклонен';
 +
  else out_text = 'Неизвестный статус';
  
GRANT EXECUTE ON PROCEDURE PR_NEW_PART TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;
+
  suspend;
GRANT EXECUTE ON PROCEDURE PR_NEW_PART TO "PUBLIC";
+
end;^
GRANT EXECUTE ON PROCEDURE PR_NEW_PART TO STANDART;
+
GRANT EXECUTE ON PROCEDURE PR_NEW_PART TO SYSDBA;
+
  
SET TERM ^ ;
+
create or alter procedure PR_INSTALL_COMMIT_RECURSE
 +
as
 +
begin
  
CREATE OR ALTER TRIGGER DOC_DETAIL_ACTIVE_BI FOR DOC_DETAIL_ACTIVE
+
  if ((select
ACTIVE BEFORE INSERT POSITION 0
+
    count(1)
 +
    from rdb$procedure_parameters pp
 +
    where 1=1
 +
    and pp.rdb$procedure_name='PR_DOC_DETAIL_INSERT'
 +
    and pp.rdb$parameter_name='SUM_NDSR')=0 ) then
 +
  EXECUTE STATEMENT ('
 +
  create or alter procedure PR_DOC_PRIHOD_COMMIT_RECURSE (
 +
        DOC_ID type of DM_ID,
 +
        DOC_PARENT_ID type of DM_ID,
 +
        PART_PARENT_ID type of DM_ID,
 +
        DOC_COMMITDATE type of DM_DATE,
 +
        CONTRACT_ID DM_ID)
 +
    as
 +
    declare variable PART_ID type of DM_ID;
 +
    declare variable WARE_ID type of DM_UUID_NULL;
 +
    declare variable SNAME type of DM_TEXT;
 +
    declare variable SIZG type of DM_TEXT;
 +
    declare variable SCOUNTRY type of DM_TEXT;
 +
    declare variable ORIG_CODE type of DM_TEXT;
 +
    declare variable SORIG_NAME type of DM_TEXT;
 +
    declare variable SORIG_IZG type of DM_TEXT;
 +
    declare variable SORIG_COUNTRY type of DM_TEXT;
 +
    declare variable BARCODE type of DM_TEXT;
 +
    declare variable Z_ID type of DM_ID;
 +
    declare variable SKLAD_ID DM_TEXT;
 +
    declare variable PRICE type of DM_DOUBLE;
 +
    declare variable PRICE_O type of DM_DOUBLE;
 +
    declare variable PRICE_Z type of DM_DOUBLE;
 +
    declare variable PRICE_R type of DM_DOUBLE;
 +
    declare variable QUANT type of DM_DOUBLE;
 +
    declare variable BARCODE1 type of DM_TEXT;
 +
    declare variable DEP type of DM_ID;
 +
    declare variable KRITK type of DM_DOUBLE;
 +
    declare variable GODENDO type of DM_DATETIME;
 +
    declare variable SERIA type of DM_TEXT;
 +
    declare variable NDS type of DM_DOUBLE;
 +
    declare variable SUM_NDSO type of DM_DOUBLE;
 +
    declare variable SERT type of DM_TEXT;
 +
    declare variable DATESERT type of DM_DATETIME;
 +
    declare variable KEMVSERT type of DM_TEXT;
 +
    declare variable SDSERT type of DM_DATETIME;
 +
    declare variable REGN type of DM_TEXT;
 +
    declare variable NGTD type of DM_TEXT;
 +
    declare variable EDIZM type of DM_TEXT;
 +
    declare variable PARENT_ID type of DM_ID;
 +
    declare variable SUMMA type of DM_DOUBLE;
 +
    declare variable SUMMA_O type of DM_DOUBLE;
 +
    declare variable DISCOUNT type of DM_DOUBLE;
 +
    declare variable ACTIVE_ID type of DM_ID;
 +
    declare variable NAC type of DM_DOUBLE;
 +
    declare variable DOC_DETAIL_ID type of DM_ID;
 +
    declare variable MOTHERPART_ID type of DM_ID;
 +
    declare variable BCODE_IZG type of DM_TEXT;
 +
    declare variable HUMAN_QUANT type of DM_TEXT;
 +
    declare variable SUM_DSC type of DM_DOUBLE;
 +
    declare variable DCARD type of DM_TEXT;
 +
    declare variable PART_TYPE DM_STATUS;
 +
    declare variable BASE_AGENT_ID DM_ID;
 +
    declare variable GROUP_ID DM_ID;
 +
    declare variable MAKE_ID DM_ID_NULL;
 +
    declare variable MNN DM_TEXT;
 +
    declare variable MOTHERPART_UUID DM_UUID_NULL;
 +
    declare variable EGAIS_ID DM_TEXT;
 +
    declare variable EGAIS_BREGID DM_TEXT1024;
 +
    declare variable EGAIS_REGID DM_TEXT1024;
 +
    declare variable EGAIS_ALCCODE DM_TEXT1024;
 +
    declare variable CAPACITY DM_DOUBLE;
 +
    declare variable ALC_VOLUME DM_DOUBLE;
 +
    declare variable EGAIS_PRODUCER_ID DM_TEXT1024;
 +
    declare variable EGAIS_QUANT DM_DOUBLE;
 +
    declare variable EGAIS_BARCODE DM_TEXT1024;
 +
    declare variable EGAIS_TYPE DM_TEXT;
 +
    declare variable PRODUCER_INN DM_TEXT1024;
 +
    declare variable PRODUCER_KPP DM_TEXT1024;
 +
    declare variable BOTTLINGDATE DM_DATETIME;
 +
    declare variable EGAIS_PRODUCT_VCODE DM_TEXT;
 +
    begin
 +
    --whithout SUM_NDSR
 +
    for
 +
    select
 +
    /*ware_id*/  sname,sizg,scountry,orig_code,sorig_name,sorig_izg,sorig_country,barcode,z_id,sklad_id,
 +
    /*part_id*/  PRICE,PRICE_O,PRICE_Z,PRICE_R,QUANT,BARCODE1,/*KRITK,*/GODENDO,SERIA,NDS,SUM_NDSO,SERT,DATESERT,KEMVSERT,SDSERT,REGN,NGTD,EDIZM,
 +
    PARENT_ID,DISCOUNT,SUMMA,summa_o, id, part_id, nac, doc_detail_id, motherpart_id, dep, bcode_izg, human_quant, SUM_DSC, dcard,
 +
    part_type, BASE_AGENT_ID, group_id, make_id, mnn, motherpart_uuid,
 +
    EGAIS_ID, EGAIS_BREGID, EGAIS_REGID, EGAIS_ALCCODE, CAPACITY, ALC_VOLUME, EGAIS_PRODUCER_ID, EGAIS_QUANT, EGAIS_BARCODE,
 +
    EGAIS_TYPE, PRODUCER_INN, PRODUCER_KPP, BOTTLINGDATE, EGAIS_PRODUCT_VCODE
 +
    from doc_detail_active where doc_id=:doc_id and part_parent_id=:doc_parent_id
 +
    into
 +
    :sname,:sizg,:scountry,:orig_code,:sorig_name,:sorig_izg,:sorig_country,:barcode,:z_id,:sklad_id,
 +
    :PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE1,/*:KRITK,*/:GODENDO,:SERIA,:NDS,:SUM_NDSO,:SERT,:DATESERT,:KEMVSERT,:SDSERT,:REGN,:NGTD,:EDIZM,
 +
    :PARENT_ID,:DISCOUNT,:SUMMA,:summa_o, :active_id, :part_id, :nac, :doc_detail_id, :motherpart_id, :dep, :bcode_izg, :human_quant, :SUM_DSC, :dcard,
 +
    :part_type, :BASE_AGENT_ID, :group_id,:make_id, :mnn, :motherpart_uuid,
 +
    :EGAIS_ID, :EGAIS_BREGID, :EGAIS_REGID, :EGAIS_ALCCODE, :CAPACITY, :ALC_VOLUME, :EGAIS_PRODUCER_ID, :EGAIS_QUANT, :EGAIS_BARCODE,
 +
    :EGAIS_TYPE, :PRODUCER_INN, :PRODUCER_KPP, :BOTTLINGDATE, :EGAIS_PRODUCT_VCODE
 +
    do
 +
    begin
 +
    --    if ((price<0.001) or (price is null)) then exception EX_PRICE;
 +
    if ((price<0) or (price is null)) then exception EX_PRICE;
 +
    if (/*(price_o<0.001) or */(price_o is null)) then exception EX_PRICE_O;
 +
    if (/*(quant<0.00001) or */(quant is null)) then exception EX_QUANT;
 +
    if (/*(summa<0.00001) or */(summa is null)) then exception EX_SUMMA;
 +
    if (/*(summa_o<0.00001) or */(summa_o is null)) then exception EX_SUMMA_O;
 +
    --    if ((NDS<0.00001) or (NDS is null)) then exception EX_NDS;
 +
    if (/*(SUM_NDSO<0) or */(SUM_NDSO is null)) then exception EX_SUM_NDSO;
 +
    select w_id from pr_get_ware(:sname,:sizg,:scountry,:orig_code,:sorig_name,:sorig_izg,:sorig_country,:bcode_izg,:z_id,:sklad_id,:part_type,:mnn)
 +
    into :ware_id;
 +
    if ((part_id=0) or (part_id is NULL)) then
 +
    select p_id from pr_new_part(:DOC_ID,:part_parent_id,:WARE_ID,:PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE,:BARCODE1,:DEP,/*:KRITK,*/:GODENDO,:SERIA,:NDS,
 +
    :SUM_NDSO,:SERT,:DATESERT,:KEMVSERT,:SDSERT,:REGN,:NGTD,:EDIZM,:NAC,:motherpart_id, :part_type,:BASE_AGENT_ID, :sklad_id, :contract_id, :active_id, :group_id,
 +
    :motherpart_uuid, :EGAIS_ID, :EGAIS_REGID, :EGAIS_BREGID, :EGAIS_ALCCODE, :EGAIS_QUANT, :CAPACITY, :ALC_VOLUME, :EGAIS_PRODUCER_ID, :EGAIS_BARCODE,
 +
    :EGAIS_TYPE, :PRODUCER_INN, :PRODUCER_KPP, :BOTTLINGDATE, :EGAIS_PRODUCT_VCODE) into :part_id;
 +
    execute procedure PR_DOC_DETAIL_INSERT(:doc_detail_id,:DOC_ID,:PART_ID,:QUANT,:DISCOUNT,:SUMMA,:summa_o,:price,:sum_ndso,:nac,:doc_commitdate,:human_quant,:SUM_DSC,:dcard,:active_id,:part_type,:make_id);
 +
    -- обновляем членство в группах
 +
    execute procedure PR_UPDGROUPDETAIL_ACTIVE2PARTS(:active_id,:part_id);
 +
    -- присваиваем ценам партии
 +
    update prices set part_id=:part_id where dda_id=:active_id;
 +
    update or insert into prices (part_id,price_type,currency_id, price,dda_id) values (:part_id,0,0,:price,:active_id) matching (PART_ID,PRICE_TYPE);
 +
    execute procedure PR_DOC_PRIHOD_COMMIT_RECURSE(:doc_id,:active_id,:part_id,:doc_commitdate,:contract_id);
 +
    end
 +
    end;
 +
 
 +
  ');
 +
 
 +
else
 +
 
 +
  EXECUTE STATEMENT ('
 +
    create or alter procedure PR_DOC_PRIHOD_COMMIT_RECURSE (
 +
        DOC_ID type of DM_ID,
 +
        DOC_PARENT_ID type of DM_ID,
 +
        PART_PARENT_ID type of DM_ID,
 +
        DOC_COMMITDATE type of DM_DATE,
 +
        CONTRACT_ID DM_ID)
 +
    as
 +
    declare variable PART_ID type of DM_ID;
 +
    declare variable WARE_ID type of DM_UUID_NULL;
 +
    declare variable SNAME type of DM_TEXT;
 +
    declare variable SIZG type of DM_TEXT;
 +
    declare variable SCOUNTRY type of DM_TEXT;
 +
    declare variable ORIG_CODE type of DM_TEXT;
 +
    declare variable SORIG_NAME type of DM_TEXT;
 +
    declare variable SORIG_IZG type of DM_TEXT;
 +
    declare variable SORIG_COUNTRY type of DM_TEXT;
 +
    declare variable BARCODE type of DM_TEXT;
 +
    declare variable Z_ID type of DM_ID;
 +
    declare variable SKLAD_ID DM_TEXT;
 +
    declare variable PRICE type of DM_DOUBLE;
 +
    declare variable PRICE_O type of DM_DOUBLE;
 +
    declare variable PRICE_Z type of DM_DOUBLE;
 +
    declare variable PRICE_R type of DM_DOUBLE;
 +
    declare variable QUANT type of DM_DOUBLE;
 +
    declare variable BARCODE1 type of DM_TEXT;
 +
    declare variable DEP type of DM_ID;
 +
    declare variable KRITK type of DM_DOUBLE;
 +
    declare variable GODENDO type of DM_DATETIME;
 +
    declare variable SERIA type of DM_TEXT;
 +
    declare variable NDS type of DM_DOUBLE;
 +
    declare variable SUM_NDSO type of DM_DOUBLE;
 +
    declare variable SUM_NDSR DM_DOUBLE;
 +
    declare variable SERT type of DM_TEXT;
 +
    declare variable DATESERT type of DM_DATETIME;
 +
    declare variable KEMVSERT type of DM_TEXT;
 +
    declare variable SDSERT type of DM_DATETIME;
 +
    declare variable REGN type of DM_TEXT;
 +
    declare variable NGTD type of DM_TEXT;
 +
    declare variable EDIZM type of DM_TEXT;
 +
    declare variable PARENT_ID type of DM_ID;
 +
    declare variable SUMMA type of DM_DOUBLE;
 +
    declare variable SUMMA_O type of DM_DOUBLE;
 +
    declare variable DISCOUNT type of DM_DOUBLE;
 +
    declare variable ACTIVE_ID type of DM_ID;
 +
    declare variable NAC type of DM_DOUBLE;
 +
    declare variable DOC_DETAIL_ID type of DM_ID;
 +
    declare variable MOTHERPART_ID type of DM_ID;
 +
    declare variable BCODE_IZG type of DM_TEXT;
 +
    declare variable HUMAN_QUANT type of DM_TEXT;
 +
    declare variable SUM_DSC type of DM_DOUBLE;
 +
    declare variable DCARD type of DM_TEXT;
 +
    declare variable PART_TYPE DM_STATUS;
 +
    declare variable BASE_AGENT_ID DM_ID;
 +
    declare variable GROUP_ID DM_ID;
 +
    declare variable MAKE_ID DM_ID_NULL;
 +
    declare variable MNN DM_TEXT;
 +
    declare variable MOTHERPART_UUID DM_UUID_NULL;
 +
    declare variable EGAIS_ID DM_TEXT;
 +
    declare variable EGAIS_BREGID DM_TEXT1024;
 +
    declare variable EGAIS_REGID DM_TEXT1024;
 +
    declare variable EGAIS_ALCCODE DM_TEXT1024;
 +
    declare variable CAPACITY DM_DOUBLE;
 +
    declare variable ALC_VOLUME DM_DOUBLE;
 +
    declare variable EGAIS_PRODUCER_ID DM_TEXT1024;
 +
    declare variable EGAIS_QUANT DM_DOUBLE;
 +
    declare variable EGAIS_BARCODE DM_TEXT1024;
 +
    declare variable EGAIS_TYPE DM_TEXT;
 +
    declare variable PRODUCER_INN DM_TEXT1024;
 +
    declare variable PRODUCER_KPP DM_TEXT1024;
 +
    declare variable BOTTLINGDATE DM_DATETIME;
 +
    declare variable EGAIS_PRODUCT_VCODE DM_TEXT;
 +
    begin
 +
    --whith SUM_NDSR
 +
    for
 +
    select
 +
    /*ware_id*/  sname,sizg,scountry,orig_code,sorig_name,sorig_izg,sorig_country,barcode,z_id,sklad_id,
 +
    /*part_id*/  PRICE,PRICE_O,PRICE_Z,PRICE_R,QUANT,BARCODE1,/*KRITK,*/GODENDO,SERIA,NDS,SUM_NDSO,SUM_NDSR,SERT,DATESERT,KEMVSERT,SDSERT,REGN,NGTD,EDIZM,
 +
    PARENT_ID,DISCOUNT,SUMMA,summa_o, id, part_id, nac, doc_detail_id, motherpart_id, dep, bcode_izg, human_quant, SUM_DSC, dcard,
 +
    part_type, BASE_AGENT_ID, group_id, make_id, mnn, motherpart_uuid,
 +
    EGAIS_ID, EGAIS_BREGID, EGAIS_REGID, EGAIS_ALCCODE, CAPACITY, ALC_VOLUME, EGAIS_PRODUCER_ID, EGAIS_QUANT, EGAIS_BARCODE,
 +
    EGAIS_TYPE, PRODUCER_INN, PRODUCER_KPP, BOTTLINGDATE, EGAIS_PRODUCT_VCODE
 +
    from doc_detail_active where doc_id=:doc_id and part_parent_id=:doc_parent_id
 +
    into
 +
    :sname,:sizg,:scountry,:orig_code,:sorig_name,:sorig_izg,:sorig_country,:barcode,:z_id,:sklad_id,
 +
    :PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE1,/*:KRITK,*/:GODENDO,:SERIA,:NDS,:SUM_NDSO,:SUM_NDSR,:SERT,:DATESERT,:KEMVSERT,:SDSERT,:REGN,:NGTD,:EDIZM,
 +
    :PARENT_ID,:DISCOUNT,:SUMMA,:summa_o, :active_id, :part_id, :nac, :doc_detail_id, :motherpart_id, :dep, :bcode_izg, :human_quant, :SUM_DSC, :dcard,
 +
    :part_type, :BASE_AGENT_ID, :group_id,:make_id, :mnn, :motherpart_uuid,
 +
    :EGAIS_ID, :EGAIS_BREGID, :EGAIS_REGID, :EGAIS_ALCCODE, :CAPACITY, :ALC_VOLUME, :EGAIS_PRODUCER_ID, :EGAIS_QUANT, :EGAIS_BARCODE,
 +
    :EGAIS_TYPE, :PRODUCER_INN, :PRODUCER_KPP, :BOTTLINGDATE, :EGAIS_PRODUCT_VCODE
 +
    do
 +
    begin
 +
    --    if ((price<0.001) or (price is null)) then exception EX_PRICE;
 +
    if ((price<0) or (price is null)) then exception EX_PRICE;
 +
    if (/*(price_o<0.001) or */(price_o is null)) then exception EX_PRICE_O;
 +
    if (/*(quant<0.00001) or */(quant is null)) then exception EX_QUANT;
 +
    if (/*(summa<0.00001) or */(summa is null)) then exception EX_SUMMA;
 +
    if (/*(summa_o<0.00001) or */(summa_o is null)) then exception EX_SUMMA_O;
 +
    --    if ((NDS<0.00001) or (NDS is null)) then exception EX_NDS;
 +
    if (/*(SUM_NDSO<0) or */(SUM_NDSO is null or SUM_NDSR is null )) then exception EX_SUM_NDSO;
 +
    select w_id from pr_get_ware(:sname,:sizg,:scountry,:orig_code,:sorig_name,:sorig_izg,:sorig_country,:bcode_izg,:z_id,:sklad_id,:part_type,:mnn)
 +
    into :ware_id;
 +
    if ((part_id=0) or (part_id is NULL)) then
 +
    select p_id from pr_new_part(:DOC_ID,:part_parent_id,:WARE_ID,:PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE,:BARCODE1,:DEP,/*:KRITK,*/:GODENDO,:SERIA,:NDS,
 +
    :SUM_NDSO,:SERT,:DATESERT,:KEMVSERT,:SDSERT,:REGN,:NGTD,:EDIZM,:NAC,:motherpart_id, :part_type,:BASE_AGENT_ID, :sklad_id, :contract_id, :active_id, :group_id,
 +
    :motherpart_uuid, :EGAIS_ID, :EGAIS_REGID, :EGAIS_BREGID, :EGAIS_ALCCODE, :EGAIS_QUANT, :CAPACITY, :ALC_VOLUME, :EGAIS_PRODUCER_ID, :EGAIS_BARCODE,
 +
    :EGAIS_TYPE, :PRODUCER_INN, :PRODUCER_KPP, :BOTTLINGDATE, :EGAIS_PRODUCT_VCODE) into :part_id;
 +
    execute procedure PR_DOC_DETAIL_INSERT(:doc_detail_id,:DOC_ID,:PART_ID,:QUANT,:DISCOUNT,:SUMMA,:summa_o,:price,:sum_ndso,:sum_ndsr,:nac,:doc_commitdate,:human_quant,:SUM_DSC,:dcard,:active_id,:part_type,:make_id);
 +
    -- обновляем членство в группах
 +
    execute procedure PR_UPDGROUPDETAIL_ACTIVE2PARTS(:active_id,:part_id);
 +
    -- присваиваем ценам партии
 +
    update prices set part_id=:part_id where dda_id=:active_id;
 +
    update or insert into prices (part_id,price_type,currency_id, price,dda_id) values (:part_id,0,0,:price,:active_id) matching (PART_ID,PRICE_TYPE);
 +
    execute procedure PR_DOC_PRIHOD_COMMIT_RECURSE(:doc_id,:active_id,:part_id,:doc_commitdate,:contract_id);
 +
    end
 +
    end;
 +
  ');
 +
 
 +
end^
 +
 
 +
GRANT EXECUTE ON PROCEDURE PR_INSTALL_COMMIT_RECURSE TO SYSDBA;^
 +
 
 +
execute procedure PR_INSTALL_COMMIT_RECURSE;^
 +
 
 +
GRANT EXECUTE ON PROCEDURE PR_GET_EGAIS_STATUS TO SYSDBA;^
 +
 
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','MOTHERPART_UUID','da.motherpart_uuid');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','EGAIS_ID','EGAIS_ID');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','EGAIS_BREGID','EGAIS_BREGID');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','EGAIS_REGID','EGAIS_REGID');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','EGAIS_ALCCODE','EGAIS_ALCCODE');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','CAPACITY','CAPACITY');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','ALC_VOLUME','ALC_VOLUME');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','EGAIS_PRODUCER_ID','EGAIS_PRODUCER_ID');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','EGAIS_QUANT','EGAIS_QUANT');^
 +
 
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','MOTHERPART_UUID','p.motherpart_uuid');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','EGAIS_ID','p.EGAIS_ID');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','EGAIS_BREGID','p.EGAIS_BREGID');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','EGAIS_REGID','p.EGAIS_REGID');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','EGAIS_ALCCODE','p.EGAIS_ALCCODE');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','CAPACITY','p.CAPACITY');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','ALC_VOLUME','p.ALC_VOLUME');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','EGAIS_TTNID','d.EGAIS_ID');^
 +
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','EGAIS_QUANT','p.EGAIS_QUANT');^
 +
 
 +
execute procedure PR_ALTER_VIEW('VW_PARTS','EGAIS_ID','p.EGAIS_ID');^
 +
execute procedure PR_ALTER_VIEW('VW_PARTS','EGAIS_BREGID','p.EGAIS_BREGID');^
 +
execute procedure PR_ALTER_VIEW('VW_PARTS','EGAIS_REGID','p.EGAIS_REGID');^
 +
execute procedure PR_ALTER_VIEW('VW_PARTS','EGAIS_ALCCODE','p.EGAIS_ALCCODE');^
 +
 
 +
execute procedure PR_ALTER_VIEW('VW_DOCS','EGAIS_NUM','docs.EGAIS_NUM');^
 +
execute procedure PR_ALTER_VIEW('VW_DOCS','EGAIS_ID','docs.EGAIS_ID');^
 +
execute procedure PR_ALTER_VIEW('VW_DOCS','EGAIS_UNITTYPE','docs.EGAIS_UNITTYPE');^
 +
execute procedure PR_ALTER_VIEW('VW_DOCS','EGAIS_STATUS','docs.EGAIS_STATUS');^
 +
execute procedure PR_ALTER_VIEW('VW_DOCS','EGAIS_STATUS_TEXT','(select out_text from PR_GET_EGAIS_STATUS(docs.EGAIS_STATUS))');^
 +
 
 +
execute procedure PR_ALTER_VIEW('VW_AGENTS','EGAIS_ID','EGAIS_ID');^
 +
 
 +
create or alter procedure PR_GET_ADDRESS_ID (
 +
    COUNTRY_ID DM_ID_NULL,
 +
    REGION_ID DM_ID_NULL,
 +
    DESCRIPTION DM_TEXT_BIG)
 +
returns (
 +
    ID DM_ID_NULL)
 
as
 
as
 
begin
 
begin
if (new.id is null) then
+
  if ((select id from addr_vals where id = :country_id) is null) then
new.id = gen_id(gen_doc_detail_active_id,1);
+
    insert into addr_vals (id, vtype, svalue) values (:country_id, 0, :country_id);
new.insertdt='now';
+
  if ((select id from addr_vals where id = :region_id) is null) then
if (new.base_agent_id is null) then new.base_agent_id=0;
+
    insert into addr_vals (id, vtype, svalue) values (:region_id, 1, :region_id);
if (new.status is null) then new.status=0;
+
if (new.parent_id is null) then new.parent_id=0;
+
if (new.part_type is null) then new.part_type=0;
+
  
if ((new.part_id is null) or (new.part_id=0)) then
+
  select id from addrs where country_id = :country_id and region_id = :region_id and addresstext = :description into :id;
 +
  if (id is null) then
 +
    insert into addrs (country_id, region_id, addresstext) values (:country_id, :region_id, :description) returning id into :id;
 +
 
 +
  suspend;
 +
end;^
 +
 
 +
GRANT SELECT,INSERT ON ADDR_VALS TO PROCEDURE PR_GET_ADDRESS_ID;^
 +
GRANT SELECT,INSERT ON ADDRS TO PROCEDURE PR_GET_ADDRESS_ID;^
 +
 
 +
EXECUTE BLOCK AS BEGIN
 +
if (not exists(select 1 from DOC_TYPES where ID = 40)) then
 +
execute statement '
 +
INSERT INTO DOC_TYPES (ID, CAPTION, INSERTDT, BASE_TYPE, STATINI, REPORTS, VTYPE)
 +
              VALUES (40, ''ТТН ЕГАИС'', null, 1, ''[XML]
 +
enabled=1
 +
caption=Печать пакета документов прихода
 +
tmplpath=prihod.xml
 +
askbefore=1
 +
 
 +
[freereport]
 +
enabled=1
 +
caption=Печать пакета документов прихода
 +
tmplpath=prihod.cffr3
 +
 
 +
[dbf]
 +
inipath=dbf.ini
 +
 
 +
[CSV]
 +
inipath=dbf.ini
 +
quotestrings=1
 +
separator=#9
 +
headers=1'', '' [XML]
 +
enabled=1
 +
caption=Печать пакета документов прихода
 +
tmplpath=prihod.xml
 +
askbefore=1
 +
 
 +
[freereport]
 +
enabled=1
 +
caption=Печать пакета документов прихода
 +
tmplpath=prihod.cffr
 +
 
 +
 
 +
;''''doc_id=:doc_id:'''';''''doc_detail=:doc_detail:'''''', 1);';
 +
END^
 +
 
 +
EXECUTE BLOCK AS BEGIN
 +
if (not exists(select 1 from GROUPS where ID = -10)) then
 +
execute statement '
 +
INSERT INTO GROUPS (ID, PARENT_ID, CAPTION, GROUPTABLE, STATUS, INSERTDT, SYSTEMFLAG, DESCRIPTION, IMAGEINDEX, DATA, COLOR, SORTING, BASE_AGENT_ID)
 +
            VALUES (-10, -4, ''ЕГАИС оптовики'', ''AGENTS'', 0, null, 1, NULL, -1, NULL, NULL, NULL, 0);
 +
';
 +
END^
 +
 
 +
create or alter procedure PR_EDITCUSTOMDOC (
 +
    DOC_ID type of DM_ID,
 +
    SESSION_ID type of DM_ID,
 +
    RGUID type of DM_RGUID)
 +
returns (
 +
    CUR_DOC_ID type of DM_ID)
 +
as
 +
declare variable VNUM type of DM_ID_NULL;
 +
declare variable DOC_TYPE type of DM_ID;
 +
declare variable DOC_BASE_TYPE type of DM_ID;
 +
declare variable DOC_STATUS type of DM_STATUS;
 +
declare variable DOC_AGENT_ID type of DM_ID;
 +
declare variable DOCNUM type of DM_TEXT;
 +
declare variable DOC_CAPTION type of DM_TEXT;
 +
declare variable BASE_AGENT_ID integer;
 +
declare variable DOCDATE type of DM_DATETIME;
 +
declare variable EGAIS_NUM DM_TEXT;
 +
declare variable EGAIS_ID DM_TEXT;
 +
declare variable EGAIS_UNITTYPE DM_TEXT;
 +
declare variable EGAIS_STATUS DM_STATUS;
 
begin
 
begin
-->cf20110923
+
  select d.doc_type, d.status, dt.base_type, dt.caption, d.docnum, d.docdate, d.agent_id, d.vnum, d.base_agent_id, EGAIS_NUM, EGAIS_ID, EGAIS_UNITTYPE, EGAIS_STATUS from docs d left join doc_types dt on d.doc_type=dt.id where d.id=:doc_id
--if (new.ware_id<0) then
+
    into :doc_type, :doc_status, :doc_base_type, :doc_caption, :docnum, :docdate, :doc_AGENT_ID,:vnum, :BASE_AGENT_ID, :EGAIS_NUM, :EGAIS_ID, :EGAIS_UNITTYPE, :EGAIS_STATUS;
if (new.ware_id='-1') then
+
 
 +
  if (doc_type is null) then exception EX_CANTFINDDOC_ID;
 +
  if (doc_status in (0,-2,2)) then exception EX_WRONGDOCSTATUS;
 +
  if (doc_base_type=3) then exception EX_WRONGDOC_BASE_TYPE;
 +
--  if (doc_agent_id <= 0) then exception EX_WRONG_AGENT;
 +
  cur_doc_id=gen_id(gen_docs_id,1);
 +
  insert into docs (ID,PARENT_ID,DOC_TYPE,STATUS,AGENT_ID,RGUID,AUDIT_ID,DOCNUM,DOCDATE,DELETED_DOC_ID, BASE_AGENT_ID, EGAIS_NUM, EGAIS_ID, EGAIS_UNITTYPE, EGAIS_STATUS)
 +
    values (:cur_doc_id,0,:DOC_TYPE,0,:doc_AGENT_ID,:RGUID,:session_ID,:DOCNUM,:DOCDATE,:DOC_ID, :BASE_AGENT_ID, :EGAIS_NUM, :EGAIS_ID, :EGAIS_UNITTYPE, :EGAIS_STATUS);
 +
  -- Обновление номера документа на старое значение
 +
  UPDATE docs set vnum = :vnum, caption=:doc_caption || ' №' || :vnum  where id = :cur_doc_id;
 +
 
 +
  if (doc_base_type=1) then --приход
 +
  begin
 +
  if (doc_status=1) then --
 +
  begin
 +
    insert into DOC_DETAIL_ACTIVE (doc_id,part_id,quant,summa,discount,koef,sum_dsc,sum_ndso,sum_ndsr)
 +
      select :cur_doc_id,part_id,quant,summa,discount,0,sum_dsc,sum_ndso,sum_ndsr from doc_detail where doc_id=:doc_id;
 +
    update DOC_DETAIL_ACTIVE dda set dda.part_id=iif((select count(*) from doc_detail where part_id = dda.part_id) > 1,dda.part_id,0) where dda.doc_id=:cur_doc_id;
 +
  end
 +
  else
 +
  begin
 +
    if (doc_status=-1) then
 +
    begin
 +
      insert into DOC_DETAIL_ACTIVE (doc_id,part_id,quant,summa,discount,koef,sum_dsc)
 +
        select :cur_doc_id,part_id,quant,summa,discount,0,sum_dsc from doc_detail_deleted where doc_id=:doc_id;
 +
      --update DOC_DETAIL_ACTIVE set part_id=0 where doc_id=:cur_doc_id;
 +
      update DOC_DETAIL_ACTIVE dda set dda.part_id=iif((select count(*) from doc_detail where part_id = dda.part_id) > 1,dda.part_id,0) where dda.doc_id=:cur_doc_id;
 +
    end
 +
  end
 +
  end
 +
  else if ((doc_base_type=2) or (doc_base_type=7)) then  --расход
 +
  begin
 +
    if (doc_status=1) then
 +
    begin
 +
      insert into doc_detail_active (doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,sum_ndsr,koef,sum_dsc)
 +
        select :cur_doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,sum_ndsr,1,sum_dsc from doc_detail where doc_id=:doc_id;
 +
    end
 +
    else
 +
    begin
 +
      if (doc_status=-1) then
 +
      begin
 +
        insert into doc_detail_active (doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,sum_ndsr,koef,sum_dsc)
 +
          select :cur_doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,sum_ndsr,1,sum_dsc from doc_detail_deleted where doc_id=:doc_id;
 +
      end
 +
    end
 +
  end
 +
 
 +
  suspend;
 +
end;^
 +
 
 +
set term ; ^
 +
</pre>
 +
 
 +
==Дополнения к ЕГАИС==
 +
Если вы ставите версию менеджера 68 и выше, то нужно еще установить [[Скрипт дополнений к ЕГАИС]].
 +
 
 +
=Установка Этап 2 (выполняется для '''ПРОДУКТОВЫХ''' клиентов)=
 +
 
 +
==В процедуре PR_DOC_COMMIT==
 +
вставить строки после exception EX_WRONGDOC_BASE_TYPE на
 +
<PRE>
 +
/* nicky edit */
 +
if (exists (select * from docs d where d.id = :doc_id and d.doc_type in (3, 9))) then
 +
  begin
 +
    insert into egais_detail (doc_detail_id, egais_barcode, producer_inn, producer_kpp) select dd.id, dda.egais_barcode, dda.producer_inn, dda.producer_kpp
 +
      from doc_detail dd join doc_detail_active dda on dd.doc_id = dda.doc_id and dd.part_id = dda.part_id
 +
      join vw_warebase wb on dd.part_id = wb.part_id
 +
      where dd.doc_id = :doc_id and (char_length(dda.EGAIS_BARCODE) > 0 or (wb.MMBSH containing '-21={') );
 +
  end
 +
/* nicky edit end*/
 +
</PRE>
 +
 
 +
==во VW_WAREBASE==
 +
добавить EGAIS_PRODUCT_VCODE где источник p.EGAIS_PRODUCT_VCODE и в конце добавить left join parts p on wb.part_id = p.id
 +
 
 +
==Исправить триггер DOC_DETAIL_ACTIVE_BI==
 +
1) Комментируем строки стандартного приведения
 +
<nowiki>
 +
/*if (new.ware_id<0) then
 
begin
 
begin
 
select goodname, goodizg, goodcountry from PR_MAKEGOODWAREVALUES(new.sname,new.sorig_name,new.sizg,new.sorig_izg,new.scountry,new.sorig_country,new.orig_code,new.id,new.part_type)
 
select goodname, goodizg, goodcountry from PR_MAKEGOODWAREVALUES(new.sname,new.sorig_name,new.sizg,new.sorig_izg,new.scountry,new.sorig_country,new.orig_code,new.id,new.part_type)
 
into new.sname, new.sizg,new.scountry;
 
into new.sname, new.sizg,new.scountry;
 
end
 
end
--<cf20110923
+
*/
new.part_id=0;
+
</nowiki>
select val_id from PR_GETVAL_ID(new.sname, 0, new.part_type) into new.name_id;
+
 
--select id from vals where vtype=0 and alttype=new.part_type and svalue=new.sname into new.name_id;
+
2) После условия <nowiki> if (new.part_id>0) then -- заполняем значения партии </nowiki>,  
select val_id from PR_GETVAL_ID(new.sizg, 3, new.part_type) into new.izg_id;
+
дополняем выборку из таблицы PARTS полями
--select id from vals where vtype=3 and alttype=new.part_type and svalue=new.sizg into new.izg_id;
+
<nowiki>
select val_id from PR_GETVAL_ID(new.scountry, 2, new.part_type) into new.country_id;
+
.....
--select id from vals where vtype=2 and alttype=new.part_type and svalue=new.scountry into new.country_id;
+
select val_id from PR_GETVAL_ID(new.sorig_name, 1, new.part_type) into new.orig_name_id;
+
--select id from vals where vtype=1 and alttype=new.part_type and svalue=new.sorig_name into new.orig_name_id;
+
select val_id from PR_GETVAL_ID(new.sorig_izg, 6, new.part_type) into new.orig_izg_id;
+
--select id from vals where vtype=6 and alttype=new.part_type and svalue=new.sorig_izg into new.orig_izg_id;
+
select val_id from PR_GETVAL_ID(new.sorig_country, 5, new.part_type) into new.orig_country_id;
+
--select id from vals where vtype=5 and alttype=new.part_type and svalue=new.sorig_country into new.orig_country_id;
+
new.ware_id=0;
+
select first 1 id from wares where
+
name_id=new.name_id and izg_id=new.izg_id and country_id=new.country_id and
+
orig_code=new.orig_code and
+
orig_name_id=new.orig_name_id and orig_izg_id=new.orig_izg_id and orig_country_id=new.orig_country_id
+
and barcode=new.bcode_izg into new.ware_id;
+
end
+
if (new.part_parent_id is null) then new.part_parent_id=0;
+
if (new.ware_id is null) then new.ware_id=0;
+
if (new.name_id is null) then new.name_id=0;
+
if (new.izg_id is null) then new.izg_id=0;
+
if (new.country_id is null) then new.country_id=0;
+
if (new.orig_name_id is null) then new.orig_name_id=0;
+
if (new.orig_izg_id is null) then new.orig_izg_id=0;
+
if (new.orig_country_id is null) then new.orig_country_id=0;
+
if (new.z_id is null) then new.z_id=0;
+
if (new.sklad_id is null) then new.sklad_id='';
+
if (new.motherpart_id is null) then new.motherpart_id=0;
+
if (new.doc_detail_id is null) then new.doc_detail_id=0;
+
if (new.part_id>0) then -- заполняем значения партии
+
begin
+
select
+
WARE_ID,
+
PRICE,
+
PRICE_O,
+
PRICE_Z,
+
PRICE_R,
+
--QUANT,
+
BARCODE,
+
BARCODE1,
+
--KRITK,
+
GODENDO,
+
SERIA,
+
NDS,
+
--SUM_NDSO,
+
SERT,
+
DATESERT,
+
KEMVSERT,
+
SDSERT,
+
REGN,
+
NGTD,
+
EDIZM,
+
nac,
+
dep,
+
part_type,
+
base_agent_id,
+
group_id,
+
 
motherpart_uuid,
 
motherpart_uuid,
 
EGAIS_ID,
 
EGAIS_ID,
Строка 267: Строка 824:
 
EGAIS_QUANT,
 
EGAIS_QUANT,
 
CAPACITY,
 
CAPACITY,
ALC_VOLUME
+
ALC_VOLUME,
 +
EGAIS_BARCODE,
 +
EGAIS_TYPE,
 +
PRODUCER_INN,
 +
PRODUCER_KPP,
 +
BOTTLINGDATE,
 +
EGAIS_PRODUCT_VCODE
 
from parts where id=new.part_id into
 
from parts where id=new.part_id into
new.WARE_ID,
+
......
new.PRICE,
+
new.PRICE_O,
+
new.PRICE_Z,
+
new.PRICE_R,
+
--new.QUANT,
+
new.BARCODE,
+
new.BARCODE1,
+
--new.KRITK,
+
new.GODENDO,
+
new.SERIA,
+
new.NDS,
+
--new.SUM_NDSO,
+
new.SERT,
+
new.DATESERT,
+
new.KEMVSERT,
+
new.SDSERT,
+
new.REGN,
+
new.NGTD,
+
new.EDIZM,
+
new.nac,
+
new.dep,
+
new.part_type,
+
new.base_agent_id,
+
new.group_id,
+
 
new.motherpart_uuid,
 
new.motherpart_uuid,
 
new.EGAIS_ID,
 
new.EGAIS_ID,
Строка 301: Строка 840:
 
new.EGAIS_QUANT,
 
new.EGAIS_QUANT,
 
new.CAPACITY,
 
new.CAPACITY,
new.ALC_VOLUME
+
new.ALC_VOLUME,
;
+
new.EGAIS_BARCODE,
end
+
new.EGAIS_TYPE,
if (new.group_id is null) then
+
new.PRODUCER_INN,
new.group_id=0;
+
new.PRODUCER_KPP,
--if (new.ware_id>0) then -- заполняем значения позиции
+
new.BOTTLINGDATE,
if (new.ware_id not in ('-1','0')) then -- заполняем значения позиции
+
new.EGAIS_PRODUCT_VCODE;
begin
+
</nowiki>
select
+
 
ww.NAME_ID,
+
3) В конце триггера пишем
(select svalue from vals where id=ww.name_id),
+
<nowiki>
ww.IZG_ID,
+
--20160212 Приведение наименований для ЕГАИС, стандартное д.б. отключено
(select svalue from vals where id=ww.IZG_ID),
+
if ((select doc_type from docs where id = new.doc_id)=40) then
ww.COUNTRY_ID,
+
if ( (new.capacity is not null) and
(select svalue from vals where id=ww.COUNTRY_ID),
+
    (new.bcode_izg is null or trim(new.bcode_izg) = '') and
ww.ORIG_CODE,
+
    (select first 1 count(1) from warebase w left join parts p on p.id = w.part_id
ww.ORIG_NAME_ID,
+
          where (sname = new.sname or sorig_name = new.sname or sname = new.sorig_name or sorig_name = new.sorig_name) and
(select svalue from vals where id=ww.ORIG_NAME_ID),
+
                (bcode_izg is not null and trim(bcode_izg) <> '') and
ww.ORIG_IZG_ID,
+
                (coalesce(p.capacity,0) = new.capacity) and
(select svalue from vals where id=ww.ORIG_IZG_ID),
+
                (coalesce(p.egais_alccode,0) = coalesce(new.egais_alccode,0)) ) > 0
ww.ORIG_COUNTRY_ID,
+
  )
(select svalue from vals where id=ww.ORIG_COUNTRY_ID),
+
  then
ww.BARCODE,
+
  begin
ww.Z_ID,
+
    select first 1 sname, name_id, bcode_izg, w.price from warebase w left join parts p on p.id = w.part_id
ww.SKLAD_ID
+
          where ( (sname = new.sname or sorig_name = new.sname or sname = new.sorig_name or sorig_name = new.sorig_name) and
from wares ww where ww.id=new.ware_id into
+
                  (bcode_izg is not null and trim(bcode_izg) <> '') and
new.NAME_ID,
+
                  (coalesce(p.capacity,0) = new.capacity) and
new.SNAME,
+
                  (coalesce(p.egais_alccode,0) = coalesce(new.egais_alccode,0)) )
new.IZG_ID,
+
    into new.sname, new.name_id, new.bcode_izg, new.price;
new.SIZG,
+
    new.summa = new.price*new.quant;
new.COUNTRY_ID,
+
    if (new.price_o<>0) then new.nac=(new.price-new.price_o)*100/new.price_o;
new.scountry,
+
  End
new.ORIG_CODE,
+
</nowiki>
new.ORIG_NAME_ID,
+
 
new.sorig_name,
+
==Новый метод редактирования штрихкодов==
new.ORIG_IZG_ID,
+
<PRE>
new.sorig_izg,
+
CREATE UNIQUE INDEX WARES_IDX1 ON WARES (NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,BARCODE);
new.ORIG_COUNTRY_ID,
+
CREATE INDEX WARES_LOG_IDX_INSERTDT ON WARES_LOG (INSERTDT);
new.sorig_country,
+
new.bcode_izg,
+
new.Z_ID,
+
new.SKLAD_ID;
+
end
+
else
+
begin
+
--if (new.ware_id<0) then
+
if (new.ware_id='-1') then
+
begin
+
select goodname, goodizg, goodcountry from PR_MAKEGOODWAREVALUES(new.sname,new.sorig_name,new.sizg,new.sorig_izg,new.scountry,new.sorig_country,new.orig_code,new.id,new.part_type)
+
into new.sname, new.sizg,new.scountry;
+
new.ware_id=0;
+
end
+
end
+
if (new.quant is null) then new.quant=0;
+
if (new.price is null) then new.price=0;
+
if (new.price_o is null) then new.price_o=0;
+
if (new.nds is null) then new.nds=0;
+
if (new.summa is null) then new.summa=new.quant*new.price;
+
if (new.sum_dsc is null) then new.sum_dsc=0;
+
if (new.summa_o is null) then
+
begin
+
new.summa_o=new.quant*new.price_o;
+
end
+
else
+
begin
+
if (new.quant<>0) then
+
new.price_o=new.summa_o/new.quant;
+
end
+
if (new.sum_ndso is null) then new.sum_ndso=new.summa_o*new.nds/100;
+
if (((new.nac is null) or (new.nac=0)) and new.price_o<>0)  then
+
new.nac=(new.price-new.price_o)*100/new.price_o;
+
if (new.dep is null) then
+
begin
+
select first 1 id from deps where nds=new.nds order by id into new.dep;
+
end
+
if (new.dep is null) then
+
new.dep=0;
+
---> 20130301-ann gen_barcode_by_name
+
if ((new.barcode is null) or (trim(new.barcode)='') or (new.part_id=0) ) then
+
begin
+
if ((select PARAM_VALUE from PR_GETPARAMVALUE('GEN_BARCODE',0))=0) then
+
select res_bcode from utpr_getchecksum_ean13(new.id) into new.barcode;
+
--else select res_bcode from utpr_getchecksum_ean13(new.name_id,'88') into new.barcode;
+
else select res_bcode from utpr_getchecksum_ean13((select l_id from vals where d$uuid=new.name_id),'88') into new.barcode;
+
end
+
---> 20130301-ann gen_barcode_by_name
+
if (new.part_parent_id>0) then
+
begin
+
update doc_detail_active set
+
quant=quant-new.quant,
+
summa=summa-new.summa,
+
summa_o=summa_o-new.summa_o,
+
sum_ndso=sum_ndso-new.sum_ndso
+
where id=new.part_parent_id;
+
execute procedure PR_COPY_MEMBERSHIP('DOC_DETAIL_ACTIVE',new.part_parent_id,new.id);
+
end
+
end
+
^
+
SET TERM ; ^
+
  
 
SET TERM ^ ;
 
SET TERM ^ ;
  
create or alter procedure PR_DOC_PRIHOD_COMMIT_RECURSE (
+
create or alter procedure PR_GET_WARE (
     DOC_ID type of DM_ID,
+
     SNAME type of DM_TEXT,
     DOC_PARENT_ID type of DM_ID,
+
     SIZG type of DM_TEXT,
     PART_PARENT_ID type of DM_ID,
+
     SCOUNTRY type of DM_TEXT,
     DOC_COMMITDATE type of DM_DATE,
+
     ORIG_CODE type of DM_TEXT,
     CONTRACT_ID DM_ID)
+
     SORIG_NAME type of DM_TEXT,
 +
    SORIG_IZG type of DM_TEXT,
 +
    SORIG_COUNTRY type of DM_TEXT,
 +
    BARCODE type of DM_TEXT,
 +
    Z_ID type of DM_ID,
 +
    SKLAD_ID DM_TEXT,
 +
    ALTTYPE DM_STATUS,
 +
    MNN DM_TEXT = '')
 +
returns (
 +
    W_ID type of DM_ID)
 
as
 
as
declare variable PART_ID type of DM_ID;
+
declare variable OLD_BARCODE DM_TEXT1024;
declare variable WARE_ID type of DM_UUID_NULL;
+
declare variable NAME_ID type of DM_ID;
declare variable SNAME type of DM_TEXT;
+
declare variable IZG_ID type of DM_ID;
declare variable SIZG type of DM_TEXT;
+
declare variable COUNTRY_ID type of DM_ID;
declare variable SCOUNTRY type of DM_TEXT;
+
declare variable ORIG_NAME_ID type of DM_ID;
declare variable ORIG_CODE type of DM_TEXT;
+
declare variable ORIG_IZG_ID type of DM_ID;
declare variable SORIG_NAME type of DM_TEXT;
+
declare variable ORIG_COUNTRY_ID type of DM_ID;
declare variable SORIG_IZG type of DM_TEXT;
+
declare variable SORIG_COUNTRY type of DM_TEXT;
+
declare variable BARCODE type of DM_TEXT;
+
declare variable Z_ID type of DM_ID;
+
declare variable SKLAD_ID DM_TEXT;
+
declare variable PRICE type of DM_DOUBLE;
+
declare variable PRICE_O type of DM_DOUBLE;
+
declare variable PRICE_Z type of DM_DOUBLE;
+
declare variable PRICE_R type of DM_DOUBLE;
+
declare variable QUANT type of DM_DOUBLE;
+
declare variable BARCODE1 type of DM_TEXT;
+
declare variable DEP type of DM_ID;
+
declare variable KRITK type of DM_DOUBLE;
+
declare variable GODENDO type of DM_DATETIME;
+
declare variable SERIA type of DM_TEXT;
+
declare variable NDS type of DM_DOUBLE;
+
declare variable SUM_NDSO type of DM_DOUBLE;
+
declare variable SERT type of DM_TEXT;
+
declare variable DATESERT type of DM_DATETIME;
+
declare variable KEMVSERT type of DM_TEXT;
+
declare variable SDSERT type of DM_DATETIME;
+
declare variable REGN type of DM_TEXT;
+
declare variable NGTD type of DM_TEXT;
+
declare variable EDIZM type of DM_TEXT;
+
declare variable PARENT_ID type of DM_ID;
+
declare variable SUMMA type of DM_DOUBLE;
+
declare variable SUMMA_O type of DM_DOUBLE;
+
declare variable DISCOUNT type of DM_DOUBLE;
+
declare variable ACTIVE_ID type of DM_ID;
+
declare variable NAC type of DM_DOUBLE;
+
declare variable DOC_DETAIL_ID type of DM_ID;
+
declare variable MOTHERPART_ID type of DM_ID;
+
declare variable BCODE_IZG type of DM_TEXT;
+
declare variable HUMAN_QUANT type of DM_TEXT;
+
declare variable SUM_DSC type of DM_DOUBLE;
+
declare variable DCARD type of DM_TEXT;
+
declare variable PART_TYPE DM_STATUS;
+
declare variable BASE_AGENT_ID DM_ID;
+
declare variable GROUP_ID DM_ID;
+
declare variable MAKE_ID DM_ID_NULL;
+
declare variable MNN DM_TEXT;
+
declare variable MOTHERPART_UUID DM_UUID_NULL;
+
declare variable EGAIS_ID DM_TEXT1024;
+
declare variable EGAIS_BREGID DM_TEXT1024;
+
declare variable EGAIS_REGID DM_TEXT1024;
+
declare variable EGAIS_ALCCODE DM_TEXT1024;
+
declare variable CAPACITY DM_DOUBLE;
+
declare variable ALC_VOLUME DM_DOUBLE;
+
declare variable EGAIS_PRODUCER_ID DM_TEXT1024;
+
declare variable EGAIS_QUANT DM_DOUBLE;
+
 
begin
 
begin
for
+
if (orig_code is null) then orig_code='';
select
+
if (barcode is null) then barcode='';
/*ware_id*/  sname,sizg,scountry,orig_code,sorig_name,sorig_izg,sorig_country,barcode,z_id,sklad_id,
+
select val_id from pr_getval_id(:sname,0,:alttype,:mnn) into :name_id;
/*part_id*/  PRICE,PRICE_O,PRICE_Z,PRICE_R,QUANT,BARCODE1,/*KRITK,*/GODENDO,SERIA,NDS,SUM_NDSO,SERT,DATESERT,KEMVSERT,SDSERT,REGN,NGTD,EDIZM,
+
select val_id from pr_getval_id(:sizg,3,:alttype) into :izg_id;
PARENT_ID,DISCOUNT,SUMMA,summa_o, id, part_id, nac, doc_detail_id, motherpart_id, dep, bcode_izg, human_quant, SUM_DSC, dcard,
+
select val_id from pr_getval_id(:scountry,2,:alttype) into :country_id;
part_type, BASE_AGENT_ID, group_id, make_id, mnn, motherpart_uuid,
+
select val_id from pr_getval_id(:sorig_name,1,:alttype) into :orig_name_id;
EGAIS_ID, EGAIS_BREGID, EGAIS_REGID, EGAIS_ALCCODE, CAPACITY, ALC_VOLUME, EGAIS_PRODUCER_ID, EGAIS_QUANT
+
select val_id from pr_getval_id(:sorig_izg,6,:alttype) into :orig_izg_id;
from doc_detail_active where doc_id=:doc_id and part_parent_id=:doc_parent_id
+
select val_id from pr_getval_id(:sorig_country,5,:alttype) into :orig_country_id;
into
+
select id from wares where NAME_ID=:name_id and IZG_ID=:izg_id and COUNTRY_ID=:country_id and
:sname,:sizg,:scountry,:orig_code,:sorig_name,:sorig_izg,:sorig_country,:barcode,:z_id,:sklad_id,
+
ORIG_CODE=:orig_code and ORIG_NAME_ID=:orig_name_id and
:PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE1,/*:KRITK,*/:GODENDO,:SERIA,:NDS,:SUM_NDSO,:SERT,:DATESERT,:KEMVSERT,:SDSERT,:REGN,:NGTD,:EDIZM,
+
ORIG_IZG_ID=:orig_izg_id and ORIG_COUNTRY_ID=:orig_country_id and barcode=:barcode into :w_id;
:PARENT_ID,:DISCOUNT,:SUMMA,:summa_o, :active_id, :part_id, :nac, :doc_detail_id, :motherpart_id, :dep, :bcode_izg, :human_quant, :SUM_DSC, :dcard,
+
if (w_id is null) then
:part_type, :BASE_AGENT_ID, :group_id,:make_id, :mnn, :motherpart_uuid,
+
:EGAIS_ID, :EGAIS_BREGID, :EGAIS_REGID, :EGAIS_ALCCODE, :CAPACITY, :ALC_VOLUME, :EGAIS_PRODUCER_ID, :EGAIS_QUANT
+
do
+
 
begin
 
begin
--    if ((price<0.001) or (price is null)) then exception EX_PRICE;
+
--    exception EX_WRONG_OPER;
if ((price<0) or (price is null)) then exception EX_PRICE;
+
w_id=gen_id(gen_wares_id,1);
if (/*(price_o<0.001) or */(price_o is null)) then exception EX_PRICE_O;
+
--w_id=UUID_TO_CHAR(GEN_UUID());
if (/*(quant<0.00001) or */(quant is null)) then exception EX_QUANT;
+
insert into wares (ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,BARCODE,Z_ID,SKLAD_ID)
if (/*(summa<0.00001) or */(summa is null)) then exception EX_SUMMA;
+
values
if (/*(summa_o<0.00001) or */(summa_o is null)) then exception EX_SUMMA_O;
+
(:W_ID,:NAME_ID,:IZG_ID,:COUNTRY_ID,:ORIG_CODE,:ORIG_NAME_ID,:ORIG_IZG_ID,:ORIG_COUNTRY_ID,:BARCODE,:Z_ID,:SKLAD_ID);
--   if ((NDS<0.00001) or (NDS is null)) then exception EX_NDS;
+
if (/*(SUM_NDSO<0) or */(SUM_NDSO is null)) then exception EX_SUM_NDSO;
+
select w_id from pr_get_ware(:sname,:sizg,:scountry,:orig_code,:sorig_name,:sorig_izg,:sorig_country,:bcode_izg,:z_id,:sklad_id,:part_type,:mnn)
+
into :ware_id;
+
if ((part_id=0) or (part_id is NULL)) then
+
select p_id from pr_new_part(:DOC_ID,:part_parent_id,:WARE_ID,:PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE,:BARCODE1,:DEP,/*:KRITK,*/:GODENDO,:SERIA,:NDS,
+
:SUM_NDSO,:SERT,:DATESERT,:KEMVSERT,:SDSERT,:REGN,:NGTD,:EDIZM,:NAC,:motherpart_id, :part_type,:BASE_AGENT_ID, :sklad_id, :contract_id, :active_id, :group_id,
+
:motherpart_uuid, :EGAIS_ID, :EGAIS_REGID, :EGAIS_BREGID, :EGAIS_ALCCODE, :EGAIS_QUANT, :CAPACITY, :ALC_VOLUME, :EGAIS_PRODUCER_ID) into :part_id;
+
execute procedure PR_DOC_DETAIL_INSERT(:doc_detail_id,:DOC_ID,:PART_ID,:QUANT,:DISCOUNT,:SUMMA,:summa_o,:price,:sum_ndso,:nac,:doc_commitdate,:human_quant,:SUM_DSC,:dcard,:active_id,:part_type,:make_id);
+
-- обновляем членство в группах
+
execute procedure PR_UPDGROUPDETAIL_ACTIVE2PARTS(:active_id,:part_id);
+
-- присваиваем ценам партии
+
update prices set part_id=:part_id where dda_id=:active_id;
+
update or insert into prices (part_id,price_type,currency_id, price,dda_id) values (:part_id,0,0,:price,:active_id) matching (PART_ID,PRICE_TYPE);
+
execute procedure PR_DOC_PRIHOD_COMMIT_RECURSE(:doc_id,:active_id,:part_id,:doc_commitdate,:contract_id);
+
 
end
 
end
end
+
--else if (old_barcode <> barcode) then update wares set barcode = :barcode where id = :w_id;
^
+
suspend;
 +
end^
 +
 
 
SET TERM ; ^
 
SET TERM ; ^
  
 
/* Following GRANT statetements are generated automatically */
 
/* Following GRANT statetements are generated automatically */
  
GRANT SELECT ON DOC_DETAIL_ACTIVE TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;
+
GRANT EXECUTE ON PROCEDURE PR_GETVAL_ID TO PROCEDURE PR_GET_WARE;
GRANT EXECUTE ON PROCEDURE PR_GET_WARE TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;
+
GRANT SELECT,INSERT ON WARES TO PROCEDURE PR_GET_WARE;
GRANT EXECUTE ON PROCEDURE PR_NEW_PART TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;
+
GRANT EXECUTE ON PROCEDURE PR_DOC_DETAIL_INSERT TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;
+
GRANT EXECUTE ON PROCEDURE PR_UPDGROUPDETAIL_ACTIVE2PARTS TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;
+
GRANT SELECT,INSERT,UPDATE ON PRICES TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;
+
GRANT EXECUTE ON PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;
+
  
 
/* Existing privileges on this procedure */
 
/* Existing privileges on this procedure */
  
GRANT EXECUTE ON PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;
+
GRANT EXECUTE ON PROCEDURE PR_GET_WARE TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;
GRANT EXECUTE ON PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE TO "PUBLIC";
+
GRANT EXECUTE ON PROCEDURE PR_GET_WARE TO "PUBLIC";
GRANT EXECUTE ON PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE TO STANDART;
+
GRANT EXECUTE ON PROCEDURE PR_GET_WARE TO STANDART;
GRANT EXECUTE ON PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE TO SYSDBA;
+
GRANT EXECUTE ON PROCEDURE PR_GET_WARE TO SYSDBA;
  
 
SET TERM ^ ;
 
SET TERM ^ ;
  
create or alter procedure PR_GET_EGAIS_STATUS (
+
create or alter procedure PR_GETWARE_BY_IDS (
     ID DM_STATUS)
+
     NAME_ID type of DM_ID,
 +
    IZG_ID type of DM_ID,
 +
    COUNTRY_ID type of DM_ID,
 +
    ORIG_CODE type of DM_TEXT,
 +
    ORIG_NAME_ID type of DM_ID,
 +
    ORIG_IZG_ID type of DM_ID,
 +
    ORIG_COUNTRY_ID type of DM_ID,
 +
    DOINSERT type of DM_STATUS,
 +
    SEARCHINLOGS type of DM_STATUS,
 +
    BARCODE DM_TEXT)
 
returns (
 
returns (
     OUT_TEXT DM_TEXT1024)
+
     WARE_ID type of DM_ID)
 
as
 
as
 
begin
 
begin
 +
  if (orig_code is null) then orig_code='';
 +
  if (searchinlogs is null) then searchinlogs=0;
 +
  if (searchinlogs=1) then
 +
  begin
 +
    select first 1 id from wares_log where name_id=:name_id and izg_id=:izg_id and country_id=:country_id and
 +
      orig_code=:orig_code and orig_name_id=:orig_name_id and orig_izg_id=:orig_izg_id and orig_country_id=:orig_country_id
 +
      and barcode=:barcode order by insertdt desc
 +
      into :ware_id;
 +
      if ((select id from wares where id = :ware_id) is null) then ware_id = null;
 +
  end
 +
  else
 +
  begin
 +
    select id from wares where name_id=:name_id and izg_id=:izg_id and country_id=:country_id and
 +
      orig_code=:orig_code and orig_name_id=:orig_name_id and orig_izg_id=:orig_izg_id and orig_country_id=:orig_country_id
 +
      and barcode=:barcode
 +
      into :ware_id;
 +
  end
 +
  if ((ware_id is null) and (DOINSERT=1) and (searchinlogs<>1)) then
 +
  begin
 +
    ware_id=gen_id(gen_wares_id,1);
 +
--    ware_id=UUID_TO_CHAR(GEN_UUID());
 +
    insert into wares (ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,Z_ID,SKLAD_ID, barcode)
 +
    values
 +
      (:ware_id,:NAME_ID,:IZG_ID,:COUNTRY_ID,:ORIG_CODE,:ORIG_NAME_ID,:ORIG_IZG_ID,:ORIG_COUNTRY_ID,0,'',:barcode);
 +
  end
  
   if ( (id is null) or (id = 0) )  then out_text = 'Не установлен';
+
   suspend;
  else if (id = 1) then out_text = 'Акт принятия приянт';
+
end^
  else if (id = 2) then out_text = 'Акт принятия отклонен';
+
  else if (id = 3) then out_text = 'Акт отказа принят';
+
  else if (id = 4) then out_text = 'Акт отказа отклонен';
+
  else if (id = 5) then out_text = 'Акт расхождений принят';
+
  else if (id = 6) then out_text = 'Акт расхождений отклонен';
+
  else out_text = 'Неизвестный статус';
+
  
  suspend;
 
end
 
^
 
 
SET TERM ; ^
 
SET TERM ; ^
 +
 +
/* Following GRANT statetements are generated automatically */
 +
 +
GRANT SELECT ON WARES_LOG TO PROCEDURE PR_GETWARE_BY_IDS;
 +
GRANT SELECT,INSERT ON WARES TO PROCEDURE PR_GETWARE_BY_IDS;
  
 
/* Existing privileges on this procedure */
 
/* Existing privileges on this procedure */
  
GRANT EXECUTE ON PROCEDURE PR_GET_EGAIS_STATUS TO SYSDBA;
+
GRANT EXECUTE ON PROCEDURE PR_GETWARE_BY_IDS TO PROCEDURE PR_MAKEGOODWAREVALUES;
 +
GRANT EXECUTE ON PROCEDURE PR_GETWARE_BY_IDS TO PROCEDURE PR_UPDATEWARE;
 +
GRANT EXECUTE ON PROCEDURE PR_GETWARE_BY_IDS TO PROCEDURE PR_UPDATEWARE4PART;
 +
GRANT EXECUTE ON PROCEDURE PR_GETWARE_BY_IDS TO STANDART;
 +
GRANT EXECUTE ON PROCEDURE PR_GETWARE_BY_IDS TO SYSDBA;
  
CREATE OR ALTER VIEW VW_DOC_DETAIL_ACTIVE(
+
Update params p set p.param_value = '1' where p.param_id ='BCODE_IZG_EDIT_MODE';
    ID,
+
 
    PARENT_ID,
+
Update params p set p.param_value = 'Нет' where p.param_id ='ELNAKL_MAKE_LOCAL_GN';
    DOC_ID,
+
Update params p set p.param_value = 'Нет' where p.param_id ='ELNAKL_MAKE_GLOBAL_GN';
    PART_ID,
+
</PRE>
    PART_PARENT_ID,
+
    DOC_DETAIL_ID,
+
    PRICE,
+
    NAC,
+
    QUANT,
+
    DISCOUNT,
+
    SUMMA,
+
    SUMMA_O,
+
    DCARD,
+
    WARE_ID,
+
    PRICE_O,
+
    PRICE_Z,
+
    PRICE_R,
+
    BARCODE,
+
    BARCODE1,
+
    BCODE_IZG,
+
    KRITK,
+
    GODENDO,
+
    SERIA,
+
    NDS,
+
    SUM_NDSO,
+
    SERT,
+
    DATESERT,
+
    KEMVSERT,
+
    SDSERT,
+
    REGN,
+
    NGTD,
+
    EDIZM,
+
    NAME_ID,
+
    IZG_ID,
+
    COUNTRY_ID,
+
    ORIG_CODE,
+
    ORIG_NAME_ID,
+
    ORIG_IZG_ID,
+
    ORIG_COUNTRY_ID,
+
    Z_ID,
+
    SKLAD_ID,
+
    SNAME,
+
    SIZG,
+
    SCOUNTRY,
+
    SORIG_NAME,
+
    SORIG_IZG,
+
    SORIG_COUNTRY,
+
    INSERTDT,
+
    INFO,
+
    KOEF,
+
    MOTHERPART_ID,
+
    DEP,
+
    MMBSH,
+
    NDSBYDEP,
+
    REALQUANT,
+
    PRICE_DSC,
+
    BLOCK_QUANT,
+
    SUM_DSC,
+
    HUMAN_QUANT,
+
    CUSTOMDRAW,
+
    STATUS,
+
    OLDPRICE,
+
    PART_TYPE,
+
    PRICES,
+
    BASE_AGENT_ID,
+
    SBASE_AGENT_ID,
+
    GNVLS,
+
    GROUP_ID,
+
    MAKE_ID,
+
    MNN,
+
    FIO,
+
    MGN_NAME,
+
    MGN_ID,
+
    MGN_SOURCE,
+
    SUM_NDSR,
+
    STORE_STRING,
+
    BARC_LABEL_COUNT,
+
    SGROUP_ID,
+
    MOTHERPART_UUID,
+
    EGAIS_ID,
+
    EGAIS_BREGID,
+
    EGAIS_REGID,
+
    EGAIS_ALCCODE,
+
    EGAIS_PRODUCT_VCODE,
+
    CAPACITY,
+
    ALC_VOLUME,
+
    EGAIS_PRODUCER_ID,
+
    EGAIS_QUANT)
+
AS
+
select
+
da.ID,
+
PARENT_ID,
+
DOC_ID,
+
PART_ID,
+
PART_PARENT_ID,
+
DOC_DETAIL_ID,
+
PRICE,
+
NAC,
+
QUANT,
+
DISCOUNT,
+
SUMMA,
+
SUMMA_O,
+
DCARD,
+
WARE_ID,
+
PRICE_O,
+
PRICE_Z,
+
PRICE_R,
+
BARCODE,
+
BARCODE1,
+
BCODE_IZG,
+
(select intvalue from vals where id=da.name_id),
+
GODENDO,
+
SERIA,
+
da.NDS,
+
SUM_NDSO,
+
SERT,
+
DATESERT,
+
KEMVSERT,
+
SDSERT,
+
REGN,
+
NGTD,
+
EDIZM,
+
NAME_ID,
+
IZG_ID,
+
COUNTRY_ID,
+
ORIG_CODE,
+
ORIG_NAME_ID,
+
ORIG_IZG_ID,
+
ORIG_COUNTRY_ID,
+
Z_ID,
+
SKLAD_ID,
+
SNAME,
+
SIZG,
+
SCOUNTRY,
+
SORIG_NAME,
+
SORIG_IZG,
+
SORIG_COUNTRY,
+
da.INSERTDT,
+
INFO,
+
KOEF,
+
MOTHERPART_ID,
+
DEP,
+
(select membership from PR_MEMBERSHIPS('PARTS=' || da.part_id || ';DOC_DETAIL_ACTIVE=' || da.id || ';PARTS.NAME_ID=' || da.name_id || ';PARTS.IZG_ID=' ||da.izg_id ||';',ascii_char(13)||ascii_char(10),1)),
+
deps.nds,
+
(select realquant from warebase w where w.part_id=da.part_id),
+
iif(da.quant between -0.000001 and 0.000001,0,cast(da.summa/da.quant as numeric(15,4))),
+
(select BLOCK_QUANT from warebase where part_id=da.part_id),
+
da.SUM_DSC,
+
da.human_quant,
+
DA.CUSTOMDRAW,
+
da.STATUS,
+
iif(da.parent_id<>0, (select ddd.price from DOC_DETAIL_ACTIVE ddd where ddd.id=da.parent_id),0),
+
part_type,
+
(select s from PR_GETPARTPRICES(da.part_id,da.id)),
+
da.BASE_AGENT_ID,
+
(select caption from agents where id=da.BASE_AGENT_ID),
+
da.gnvls,
+
da.group_id,
+
da.make_id,
+
da.mnn,
+
(select od.fio from DOC_DETAIL_DOCTOR docdoc left join out$traders od on docdoc.doctor_id=od.id where docdoc.doc_detail_active_id =da.id),
+
(select mgn_name from wares where id = da.ware_id) as mgn_name,
+
(select mgn_id from wares where id = da.ware_id) as mgn_id,
+
(select mgn_source from wares where id = da.ware_id) as mgn_source,
+
SUM_NDSR,
+
(select svalue from pr_getattribute('store_string', da.name_id)),
+
(select svalue from pr_getattribute('barc_label_count', da.name_id)),
+
(select gr.caption from groups gr where gr.id=da.group_id),
+
da.MOTHERPART_UUID,
+
EGAIS_ID,
+
EGAIS_BREGID,
+
EGAIS_REGID,
+
EGAIS_ALCCODE,
+
EGAIS_PRODUCT_VCODE,
+
CAPACITY,
+
ALC_VOLUME,
+
EGAIS_PRODUCER_ID,
+
EGAIS_QUANT
+
FROM
+
DOC_DETAIL_ACTIVE da left join deps on da.dep=deps.id
+
order by da.parent_id, da.sname, da.id;
+
  
CREATE OR ALTER VIEW VW_DOC_DETAIL(
+
==установка журнала продажи алкоголя==
 +
после выполнения скрипта расположенного ниже - поместить
 +
в таблице REPORTS в отчёт - журнал продажи алкоголя в поле data содержимое файла otch_alko.txt из архива [[Медиа:Alko.zip]]
 +
также в таблице groups поместить в поле data в строку Пиво содержимое файла groups_pivo.TXT из того же архива
 +
и в строку Алкоголь файл groups_alko.TXT
 +
<PRE>
 +
CREATE OR ALTER VIEW VW_ALKO(
 
     ID,
 
     ID,
     PARENT_ID,
+
     DOC_TYPE,
     DOC_ID,
+
     CAPTION,
     PART_ID,
+
     DOCDATE,
     PART_PARENT_ID,
+
     EGAIS_BARCODE,
    PRICE,
+
    QUANT,
+
    DISCOUNT,
+
    SUMMA,
+
    SUMMA_O,
+
    DCARD,
+
    INSERTDT,
+
    WARE_ID,
+
    NAME_ID,
+
 
     SNAME,
 
     SNAME,
    IZG_ID,
 
    SIZG,
 
    COUNTRY_ID,
 
    SCOUNTRY,
 
 
     ORIG_CODE,
 
     ORIG_CODE,
    SORIG_NAME,
 
    SORIG_IZG,
 
    SORIG_COUNTRY,
 
    BCODE_IZG,
 
    PRICE_O,
 
    PRICE_Z,
 
    PRICE_R,
 
    BARCODE,
 
    BARCODE1,
 
    DEP,
 
    KRITK,
 
    GODENDO,
 
    SERIA,
 
    SUM_NDSO,
 
    SERT,
 
    DATESERT,
 
    KEMVSERT,
 
    SDSERT,
 
    REGN,
 
    NGTD,
 
    EDIZM,
 
    NDS,
 
    MMBSH,
 
    NDSBYDEP,
 
    BLOCK_QUANT,
 
    DOC_COMMITDATE,
 
    MOTHERPART_ID,
 
    HUMAN_QUANT,
 
    SUM_DSC,
 
    PART_TYPE,
 
    PACKET,
 
    BASE_AGENT_ID,
 
    SBASE_AGENT_ID,
 
    CONTRACT_ID,
 
    NAC,
 
    VSHIFT,
 
    DEVICE_NUM,
 
    VNUM,
 
    DOC_STATUS,
 
    DOC_TYPE,
 
    MAKE_ID,
 
    FIO,
 
    GROUP_ID,
 
    MGN_NAME,
 
    MGN_ID,
 
    MGN_SOURCE,
 
    DOC_BASE_TYPE,
 
    SUM_NDSR,
 
    SKLAD_ID,
 
    STORE_STRING,
 
    BARC_LABEL_COUNT,
 
    RECEPT,
 
    FIO_ID,
 
    FIO_BOLNOY_ID,
 
    TYPE_LGOTA,
 
    MOTHERPART_UUID,
 
    EGAIS_ID,
 
    EGAIS_BREGID,
 
    EGAIS_REGID,
 
    EGAIS_ALCCODE,
 
 
     CAPACITY,
 
     CAPACITY,
     ALC_VOLUME,
+
     QUANT)
    EGAIS_TTNID,
+
    EGAIS_QUANT)
+
 
AS
 
AS
select
+
select d.id, d.doc_type, d.caption, d.docdate, ed.egais_barcode as egais_barcode, dd.sname, p.EGAIS_PRODUCT_VCODE, dd.capacity, iif(ed.egais_barcode='-',dd.quant,-1)
dt.ID,
+
from egais_detail ed
dt.PARENT_ID,
+
left join vw_doc_detail dd on dd.id = ed.doc_detail_id
dt.DOC_ID,
+
left join vw_docs d on d.id = dd.doc_id
dt.PART_ID,
+
left join parts p on dd.part_id = p.id
p.parent_id,
+
where d.doc_type = 3 or d.doc_type = 9
p.PRICE,
+
;
dt.QUANT,
+
dt.DISCOUNT,
+
dt.SUMMA,
+
dt.SUMMA_O,
+
dt.DCARD,
+
dt.INSERTDT,
+
p.WARE_ID,
+
w.name_id,
+
vname.svalue,
+
w.izg_id,
+
vizg.svalue,
+
w.country_id,
+
vcountry.svalue,
+
ORIG_CODE,
+
vorig_name.svalue,
+
vorig_izg.svalue,
+
vorig_country.svalue,
+
w.barcode,
+
p.PRICE_O,
+
p.PRICE_Z,
+
p.PRICE_R,
+
p.BARCODE,
+
p.BARCODE1,
+
p.DEP,
+
vname.intvalue,
+
p.GODENDO,
+
p.SERIA,
+
dt.SUM_NDSO,
+
p.SERT,
+
p.DATESERT,
+
p.KEMVSERT,
+
p.SDSERT,
+
p.REGN,
+
p.NGTD,
+
p.EDIZM,
+
p.NDS,
+
(select membership from PR_MEMBERSHIPS('PARTS=' || dt.part_id || ';PARTS.NAME_ID=' || w.name_id || ';PARTS.IZG_ID=' || w.izg_id ||';',ascii_char(13)||ascii_char(10),1)),
+
deps.nds,
+
(select BLOCK_QUANT from warebase where part_id=p.id),
+
DT.doc_commitdate,
+
p.motherpart_id,
+
dt.human_quant,
+
dt.SUM_DSC,
+
dt.part_type,
+
dt.packet,
+
dt.BASE_AGENT_ID,
+
(select caption from agents where id=dt.BASE_AGENT_ID),
+
p.contract_id,
+
DT.NAC,
+
d.vshift,
+
d.device_num,
+
d.vnum,
+
d.status,
+
d.doc_type,
+
dt.make_id,
+
(select od.fio from DOC_DETAIL_DOCTOR docdoc left join out$traders od on docdoc.doctor_id=od.id where docdoc.doc_detail_id =dt.id),
+
p.group_id,
+
w.mgn_name,
+
w.mgn_id,
+
w.mgn_source,
+
dts.base_type,
+
dt.SUM_NDSR,
+
p.SKLAD_ID,
+
(select svalue from pr_getattribute('store_string', w.name_id)),
+
(select svalue from pr_getattribute('barc_label_count', w.name_id)),
+
dt.RECEPT,
+
dt.FIO_ID,
+
dt.FIO_BOLNOY_ID,
+
dt.TYPE_LGOTA,
+
p.motherpart_uuid,
+
p.EGAIS_ID,
+
p.EGAIS_BREGID,
+
p.EGAIS_REGID,
+
p.EGAIS_ALCCODE,
+
p.CAPACITY,
+
p.ALC_VOLUME,
+
d.EGAIS_ID,
+
p.EGAIS_QUANT
+
from
+
doc_detail dt
+
left join parts p on dt.part_id=p.id
+
left join WARES w on p.ware_id=w.id
+
left join vals vname on w.name_id=vname.id
+
left join docs d on d.id=dt.doc_id
+
left join doc_types dts on d.doc_type = dts.id
+
left join vals vizg on w.izg_id=vizg.id
+
left join vals vcountry on w.country_id=vcountry.id
+
left join vals vorig_name on w.orig_name_id=vorig_name.id
+
left join vals vorig_izg on w.orig_izg_id=vorig_izg.id
+
left join vals vorig_country on w.orig_country_id=vorig_country.id
+
left join deps on p.dep=deps.id;
+
  
CREATE OR ALTER VIEW VW_PARTS(
 
    PART_ID,
 
    WARE_ID,
 
    NAME_ID,
 
    SNAME,
 
    IZG_ID,
 
    SIZG,
 
    COUNTRY_ID,
 
    SCOUNTRY,
 
    ORIG_CODE,
 
    SORIG_NAME,
 
    SORIG_IZG,
 
    SORIG_COUNTRY,
 
    BCODE_IZG,
 
    PRICE,
 
    PRICE_O,
 
    PRICE_Z,
 
    PRICE_R,
 
    QUANT,
 
    BARCODE,
 
    BARCODE1,
 
    DEP,
 
    GODENDO,
 
    SERIA,
 
    SUM_NDSO,
 
    SERT,
 
    DATESERT,
 
    KEMVSERT,
 
    SDSERT,
 
    REGN,
 
    NGTD,
 
    EDIZM,
 
    DOC_ID,
 
    INSERTDT,
 
    NDS,
 
    BASE_AGENT_ID,
 
    SBASE_AGENT_ID,
 
    MNN,
 
    NAC,
 
    GROUP_ID,
 
    EGAIS_ID,
 
    EGAIS_BREGID,
 
    EGAIS_REGID,
 
    EGAIS_ALCCODE)
 
AS
 
select
 
p.ID,
 
p.WARE_ID,
 
w.name_id,
 
vname.svalue, --SNAME,
 
w.izg_id,
 
vizg.svalue, --SIZG,
 
w.country_id,
 
vcountry.svalue, --SCOUNTRY,
 
ORIG_CODE,
 
vorig_name.svalue, --Sorig_NAME,
 
vorig_izg.svalue, --Sorig_IZG,
 
vorig_country.svalue, --Sorig_COUNTRY,
 
w.barcode,-- BCODE_IZG,
 
p.PRICE,
 
p.PRICE_O,
 
p.PRICE_Z,
 
p.PRICE_R,
 
p.QUANT,
 
p.BARCODE,
 
p.BARCODE1,
 
p.DEP,
 
--p.KRITK,
 
p.GODENDO,
 
p.SERIA,
 
p.SUM_NDSO,
 
p.SERT,
 
p.DATESERT,
 
p.KEMVSERT,
 
p.SDSERT,
 
p.REGN,
 
p.NGTD,
 
p.EDIZM,
 
p.DOC_ID,
 
p.INSERTDT,
 
p.NDS,
 
p.BASE_AGENT_ID,
 
--(select caption from agents a1 where a1.id=p.BASE_AGENT_ID)
 
a1.caption,
 
vname.preparedvalue,
 
p.nac,
 
p.group_id,
 
p.EGAIS_ID,
 
p.EGAIS_BREGID,
 
p.EGAIS_REGID,
 
p.EGAIS_ALCCODE
 
from parts p left join WARES w on p.ware_id=w.id
 
  left join vals vname on w.name_id=vname.id
 
  left join vals vizg on w.izg_id=vizg.id
 
  left join vals vcountry on w.country_id=vcountry.id
 
  left join vals vorig_name on w.orig_name_id=vorig_name.id
 
  left join vals vorig_izg on w.orig_izg_id=vorig_izg.id
 
  left join vals vorig_country on w.orig_country_id=vorig_country.id
 
  left join agents a1 on p.base_agent_id=a1.id;
 
  
CREATE OR ALTER VIEW VW_DOCS(
+
INSERT INTO REPORTS ( PARENT_ID, STATUS, REPORTTYPE, SORTING, CAPTION, PARAMS, WDICT_ID, DATA) VALUES ( 0, 0, 0, 0, 'Журнал продажи алкоголя', '', 25, NULL);
    ID,
+
    PARENT_ID,
+
    DOC_TYPE,
+
    STATUS,
+
    AGENT_ID,
+
    DOCNUM,
+
    DOCDATE,
+
    CAPTION,
+
    RGUID,
+
    INSERTDT,
+
    POSTDT,
+
    AUDIT_ID,
+
    VNUM,
+
    VSHIFT,
+
    CREATER,
+
    OWNER,
+
    COMMITDATE,
+
    SDOC_TYPE,
+
    DOC_BASE_TYPE,
+
    SAGENT,
+
    SCREATER,
+
    SOWNER,
+
    CHECKDATA,
+
    SUMMA,
+
    SUMMA_O,
+
    SUM_NDSO,
+
    CALCSUMMA,
+
    SUMM1,
+
    SUMM2,
+
    SUMM3,
+
    SUMM4,
+
    COMMITSESSION_ID,
+
    DOC_VTYPE,
+
    CURRENCY_ID,
+
    CURRENCY_CAPTION,
+
    PRICE_TYPE,
+
    PRICE_TYPE_CAPTION,
+
    BASE_AGENT_ID,
+
    SBASE_AGENT_ID,
+
    CONTRACT_ID,
+
    LINK_ID,
+
    MAKE_ID,
+
    SUMMA_MAKE_CASH,
+
    COMMITDATE_TEXT,
+
    DEVICE_NUM,
+
    SELL_STATUS,
+
    DOC_PAY_DATE,
+
    CASH_DOC_PAYED,
+
    MMBSH,
+
    SUM_DSC,
+
    VIRTUAL_SUMMA,
+
    AGENT_CONTRACT_CAPTION,
+
    BASE_TYPE,
+
    SUM_NDSR,
+
    COMMENTS,
+
    EGAIS_NUM,
+
    EGAIS_ID,
+
    EGAIS_UNITTYPE,
+
    EGAIS_STATUS,
+
    EGAIS_STATUS_TEXT)
+
AS
+
select
+
docs.ID,
+
docs.PARENT_ID,
+
docs.DOC_TYPE,
+
docs.STATUS,
+
docs.AGENT_ID,
+
docs.DOCNUM,
+
docs.DOCDATE,
+
iif(docs.DOC_TYPE in (3,9),(select caption from doc_types where id=docs.DOC_TYPE)||' №'||iif(docs.VNUM is null,0,docs.VNUM),docs.CAPTION),
+
docs.RGUID,
+
docs.INSERTDT,
+
docs.POSTDT,
+
docs.AUDIT_ID,
+
docs.VNUM,
+
docs.VSHIFT,
+
docs.CREATER,
+
docs.OWNER,
+
docs.COMMITDATE,
+
dt.caption as sdoc_type,
+
dt.base_type as doc_base_type,
+
a.caption as sagent,
+
(select username from users where id=docs.creater) as screater,
+
(select username from users where id=docs.owner) as sowner,
+
docs.CHECKDATA,
+
iif(docs.doc_type=36 and docs.status in (0,2),(select sum(da.summa) from doc_detail_active da where da.doc_id=docs.id),docs.summa),
+
iif(docs.doc_type=36 and docs.status in (0,2),(select sum(da.summa_o) from doc_detail_active da where da.doc_id=docs.id),docs.summa_o),
+
docs.sum_ndso,
+
docs.CALCSUMMA,
+
docs.SUMM1,
+
docs.SUMM2,
+
docs.SUMM3,
+
docs.SUMM4,
+
docs.commitsession_id,
+
dt.vtype,
+
docs.currency_id,
+
(select caption from currencies where id=docs.currency_id),
+
docs.price_type,
+
(select caption from price_types where id=docs.price_type),
+
docs.BASE_AGENT_ID,
+
(select caption from agents where id=docs.BASE_AGENT_ID),
+
docs.contract_id,
+
docs.link_id,
+
docs.make_id,
+
(select abs(sum(cd.summa)) from cash_docs cd where cd.doc_id = docs.id and cd.status = 1),
+
cast(docs.commitdate as varchar(255)),
+
docs.DEVICE_NUM,
+
(select status from doc_hw where doc_id = docs.id and table_id = 0 and doc_type = 0),
+
docs.doc_pay_date,
+
(select sum(coalesce(summa,0)) from cash_doc_detail where doc_id = docs.id),
+
(select membership from PR_MEMBERSHIPS('CASH_DOCS=' || docs.id || ';',ascii_char(13)||ascii_char(10),1)),
+
docs.SUM_DSC,
+
iif(dt.base_type=1,summa_o,iif(dt.base_type=5,summ2,abs(docs.summa))),
+
ac.caption,
+
dt.base_type,
+
docs.SUM_NDSR,
+
docs.COMMENTS,
+
docs.EGAIS_NUM,
+
docs.EGAIS_ID,
+
docs.EGAIS_UNITTYPE,
+
docs.EGAIS_STATUS,
+
(select out_text from PR_GET_EGAIS_STATUS(docs.EGAIS_STATUS))
+
from
+
docs
+
left join doc_types dt on docs.doc_type=dt.id
+
left join agents a on docs.agent_id=a.id
+
left join sessions s on docs.audit_id=s.id
+
left join agents_contracts ac on docs.agents_contract_id = ac.id
+
where docs.id>0;
+
  
 +
 +
INSERT INTO GROUPS (ID, PARENT_ID, CAPTION, GROUPTABLE, STATUS, INSERTDT, SYSTEMFLAG, DESCRIPTION, IMAGEINDEX, DATA, COLOR, SORTING, BASE_AGENT_ID, PACKET, SID) VALUES (-20, -8, 'Алкоголь', 'PARTS.NAME_ID', 0, '30-DEC-2015 14:41:25.011', 1, NULL, -1, NULL, 16777088, 8, 0, 6379, NULL);
 +
 +
 +
INSERT INTO GROUPS (ID, PARENT_ID, CAPTION, GROUPTABLE, STATUS, INSERTDT, SYSTEMFLAG, DESCRIPTION, IMAGEINDEX, DATA, COLOR, SORTING, BASE_AGENT_ID, PACKET, SID) VALUES (-21, -20, 'Пиво', 'PARTS.NAME_ID', 0, '30-DEC-2015 14:41:43.135', 1, NULL, -1, NULL, 516088, 8, 0, 6393, NULL);
 +
</PRE>
 +
 +
==Склейка партий==
 +
в менеджере ТМС перед авторизацией пользователя изменить запрос ищущий партии для склейки на подобный(или добавить нужные поля вручную - объём, содержание спирта...)
 +
<PRE>
 +
Select  count(part_id),sname,base_agent_id,price, docagent,capacity, sum(quant) as quant
 +
from VW_WAREBASE
 +
      where quant <> 0
 +
      group by sname,base_agent_id,price, docagent,capacity
 +
      having count(part_id)>1
 +
</PRE>
 +
 +
==ТМС проверки новых накладных от ЕГАИС==
 +
ТМС - вспомогательные - добавить новую ТМС "Проверить накладные"
 +
<nowiki>
 +
uses                                                                                                           
 +
  Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Messages, SysUtils,
 +
  ToolWin, ImgList, dxExEdtr, dxCntner, dxTL, dxDBCtrl, dxDBGrid, StdCtrls,
 +
  unMain,DB, IBQuery, IBDatabase, unDM, DBTables, cfdxUtils, Menus, System,
 +
  Buttons, ExtCtrls, StdCtrls, cfSelectEdit,need,
 +
  gb_table, Grids, ClipBrd, DBGrids, unFrameCustomDict, cfWindows;
 +
 +
var qWork: TIBQuery;
 +
    tmRefresh: TTimer;
 +
    m: TMemo;                                     
 +
                                       
 +
procedure ShowData;                                   
 +
var docnum: string;
 +
begin
 +
  try
 +
  qWork:=dm.TempQuery(nil);                   
 +
  try
 +
    //m.Clear;
 +
    if qWork.Transaction.Active then qWork.Transaction.Rollback;
 +
    qWork.Transaction.StartTransaction;
 +
    qWork.Active:=false;
 +
    qWork.SQL.Text:='select list(docnum) as docnum from docs where status=2 and doc_type = 40';
 +
    qWork.Active:=true;
 +
    docnum:=qWork.FieldByName('docnum').AsString;
 +
    if trim(docnum)<>'' then
 +
    begin
 +
      m.Color:=$008080FF;
 +
      frmManagerXP2.LogIt('Внимание, новые накладные ЕГАИС № '+trim(docnum)+#13#10+'Откройте отложенные документы из журнала.');
 +
    end
 +
    else
 +
      m.Color:=clWhite;
 +
  except                                                                                                       
 +
  //  ShowMessage(GLEM);
 +
  end;
 +
  finally
 +
    qWork.Free;
 +
  end;
 +
end;
 +
 +
procedure tmRefreshTimer;
 +
begin
 +
  ShowData;
 +
end;
 +
 +
begin
 +
m:=frmManagerXP2.FindComponent('mmLog');
 +
//m.Font.Name:='Verdana';
 +
//m.Font.Color:=clBlack;
 +
//m.Color:=$008080FF;
 +
ShowData;
 +
tmRefresh:=TTimer.Create(application);
 +
tmRefresh.Interval:=10000;
 +
tmRefresh.OnTimer:='tmRefreshTimer';
 +
end;
 +
</nowiki>
 +
 +
==Вызов ТМС проверки накладных==
 +
ТМС - События - После авторизации пользователя. В коде ХХХ это номер ТМС, созданной в предыдущем пункте
 +
<pre>
 +
uses
 +
  Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Messages, SysUtils,
 +
  ToolWin, ImgList, dxExEdtr, dxCntner, dxTL, dxDBCtrl, dxDBGrid, StdCtrls,
 +
  unMain,DB, IBQuery, IBDatabase, unDM, DBTables, cfdxUtils, Menus, System,
 +
  Buttons, ExtCtrls, StdCtrls, cfSelectEdit,need,
 +
  gb_table, Grids, ClipBrd, DBGrids, unFrameCustomDict, cfWindows, Unit1; 
 +
 +
var
 +
  mainForm: TForm1;
 +
begin
 +
  frmManagerXp2.RunTms(ХХХ,application);
 +
  if dm.IsReg = false then
 +
  begin
 +
    MainForm := TForm1.Create(Application);
 +
    MainForm.ShowModal;
 +
  end;
 +
end;
 +
</pre>
 +
 +
==Настройка Менеджера==
 +
Перезапустить Менеджер:
 +
1. в сервис - параметры системы - Настройка ЕГАИС указать адрес сервера ЕГАИС и идентификатор;
 +
2. в сервис - параметры системы - автоматизация отключить "Приводить наименования к существующим" и "Приводить наименования через глобальный справочник" (!!!ТОЛЬКО ДЛЯ ПРОДУКТОВ!!!).
 +
 +
==Сетки==
 +
Прикрепленный файл  [[Файл:Сетки_ЕГАИС.zip]]
 +
 +
==Проверить УТМ (универсальный транспортный модуль)==
 +
Переходим по ссылке на web страницу УТМ, например http://egais:8080/, смотрим версию модуля, версия должна быть '''не ниже 2.0.1''', если ниже, это значит, что УТМ тестовый.
 +
 +
[[Файл:ЕГАИС_версия_УТМ.png|Версия УТМ]]
 +
 +
==Проверка==
 +
Запустить Менеджер - Инструменты - ЕГАИС Менеджер - Настройки - Перепроверить идентификаторы всех ТТН. После этого нажать "Проверить ТТН". Ошибок быть не должно
 +
 +
[[Файл:Проверка_ИД_ТТН_ЕГАИС.png|Проверка существующих ТТН]]
 +
 +
Теги: ЕГАИС, УТМ, универсальный транспортный модуль
 +
 +
=Модификация ЕГАИС для общепита=
 +
Для организаций, реализующих алкоголь "на разлив", по требованию законодательства, необходимо в журнале продажи алкоголя фиксировать факт вскрытия упаковки.
 +
Данные отправлять в ЕГАИС не нужно, поэтому у таких клиентов на алкогольную продукцию стоит системная группа -21 "Пиво".
 +
Особенности заполнения журнала реализованы через процедуру PR_EGAIS_DETAIL_OBSHEPIT, которая вызывается при проведении документа,
 +
полный скрипт [[Файл:Модификация_ЕГАИС_для_общепита.txt]] обновления прилагается.
 +
 +
 +
=Проблемы при продаже алкоголя=
 +
при отбитии пивного чека бывает ошибка, где написано java и регулярное выражение, например {d+\10} ... и т.п.<br>
 +
в конце этого сообщения пишется поле, которое не прошло проверку правильности данных. варианты:<br>
 +
KP - неправильно указан КПП в параметрах системы <br>
 +
IN - неправильно указан ИНН в параметрах системы<br>
 +
EAN - неправильно указан шк изготовителя<br>
 +
BK - неправильно просканирован акциз (скорей всего маленький квадратик вместо основного)<br>
 +
значение Value  состоит только из цифр - не тот штрихкод отсканировали, на акцизе два штрихкода, один маленький, другой большой, пусть закроют пальцем маленький и сканируют большой, в нём должны быть цифры и латинские буквы!!! <br> пример ошибки
 +
<PRE>
 +
java.lang.IllegalArgumentException: org.xml.sax.SAXParseException; cvc-pattern-valid: Value '133-103995646074040516326020775185' is not facet-valid with respect to pattern '\d\d[a-zA-Z0-9]{21}\d[0-1]\d[0-3]\d{10}[a-zA-Z0-9]{31}' for type 'BK'
 +
</PRE>
 +
CODE - не указан код вида продукции egais_product_vcode<br>
 +
скорее всего не заполнено поле EGAIS_PRODUCT_VCODE  - код вида продукции... значит товар был оприходован вручную, а не через ЕГАИС, надо заполнить соответсвенно справочника - в интернете легко найти - искать код вида продукции алкоголь
 +
 +
* достаточно часто стала вылезать при продаже ошибка - не удалось отправить данные в ЕГАИС - скорее всего подвис модуль УТМ - лучший вариант перезагрузить компьютер с УТМ, либо попробовать службу рестартануть, но както не всегда она поднимается
 +
* для заполнения кодов вида продукции удобно воспользоватся фильтром в менеджере
 +
<PRE>
 +
((wb.mmbsh like ('%-21=%')) or (wb.mmbsh like ('%-20=%')) ) and (trim(wb.egais_product_vcode) = '' or (wb.egais_product_vcode is null))
 +
</PRE>
 +
* если не отправляются запросы в егаис, и в ЕГАИС менеджере есть только отправка запроса, но нет ответов - надо перезапустить службу УТМ, подвисла, или перезагрузить компьютер с УТМ либо если не помогает можно посмотретьнастройки брэндмауэра на компьютере с УТМ
 +
* если попросят добавить дату розлива в алкогольных магазинах, используем колонку DATESERT
 +
 +
*если при проведении документа прихода алкоголя выходит ошибка "Conversion error from string "несколько цифр через запятую" At procedure 'PR_DOC_PRIHOD_COMMIT_RECURSE'..."
 +
изменяем в процедурах PR_NEW_PART и PR_DOC_PRIHOD_COMMIT_RECURSE тип переменной egais_id на DM_TEXT
 +
 +
*если в отчёт продажи алкоголя попадают товары не алкоголя
 +
<PRE>
 +
в процедуре PR_DOC_COMMIT
 +
заменить строки после exception EX_WRONGDOC_BASE_TYPE на
 +
/* nicky edit */
 +
if (exists (select * from docs d where d.id = :doc_id and d.doc_type in (3, 9))) then
 +
  begin
 +
    insert into egais_detail (doc_detail_id, egais_barcode, producer_inn, producer_kpp) select dd.id, dda.egais_barcode, dda.producer_inn, dda.producer_kpp
 +
      from doc_detail dd join doc_detail_active dda on dd.doc_id = dda.doc_id and dd.part_id = dda.part_id
 +
      join vw_warebase wb on dd.part_id = wb.part_id
 +
      where dd.doc_id = :doc_id and (char_length(dda.EGAIS_BARCODE) > 0 or (wb.MMBSH containing '-21={') );
 +
  end
 +
/* nicky edit end*/
 +
</PRE>
 +
 +
и выполнить скрипт очистки уже попавших товаров
 +
<PRE>
 +
delete from egais_detail ed1
 +
where ed1.doc_detail_id in
 +
(select dd.id
 +
from egais_detail ed
 +
left join vw_doc_detail dd on dd.id = ed.doc_detail_id
 +
left join vw_docs d on d.id = dd.doc_id
 +
left join vw_warebase wb on wb.part_id = dd.part_id
 +
      where not(char_Length(ed.egais_barcode) > 1)
 +
      and not ((dd.mmbsh like '%-21={%') or (dd.mmbsh like '%-20={%'))
 +
      )
 +
</PRE>
 +
 +
=Частые вопросы по ЕГАИС=
 +
 +
==При отбитии чека выходит сообщение с ошибкой на английском==
 +
В новых версиях кассира сделаны необходимые проверки при добавлении товара в чек, но на всякий случай приводим примеры ошибок от УТМ и что они означают.
 +
* IN - ругается на ИНН, указанный в реквизитах предприятия
 +
* KPP - ругается на КПП, указанный в реквизитах предприятия
 +
* BK - ругается на двумерный штрихкод акциза
 +
* CODE - у какой то позиции не проставлен код вида продукции
 +
* EAN - проблема со штрихкодом производителя
 +
* duplicate - каким то образом в чеке две позиции с одинаковым акцизом
 +
* 50 или 51 - проблема в ккм с печатью qr кода
 +
* ошибка отправки данных - утм не включен
 +
 +
==Алкоголь при добавлении в чек не запрашивает акциз==
 +
Проверьте, что на данной позиции стоит группа 20 Алкоголь.
 +
 +
==При добавлении пива запрашивает акциз, а его нет==
 +
Проверьте, что на данной позиции стоит группа 21 Алкоголь / Пиво, а не группа 20.
 +
 +
==Нужно продать старую бутылку в обход ЕГАИС==
 +
Нужно снять с нее группы 20 и 21.
 +
 +
==У клиента в одной базе два предприятия: ИП и ООО. Какие реквизиты заполнять в реквизитах организации==
 +
В параметрах нужно указывать реквизиты того предприятия, которое торгует алкоголем. Обычно это ООО.
 +
 +
==Что делать если кассир выдает ошибку отправки данных в ЕГАИС без каких либо подробностей==
 +
Скорей всего УТМ не включен. Проверьте УТМ набрав путь к нему в адресной строке браузера или нажмите проверить ттн в менеджере.
 +
 +
==Что делать пытались пробить бутылку но не получилось и бутылку отдали не пробив по программе==
 +
Чтобы выровнять остатки по прорамме, пусть пробивают чек, а акциз сканируют с другой такойже бутылки. если такой бутылки нет, пусть сканируют акциз с другой бутылки.
 +
Адекватным клиентам, можно показать как сохранять акцизы в блокнот (но таких единицы). Конечно, сама ситуация неправильная, но это это лучший выход из нее.
 +
Чтобы таких случаев не было, в есть различные проверки.
 +
 +
==Что делать если на сайте ЕГАИС не совсем корректные остатки==
 +
РАР будет использовать информацию об остатках при проверке деятельности магазинов только с 1.01.2017.
 +
 +
==Будет ли работать ЕГАИС если нет интернета==
 +
Если в точке нет интернета, егаис всеравно будет работать, данные будут сохраняться в утм, qr коды будут печататься, но если их отсканировать и перейти на сайт - там будет пусто. Главное чтобы утм была включена и работала. Когда интернет появится, утм сама синхронизируется с РАР. После этого данные появятся на сайте егаис. Без интернета можно работать 3 дня.
 +
 +
==Что делать если в чеке над qr кодом пишется неверное название магазина==
 +
В егаис при продаже нужно передавать название магазина. Кассир берет его из параметров системы, реквизиты организации, название торговой точки там может стоять ИП какое нибудь (их первое предприятие). Клиентов пугает, что у них выходит ИП вместо ООО. В качестве временного решения предлагаю менять реквизиты, перезапускаем кассира и печатает в чеках нормально, но потом у клиента эти реквизиты выходят в печатных формах и ценниках.
 +
 +
==При продаже алкоголя ругается на штрихкода изготовителя==
 +
Проверьте правильность штрихкода (с бутылки сканируется именно те цифры, какие записаны в программе). Если штрихкода в программе не забит и на бутылке его нет, вставьте локальный штрихкод.
 +
 +
==Ошибка 50 или 51==
 +
Если при продаже алкоголя выходит незавершенка и пишет ошибку 50 или 51 некорретные данные - это значит проблема не в отправке данных, а непосредственно при печати qr кода кассовым аппаратом.
 +
Делаем проверку - в настройках оставляем галочку отправлять данные в егаис, но при этом ставим еще галочку не печатать qr код. Если чек выходит, значит проблема или с тем, что ккм не поддерживает печатать кодов или нужно объяснить прошивку. В крайнем случае оставляем все как есть и объясняем клиенту, что РАР разрешил на время переходного периода не печатать qr код если печатается ссылка, говорим что в ближайшее время исправим эту ситуацию и сообщаем о таких клиентах отделу внедрения.<br>
 +
Ещё данная ошибка может быть с следующем случае - ККМ старая, перепрошита под ЕГАИС<br>
 +
старые аппараты не могут печатать большие изображения<br>
 +
в options.ini под нужным предприятием добавляем строки<br>
 +
атол (быстро):<br>
 +
1_QR_Height (100)<br>
 +
1_QR_Scale (300)<br>
 +
<br>
 +
атол (медленно):<br>
 +
1_QRSlow_BmpScale (7)<br>
 +
1_QRSlow_Scale (7)<br>
 +
<br>
 +
штрих (быстро):<br>
 +
2_QR_DotSize (7)<br>
 +
<br>
 +
штрих (медленно):<br>
 +
2_QRSlow_BmpScale (7)<br>
 +
быстро - средствами ККМ, медленно - как графический объект
 +
 +
==Почему в чеке несколько бутылок с алкоголем, а qr код распечатался один==
 +
1 чек - 1 qr код. Если перейти по ссылке, то отобразится информация по всем позициям в чеке.
 +
 +
==Должны ли печататься qr коды при продаже пива==
 +
РАР отменил пивные чеки, т.е. непосредственно при продаже информация в егаис не уходит. В конце дня нужно делать "акт списания из торгового зала со второго регистра" из менеджера, в котором будут все эти продажи.
 +
 +
==Как отпускать алкоголь в общепитах==
 +
От общепита РАР требует только данные по приходу ТТН. Непосредственно при продаже в ЕГАИС ничего отправлять не нужно. Нужно только вести журнал по алкоголю.
 +
 +
==Как сделать возврат поставщику по ЕГАИС==
 +
Открыть журнал документов, встать на проведеннный приход по ттн, нажать на кнопку "сделать возврат" на панели, где находятся и другие кнопки, относящиеся к ЕГАИС. Затем проставить нужное количество и отправить. Не пытайтесь вручную создать расходный документ "возврат по ЕГАИС", добавить в него позиции и провести - это неправильно.
 +
 +
==Где можно посмотреть какой запрос был отправлен в ЕГАИС==
 +
Таблица EGAIS_REQUESTS. Тело запроса будет в колонке QUERY_DATA, а ответ в REPLY_DATA.
 +
 +
==Почему клиент сканирует QR код, переходит на сайт, а там пусто==
 +
Обычно данные появляются на сайте в течении 5 минут после продажи, но могут быть задержки. Я лично был свидетелем, когда после покупки в Красном и Белом данные появились только через полчаса.
 +
 +
==Почему на сайте в информации о чеке неверно отображается дата чека==
 +
Проблема решается обновлением версии кассира.
 +
 +
==Что делать если акт на самом деле принят, но в журнале документов отображается, что не принят?==
 +
В начальных версиях егаис-менеджера была ошибка, что если по ТТН отправляют повторный акт по уже принятой накладной и УТМ по этому запросу возвращает отрицательный ответ (т.к. ттн уже подтверждена), то менеджер меняет в базе статус с принятого на отклонён. Это можно исправить спомощью процедуры:
 +
<pre>
 
SET TERM ^ ;
 
SET TERM ^ ;
  
create or alter procedure PR_GET_ADDRESS_ID (
+
create or alter procedure PR_CHECK_TTN_ACCEPTED
    COUNTRY_ID DM_ID_NULL,
+
    REGION_ID DM_ID_NULL,
+
    DESCRIPTION DM_TEXT_BIG)
+
 
returns (
 
returns (
     ID DM_ID_NULL)
+
     DOC_ID_OUT bigint)
 
as
 
as
 +
declare variable DOC_ID DM_ID;
 +
declare variable EGAIS_ID DM_UUID;
 +
declare variable C DM_STATUS;
 
begin
 
begin
 +
for select D.ID,
 +
            D.EGAIS_ID
 +
    from DOCS D
 +
    where D.DOC_TYPE = 40
 +
          and D.EGAIS_STATUS = 2
 +
    into :DOC_ID,
 +
          :EGAIS_ID
 +
do
 +
begin
 +
  C = 0;
 +
  select first 1 count(*)
 +
  from EGAIS_REQUESTS R
 +
  where 1 = 1
 +
        and R.EGAIS_ID = :EGAIS_ID
 +
        and R.REPLY_DATA containing '<tc:Conclusion>Accepted</tc:Conclusion>'
 +
  into C;
 +
  if (C > 0) then
 +
  begin
 +
  select :DOC_ID
 +
  from RDB$DATABASE
 +
  into :DOC_ID_OUT;
 +
  update DOCS D
 +
  set D.EGAIS_STATUS = 1
 +
  where D.ID = :DOC_ID;
 +
  suspend;
 +
  end
 +
end
 +
end^
  
  if ((select id from addr_vals where id = :country_id) is null) then
+
SET TERM ; ^
    insert into addr_vals (id, vtype, svalue) values (:country_id, 0, :country_id);
+
  if ((select id from addr_vals where id = :region_id) is null) then
+
    insert into addr_vals (id, vtype, svalue) values (:region_id, 1, :region_id);
+
  
   select id from addrs where country_id = :country_id and region_id = :region_id and addresstext = :description into :id;
+
/* Following GRANT statetements are generated automatically */
   if (id is null) then
+
 
    insert into addrs (country_id, region_id, addresstext) values (:country_id, :region_id, :description) returning id into :id;
+
GRANT SELECT,UPDATE ON DOCS TO PROCEDURE PR_CHECK_TTN_ACCEPTED;
 +
GRANT SELECT ON EGAIS_REQUESTS TO PROCEDURE PR_CHECK_TTN_ACCEPTED;
 +
 
 +
/* Existing privileges on this procedure */
 +
 
 +
GRANT EXECUTE ON PROCEDURE PR_CHECK_TTN_ACCEPTED TO SYSDBA;
 +
</pre>
 +
Если каким то образом получилось, что в егаис накладная принята, но в базе нет данных запросов и она там неподтверждена, то ее можно подтвердить вручную спомощью запроса:
 +
<pre>
 +
update docs d set d.egais_status=1 where d.doc_id=:doc_id;
 +
</pre>
 +
==Ошибка при принятии накладной: "Не удалось найти ЕГАИС идентификатор ТТН. Принятие отменено."==
 +
[[Файл:ЕГАИС_ошибка_при_принятии_накладной.png]]
 +
 
 +
Заходим во входящие запросы, выполняем "запросить данные". Находим строку, на которую ругается ЕГАИС, например, с нужным нам [[Waybill/2701]], и удаляем эту строку.
 +
После чего заходим в личный кабинет ЕГАИС и заново запрашиваем накладную
 +
 
 +
==Что делать с зависшими накладными==
 +
Если на ТТН уже пришел акт подтверждения, а в модуле ЕГАИС они по прежнему висят, то нужно сделать следующее. В таблице EGAIS_REQUESTS нужно отфильтровать ТТН по статусу. У зависших накладных статус будет 0 или null. Далее у этих ТТН нужно поменять статус на 1.
 +
 
 +
==Ошибка "Продукция не поступала в магазин по поштучному учету==
 +
Проверить подтверждена ли накладная,не было ли акта расхождения, проверить есть ли эта акцизная марка в ТТН и проверить дату поступления ТТН.
 +
Если дата очень свежая - возможно сервер ЕГАИС еще не зафиксировал акцизную марку на 3 регистре и нужно подождать некоторое время.
 +
 
 +
==Не подгружаются страна и производитель импортных напитков==
 +
выполнить скрипт ниже
 +
[[Файл:ЕГАИС_справочник_производителей.txt]]
 +
 
 +
=ЕГАИС 3.0=
 +
Обновить версию менеджера на ManagerXP2_273_55(20180301_112227).exe и выше. При запуске менеджера добавляется таблица EGAIS_DETAIL_BARCODES, генератор GEN_EGAIS_DETAIL_BARCODES_ID, триггер EGAIS_DETAIL_BARCODES_BI.<br>
 +
Далее добавить процедуру PR_EGAIS_BARCODES_COMMIT
 +
<pre>
 +
SET TERM ^ ;
 +
 
 +
create or alter procedure PR_EGAIS_BARCODES_COMMIT (
 +
    DDA_ID DM_ID,
 +
    PART_ID DM_ID,
 +
    DD_ID DM_ID_NULL)
 +
as
 +
begin
 +
   update egais_detail_barcodes set dda_id = 0, doc_detail_id = :dd_id, part_id = :part_id, commitdate = current_timestamp where dda_id = :dda_id;
 +
end^
 +
 
 +
SET TERM ; ^
 +
 
 +
/* Following GRANT statetements are generated automatically */
 +
 
 +
GRANT SELECT,UPDATE ON EGAIS_DETAIL_BARCODES TO PROCEDURE PR_EGAIS_BARCODES_COMMIT;
 +
 
 +
/* Existing privileges on this procedure */
 +
 
 +
GRANT EXECUTE ON PROCEDURE PR_EGAIS_BARCODES_COMMIT TO SYSDBA;
 +
</pre>
 +
 
 +
В процедуре PR_DOC_CANCEL добавить строку в конце
 +
<pre>
 +
--удаление акцизных марок по doc_id
 +
    delete from egais_detail_barcodes where doc_id = :doc_id;
 +
--
 +
</pre>
 +
 
 +
 
 +
В процедуре PR_DOC_DETAIL_INSERT добавить строку в конце
 +
<pre>
 +
-- проводим ЕГАИС марки
 +
  execute procedure PR_EGAIS_BARCODES_COMMIT(:ACTIVE_ID, :PART_ID, :NEW_ID);
 +
</pre>
 +
 
 +
Процедуру PR_EDITCUSTOMDOC меняем полностью
 +
<pre>
 +
SET TERM ^ ;
 +
 
 +
create or alter procedure PR_EDITCUSTOMDOC (
 +
    DOC_ID type of DM_ID,
 +
    SESSION_ID type of DM_ID,
 +
    RGUID type of DM_RGUID)
 +
returns (
 +
    CUR_DOC_ID type of DM_ID)
 +
as
 +
declare variable DDA_ID DM_ID_NULL;
 +
declare variable VNUM type of DM_ID_NULL;
 +
declare variable DOC_TYPE type of DM_ID;
 +
declare variable DOC_BASE_TYPE type of DM_ID;
 +
declare variable DOC_STATUS type of DM_STATUS;
 +
declare variable DOC_AGENT_ID type of DM_ID;
 +
declare variable DOCNUM type of DM_TEXT;
 +
declare variable DOC_CAPTION type of DM_TEXT;
 +
declare variable BASE_AGENT_ID integer;
 +
declare variable DOCDATE type of DM_DATETIME;
 +
declare variable EGAIS_NUM DM_TEXT;
 +
declare variable EGAIS_ID DM_TEXT;
 +
declare variable EGAIS_UNITTYPE DM_TEXT;
 +
declare variable EGAIS_STATUS DM_STATUS;
 +
begin
 +
  select d.doc_type, d.status, dt.base_type, dt.caption, d.docnum, d.docdate, d.agent_id, d.vnum, d.base_agent_id, EGAIS_NUM, EGAIS_ID, EGAIS_UNITTYPE, EGAIS_STATUS from docs d left join doc_types dt on d.doc_type=dt.id where d.id=:doc_id
 +
    into :doc_type, :doc_status, :doc_base_type, :doc_caption, :docnum, :docdate, :doc_AGENT_ID,:vnum, :BASE_AGENT_ID, :EGAIS_NUM, :EGAIS_ID, :EGAIS_UNITTYPE, :EGAIS_STATUS;
 +
 
 +
   if (doc_type is null) then exception EX_CANTFINDDOC_ID;
 +
  if (doc_status in (0,-2,2)) then exception EX_WRONGDOCSTATUS;
 +
  if (doc_base_type=3) then exception EX_WRONGDOC_BASE_TYPE;
 +
--  if (doc_agent_id <= 0) then exception EX_WRONG_AGENT;
 +
  cur_doc_id=gen_id(gen_docs_id,1);
 +
  insert into docs (ID,PARENT_ID,DOC_TYPE,STATUS,AGENT_ID,RGUID,AUDIT_ID,DOCNUM,DOCDATE,DELETED_DOC_ID, BASE_AGENT_ID, EGAIS_NUM, EGAIS_ID, EGAIS_UNITTYPE, EGAIS_STATUS)
 +
    values (:cur_doc_id,0,:DOC_TYPE,0,:doc_AGENT_ID,:RGUID,:session_ID,:DOCNUM,:DOCDATE,:DOC_ID, :BASE_AGENT_ID, :EGAIS_NUM, :EGAIS_ID, :EGAIS_UNITTYPE, :EGAIS_STATUS);
 +
  -- Обновление номера документа на старое значение
 +
  UPDATE docs set vnum = :vnum, caption=:doc_caption || ' №' || :vnum  where id = :cur_doc_id;
 +
 
 +
  if (doc_base_type=1) then --приход
 +
  begin
 +
  if (doc_status=1) then --
 +
  begin
 +
    insert into DOC_DETAIL_ACTIVE (doc_id,part_id,quant,summa,discount,koef,sum_dsc,sum_ndso, doc_detail_id)
 +
      select :cur_doc_id,part_id,quant,summa,discount,0,sum_dsc,sum_ndso, id from doc_detail where doc_id=:doc_id;
 +
    update DOC_DETAIL_ACTIVE dda set dda.part_id=iif((select count(*) from doc_detail where part_id = dda.part_id) > 1,dda.part_id,0) where dda.doc_id=:cur_doc_id;
 +
    update egais_detail_barcodes edb set part_id = 0, doc_detail_id = 0, doc_id = :cur_doc_id,
 +
      dda_id = (select id from doc_detail_active where doc_id = :cur_doc_id and doc_detail_id = edb.doc_detail_id) where doc_id = :doc_id;
 +
  end
 +
  else
 +
  begin
 +
    if (doc_status=-1) then
 +
    begin
 +
      insert into DOC_DETAIL_ACTIVE (doc_id,part_id,quant,summa,discount,koef,sum_dsc)
 +
        select :cur_doc_id,part_id,quant,summa,discount,0,sum_dsc from doc_detail_deleted where doc_id=:doc_id;
 +
      --update DOC_DETAIL_ACTIVE set part_id=0 where doc_id=:cur_doc_id;
 +
      update DOC_DETAIL_ACTIVE dda set dda.part_id=iif((select count(*) from doc_detail where part_id = dda.part_id) > 1,dda.part_id,0) where dda.doc_id=:cur_doc_id;
 +
    end
 +
  end
 +
  end
 +
  else if ((doc_base_type=2) or (doc_base_type=7)) then  --расход
 +
  begin
 +
    if (doc_status=1) then
 +
    begin
 +
      insert into doc_detail_active (doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,koef,sum_dsc, doc_detail_id)
 +
        select :cur_doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,1,sum_dsc, id from doc_detail where doc_id=:doc_id;
 +
      update egais_detail_barcodes edb set doc_detail_id = 0, doc_id = :cur_doc_id,
 +
        dda_id = (select id from doc_detail_active where doc_id = :cur_doc_id and doc_detail_id = edb.doc_detail_id) where doc_id = :doc_id;
 +
    end
 +
    else
 +
    begin
 +
      if (doc_status=-1) then
 +
      begin
 +
        insert into doc_detail_active (doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,koef,sum_dsc)
 +
          select :cur_doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,1,sum_dsc from doc_detail_deleted where doc_id=:doc_id;
 +
      end
 +
    end
 +
  end
  
 
   suspend;
 
   suspend;
end
+
end^
^
+
 
 
SET TERM ; ^
 
SET TERM ; ^
  
 
/* Following GRANT statetements are generated automatically */
 
/* Following GRANT statetements are generated automatically */
  
GRANT SELECT,INSERT ON ADDR_VALS TO PROCEDURE PR_GET_ADDRESS_ID;
+
GRANT SELECT,INSERT,UPDATE ON DOCS TO PROCEDURE PR_EDITCUSTOMDOC;
GRANT SELECT,INSERT ON ADDRS TO PROCEDURE PR_GET_ADDRESS_ID;
+
GRANT SELECT ON DOC_TYPES TO PROCEDURE PR_EDITCUSTOMDOC;
 +
GRANT SELECT,INSERT,UPDATE ON DOC_DETAIL_ACTIVE TO PROCEDURE PR_EDITCUSTOMDOC;
 +
GRANT SELECT ON DOC_DETAIL TO PROCEDURE PR_EDITCUSTOMDOC;
 +
GRANT SELECT,UPDATE ON EGAIS_DETAIL_BARCODES TO PROCEDURE PR_EDITCUSTOMDOC;
 +
GRANT SELECT ON DOC_DETAIL_DELETED TO PROCEDURE PR_EDITCUSTOMDOC;
  
 
/* Existing privileges on this procedure */
 
/* Existing privileges on this procedure */
  
GRANT EXECUTE ON PROCEDURE PR_GET_ADDRESS_ID TO SYSDBA;
+
GRANT EXECUTE ON PROCEDURE PR_EDITCUSTOMDOC TO STANDART;
 +
GRANT EXECUTE ON PROCEDURE PR_EDITCUSTOMDOC TO SYSDBA;
 +
</pre>
  
INSERT INTO DOC_TYPES (ID, CAPTION, INSERTDT, BASE_TYPE, STATINI, REPORTS, VTYPE)
+
Вьюха VW_WAREBASE
              VALUES (40, 'ТТН ЕГАИС', null, 1, '[XML]
+
<pre>
enabled=1
+
EGAIS_BARCODE
caption=Печать пакета документов прихода
+
как
tmplpath=prihod.xml
+
(select coalesce('Количество акциз: '||sum(quant), '') from egais_detail_barcodes where part_id = wb.part_id and dda_id = 0)
askbefore=1
+
</pre>
  
[freereport]
+
Вьюха VW_DOC_DETAIL_ACTIVE
enabled=1
+
<pre>
caption=Печать пакета документов прихода
+
EGAIS_BARCODE
tmplpath=prihod.cffr3
+
как
 +
( (select 'Кол-во: '||count(egais_barcode) from egais_detail_barcodes where ((dda_id = da.id) and (dda_id > 0)) ) || ' / ' ||
 +
    (select 'Неверных: '||count(egais_barcode) from egais_detail_barcodes where ((dda_id = da.id) and (dda_id > 0)) and alccode <> da.egais_alccode) )
 +
</pre>
  
[dbf]
+
Вьюха VW_DOC_DETAIL
inipath=dbf.ini
+
<pre>
 +
EGAIS_BARCODE
 +
как
 +
(select coalesce('Количество акциз: '||sum(quant), '') from egais_detail_barcodes where part_id = dt.part_id and doc_id = dt.doc_id)
 +
</pre>
  
[CSV]
+
Вьюха VW_WAREBASEPARTS
inipath=dbf.ini
+
<pre>
quotestrings=1
+
EGAIS_BARCODE
separator=#9
+
как
headers=1', ' [XML]
+
(select coalesce('Количество акциз: '||sum(quant), '') from egais_detail_barcodes where part_id = wb.part_id and dda_id = 0)
enabled=1
+
</pre>
caption=Печать пакета документов прихода
+
tmplpath=prihod.xml
+
askbefore=1
+
  
[freereport]
+
<pre> Настроить в сетках поля egais_alccode и EGAIS_BARCODE </pre>
enabled=1
+
caption=Печать пакета документов прихода
+
tmplpath=prihod.cffr
+
  
;''doc_id=:doc_id:'';''doc_detail=:doc_detail:''', 1);
+
Далее переходим в Параметры Системы, Настройки ЕГАИС, выставляем параметры версия акта ТТН и проверку алкокода.
  
INSERT INTO GROUPS (ID, PARENT_ID, CAPTION, GROUPTABLE, STATUS, INSERTDT, SYSTEMFLAG, DESCRIPTION, IMAGEINDEX, DATA, COLOR, SORTING, BASE_AGENT_ID)
+
[[Файл:Версия акта ттн.jpg]]
            VALUES (-10, -4, 'ЕГАИС оптовики', 'AGENTS', 0, null, 1, NULL, -1, NULL, NULL, NULL, 0);
+
 
 +
[[Файл:Проверка алкогода.jpg]]
 +
 
 +
=Помарочная инвентаризация=
 +
* Инструкция для пользователя [[файл:ПОМАРОЧНАЯ_ИНВЕНТАРИЗАЦИЯ_АЛКОГОЛЬНОЙ_ПРОДУКЦИИ.docx]]
 +
* Предупредить пользователя, что бы на время ревизии не делали продаж по алкоголю
 +
* Обновить менеджер до версии не ниже ManagerXP2_273_64
 +
* Выполнить скрипт [[файл:СкриптПомарочная.txt]]
 +
* Обновить тмс \\vnedrenie\Obmen\EGAIS_SKLAD\ЕГАИС ТМС.TXT
 +
* Перед завершением ревизии проверить фильтр в остатках в базе.  Отражает список партий, по которым не было сканировано ни одной акцизки
 +
<pre>
 +
quant<>0
 +
and not exists (select  i.id from inv_barcodes_detail i where i.part_id=wB.part_id)
 +
and mmbsh containing '-20' and mmbsh not containing 'кред'
 
</pre>
 
</pre>
 +
Если позиции есть в этом фильтре, то такой товар нужно списать документов "ЕГАИС списание со склада" либо найти товар и внести его в ревизию.
 +
* Перед завершением ревизии проверить фильтр в помарочной инвентаризации. 
 +
<pre>
 +
part_id=0;
 +
quant_bae<0;
 +
</pre>
 +
 +
 +
=Как отменить ЕГАИС списание(виртуальный)=
 +
 +
В таблице egais_requests по полю egais_id (= id документа списания из docs) находим в поле reply_data значение FSRAR_ID <br>
 +
select * from egais_requests where  egais_id='127122'<br>
 +
<tc:RegID>WOF-0069733024</tc:RegID><br>
 +
Далее в Менеджере заходим в ЕГАИС -> Запрос на отмену проведения акта списания с баланса<br>
 +
[[Файл:егаис.jpg]] <br>
 +
 +
 +
Далее вводим номер документа  WOF-0069733024<br>
 +
 +
 +
[[Файл:егаис3.png]]<br>
  
==Настройка Меенеджера==
+
Отправить
В Менеджере - сервис - параметры системы - Настройка ЕГАИС
+
указать адрес сервера ЕГАИС и идентификатор
+

Текущая версия на 12:47, 12 августа 2021

Содержание

Настройка jacarta-ключа

Предварительно нужно установить Единый клиент джакарты Медиа:Получение_КЭП_для_ЕГАИС.docx

Установка или обновление сертификата для jacarta-ключа

Медиа:Обновление_сертификата_для_jacarta.doc


Установка Этап 1 (выполняется для ВСЕХ клиентов)

Установить процедуру PR_ALTER_VIEW

PR_ALTER_VIEW

Заменить версию Менеджера

Для скриптов ниже актуальная версия Менеджера ManagerXP2_272_62(20160321_155233) кассира zkassa 2.2.1.22.exe

Выполнить скрипт (для всех)

SET TERM ^ ;
/*создание доменов если их нет*/
execute procedure PR_ALTER_VIEW('DM_ID_NULL','','BIGINT','DOMAIN');^
execute procedure PR_ALTER_VIEW('DM_ID','','BIGINT NOT NULL','DOMAIN');^
execute procedure PR_ALTER_VIEW('DM_STATUS','','INTEGER','DOMAIN');^
execute procedure PR_ALTER_VIEW('DM_DATETIME','','TIMESTAMP','DOMAIN');^
execute procedure PR_ALTER_VIEW('DM_TEXT1024','','VARCHAR(1024) CHARACTER SET WIN1251 COLLATE WIN1251','DOMAIN');^
execute procedure PR_ALTER_VIEW('DM_DOUBLE','','DOUBLE PRECISION','DOMAIN');^
execute procedure PR_ALTER_VIEW('DM_ID_NULL','','BIGINT','DOMAIN');^
execute procedure PR_ALTER_VIEW('DM_ID_NULL','','BIGINT','DOMAIN');^

/*не относится к ЕГАИС*/
execute procedure PR_ALTER_VIEW('DOC_DETAIL','FIO_ID','DM_ID_NULL','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL','FIO_BOLNOY_ID','DM_ID_NULL','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL','TYPE_LGOTA','DM_ID_NULL','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL','RECEPT','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','SUM_NDSR','DM_DOUBLE','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL','SUM_NDSR','DM_DOUBLE','TABLE');^
execute procedure PR_ALTER_VIEW('DOCS','FIO_ID','DM_ID_NULL','TABLE');^
execute procedure PR_ALTER_VIEW('DOCS','SUM_NDSR','DM_DOUBLE','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL','SUM_NDSR','DM_DOUBLE','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','MOTHERPART_UUID','DM_UUID_NULL','TABLE');^
execute procedure PR_ALTER_VIEW('PARTS','MOTHERPART_UUID','DM_UUID_NULL','TABLE');^
execute procedure PR_ALTER_VIEW('VALS','D$UUID','DM_UUID_NULL','TABLE');^
execute procedure PR_ALTER_VIEW('VALS','L_ID','DM_ID_NULL','TABLE');^

execute procedure PR_ALTER_VIEW('AGENTS','EGAIS_ID','DM_UUID_NULL','TABLE');^
execute procedure PR_ALTER_VIEW('DOCS','EGAIS_NUM','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('DOCS','EGAIS_ID','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('DOCS','EGAIS_UNITTYPE','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('DOCS','EGAIS_STATUS','DM_STATUS','TABLE');^

execute procedure PR_ALTER_VIEW('PARTS','EGAIS_ID','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_REGID','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_BREGID','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_ALCCODE','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_QUANT','DM_DOUBLE','TABLE');^
execute procedure PR_ALTER_VIEW('PARTS','CAPACITY','DM_DOUBLE','TABLE');^
execute procedure PR_ALTER_VIEW('PARTS','ALC_VOLUME','DM_DOUBLE','TABLE');^
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_PRODUCER_ID','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_BARCODE','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_TYPE','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('PARTS','PRODUCER_INN','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('PARTS','PRODUCER_KPP','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('PARTS','BOTTLINGDATE','DM_DATETIME','TABLE');^
execute procedure PR_ALTER_VIEW('PARTS','EGAIS_PRODUCT_VCODE','DM_TEXT','TABLE');^

execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_ID','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_BREGID','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_REGID','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_ALCCODE','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_PRODUCT_VCODE','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','CAPACITY','DM_DOUBLE','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','ALC_VOLUME','DM_DOUBLE','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_PRODUCER_ID','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_QUANT','DM_DOUBLE','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_BARCODE','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','EGAIS_TYPE','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','PRODUCER_INN','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','PRODUCER_KPP','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('DOC_DETAIL_ACTIVE','BOTTLINGDATE','DM_DATETIME','TABLE');^

set term ; ^

/******************************************************************************/
/***               Generated by IBExpert 22.11.2019 11:21:53                ***/
/******************************************************************************/

/******************************************************************************/
/***      Following SET SQL DIALECT is just for the Database Comparer       ***/
/******************************************************************************/
SET SQL DIALECT 3;



/******************************************************************************/
/***                                 Tables                                 ***/
/******************************************************************************/


CREATE GENERATOR GEN_EGAIS_REQUESTS_ID;

CREATE TABLE EGAIS_REQUESTS (
    ID           DM_ID NOT NULL /* DM_ID = BIGINT */,
    REPLY_ID     DM_TEXT /* DM_TEXT = VARCHAR(250) */,
    REPLY_URL    DM_TEXT1024 /* DM_TEXT1024 = VARCHAR(1024) */,
    QUERY_TYPE   DM_STATUS /* DM_STATUS = INTEGER */,
    QUERY_URL    DM_TEXT /* DM_TEXT = VARCHAR(250) */,
    QUERY_DATA   DM_BLOBBIN /* DM_BLOBBIN = BLOB SUB_TYPE 0 SEGMENT SIZE 80 */,
    REPLY_DATA   DM_BLOBBIN /* DM_BLOBBIN = BLOB SUB_TYPE 0 SEGMENT SIZE 80 */,
    STATUS       DM_STATUS /* DM_STATUS = INTEGER */,
    INSERT_DATE  DM_DATETIME /* DM_DATETIME = TIMESTAMP */,
    REPLY_DATE   DM_DATETIME /* DM_DATETIME = TIMESTAMP */,
    EGAIS_ID     DM_TEXT1024 /* DM_TEXT1024 = VARCHAR(1024) */,
    QUERY_OUT    DM_TEXT1024 /* DM_TEXT1024 = VARCHAR(1024) */,
    USER_ID      DM_ID_NULL /* DM_ID_NULL = BIGINT */
);




/******************************************************************************/
/***                              Primary keys                              ***/
/******************************************************************************/

ALTER TABLE EGAIS_REQUESTS ADD CONSTRAINT PK_EGAIS_REQUESTS PRIMARY KEY (ID);


/******************************************************************************/
/***                                Indices                                 ***/
/******************************************************************************/

CREATE INDEX EGAIS_REQUESTS_IDX1 ON EGAIS_REQUESTS (REPLY_ID);


/******************************************************************************/
/***                                Triggers                                ***/
/******************************************************************************/



SET TERM ^ ;



/******************************************************************************/
/***                          Triggers for tables                           ***/
/******************************************************************************/



/* Trigger: EGAIS_REQUESTS_BI */
CREATE OR ALTER TRIGGER EGAIS_REQUESTS_BI FOR EGAIS_REQUESTS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_egais_REQUESTS_id,1);
  if (new.insert_date is null) then
    new.insert_date = 'now';
end
^


/* Trigger: EGAIS_REQUESTS_BU0 */
CREATE OR ALTER TRIGGER EGAIS_REQUESTS_BU0 FOR EGAIS_REQUESTS
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  if (new.reply_url <> '') then
    new.reply_date = 'now';
end
^

SET TERM ; ^



/******************************************************************************/
/***                          Fields descriptions                           ***/
/******************************************************************************/

COMMENT ON COLUMN EGAIS_REQUESTS.QUERY_TYPE IS 
'1 - синхронизация контрагентов
2 - акт принятия ТТН
3 - акт отказа от ТТН
4 - акт расхождения по ТТН';



/******************************************************************************/
/***                               Privileges                               ***/
/******************************************************************************/

Выполнить скрипт (для фармы не обязательно)

SET TERM ^ ;
execute procedure PR_ALTER_VIEW('','','GEN_EGAIS_REQUESTS_ID','generator');^

/*таблица EGAIS_PRODUCERS*/
EXECUTE BLOCK AS BEGIN
if (not exists(select 1 from rdb$relations where rdb$relation_name = 'EGAIS_PRODUCERS')) then
execute statement 'CREATE TABLE EGAIS_PRODUCERS(ID DM_ID NOT NULL);';
END^

execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','INN','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','KPP','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','FULLNAME','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','SHORTNAME','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','COUNTRY','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','POSTINDEX','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','REGIONCODE','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','DESCRIPTION','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','CITY','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','STREET','DM_TEXT','TABLE');^

execute procedure PR_ALTER_VIEW('EGAIS_PRODUCERS','ID','EGAIS_PRODUCERS_IDX1','INDEX');^

/* таблица EGAIS_REQUESTS*/
EXECUTE BLOCK AS BEGIN
if (not exists(select 1 from rdb$relations where rdb$relation_name = 'EGAIS_REQUESTS')) then
execute statement 'CREATE TABLE EGAIS_REQUESTS (ID  DM_ID NOT NULL);';
END^

execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','REPLY_ID','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','REPLY_URL','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','QUERY_TYPE','DM_STATUS','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','QUERY_URL','DM_TEXT','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','QUERY_DATA','DM_BLOBBIN','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','REPLY_DATA','DM_BLOBBIN','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','STATUS','DM_STATUS','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','INSERT_DATE','DM_DATETIME','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','REPLY_DATE','DM_DATETIME','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','EGAIS_ID','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','QUERY_OUT','DM_TEXT1024','TABLE');^

execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','ID','','PRIMARY KEY');^
execute procedure PR_ALTER_VIEW('EGAIS_REQUESTS','REPLY_ID','EGAIS_REQUESTS_IDX1','index');^

/* Trigger: EGAIS_REQUESTS_BI */
CREATE OR ALTER TRIGGER EGAIS_REQUESTS_BI FOR EGAIS_REQUESTS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_egais_REQUESTS_id,1);
  if (new.insert_date is null) then
    new.insert_date = 'now';
end;^

/* Trigger: EGAIS_REQUESTS_BU0 */
CREATE OR ALTER TRIGGER EGAIS_REQUESTS_BU0 FOR EGAIS_REQUESTS
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  if (new.reply_url <> '') then
    new.reply_date = 'now';
end;^

create or alter procedure PR_NEW_PART (
    DOC_ID type of DM_ID,
    PARENT_ID type of DM_ID,
    WARE_ID type of DM_UUID_NULL,
    PRICE type of DM_DOUBLE,
    PRICE_O type of DM_DOUBLE,
    PRICE_Z type of DM_DOUBLE,
    PRICE_R type of DM_DOUBLE,
    QUANT type of DM_DOUBLE,
    BARCODE type of DM_TEXT,
    BARCODE1 type of DM_TEXT,
    DEP type of DM_ID,
    GODENDO type of DM_DATETIME,
    SERIA type of DM_TEXT,
    NDS type of DM_DOUBLE,
    SUM_NDSO type of DM_DOUBLE,
    SERT type of DM_TEXT,
    DATESERT type of DM_DATETIME,
    KEMVSERT type of DM_TEXT,
    SDSERT type of DM_DATETIME,
    REGN type of DM_TEXT,
    NGTD type of DM_TEXT,
    EDIZM type of DM_TEXT,
    NAC type of DM_DOUBLE,
    MOTHERPART_ID type of DM_ID,
    PART_TYPE DM_STATUS,
    BASE_AGENT_ID DM_ID,
    SKLAD_ID type of DM_TEXT,
    CONTRACT_ID DM_ID,
    DOC_DETAIL_ACTIVE_ID DM_ID,
    GROUP_ID DM_ID,
    MOTHERPART_UUID DM_UUID_NULL = 0,
    EGAIS_ID DM_TEXT = null,
    EGAIS_REGID DM_TEXT1024 = null,
    EGAIS_BREGID DM_TEXT1024 = null,
    EGAIS_ALCCODE DM_TEXT1024 = null,
    EGAIS_QUANT DM_DOUBLE = 0,
    CAPACITY DM_DOUBLE = 0,
    ALC_VOLUME DM_DOUBLE = 0,
    EGAIS_PRODUCER_ID DM_TEXT1024 = null,
    EGAIS_BARCODE DM_TEXT1024 = null,
    EGAIS_TYPE DM_TEXT = null,
    PRODUCER_INN DM_TEXT1024 = null,
    PRODUCER_KPP DM_TEXT1024 = null,
    BOTTLINGDATE DM_DATETIME = null,
    EGAIS_PRODUCT_VCODE DM_TEXT = null)
returns (
    P_ID type of DM_ID)
as
begin
  p_id=gen_id(gen_parts_id,1);
  insert into parts
    (ID,parent_id,doc_id,WARE_ID,PRICE,PRICE_O,PRICE_Z,PRICE_R,QUANT,BARCODE,BARCODE1,DEP,/*KRITK,*/GODENDO,SERIA,NDS,SUM_NDSO,SERT,DATESERT,KEMVSERT,SDSERT,REGN,NGTD,
    EDIZM,NAC,motherpart_id,sklad_id,part_type,BASE_AGENT_ID,contract_id, doc_detail_active_id, group_id, motherpart_uuid,
    EGAIS_ID, EGAIS_BREGID, EGAIS_REGID, EGAIS_ALCCODE, EGAIS_QUANT, CAPACITY, ALC_VOLUME, EGAIS_PRODUCER_ID, EGAIS_BARCODE,
    EGAIS_TYPE, PRODUCER_INN, PRODUCER_KPP, BOTTLINGDATE, EGAIS_PRODUCT_VCODE)
  values
    (:p_id,:parent_id,:doc_id,:WARE_ID,:PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE,:BARCODE1,:DEP,/*:KRITK,*/:GODENDO,:SERIA,:NDS,:SUM_NDSO,:SERT,:DATESERT,:KEMVSERT,
    :SDSERT,:REGN,:NGTD,:EDIZM,:NAC,:motherpart_id,:sklad_id,:part_type,:BASE_AGENT_ID,:contract_id,:doc_detail_active_id, :group_id, :motherpart_uuid,
    :EGAIS_ID, :EGAIS_BREGID, :EGAIS_REGID, :EGAIS_ALCCODE, :EGAIS_QUANT, :CAPACITY, :ALC_VOLUME, :EGAIS_PRODUCER_ID, :EGAIS_BARCODE,
    :EGAIS_TYPE, :PRODUCER_INN, :PRODUCER_KPP, :BOTTLINGDATE, :EGAIS_PRODUCT_VCODE);
  suspend;
end;^

GRANT INSERT ON PARTS TO PROCEDURE PR_NEW_PART;^

GRANT EXECUTE ON PROCEDURE PR_NEW_PART TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;^
GRANT EXECUTE ON PROCEDURE PR_NEW_PART TO "PUBLIC";^
GRANT EXECUTE ON PROCEDURE PR_NEW_PART TO STANDART;^
GRANT EXECUTE ON PROCEDURE PR_NEW_PART TO SYSDBA;^

create or alter procedure PR_GET_EGAIS_STATUS (
    ID DM_STATUS)
returns (
    OUT_TEXT DM_TEXT1024)
as
begin
  if ( (id is null) or (id = 0) )  then out_text = 'Не установлен';
  else if (id = 1) then out_text = 'Акт принятия принят';
  else if (id = 2) then out_text = 'Акт принятия отклонен';
  else if (id = 3) then out_text = 'Акт отказа принят';
  else if (id = 4) then out_text = 'Акт отказа отклонен';
  else if (id = 5) then out_text = 'Акт расхождений принят';
  else if (id = 6) then out_text = 'Акт расхождений отклонен';
  else out_text = 'Неизвестный статус';

  suspend;
end;^

create or alter procedure PR_INSTALL_COMMIT_RECURSE
as
begin

  if ((select
    count(1)
    from rdb$procedure_parameters pp
    where 1=1
    and pp.rdb$procedure_name='PR_DOC_DETAIL_INSERT'
    and pp.rdb$parameter_name='SUM_NDSR')=0 ) then
  EXECUTE STATEMENT ('
   create or alter procedure PR_DOC_PRIHOD_COMMIT_RECURSE (
        DOC_ID type of DM_ID,
        DOC_PARENT_ID type of DM_ID,
        PART_PARENT_ID type of DM_ID,
        DOC_COMMITDATE type of DM_DATE,
        CONTRACT_ID DM_ID)
    as
    declare variable PART_ID type of DM_ID;
    declare variable WARE_ID type of DM_UUID_NULL;
    declare variable SNAME type of DM_TEXT;
    declare variable SIZG type of DM_TEXT;
    declare variable SCOUNTRY type of DM_TEXT;
    declare variable ORIG_CODE type of DM_TEXT;
    declare variable SORIG_NAME type of DM_TEXT;
    declare variable SORIG_IZG type of DM_TEXT;
    declare variable SORIG_COUNTRY type of DM_TEXT;
    declare variable BARCODE type of DM_TEXT;
    declare variable Z_ID type of DM_ID;
    declare variable SKLAD_ID DM_TEXT;
    declare variable PRICE type of DM_DOUBLE;
    declare variable PRICE_O type of DM_DOUBLE;
    declare variable PRICE_Z type of DM_DOUBLE;
    declare variable PRICE_R type of DM_DOUBLE;
    declare variable QUANT type of DM_DOUBLE;
    declare variable BARCODE1 type of DM_TEXT;
    declare variable DEP type of DM_ID;
    declare variable KRITK type of DM_DOUBLE;
    declare variable GODENDO type of DM_DATETIME;
    declare variable SERIA type of DM_TEXT;
    declare variable NDS type of DM_DOUBLE;
    declare variable SUM_NDSO type of DM_DOUBLE;
    declare variable SERT type of DM_TEXT;
    declare variable DATESERT type of DM_DATETIME;
    declare variable KEMVSERT type of DM_TEXT;
    declare variable SDSERT type of DM_DATETIME;
    declare variable REGN type of DM_TEXT;
    declare variable NGTD type of DM_TEXT;
    declare variable EDIZM type of DM_TEXT;
    declare variable PARENT_ID type of DM_ID;
    declare variable SUMMA type of DM_DOUBLE;
    declare variable SUMMA_O type of DM_DOUBLE;
    declare variable DISCOUNT type of DM_DOUBLE;
    declare variable ACTIVE_ID type of DM_ID;
    declare variable NAC type of DM_DOUBLE;
    declare variable DOC_DETAIL_ID type of DM_ID;
    declare variable MOTHERPART_ID type of DM_ID;
    declare variable BCODE_IZG type of DM_TEXT;
    declare variable HUMAN_QUANT type of DM_TEXT;
    declare variable SUM_DSC type of DM_DOUBLE;
    declare variable DCARD type of DM_TEXT;
    declare variable PART_TYPE DM_STATUS;
    declare variable BASE_AGENT_ID DM_ID;
    declare variable GROUP_ID DM_ID;
    declare variable MAKE_ID DM_ID_NULL;
    declare variable MNN DM_TEXT;
    declare variable MOTHERPART_UUID DM_UUID_NULL;
    declare variable EGAIS_ID DM_TEXT;
    declare variable EGAIS_BREGID DM_TEXT1024;
    declare variable EGAIS_REGID DM_TEXT1024;
    declare variable EGAIS_ALCCODE DM_TEXT1024;
    declare variable CAPACITY DM_DOUBLE;
    declare variable ALC_VOLUME DM_DOUBLE;
    declare variable EGAIS_PRODUCER_ID DM_TEXT1024;
    declare variable EGAIS_QUANT DM_DOUBLE;
    declare variable EGAIS_BARCODE DM_TEXT1024;
    declare variable EGAIS_TYPE DM_TEXT;
    declare variable PRODUCER_INN DM_TEXT1024;
    declare variable PRODUCER_KPP DM_TEXT1024;
    declare variable BOTTLINGDATE DM_DATETIME;
    declare variable EGAIS_PRODUCT_VCODE DM_TEXT;
    begin
    --whithout SUM_NDSR
    for
    select
    /*ware_id*/  sname,sizg,scountry,orig_code,sorig_name,sorig_izg,sorig_country,barcode,z_id,sklad_id,
    /*part_id*/  PRICE,PRICE_O,PRICE_Z,PRICE_R,QUANT,BARCODE1,/*KRITK,*/GODENDO,SERIA,NDS,SUM_NDSO,SERT,DATESERT,KEMVSERT,SDSERT,REGN,NGTD,EDIZM,
    PARENT_ID,DISCOUNT,SUMMA,summa_o, id, part_id, nac, doc_detail_id, motherpart_id, dep, bcode_izg, human_quant, SUM_DSC, dcard,
    part_type, BASE_AGENT_ID, group_id, make_id, mnn, motherpart_uuid,
    EGAIS_ID, EGAIS_BREGID, EGAIS_REGID, EGAIS_ALCCODE, CAPACITY, ALC_VOLUME, EGAIS_PRODUCER_ID, EGAIS_QUANT, EGAIS_BARCODE,
    EGAIS_TYPE, PRODUCER_INN, PRODUCER_KPP, BOTTLINGDATE, EGAIS_PRODUCT_VCODE
    from doc_detail_active where doc_id=:doc_id and part_parent_id=:doc_parent_id
    into
    :sname,:sizg,:scountry,:orig_code,:sorig_name,:sorig_izg,:sorig_country,:barcode,:z_id,:sklad_id,
    :PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE1,/*:KRITK,*/:GODENDO,:SERIA,:NDS,:SUM_NDSO,:SERT,:DATESERT,:KEMVSERT,:SDSERT,:REGN,:NGTD,:EDIZM,
    :PARENT_ID,:DISCOUNT,:SUMMA,:summa_o, :active_id, :part_id, :nac, :doc_detail_id, :motherpart_id, :dep, :bcode_izg, :human_quant, :SUM_DSC, :dcard,
    :part_type, :BASE_AGENT_ID, :group_id,:make_id, :mnn, :motherpart_uuid,
    :EGAIS_ID, :EGAIS_BREGID, :EGAIS_REGID, :EGAIS_ALCCODE, :CAPACITY, :ALC_VOLUME, :EGAIS_PRODUCER_ID, :EGAIS_QUANT, :EGAIS_BARCODE,
    :EGAIS_TYPE, :PRODUCER_INN, :PRODUCER_KPP, :BOTTLINGDATE, :EGAIS_PRODUCT_VCODE
    do
    begin
    --    if ((price<0.001) or (price is null)) then exception EX_PRICE;
    if ((price<0) or (price is null)) then exception EX_PRICE;
    if (/*(price_o<0.001) or */(price_o is null)) then exception EX_PRICE_O;
    if (/*(quant<0.00001) or */(quant is null)) then exception EX_QUANT;
    if (/*(summa<0.00001) or */(summa is null)) then exception EX_SUMMA;
    if (/*(summa_o<0.00001) or */(summa_o is null)) then exception EX_SUMMA_O;
    --    if ((NDS<0.00001) or (NDS is null)) then exception EX_NDS;
    if (/*(SUM_NDSO<0) or */(SUM_NDSO is null)) then exception EX_SUM_NDSO;
    select w_id from pr_get_ware(:sname,:sizg,:scountry,:orig_code,:sorig_name,:sorig_izg,:sorig_country,:bcode_izg,:z_id,:sklad_id,:part_type,:mnn)
    into :ware_id;
    if ((part_id=0) or (part_id is NULL)) then
    select p_id from pr_new_part(:DOC_ID,:part_parent_id,:WARE_ID,:PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE,:BARCODE1,:DEP,/*:KRITK,*/:GODENDO,:SERIA,:NDS,
    :SUM_NDSO,:SERT,:DATESERT,:KEMVSERT,:SDSERT,:REGN,:NGTD,:EDIZM,:NAC,:motherpart_id, :part_type,:BASE_AGENT_ID, :sklad_id, :contract_id, :active_id, :group_id,
    :motherpart_uuid, :EGAIS_ID, :EGAIS_REGID, :EGAIS_BREGID, :EGAIS_ALCCODE, :EGAIS_QUANT, :CAPACITY, :ALC_VOLUME, :EGAIS_PRODUCER_ID, :EGAIS_BARCODE,
    :EGAIS_TYPE, :PRODUCER_INN, :PRODUCER_KPP, :BOTTLINGDATE, :EGAIS_PRODUCT_VCODE) into :part_id;
    execute procedure PR_DOC_DETAIL_INSERT(:doc_detail_id,:DOC_ID,:PART_ID,:QUANT,:DISCOUNT,:SUMMA,:summa_o,:price,:sum_ndso,:nac,:doc_commitdate,:human_quant,:SUM_DSC,:dcard,:active_id,:part_type,:make_id);
    -- обновляем членство в группах
    execute procedure PR_UPDGROUPDETAIL_ACTIVE2PARTS(:active_id,:part_id);
    -- присваиваем ценам партии
    update prices set part_id=:part_id where dda_id=:active_id;
    update or insert into prices (part_id,price_type,currency_id, price,dda_id) values (:part_id,0,0,:price,:active_id) matching (PART_ID,PRICE_TYPE);
    execute procedure PR_DOC_PRIHOD_COMMIT_RECURSE(:doc_id,:active_id,:part_id,:doc_commitdate,:contract_id);
    end
    end;

  ');

else

  EXECUTE STATEMENT ('
    create or alter procedure PR_DOC_PRIHOD_COMMIT_RECURSE (
        DOC_ID type of DM_ID,
        DOC_PARENT_ID type of DM_ID,
        PART_PARENT_ID type of DM_ID,
        DOC_COMMITDATE type of DM_DATE,
        CONTRACT_ID DM_ID)
    as
    declare variable PART_ID type of DM_ID;
    declare variable WARE_ID type of DM_UUID_NULL;
    declare variable SNAME type of DM_TEXT;
    declare variable SIZG type of DM_TEXT;
    declare variable SCOUNTRY type of DM_TEXT;
    declare variable ORIG_CODE type of DM_TEXT;
    declare variable SORIG_NAME type of DM_TEXT;
    declare variable SORIG_IZG type of DM_TEXT;
    declare variable SORIG_COUNTRY type of DM_TEXT;
    declare variable BARCODE type of DM_TEXT;
    declare variable Z_ID type of DM_ID;
    declare variable SKLAD_ID DM_TEXT;
    declare variable PRICE type of DM_DOUBLE;
    declare variable PRICE_O type of DM_DOUBLE;
    declare variable PRICE_Z type of DM_DOUBLE;
    declare variable PRICE_R type of DM_DOUBLE;
    declare variable QUANT type of DM_DOUBLE;
    declare variable BARCODE1 type of DM_TEXT;
    declare variable DEP type of DM_ID;
    declare variable KRITK type of DM_DOUBLE;
    declare variable GODENDO type of DM_DATETIME;
    declare variable SERIA type of DM_TEXT;
    declare variable NDS type of DM_DOUBLE;
    declare variable SUM_NDSO type of DM_DOUBLE;
    declare variable SUM_NDSR DM_DOUBLE;
    declare variable SERT type of DM_TEXT;
    declare variable DATESERT type of DM_DATETIME;
    declare variable KEMVSERT type of DM_TEXT;
    declare variable SDSERT type of DM_DATETIME;
    declare variable REGN type of DM_TEXT;
    declare variable NGTD type of DM_TEXT;
    declare variable EDIZM type of DM_TEXT;
    declare variable PARENT_ID type of DM_ID;
    declare variable SUMMA type of DM_DOUBLE;
    declare variable SUMMA_O type of DM_DOUBLE;
    declare variable DISCOUNT type of DM_DOUBLE;
    declare variable ACTIVE_ID type of DM_ID;
    declare variable NAC type of DM_DOUBLE;
    declare variable DOC_DETAIL_ID type of DM_ID;
    declare variable MOTHERPART_ID type of DM_ID;
    declare variable BCODE_IZG type of DM_TEXT;
    declare variable HUMAN_QUANT type of DM_TEXT;
    declare variable SUM_DSC type of DM_DOUBLE;
    declare variable DCARD type of DM_TEXT;
    declare variable PART_TYPE DM_STATUS;
    declare variable BASE_AGENT_ID DM_ID;
    declare variable GROUP_ID DM_ID;
    declare variable MAKE_ID DM_ID_NULL;
    declare variable MNN DM_TEXT;
    declare variable MOTHERPART_UUID DM_UUID_NULL;
    declare variable EGAIS_ID DM_TEXT;
    declare variable EGAIS_BREGID DM_TEXT1024;
    declare variable EGAIS_REGID DM_TEXT1024;
    declare variable EGAIS_ALCCODE DM_TEXT1024;
    declare variable CAPACITY DM_DOUBLE;
    declare variable ALC_VOLUME DM_DOUBLE;
    declare variable EGAIS_PRODUCER_ID DM_TEXT1024;
    declare variable EGAIS_QUANT DM_DOUBLE;
    declare variable EGAIS_BARCODE DM_TEXT1024;
    declare variable EGAIS_TYPE DM_TEXT;
    declare variable PRODUCER_INN DM_TEXT1024;
    declare variable PRODUCER_KPP DM_TEXT1024;
    declare variable BOTTLINGDATE DM_DATETIME;
    declare variable EGAIS_PRODUCT_VCODE DM_TEXT;
    begin
    --whith SUM_NDSR
    for
    select
    /*ware_id*/  sname,sizg,scountry,orig_code,sorig_name,sorig_izg,sorig_country,barcode,z_id,sklad_id,
    /*part_id*/  PRICE,PRICE_O,PRICE_Z,PRICE_R,QUANT,BARCODE1,/*KRITK,*/GODENDO,SERIA,NDS,SUM_NDSO,SUM_NDSR,SERT,DATESERT,KEMVSERT,SDSERT,REGN,NGTD,EDIZM,
    PARENT_ID,DISCOUNT,SUMMA,summa_o, id, part_id, nac, doc_detail_id, motherpart_id, dep, bcode_izg, human_quant, SUM_DSC, dcard,
    part_type, BASE_AGENT_ID, group_id, make_id, mnn, motherpart_uuid,
    EGAIS_ID, EGAIS_BREGID, EGAIS_REGID, EGAIS_ALCCODE, CAPACITY, ALC_VOLUME, EGAIS_PRODUCER_ID, EGAIS_QUANT, EGAIS_BARCODE,
    EGAIS_TYPE, PRODUCER_INN, PRODUCER_KPP, BOTTLINGDATE, EGAIS_PRODUCT_VCODE
    from doc_detail_active where doc_id=:doc_id and part_parent_id=:doc_parent_id
    into
    :sname,:sizg,:scountry,:orig_code,:sorig_name,:sorig_izg,:sorig_country,:barcode,:z_id,:sklad_id,
    :PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE1,/*:KRITK,*/:GODENDO,:SERIA,:NDS,:SUM_NDSO,:SUM_NDSR,:SERT,:DATESERT,:KEMVSERT,:SDSERT,:REGN,:NGTD,:EDIZM,
    :PARENT_ID,:DISCOUNT,:SUMMA,:summa_o, :active_id, :part_id, :nac, :doc_detail_id, :motherpart_id, :dep, :bcode_izg, :human_quant, :SUM_DSC, :dcard,
    :part_type, :BASE_AGENT_ID, :group_id,:make_id, :mnn, :motherpart_uuid,
    :EGAIS_ID, :EGAIS_BREGID, :EGAIS_REGID, :EGAIS_ALCCODE, :CAPACITY, :ALC_VOLUME, :EGAIS_PRODUCER_ID, :EGAIS_QUANT, :EGAIS_BARCODE,
    :EGAIS_TYPE, :PRODUCER_INN, :PRODUCER_KPP, :BOTTLINGDATE, :EGAIS_PRODUCT_VCODE
    do
    begin
    --    if ((price<0.001) or (price is null)) then exception EX_PRICE;
    if ((price<0) or (price is null)) then exception EX_PRICE;
    if (/*(price_o<0.001) or */(price_o is null)) then exception EX_PRICE_O;
    if (/*(quant<0.00001) or */(quant is null)) then exception EX_QUANT;
    if (/*(summa<0.00001) or */(summa is null)) then exception EX_SUMMA;
    if (/*(summa_o<0.00001) or */(summa_o is null)) then exception EX_SUMMA_O;
    --    if ((NDS<0.00001) or (NDS is null)) then exception EX_NDS;
    if (/*(SUM_NDSO<0) or */(SUM_NDSO is null or SUM_NDSR is null )) then exception EX_SUM_NDSO;
    select w_id from pr_get_ware(:sname,:sizg,:scountry,:orig_code,:sorig_name,:sorig_izg,:sorig_country,:bcode_izg,:z_id,:sklad_id,:part_type,:mnn)
    into :ware_id;
    if ((part_id=0) or (part_id is NULL)) then
    select p_id from pr_new_part(:DOC_ID,:part_parent_id,:WARE_ID,:PRICE,:PRICE_O,:PRICE_Z,:PRICE_R,:QUANT,:BARCODE,:BARCODE1,:DEP,/*:KRITK,*/:GODENDO,:SERIA,:NDS,
    :SUM_NDSO,:SERT,:DATESERT,:KEMVSERT,:SDSERT,:REGN,:NGTD,:EDIZM,:NAC,:motherpart_id, :part_type,:BASE_AGENT_ID, :sklad_id, :contract_id, :active_id, :group_id,
    :motherpart_uuid, :EGAIS_ID, :EGAIS_REGID, :EGAIS_BREGID, :EGAIS_ALCCODE, :EGAIS_QUANT, :CAPACITY, :ALC_VOLUME, :EGAIS_PRODUCER_ID, :EGAIS_BARCODE,
    :EGAIS_TYPE, :PRODUCER_INN, :PRODUCER_KPP, :BOTTLINGDATE, :EGAIS_PRODUCT_VCODE) into :part_id;
    execute procedure PR_DOC_DETAIL_INSERT(:doc_detail_id,:DOC_ID,:PART_ID,:QUANT,:DISCOUNT,:SUMMA,:summa_o,:price,:sum_ndso,:sum_ndsr,:nac,:doc_commitdate,:human_quant,:SUM_DSC,:dcard,:active_id,:part_type,:make_id);
    -- обновляем членство в группах
    execute procedure PR_UPDGROUPDETAIL_ACTIVE2PARTS(:active_id,:part_id);
    -- присваиваем ценам партии
    update prices set part_id=:part_id where dda_id=:active_id;
    update or insert into prices (part_id,price_type,currency_id, price,dda_id) values (:part_id,0,0,:price,:active_id) matching (PART_ID,PRICE_TYPE);
    execute procedure PR_DOC_PRIHOD_COMMIT_RECURSE(:doc_id,:active_id,:part_id,:doc_commitdate,:contract_id);
    end
    end;
  ');

end^

GRANT EXECUTE ON PROCEDURE PR_INSTALL_COMMIT_RECURSE TO SYSDBA;^

execute procedure PR_INSTALL_COMMIT_RECURSE;^

GRANT EXECUTE ON PROCEDURE PR_GET_EGAIS_STATUS TO SYSDBA;^

execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','MOTHERPART_UUID','da.motherpart_uuid');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','EGAIS_ID','EGAIS_ID');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','EGAIS_BREGID','EGAIS_BREGID');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','EGAIS_REGID','EGAIS_REGID');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','EGAIS_ALCCODE','EGAIS_ALCCODE');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','CAPACITY','CAPACITY');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','ALC_VOLUME','ALC_VOLUME');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','EGAIS_PRODUCER_ID','EGAIS_PRODUCER_ID');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL_ACTIVE','EGAIS_QUANT','EGAIS_QUANT');^

execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','MOTHERPART_UUID','p.motherpart_uuid');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','EGAIS_ID','p.EGAIS_ID');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','EGAIS_BREGID','p.EGAIS_BREGID');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','EGAIS_REGID','p.EGAIS_REGID');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','EGAIS_ALCCODE','p.EGAIS_ALCCODE');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','CAPACITY','p.CAPACITY');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','ALC_VOLUME','p.ALC_VOLUME');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','EGAIS_TTNID','d.EGAIS_ID');^
execute procedure PR_ALTER_VIEW('VW_DOC_DETAIL','EGAIS_QUANT','p.EGAIS_QUANT');^

execute procedure PR_ALTER_VIEW('VW_PARTS','EGAIS_ID','p.EGAIS_ID');^
execute procedure PR_ALTER_VIEW('VW_PARTS','EGAIS_BREGID','p.EGAIS_BREGID');^
execute procedure PR_ALTER_VIEW('VW_PARTS','EGAIS_REGID','p.EGAIS_REGID');^
execute procedure PR_ALTER_VIEW('VW_PARTS','EGAIS_ALCCODE','p.EGAIS_ALCCODE');^

execute procedure PR_ALTER_VIEW('VW_DOCS','EGAIS_NUM','docs.EGAIS_NUM');^
execute procedure PR_ALTER_VIEW('VW_DOCS','EGAIS_ID','docs.EGAIS_ID');^
execute procedure PR_ALTER_VIEW('VW_DOCS','EGAIS_UNITTYPE','docs.EGAIS_UNITTYPE');^
execute procedure PR_ALTER_VIEW('VW_DOCS','EGAIS_STATUS','docs.EGAIS_STATUS');^
execute procedure PR_ALTER_VIEW('VW_DOCS','EGAIS_STATUS_TEXT','(select out_text from PR_GET_EGAIS_STATUS(docs.EGAIS_STATUS))');^

execute procedure PR_ALTER_VIEW('VW_AGENTS','EGAIS_ID','EGAIS_ID');^

create or alter procedure PR_GET_ADDRESS_ID (
    COUNTRY_ID DM_ID_NULL,
    REGION_ID DM_ID_NULL,
    DESCRIPTION DM_TEXT_BIG)
returns (
    ID DM_ID_NULL)
as
begin
  if ((select id from addr_vals where id = :country_id) is null) then
    insert into addr_vals (id, vtype, svalue) values (:country_id, 0, :country_id);
  if ((select id from addr_vals where id = :region_id) is null) then
    insert into addr_vals (id, vtype, svalue) values (:region_id, 1, :region_id);

  select id from addrs where country_id = :country_id and region_id = :region_id and addresstext = :description into :id;
  if (id is null) then
    insert into addrs (country_id, region_id, addresstext) values (:country_id, :region_id, :description) returning id into :id;

  suspend;
end;^

GRANT SELECT,INSERT ON ADDR_VALS TO PROCEDURE PR_GET_ADDRESS_ID;^
GRANT SELECT,INSERT ON ADDRS TO PROCEDURE PR_GET_ADDRESS_ID;^

EXECUTE BLOCK AS BEGIN
if (not exists(select 1 from DOC_TYPES where ID = 40)) then
execute statement '
INSERT INTO DOC_TYPES (ID, CAPTION, INSERTDT, BASE_TYPE, STATINI, REPORTS, VTYPE)
               VALUES (40, ''ТТН ЕГАИС'', null, 1, ''[XML]
enabled=1
caption=Печать пакета документов прихода
tmplpath=prihod.xml
askbefore=1

[freereport]
enabled=1
caption=Печать пакета документов прихода
tmplpath=prihod.cffr3

[dbf]
inipath=dbf.ini

[CSV]
inipath=dbf.ini
quotestrings=1
separator=#9
headers=1'', '' [XML]
enabled=1
caption=Печать пакета документов прихода
tmplpath=prihod.xml
askbefore=1

[freereport]
enabled=1
caption=Печать пакета документов прихода
tmplpath=prihod.cffr


;''''doc_id=:doc_id:'''';''''doc_detail=:doc_detail:'''''', 1);';
END^

EXECUTE BLOCK AS BEGIN
if (not exists(select 1 from GROUPS where ID = -10)) then
execute statement '
INSERT INTO GROUPS (ID, PARENT_ID, CAPTION, GROUPTABLE, STATUS, INSERTDT, SYSTEMFLAG, DESCRIPTION, IMAGEINDEX, DATA, COLOR, SORTING, BASE_AGENT_ID)
            VALUES (-10, -4, ''ЕГАИС оптовики'', ''AGENTS'', 0, null, 1, NULL, -1, NULL, NULL, NULL, 0);
';
END^

create or alter procedure PR_EDITCUSTOMDOC (
    DOC_ID type of DM_ID,
    SESSION_ID type of DM_ID,
    RGUID type of DM_RGUID)
returns (
    CUR_DOC_ID type of DM_ID)
as
declare variable VNUM type of DM_ID_NULL;
declare variable DOC_TYPE type of DM_ID;
declare variable DOC_BASE_TYPE type of DM_ID;
declare variable DOC_STATUS type of DM_STATUS;
declare variable DOC_AGENT_ID type of DM_ID;
declare variable DOCNUM type of DM_TEXT;
declare variable DOC_CAPTION type of DM_TEXT;
declare variable BASE_AGENT_ID integer;
declare variable DOCDATE type of DM_DATETIME;
declare variable EGAIS_NUM DM_TEXT;
declare variable EGAIS_ID DM_TEXT;
declare variable EGAIS_UNITTYPE DM_TEXT;
declare variable EGAIS_STATUS DM_STATUS;
begin
  select d.doc_type, d.status, dt.base_type, dt.caption, d.docnum, d.docdate, d.agent_id, d.vnum, d.base_agent_id, EGAIS_NUM, EGAIS_ID, EGAIS_UNITTYPE, EGAIS_STATUS from docs d left join doc_types dt on d.doc_type=dt.id where d.id=:doc_id
    into :doc_type, :doc_status, :doc_base_type, :doc_caption, :docnum, :docdate, :doc_AGENT_ID,:vnum, :BASE_AGENT_ID, :EGAIS_NUM, :EGAIS_ID, :EGAIS_UNITTYPE, :EGAIS_STATUS;

  if (doc_type is null) then exception EX_CANTFINDDOC_ID;
  if (doc_status in (0,-2,2)) then exception EX_WRONGDOCSTATUS;
  if (doc_base_type=3) then exception EX_WRONGDOC_BASE_TYPE;
--  if (doc_agent_id <= 0) then exception EX_WRONG_AGENT;
  cur_doc_id=gen_id(gen_docs_id,1);
  insert into docs (ID,PARENT_ID,DOC_TYPE,STATUS,AGENT_ID,RGUID,AUDIT_ID,DOCNUM,DOCDATE,DELETED_DOC_ID, BASE_AGENT_ID, EGAIS_NUM, EGAIS_ID, EGAIS_UNITTYPE, EGAIS_STATUS)
    values (:cur_doc_id,0,:DOC_TYPE,0,:doc_AGENT_ID,:RGUID,:session_ID,:DOCNUM,:DOCDATE,:DOC_ID, :BASE_AGENT_ID, :EGAIS_NUM, :EGAIS_ID, :EGAIS_UNITTYPE, :EGAIS_STATUS);
  -- Обновление номера документа на старое значение
  UPDATE docs set vnum = :vnum, caption=:doc_caption || ' №' || :vnum  where id = :cur_doc_id;

  if (doc_base_type=1) then --приход
  begin
   if (doc_status=1) then --
   begin
     insert into DOC_DETAIL_ACTIVE (doc_id,part_id,quant,summa,discount,koef,sum_dsc,sum_ndso,sum_ndsr)
       select :cur_doc_id,part_id,quant,summa,discount,0,sum_dsc,sum_ndso,sum_ndsr from doc_detail where doc_id=:doc_id;
     update DOC_DETAIL_ACTIVE dda set dda.part_id=iif((select count(*) from doc_detail where part_id = dda.part_id) > 1,dda.part_id,0) where dda.doc_id=:cur_doc_id;
   end
   else
   begin
     if (doc_status=-1) then
     begin
       insert into DOC_DETAIL_ACTIVE (doc_id,part_id,quant,summa,discount,koef,sum_dsc)
         select :cur_doc_id,part_id,quant,summa,discount,0,sum_dsc from doc_detail_deleted where doc_id=:doc_id;
       --update DOC_DETAIL_ACTIVE set part_id=0 where doc_id=:cur_doc_id;
       update DOC_DETAIL_ACTIVE dda set dda.part_id=iif((select count(*) from doc_detail where part_id = dda.part_id) > 1,dda.part_id,0) where dda.doc_id=:cur_doc_id;
     end 
   end
  end
  else if ((doc_base_type=2) or (doc_base_type=7)) then  --расход
  begin
    if (doc_status=1) then
    begin
      insert into doc_detail_active (doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,sum_ndsr,koef,sum_dsc)
        select :cur_doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,sum_ndsr,1,sum_dsc from doc_detail where doc_id=:doc_id;
    end
    else
    begin
      if (doc_status=-1) then
      begin
        insert into doc_detail_active (doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,sum_ndsr,koef,sum_dsc)
          select :cur_doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,sum_ndsr,1,sum_dsc from doc_detail_deleted where doc_id=:doc_id;
      end
    end 
  end

  suspend;
end;^

set term ; ^

Дополнения к ЕГАИС

Если вы ставите версию менеджера 68 и выше, то нужно еще установить Скрипт дополнений к ЕГАИС.

Установка Этап 2 (выполняется для ПРОДУКТОВЫХ клиентов)

В процедуре PR_DOC_COMMIT

вставить строки после exception EX_WRONGDOC_BASE_TYPE на

/* nicky edit */
if (exists (select * from docs d where d.id = :doc_id and d.doc_type in (3, 9))) then
  begin
    insert into egais_detail (doc_detail_id, egais_barcode, producer_inn, producer_kpp) select dd.id, dda.egais_barcode, dda.producer_inn, dda.producer_kpp
      from doc_detail dd join doc_detail_active dda on dd.doc_id = dda.doc_id and dd.part_id = dda.part_id
      join vw_warebase wb on dd.part_id = wb.part_id
      where dd.doc_id = :doc_id and (char_length(dda.EGAIS_BARCODE) > 0 or (wb.MMBSH containing '-21={') );
  end
/* nicky edit end*/

во VW_WAREBASE

добавить EGAIS_PRODUCT_VCODE где источник p.EGAIS_PRODUCT_VCODE и в конце добавить left join parts p on wb.part_id = p.id

Исправить триггер DOC_DETAIL_ACTIVE_BI

1) Комментируем строки стандартного приведения

/*if (new.ware_id<0) then
begin
select goodname, goodizg, goodcountry from PR_MAKEGOODWAREVALUES(new.sname,new.sorig_name,new.sizg,new.sorig_izg,new.scountry,new.sorig_country,new.orig_code,new.id,new.part_type)
into new.sname, new.sizg,new.scountry;
end
*/
 

2) После условия if (new.part_id>0) then -- заполняем значения партии , дополняем выборку из таблицы PARTS полями

.....
motherpart_uuid,
EGAIS_ID,
EGAIS_REGID,
EGAIS_BREGID,
EGAIS_ALCCODE,
EGAIS_QUANT,
CAPACITY,
ALC_VOLUME,
EGAIS_BARCODE,
EGAIS_TYPE,
PRODUCER_INN,
PRODUCER_KPP,
BOTTLINGDATE,
EGAIS_PRODUCT_VCODE
from parts where id=new.part_id into
......
new.motherpart_uuid,
new.EGAIS_ID,
new.EGAIS_REGID,
new.EGAIS_BREGID,
new.EGAIS_ALCCODE,
new.EGAIS_QUANT,
new.CAPACITY,
new.ALC_VOLUME,
new.EGAIS_BARCODE,
new.EGAIS_TYPE,
new.PRODUCER_INN,
new.PRODUCER_KPP,
new.BOTTLINGDATE,
new.EGAIS_PRODUCT_VCODE;
 

3) В конце триггера пишем

--20160212 Приведение наименований для ЕГАИС, стандартное д.б. отключено
if ((select doc_type from docs where id = new.doc_id)=40) then
if ( (new.capacity is not null) and
     (new.bcode_izg is null or trim(new.bcode_izg) = '') and
     (select first 1 count(1) from warebase w left join parts p on p.id = w.part_id
          where (sname = new.sname or sorig_name = new.sname or sname = new.sorig_name or sorig_name = new.sorig_name) and
                (bcode_izg is not null and trim(bcode_izg) <> '') and
                (coalesce(p.capacity,0) = new.capacity) and
                (coalesce(p.egais_alccode,0) = coalesce(new.egais_alccode,0)) ) > 0
   )
  then
  begin
    select first 1 sname, name_id, bcode_izg, w.price from warebase w left join parts p on p.id = w.part_id
           where ( (sname = new.sname or sorig_name = new.sname or sname = new.sorig_name or sorig_name = new.sorig_name) and
                   (bcode_izg is not null and trim(bcode_izg) <> '') and
                   (coalesce(p.capacity,0) = new.capacity) and
                   (coalesce(p.egais_alccode,0) = coalesce(new.egais_alccode,0)) )
     into new.sname, new.name_id, new.bcode_izg, new.price;
     new.summa = new.price*new.quant;
     if (new.price_o<>0) then new.nac=(new.price-new.price_o)*100/new.price_o;
  End
 

Новый метод редактирования штрихкодов

CREATE UNIQUE INDEX WARES_IDX1 ON WARES (NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,BARCODE);
CREATE INDEX WARES_LOG_IDX_INSERTDT ON WARES_LOG (INSERTDT);

SET TERM ^ ;

create or alter procedure PR_GET_WARE (
    SNAME type of DM_TEXT,
    SIZG type of DM_TEXT,
    SCOUNTRY type of DM_TEXT,
    ORIG_CODE type of DM_TEXT,
    SORIG_NAME type of DM_TEXT,
    SORIG_IZG type of DM_TEXT,
    SORIG_COUNTRY type of DM_TEXT,
    BARCODE type of DM_TEXT,
    Z_ID type of DM_ID,
    SKLAD_ID DM_TEXT,
    ALTTYPE DM_STATUS,
    MNN DM_TEXT = '')
returns (
    W_ID type of DM_ID)
as
declare variable OLD_BARCODE DM_TEXT1024;
declare variable NAME_ID type of DM_ID;
declare variable IZG_ID type of DM_ID;
declare variable COUNTRY_ID type of DM_ID;
declare variable ORIG_NAME_ID type of DM_ID;
declare variable ORIG_IZG_ID type of DM_ID;
declare variable ORIG_COUNTRY_ID type of DM_ID;
begin
if (orig_code is null) then orig_code='';
if (barcode is null) then barcode='';
select val_id from pr_getval_id(:sname,0,:alttype,:mnn) into :name_id;
select val_id from pr_getval_id(:sizg,3,:alttype) into :izg_id;
select val_id from pr_getval_id(:scountry,2,:alttype) into :country_id;
select val_id from pr_getval_id(:sorig_name,1,:alttype) into :orig_name_id;
select val_id from pr_getval_id(:sorig_izg,6,:alttype) into :orig_izg_id;
select val_id from pr_getval_id(:sorig_country,5,:alttype) into :orig_country_id;
select id from wares where NAME_ID=:name_id and IZG_ID=:izg_id and COUNTRY_ID=:country_id and
ORIG_CODE=:orig_code and ORIG_NAME_ID=:orig_name_id and
ORIG_IZG_ID=:orig_izg_id and ORIG_COUNTRY_ID=:orig_country_id and barcode=:barcode into :w_id;
if (w_id is null) then
begin
--    exception EX_WRONG_OPER;
w_id=gen_id(gen_wares_id,1);
--w_id=UUID_TO_CHAR(GEN_UUID());
insert into wares (ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,BARCODE,Z_ID,SKLAD_ID)
values
(:W_ID,:NAME_ID,:IZG_ID,:COUNTRY_ID,:ORIG_CODE,:ORIG_NAME_ID,:ORIG_IZG_ID,:ORIG_COUNTRY_ID,:BARCODE,:Z_ID,:SKLAD_ID);
end
--else if (old_barcode <> barcode) then update wares set barcode = :barcode where id = :w_id;
suspend;
end^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT EXECUTE ON PROCEDURE PR_GETVAL_ID TO PROCEDURE PR_GET_WARE;
GRANT SELECT,INSERT ON WARES TO PROCEDURE PR_GET_WARE;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE PR_GET_WARE TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;
GRANT EXECUTE ON PROCEDURE PR_GET_WARE TO "PUBLIC";
GRANT EXECUTE ON PROCEDURE PR_GET_WARE TO STANDART;
GRANT EXECUTE ON PROCEDURE PR_GET_WARE TO SYSDBA;

SET TERM ^ ;

create or alter procedure PR_GETWARE_BY_IDS (
    NAME_ID type of DM_ID,
    IZG_ID type of DM_ID,
    COUNTRY_ID type of DM_ID,
    ORIG_CODE type of DM_TEXT,
    ORIG_NAME_ID type of DM_ID,
    ORIG_IZG_ID type of DM_ID,
    ORIG_COUNTRY_ID type of DM_ID,
    DOINSERT type of DM_STATUS,
    SEARCHINLOGS type of DM_STATUS,
    BARCODE DM_TEXT)
returns (
    WARE_ID type of DM_ID)
as
begin
  if (orig_code is null) then orig_code='';
  if (searchinlogs is null) then searchinlogs=0;
  if (searchinlogs=1) then
  begin 
    select first 1 id from wares_log where name_id=:name_id and izg_id=:izg_id and country_id=:country_id and
      orig_code=:orig_code and orig_name_id=:orig_name_id and orig_izg_id=:orig_izg_id and orig_country_id=:orig_country_id
      and barcode=:barcode order by insertdt desc
      into :ware_id;
      if ((select id from wares where id = :ware_id) is null) then ware_id = null;
  end
  else
  begin
    select id from wares where name_id=:name_id and izg_id=:izg_id and country_id=:country_id and
      orig_code=:orig_code and orig_name_id=:orig_name_id and orig_izg_id=:orig_izg_id and orig_country_id=:orig_country_id
      and barcode=:barcode
      into :ware_id;
  end
  if ((ware_id is null) and (DOINSERT=1) and (searchinlogs<>1)) then
  begin
    ware_id=gen_id(gen_wares_id,1);
--    ware_id=UUID_TO_CHAR(GEN_UUID());
    insert into wares (ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_CODE,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,Z_ID,SKLAD_ID, barcode)
     values
       (:ware_id,:NAME_ID,:IZG_ID,:COUNTRY_ID,:ORIG_CODE,:ORIG_NAME_ID,:ORIG_IZG_ID,:ORIG_COUNTRY_ID,0,'',:barcode);
  end

  suspend;
end^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT ON WARES_LOG TO PROCEDURE PR_GETWARE_BY_IDS;
GRANT SELECT,INSERT ON WARES TO PROCEDURE PR_GETWARE_BY_IDS;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE PR_GETWARE_BY_IDS TO PROCEDURE PR_MAKEGOODWAREVALUES;
GRANT EXECUTE ON PROCEDURE PR_GETWARE_BY_IDS TO PROCEDURE PR_UPDATEWARE;
GRANT EXECUTE ON PROCEDURE PR_GETWARE_BY_IDS TO PROCEDURE PR_UPDATEWARE4PART;
GRANT EXECUTE ON PROCEDURE PR_GETWARE_BY_IDS TO STANDART;
GRANT EXECUTE ON PROCEDURE PR_GETWARE_BY_IDS TO SYSDBA;

Update params p set p.param_value = '1' where p.param_id ='BCODE_IZG_EDIT_MODE';

Update params p set p.param_value = 'Нет' where p.param_id ='ELNAKL_MAKE_LOCAL_GN';
Update params p set p.param_value = 'Нет' where p.param_id ='ELNAKL_MAKE_GLOBAL_GN';

установка журнала продажи алкоголя

после выполнения скрипта расположенного ниже - поместить в таблице REPORTS в отчёт - журнал продажи алкоголя в поле data содержимое файла otch_alko.txt из архива Медиа:Alko.zip также в таблице groups поместить в поле data в строку Пиво содержимое файла groups_pivo.TXT из того же архива и в строку Алкоголь файл groups_alko.TXT

CREATE OR ALTER VIEW VW_ALKO(
    ID,
    DOC_TYPE,
    CAPTION,
    DOCDATE,
    EGAIS_BARCODE,
    SNAME,
    ORIG_CODE,
    CAPACITY,
    QUANT)
AS
select d.id, d.doc_type, d.caption, d.docdate, ed.egais_barcode as egais_barcode, dd.sname, p.EGAIS_PRODUCT_VCODE, dd.capacity, iif(ed.egais_barcode='-',dd.quant,-1)
from egais_detail ed
left join vw_doc_detail dd on dd.id = ed.doc_detail_id
left join vw_docs d on d.id = dd.doc_id
left join parts p on dd.part_id = p.id
where d.doc_type = 3 or d.doc_type = 9
;


INSERT INTO REPORTS ( PARENT_ID, STATUS, REPORTTYPE, SORTING, CAPTION, PARAMS, WDICT_ID, DATA) VALUES ( 0, 0, 0, 0, 'Журнал продажи алкоголя', '', 25, NULL);


INSERT INTO GROUPS (ID, PARENT_ID, CAPTION, GROUPTABLE, STATUS, INSERTDT, SYSTEMFLAG, DESCRIPTION, IMAGEINDEX, DATA, COLOR, SORTING, BASE_AGENT_ID, PACKET, SID) VALUES (-20, -8, 'Алкоголь', 'PARTS.NAME_ID', 0, '30-DEC-2015 14:41:25.011', 1, NULL, -1, NULL, 16777088, 8, 0, 6379, NULL);


INSERT INTO GROUPS (ID, PARENT_ID, CAPTION, GROUPTABLE, STATUS, INSERTDT, SYSTEMFLAG, DESCRIPTION, IMAGEINDEX, DATA, COLOR, SORTING, BASE_AGENT_ID, PACKET, SID) VALUES (-21, -20, 'Пиво', 'PARTS.NAME_ID', 0, '30-DEC-2015 14:41:43.135', 1, NULL, -1, NULL, 516088, 8, 0, 6393, NULL);

Склейка партий

в менеджере ТМС перед авторизацией пользователя изменить запрос ищущий партии для склейки на подобный(или добавить нужные поля вручную - объём, содержание спирта...)

Select  count(part_id),sname,base_agent_id,price, docagent,capacity, sum(quant) as quant
from VW_WAREBASE
      where quant <> 0
      group by sname,base_agent_id,price, docagent,capacity
      having count(part_id)>1

ТМС проверки новых накладных от ЕГАИС

ТМС - вспомогательные - добавить новую ТМС "Проверить накладные"

uses                                                                                                            
  Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Messages, SysUtils,
  ToolWin, ImgList, dxExEdtr, dxCntner, dxTL, dxDBCtrl, dxDBGrid, StdCtrls,
  unMain,DB, IBQuery, IBDatabase, unDM, DBTables, cfdxUtils, Menus, System,
  Buttons, ExtCtrls, StdCtrls, cfSelectEdit,need,
  gb_table, Grids, ClipBrd, DBGrids, unFrameCustomDict, cfWindows;

var qWork: TIBQuery;
    tmRefresh: TTimer;
    m: TMemo;                                       
                                         
procedure ShowData;                                     
var docnum: string;
begin
  try
  qWork:=dm.TempQuery(nil);                    
  try
    //m.Clear;
    if qWork.Transaction.Active then qWork.Transaction.Rollback;
    qWork.Transaction.StartTransaction;
    qWork.Active:=false;
    qWork.SQL.Text:='select list(docnum) as docnum from docs where status=2 and doc_type = 40';
    qWork.Active:=true;
    docnum:=qWork.FieldByName('docnum').AsString;
    if trim(docnum)<>'' then
    begin
      m.Color:=$008080FF;
      frmManagerXP2.LogIt('Внимание, новые накладные ЕГАИС № '+trim(docnum)+#13#10+'Откройте отложенные документы из журнала.');
    end
    else
      m.Color:=clWhite;
  except                                                                                                        
  //  ShowMessage(GLEM);
  end;
  finally
    qWork.Free;
  end;
end;

procedure tmRefreshTimer;
begin
   ShowData;
end;

begin
 m:=frmManagerXP2.FindComponent('mmLog');
 //m.Font.Name:='Verdana';
 //m.Font.Color:=clBlack;
 //m.Color:=$008080FF;
 ShowData;
 tmRefresh:=TTimer.Create(application);
 tmRefresh.Interval:=10000;
 tmRefresh.OnTimer:='tmRefreshTimer';
end;
 

Вызов ТМС проверки накладных

ТМС - События - После авторизации пользователя. В коде ХХХ это номер ТМС, созданной в предыдущем пункте

uses
  Classes, Graphics, Controls, Forms, Dialogs, ComCtrls, Messages, SysUtils,
  ToolWin, ImgList, dxExEdtr, dxCntner, dxTL, dxDBCtrl, dxDBGrid, StdCtrls,
  unMain,DB, IBQuery, IBDatabase, unDM, DBTables, cfdxUtils, Menus, System,
  Buttons, ExtCtrls, StdCtrls, cfSelectEdit,need,
  gb_table, Grids, ClipBrd, DBGrids, unFrameCustomDict, cfWindows, Unit1;  

var
  mainForm: TForm1;
begin
  frmManagerXp2.RunTms(ХХХ,application);
  if dm.IsReg = false then
   begin
    MainForm := TForm1.Create(Application);
    MainForm.ShowModal;
   end;
end;

Настройка Менеджера

Перезапустить Менеджер:

1. в сервис - параметры системы - Настройка ЕГАИС указать адрес сервера ЕГАИС и идентификатор;
2. в сервис - параметры системы - автоматизация отключить "Приводить наименования к существующим" и "Приводить наименования через глобальный справочник" (!!!ТОЛЬКО ДЛЯ ПРОДУКТОВ!!!).

Сетки

Прикрепленный файл Файл:Сетки ЕГАИС.zip

Проверить УТМ (универсальный транспортный модуль)

Переходим по ссылке на web страницу УТМ, например http://egais:8080/, смотрим версию модуля, версия должна быть не ниже 2.0.1, если ниже, это значит, что УТМ тестовый.

Версия УТМ

Проверка

Запустить Менеджер - Инструменты - ЕГАИС Менеджер - Настройки - Перепроверить идентификаторы всех ТТН. После этого нажать "Проверить ТТН". Ошибок быть не должно

Проверка существующих ТТН

Теги: ЕГАИС, УТМ, универсальный транспортный модуль

Модификация ЕГАИС для общепита

Для организаций, реализующих алкоголь "на разлив", по требованию законодательства, необходимо в журнале продажи алкоголя фиксировать факт вскрытия упаковки. Данные отправлять в ЕГАИС не нужно, поэтому у таких клиентов на алкогольную продукцию стоит системная группа -21 "Пиво". Особенности заполнения журнала реализованы через процедуру PR_EGAIS_DETAIL_OBSHEPIT, которая вызывается при проведении документа, полный скрипт Файл:Модификация ЕГАИС для общепита.txt обновления прилагается.


Проблемы при продаже алкоголя

при отбитии пивного чека бывает ошибка, где написано java и регулярное выражение, например {d+\10} ... и т.п.
в конце этого сообщения пишется поле, которое не прошло проверку правильности данных. варианты:
KP - неправильно указан КПП в параметрах системы
IN - неправильно указан ИНН в параметрах системы
EAN - неправильно указан шк изготовителя
BK - неправильно просканирован акциз (скорей всего маленький квадратик вместо основного)
значение Value состоит только из цифр - не тот штрихкод отсканировали, на акцизе два штрихкода, один маленький, другой большой, пусть закроют пальцем маленький и сканируют большой, в нём должны быть цифры и латинские буквы!!!
пример ошибки

java.lang.IllegalArgumentException: org.xml.sax.SAXParseException; cvc-pattern-valid: Value '133-103995646074040516326020775185' is not facet-valid with respect to pattern '\d\d[a-zA-Z0-9]{21}\d[0-1]\d[0-3]\d{10}[a-zA-Z0-9]{31}' for type 'BK'

CODE - не указан код вида продукции egais_product_vcode
скорее всего не заполнено поле EGAIS_PRODUCT_VCODE - код вида продукции... значит товар был оприходован вручную, а не через ЕГАИС, надо заполнить соответсвенно справочника - в интернете легко найти - искать код вида продукции алкоголь

  • достаточно часто стала вылезать при продаже ошибка - не удалось отправить данные в ЕГАИС - скорее всего подвис модуль УТМ - лучший вариант перезагрузить компьютер с УТМ, либо попробовать службу рестартануть, но както не всегда она поднимается
  • для заполнения кодов вида продукции удобно воспользоватся фильтром в менеджере
((wb.mmbsh like ('%-21=%')) or (wb.mmbsh like ('%-20=%')) ) and (trim(wb.egais_product_vcode) = '' or (wb.egais_product_vcode is null))
  • если не отправляются запросы в егаис, и в ЕГАИС менеджере есть только отправка запроса, но нет ответов - надо перезапустить службу УТМ, подвисла, или перезагрузить компьютер с УТМ либо если не помогает можно посмотретьнастройки брэндмауэра на компьютере с УТМ
  • если попросят добавить дату розлива в алкогольных магазинах, используем колонку DATESERT
  • если при проведении документа прихода алкоголя выходит ошибка "Conversion error from string "несколько цифр через запятую" At procedure 'PR_DOC_PRIHOD_COMMIT_RECURSE'..."

изменяем в процедурах PR_NEW_PART и PR_DOC_PRIHOD_COMMIT_RECURSE тип переменной egais_id на DM_TEXT

  • если в отчёт продажи алкоголя попадают товары не алкоголя
в процедуре PR_DOC_COMMIT
заменить строки после exception EX_WRONGDOC_BASE_TYPE на 
/* nicky edit */
if (exists (select * from docs d where d.id = :doc_id and d.doc_type in (3, 9))) then
  begin
    insert into egais_detail (doc_detail_id, egais_barcode, producer_inn, producer_kpp) select dd.id, dda.egais_barcode, dda.producer_inn, dda.producer_kpp
      from doc_detail dd join doc_detail_active dda on dd.doc_id = dda.doc_id and dd.part_id = dda.part_id
      join vw_warebase wb on dd.part_id = wb.part_id
      where dd.doc_id = :doc_id and (char_length(dda.EGAIS_BARCODE) > 0 or (wb.MMBSH containing '-21={') );
  end
/* nicky edit end*/

и выполнить скрипт очистки уже попавших товаров

delete from egais_detail ed1
where ed1.doc_detail_id in
(select dd.id
from egais_detail ed
left join vw_doc_detail dd on dd.id = ed.doc_detail_id
left join vw_docs d on d.id = dd.doc_id
left join vw_warebase wb on wb.part_id = dd.part_id
      where not(char_Length(ed.egais_barcode) > 1)
      and not ((dd.mmbsh like '%-21={%') or (dd.mmbsh like '%-20={%'))
      )

Частые вопросы по ЕГАИС

При отбитии чека выходит сообщение с ошибкой на английском

В новых версиях кассира сделаны необходимые проверки при добавлении товара в чек, но на всякий случай приводим примеры ошибок от УТМ и что они означают.

  • IN - ругается на ИНН, указанный в реквизитах предприятия
  • KPP - ругается на КПП, указанный в реквизитах предприятия
  • BK - ругается на двумерный штрихкод акциза
  • CODE - у какой то позиции не проставлен код вида продукции
  • EAN - проблема со штрихкодом производителя
  • duplicate - каким то образом в чеке две позиции с одинаковым акцизом
  • 50 или 51 - проблема в ккм с печатью qr кода
  • ошибка отправки данных - утм не включен

Алкоголь при добавлении в чек не запрашивает акциз

Проверьте, что на данной позиции стоит группа 20 Алкоголь.

При добавлении пива запрашивает акциз, а его нет

Проверьте, что на данной позиции стоит группа 21 Алкоголь / Пиво, а не группа 20.

Нужно продать старую бутылку в обход ЕГАИС

Нужно снять с нее группы 20 и 21.

У клиента в одной базе два предприятия: ИП и ООО. Какие реквизиты заполнять в реквизитах организации

В параметрах нужно указывать реквизиты того предприятия, которое торгует алкоголем. Обычно это ООО.

Что делать если кассир выдает ошибку отправки данных в ЕГАИС без каких либо подробностей

Скорей всего УТМ не включен. Проверьте УТМ набрав путь к нему в адресной строке браузера или нажмите проверить ттн в менеджере.

Что делать пытались пробить бутылку но не получилось и бутылку отдали не пробив по программе

Чтобы выровнять остатки по прорамме, пусть пробивают чек, а акциз сканируют с другой такойже бутылки. если такой бутылки нет, пусть сканируют акциз с другой бутылки. Адекватным клиентам, можно показать как сохранять акцизы в блокнот (но таких единицы). Конечно, сама ситуация неправильная, но это это лучший выход из нее. Чтобы таких случаев не было, в есть различные проверки.

Что делать если на сайте ЕГАИС не совсем корректные остатки

РАР будет использовать информацию об остатках при проверке деятельности магазинов только с 1.01.2017.

Будет ли работать ЕГАИС если нет интернета

Если в точке нет интернета, егаис всеравно будет работать, данные будут сохраняться в утм, qr коды будут печататься, но если их отсканировать и перейти на сайт - там будет пусто. Главное чтобы утм была включена и работала. Когда интернет появится, утм сама синхронизируется с РАР. После этого данные появятся на сайте егаис. Без интернета можно работать 3 дня.

Что делать если в чеке над qr кодом пишется неверное название магазина

В егаис при продаже нужно передавать название магазина. Кассир берет его из параметров системы, реквизиты организации, название торговой точки там может стоять ИП какое нибудь (их первое предприятие). Клиентов пугает, что у них выходит ИП вместо ООО. В качестве временного решения предлагаю менять реквизиты, перезапускаем кассира и печатает в чеках нормально, но потом у клиента эти реквизиты выходят в печатных формах и ценниках.

При продаже алкоголя ругается на штрихкода изготовителя

Проверьте правильность штрихкода (с бутылки сканируется именно те цифры, какие записаны в программе). Если штрихкода в программе не забит и на бутылке его нет, вставьте локальный штрихкод.

Ошибка 50 или 51

Если при продаже алкоголя выходит незавершенка и пишет ошибку 50 или 51 некорретные данные - это значит проблема не в отправке данных, а непосредственно при печати qr кода кассовым аппаратом. Делаем проверку - в настройках оставляем галочку отправлять данные в егаис, но при этом ставим еще галочку не печатать qr код. Если чек выходит, значит проблема или с тем, что ккм не поддерживает печатать кодов или нужно объяснить прошивку. В крайнем случае оставляем все как есть и объясняем клиенту, что РАР разрешил на время переходного периода не печатать qr код если печатается ссылка, говорим что в ближайшее время исправим эту ситуацию и сообщаем о таких клиентах отделу внедрения.
Ещё данная ошибка может быть с следующем случае - ККМ старая, перепрошита под ЕГАИС
старые аппараты не могут печатать большие изображения
в options.ini под нужным предприятием добавляем строки
атол (быстро):
1_QR_Height (100)
1_QR_Scale (300)

атол (медленно):
1_QRSlow_BmpScale (7)
1_QRSlow_Scale (7)

штрих (быстро):
2_QR_DotSize (7)

штрих (медленно):
2_QRSlow_BmpScale (7)
быстро - средствами ККМ, медленно - как графический объект

Почему в чеке несколько бутылок с алкоголем, а qr код распечатался один

1 чек - 1 qr код. Если перейти по ссылке, то отобразится информация по всем позициям в чеке.

Должны ли печататься qr коды при продаже пива

РАР отменил пивные чеки, т.е. непосредственно при продаже информация в егаис не уходит. В конце дня нужно делать "акт списания из торгового зала со второго регистра" из менеджера, в котором будут все эти продажи.

Как отпускать алкоголь в общепитах

От общепита РАР требует только данные по приходу ТТН. Непосредственно при продаже в ЕГАИС ничего отправлять не нужно. Нужно только вести журнал по алкоголю.

Как сделать возврат поставщику по ЕГАИС

Открыть журнал документов, встать на проведеннный приход по ттн, нажать на кнопку "сделать возврат" на панели, где находятся и другие кнопки, относящиеся к ЕГАИС. Затем проставить нужное количество и отправить. Не пытайтесь вручную создать расходный документ "возврат по ЕГАИС", добавить в него позиции и провести - это неправильно.

Где можно посмотреть какой запрос был отправлен в ЕГАИС

Таблица EGAIS_REQUESTS. Тело запроса будет в колонке QUERY_DATA, а ответ в REPLY_DATA.

Почему клиент сканирует QR код, переходит на сайт, а там пусто

Обычно данные появляются на сайте в течении 5 минут после продажи, но могут быть задержки. Я лично был свидетелем, когда после покупки в Красном и Белом данные появились только через полчаса.

Почему на сайте в информации о чеке неверно отображается дата чека

Проблема решается обновлением версии кассира.

Что делать если акт на самом деле принят, но в журнале документов отображается, что не принят?

В начальных версиях егаис-менеджера была ошибка, что если по ТТН отправляют повторный акт по уже принятой накладной и УТМ по этому запросу возвращает отрицательный ответ (т.к. ттн уже подтверждена), то менеджер меняет в базе статус с принятого на отклонён. Это можно исправить спомощью процедуры:

SET TERM ^ ;

create or alter procedure PR_CHECK_TTN_ACCEPTED
returns (
    DOC_ID_OUT bigint)
as
declare variable DOC_ID DM_ID;
declare variable EGAIS_ID DM_UUID;
declare variable C DM_STATUS;
begin
 for select D.ID,
            D.EGAIS_ID
     from DOCS D
     where D.DOC_TYPE = 40
           and D.EGAIS_STATUS = 2
     into :DOC_ID,
          :EGAIS_ID
 do
 begin
  C = 0;
  select first 1 count(*)
  from EGAIS_REQUESTS R
  where 1 = 1
        and R.EGAIS_ID = :EGAIS_ID
        and R.REPLY_DATA containing '<tc:Conclusion>Accepted</tc:Conclusion>'
  into C;
  if (C > 0) then
  begin
   select :DOC_ID
   from RDB$DATABASE
   into :DOC_ID_OUT;
   update DOCS D
   set D.EGAIS_STATUS = 1
   where D.ID = :DOC_ID;
   suspend;
  end
 end
end^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT,UPDATE ON DOCS TO PROCEDURE PR_CHECK_TTN_ACCEPTED;
GRANT SELECT ON EGAIS_REQUESTS TO PROCEDURE PR_CHECK_TTN_ACCEPTED;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE PR_CHECK_TTN_ACCEPTED TO SYSDBA;

Если каким то образом получилось, что в егаис накладная принята, но в базе нет данных запросов и она там неподтверждена, то ее можно подтвердить вручную спомощью запроса:

update docs d set d.egais_status=1 where d.doc_id=:doc_id;

Ошибка при принятии накладной: "Не удалось найти ЕГАИС идентификатор ТТН. Принятие отменено."

ЕГАИС ошибка при принятии накладной.png

Заходим во входящие запросы, выполняем "запросить данные". Находим строку, на которую ругается ЕГАИС, например, с нужным нам Waybill/2701, и удаляем эту строку. После чего заходим в личный кабинет ЕГАИС и заново запрашиваем накладную

Что делать с зависшими накладными

Если на ТТН уже пришел акт подтверждения, а в модуле ЕГАИС они по прежнему висят, то нужно сделать следующее. В таблице EGAIS_REQUESTS нужно отфильтровать ТТН по статусу. У зависших накладных статус будет 0 или null. Далее у этих ТТН нужно поменять статус на 1.

Ошибка "Продукция не поступала в магазин по поштучному учету

Проверить подтверждена ли накладная,не было ли акта расхождения, проверить есть ли эта акцизная марка в ТТН и проверить дату поступления ТТН. Если дата очень свежая - возможно сервер ЕГАИС еще не зафиксировал акцизную марку на 3 регистре и нужно подождать некоторое время.

Не подгружаются страна и производитель импортных напитков

выполнить скрипт ниже Файл:ЕГАИС справочник производителей.txt

ЕГАИС 3.0

Обновить версию менеджера на ManagerXP2_273_55(20180301_112227).exe и выше. При запуске менеджера добавляется таблица EGAIS_DETAIL_BARCODES, генератор GEN_EGAIS_DETAIL_BARCODES_ID, триггер EGAIS_DETAIL_BARCODES_BI.
Далее добавить процедуру PR_EGAIS_BARCODES_COMMIT

SET TERM ^ ;

create or alter procedure PR_EGAIS_BARCODES_COMMIT (
    DDA_ID DM_ID,
    PART_ID DM_ID,
    DD_ID DM_ID_NULL)
as
begin
  update egais_detail_barcodes set dda_id = 0, doc_detail_id = :dd_id, part_id = :part_id, commitdate = current_timestamp where dda_id = :dda_id;
end^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT,UPDATE ON EGAIS_DETAIL_BARCODES TO PROCEDURE PR_EGAIS_BARCODES_COMMIT;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE PR_EGAIS_BARCODES_COMMIT TO SYSDBA;

В процедуре PR_DOC_CANCEL добавить строку в конце

--удаление акцизных марок по doc_id
    delete from egais_detail_barcodes where doc_id = :doc_id;
--


В процедуре PR_DOC_DETAIL_INSERT добавить строку в конце

-- проводим ЕГАИС марки
   execute procedure PR_EGAIS_BARCODES_COMMIT(:ACTIVE_ID, :PART_ID, :NEW_ID);

Процедуру PR_EDITCUSTOMDOC меняем полностью

SET TERM ^ ;

create or alter procedure PR_EDITCUSTOMDOC (
    DOC_ID type of DM_ID,
    SESSION_ID type of DM_ID,
    RGUID type of DM_RGUID)
returns (
    CUR_DOC_ID type of DM_ID)
as
declare variable DDA_ID DM_ID_NULL;
declare variable VNUM type of DM_ID_NULL;
declare variable DOC_TYPE type of DM_ID;
declare variable DOC_BASE_TYPE type of DM_ID;
declare variable DOC_STATUS type of DM_STATUS;
declare variable DOC_AGENT_ID type of DM_ID;
declare variable DOCNUM type of DM_TEXT;
declare variable DOC_CAPTION type of DM_TEXT;
declare variable BASE_AGENT_ID integer;
declare variable DOCDATE type of DM_DATETIME;
declare variable EGAIS_NUM DM_TEXT;
declare variable EGAIS_ID DM_TEXT;
declare variable EGAIS_UNITTYPE DM_TEXT;
declare variable EGAIS_STATUS DM_STATUS;
begin
  select d.doc_type, d.status, dt.base_type, dt.caption, d.docnum, d.docdate, d.agent_id, d.vnum, d.base_agent_id, EGAIS_NUM, EGAIS_ID, EGAIS_UNITTYPE, EGAIS_STATUS from docs d left join doc_types dt on d.doc_type=dt.id where d.id=:doc_id
    into :doc_type, :doc_status, :doc_base_type, :doc_caption, :docnum, :docdate, :doc_AGENT_ID,:vnum, :BASE_AGENT_ID, :EGAIS_NUM, :EGAIS_ID, :EGAIS_UNITTYPE, :EGAIS_STATUS;

  if (doc_type is null) then exception EX_CANTFINDDOC_ID;
  if (doc_status in (0,-2,2)) then exception EX_WRONGDOCSTATUS;
  if (doc_base_type=3) then exception EX_WRONGDOC_BASE_TYPE;
--  if (doc_agent_id <= 0) then exception EX_WRONG_AGENT;
  cur_doc_id=gen_id(gen_docs_id,1);
  insert into docs (ID,PARENT_ID,DOC_TYPE,STATUS,AGENT_ID,RGUID,AUDIT_ID,DOCNUM,DOCDATE,DELETED_DOC_ID, BASE_AGENT_ID, EGAIS_NUM, EGAIS_ID, EGAIS_UNITTYPE, EGAIS_STATUS)
    values (:cur_doc_id,0,:DOC_TYPE,0,:doc_AGENT_ID,:RGUID,:session_ID,:DOCNUM,:DOCDATE,:DOC_ID, :BASE_AGENT_ID, :EGAIS_NUM, :EGAIS_ID, :EGAIS_UNITTYPE, :EGAIS_STATUS);
  -- Обновление номера документа на старое значение
  UPDATE docs set vnum = :vnum, caption=:doc_caption || ' №' || :vnum  where id = :cur_doc_id;

  if (doc_base_type=1) then --приход
  begin
   if (doc_status=1) then --
   begin
     insert into DOC_DETAIL_ACTIVE (doc_id,part_id,quant,summa,discount,koef,sum_dsc,sum_ndso, doc_detail_id)
       select :cur_doc_id,part_id,quant,summa,discount,0,sum_dsc,sum_ndso, id from doc_detail where doc_id=:doc_id;
     update DOC_DETAIL_ACTIVE dda set dda.part_id=iif((select count(*) from doc_detail where part_id = dda.part_id) > 1,dda.part_id,0) where dda.doc_id=:cur_doc_id;
     update egais_detail_barcodes edb set part_id = 0, doc_detail_id = 0, doc_id = :cur_doc_id,
       dda_id = (select id from doc_detail_active where doc_id = :cur_doc_id and doc_detail_id = edb.doc_detail_id) where doc_id = :doc_id;
   end
   else
   begin
     if (doc_status=-1) then
     begin
       insert into DOC_DETAIL_ACTIVE (doc_id,part_id,quant,summa,discount,koef,sum_dsc)
         select :cur_doc_id,part_id,quant,summa,discount,0,sum_dsc from doc_detail_deleted where doc_id=:doc_id;
       --update DOC_DETAIL_ACTIVE set part_id=0 where doc_id=:cur_doc_id;
       update DOC_DETAIL_ACTIVE dda set dda.part_id=iif((select count(*) from doc_detail where part_id = dda.part_id) > 1,dda.part_id,0) where dda.doc_id=:cur_doc_id;
     end 
   end
  end
  else if ((doc_base_type=2) or (doc_base_type=7)) then  --расход
  begin
    if (doc_status=1) then
    begin
      insert into doc_detail_active (doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,koef,sum_dsc, doc_detail_id)
        select :cur_doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,1,sum_dsc, id from doc_detail where doc_id=:doc_id;
      update egais_detail_barcodes edb set doc_detail_id = 0, doc_id = :cur_doc_id,
        dda_id = (select id from doc_detail_active where doc_id = :cur_doc_id and doc_detail_id = edb.doc_detail_id) where doc_id = :doc_id;
    end
    else
    begin
      if (doc_status=-1) then
      begin
        insert into doc_detail_active (doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,koef,sum_dsc)
          select :cur_doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,1,sum_dsc from doc_detail_deleted where doc_id=:doc_id;
      end
    end 
  end

  suspend;
end^

SET TERM ; ^

/* Following GRANT statetements are generated automatically */

GRANT SELECT,INSERT,UPDATE ON DOCS TO PROCEDURE PR_EDITCUSTOMDOC;
GRANT SELECT ON DOC_TYPES TO PROCEDURE PR_EDITCUSTOMDOC;
GRANT SELECT,INSERT,UPDATE ON DOC_DETAIL_ACTIVE TO PROCEDURE PR_EDITCUSTOMDOC;
GRANT SELECT ON DOC_DETAIL TO PROCEDURE PR_EDITCUSTOMDOC;
GRANT SELECT,UPDATE ON EGAIS_DETAIL_BARCODES TO PROCEDURE PR_EDITCUSTOMDOC;
GRANT SELECT ON DOC_DETAIL_DELETED TO PROCEDURE PR_EDITCUSTOMDOC;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE PR_EDITCUSTOMDOC TO STANDART;
GRANT EXECUTE ON PROCEDURE PR_EDITCUSTOMDOC TO SYSDBA;

Вьюха VW_WAREBASE

EGAIS_BARCODE
как 
(select coalesce('Количество акциз: '||sum(quant), '') from egais_detail_barcodes where part_id = wb.part_id and dda_id = 0)

Вьюха VW_DOC_DETAIL_ACTIVE

EGAIS_BARCODE
как
( (select 'Кол-во: '||count(egais_barcode) from egais_detail_barcodes where ((dda_id = da.id) and (dda_id > 0)) ) || ' / ' ||
    (select 'Неверных: '||count(egais_barcode) from egais_detail_barcodes where ((dda_id = da.id) and (dda_id > 0)) and alccode <> da.egais_alccode) )

Вьюха VW_DOC_DETAIL

EGAIS_BARCODE
как 
(select coalesce('Количество акциз: '||sum(quant), '') from egais_detail_barcodes where part_id = dt.part_id and doc_id = dt.doc_id)

Вьюха VW_WAREBASEPARTS

EGAIS_BARCODE
как 
(select coalesce('Количество акциз: '||sum(quant), '') from egais_detail_barcodes where part_id = wb.part_id and dda_id = 0)
 Настроить в сетках поля egais_alccode и EGAIS_BARCODE 

Далее переходим в Параметры Системы, Настройки ЕГАИС, выставляем параметры версия акта ТТН и проверку алкокода.

Версия акта ттн.jpg

Проверка алкогода.jpg

Помарочная инвентаризация

  • Инструкция для пользователя Файл:ПОМАРОЧНАЯ ИНВЕНТАРИЗАЦИЯ АЛКОГОЛЬНОЙ ПРОДУКЦИИ.docx
  • Предупредить пользователя, что бы на время ревизии не делали продаж по алкоголю
  • Обновить менеджер до версии не ниже ManagerXP2_273_64
  • Выполнить скрипт Файл:СкриптПомарочная.txt
  • Обновить тмс \\vnedrenie\Obmen\EGAIS_SKLAD\ЕГАИС ТМС.TXT
  • Перед завершением ревизии проверить фильтр в остатках в базе. Отражает список партий, по которым не было сканировано ни одной акцизки
quant<>0
and not exists (select  i.id from inv_barcodes_detail i where i.part_id=wB.part_id)
and mmbsh containing '-20' and mmbsh not containing 'кред'

Если позиции есть в этом фильтре, то такой товар нужно списать документов "ЕГАИС списание со склада" либо найти товар и внести его в ревизию.

  • Перед завершением ревизии проверить фильтр в помарочной инвентаризации.
part_id=0;
quant_bae<0;


Как отменить ЕГАИС списание(виртуальный)

В таблице egais_requests по полю egais_id (= id документа списания из docs) находим в поле reply_data значение FSRAR_ID
select * from egais_requests where egais_id='127122'

<tc:RegID>WOF-0069733024</tc:RegID>

Далее в Менеджере заходим в ЕГАИС -> Запрос на отмену проведения акта списания с баланса
Егаис.jpg


Далее вводим номер документа WOF-0069733024


Егаис3.png

Отправить