Установка ЕГАИС

Материал из wiki.standart-n.ru
Перейти к: навигация, поиск

Содержание

Установка

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

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


Установить процедуру 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_TEXT','','VARCHAR(250) CHARACTER SET WIN1251 COLLATE PXW_CYRL ','DOMAIN');^

execute procedure PR_ALTER_VIEW('','','GEN_AGENTS_CONTRACTS_STATUS_ID','generator');^

-- таблица AGENTS_CONTRACTS_STATUS
EXECUTE BLOCK AS BEGIN
if (not exists(select 1 from rdb$relations where rdb$relation_name = 'AGENTS_CONTRACTS_STATUS')) then
execute statement '
CREATE TABLE AGENTS_CONTRACTS_STATUS (
    ID       DM_STATUS NOT NULL /* DM_STATUS = INTEGER */,
    CAPTION  DM_TEXT /* DM_TEXT = VARCHAR(250) */
);';
END^

/* Trigger: AGENTS_CONTRACTS_STATUS_BI */
CREATE OR ALTER TRIGGER AGENTS_CONTRACTS_STATUS_BI FOR AGENTS_CONTRACTS_STATUS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_agents_contracts_status_id,1);
end
^

delete from AGENTS_CONTRACTS_STATUS;^
INSERT INTO AGENTS_CONTRACTS_STATUS (ID, CAPTION)
                             VALUES (0, 'Активный');^
INSERT INTO AGENTS_CONTRACTS_STATUS (ID, CAPTION)
                             VALUES (-1, 'Удален');^
INSERT INTO AGENTS_CONTRACTS_STATUS (ID, CAPTION)
                             VALUES (1, 'Основной');^

execute procedure PR_ALTER_VIEW('','','GEN_AGENTS_CONTRACTS_ID','generator');^
execute procedure PR_ALTER_VIEW('','','GEN_AGENTS_CONTRACTS_VNUM','generator');^

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

execute procedure PR_ALTER_VIEW('AGENTS_CONTRACTS','PARENT_ID','DM_ID_NULL','TABLE');^
execute procedure PR_ALTER_VIEW('AGENTS_CONTRACTS','AGENT_ID','DM_ID','TABLE');^
execute procedure PR_ALTER_VIEW('AGENTS_CONTRACTS','VNUM','DM_ID_NULL','TABLE');^
execute procedure PR_ALTER_VIEW('AGENTS_CONTRACTS','CONTRACT_DATE','DM_DATETIME','TABLE');^
execute procedure PR_ALTER_VIEW('AGENTS_CONTRACTS','CAPTION','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('AGENTS_CONTRACTS','STATUS','DM_STATUS','TABLE');^
execute procedure PR_ALTER_VIEW('AGENTS_CONTRACTS','START_DATE','DM_DATETIME','TABLE');^
execute procedure PR_ALTER_VIEW('AGENTS_CONTRACTS','END_DATE','DM_DATETIME','TABLE');^
execute procedure PR_ALTER_VIEW('AGENTS_CONTRACTS','BASE_TYPE','DM_STATUS','TABLE');^
execute procedure PR_ALTER_VIEW('AGENTS_CONTRACTS','SUMMA','DM_DOUBLE','TABLE');^
execute procedure PR_ALTER_VIEW('AGENTS_CONTRACTS','BASE_AGENT_ID','DM_ID_NULL','TABLE');^
execute procedure PR_ALTER_VIEW('AGENTS_CONTRACTS','BARCODE','DM_TEXT1024','TABLE');^
execute procedure PR_ALTER_VIEW('AGENTS_CONTRACTS','DELETEDT','DM_DATETIME','TABLE');^

/* Trigger: AGENTS_CONTRACTS_BI */
CREATE OR ALTER TRIGGER AGENTS_CONTRACTS_BI FOR AGENTS_CONTRACTS
ACTIVE BEFORE INSERT POSITION 0
as
begin
  if (new.id is null) then
    new.id = gen_id(gen_agents_contracts_id,1);

  if (new.vnum is null) then
    new.vnum = gen_id(gen_agents_contracts_vnum,1);

  if (new.caption is null) then
    new.caption = 'Договор №'||new.vnum;

end^

/* Trigger: AGENTS_CONTRACTS_BU0 */
CREATE OR ALTER TRIGGER AGENTS_CONTRACTS_BU0 FOR AGENTS_CONTRACTS
ACTIVE BEFORE UPDATE POSITION 0
AS
begin
  if (new.status = 1) then
    update agents_contracts set status = 0 where status = 1;
end^

COMMENT ON COLUMN AGENTS_CONTRACTS.STATUS IS
'0 активный
1 основной
-1 удаленный';^

CREATE OR ALTER VIEW VW_AGENTS_CONTRACTS(
    ID,
    PARENT_ID,
    AGENT_ID,
    AGENT_CAPTION,
    VNUM,
    CONTRACT_DATE,
    CAPTION,
    STATUS,
    STATUS_CAPTION,
    START_DATE,
    END_DATE,
    BASE_TYPE,
    SUMMA,
    BASE_AGENT_ID,
    BARCODE,
    DELETEDT)
AS
select
    ac.id,
    ac.parent_id,
    ac.agent_id,
    a.caption,
    ac.vnum,
    ac.contract_date,
    ac.caption,
    ac.status,
    acs.caption,
    ac.start_date,
    ac.end_date,
    ac.base_type,
    ac.summa,
    ac.base_agent_id,
    ac.barcode,
    ac.deletedt
from agents_contracts ac
left join agents a on ac.agent_id = a.id
left join agents_contracts_status acs on ac.status = acs.id ;^

execute procedure PR_ALTER_VIEW('DOCS','AGENTS_CONTRACT_ID','DM_ID_NULL','TABLE');^

/* Добавить Справочник "Контракты" */
EXECUTE BLOCK AS BEGIN
if ((select caption from SP$WDICTS where caption = 'Контракты') is null) then
execute statement 'INSERT INTO SP$WDICTS (ID, PARENT_ID, CAPTION, DESCRIPTION, SID, STATUS, INI, BMP, SORTING, FRAMECLASS) VALUES ((select max(id)+1 from SP$WDICTS), 0, ''Контракты'', NULL, ''AGENTS_CONTRACTS'', -1, ''
[insertsql]
insert into agents_contracts (agent_id, status) values (:agent_id:, 0)

[deletesql_selected]

[deletesql]
update agents_contracts set deletedt=current_date, status = iif(status = -1, 0, -1) where id=:id

[refreshsql]
select * from vw_agents_contracts where id=:id

[selectsqlwithdeleted]
select * from vw_agents_contracts where agent_id=:agent_id: order by id, caption

[selectsql]
select * from vw_agents_contracts where status <> -1 and agent_id=:agent_id: order by id, caption

[main]
sourcetablename=AGENTS_CONTRACTS
returnfieldname=id
captionfieldname=caption
keyfieldname=id
ViewID=agents_contracts
RootGroupTableName=
ShowCaption=Договора
GetCaption=Договора
GroupSelect=0
foldergroup=
initfolder_id=
dataset=0
InitTMSGroup_id=829
folders_visible=0
Canfloating=0
hidetoppanel=0
ActivateDictAction=0

[cfSelect]
selectfieldexpression=caption
AllwaysPartial=1

[form_show]
position=2
left=0
Top=0
Width=900
Height=600
MaxWidth=0
MaxHeight=0
MinWidth=500
MinHeight=400

[form_get]
position=2
left=0
Top=0
Width=900
Height=600
MaxWidth=0
MaxHeight=0
MinWidth=500
MinHeight=400

[childs]
bottomdock_units=0
bottomdock_size=0
rightdock_units=0
rightdock_size=0

[editfields]
VNUM=default
CONTRACT_DATE=default
CAPTION=default
START_DATE=default
END_DATE=default
BASE_TYPE=default
SUMMA=default
BASE_AGENT_ID=default
BARCODE=default
STATUS=WDICTS.AGENTS_CONTRACTS_STATUS(initvalue=status)
status_caption=status
'', NULL, NULL, NULL);';
END^

/* Добавить Справочник "Контракты статусы" */
EXECUTE BLOCK AS BEGIN
if ((select caption from SP$WDICTS where caption = 'Контракты статусы') is null) then
execute statement 'INSERT INTO SP$WDICTS (id, PARENT_ID, CAPTION, DESCRIPTION, SID, STATUS, INI, BMP, SORTING, FRAMECLASS) VALUES ((select max(id)+1 from SP$WDICTS),0, ''Контракты статусы'', NULL, ''AGENTS_CONTRACTS_STATUS'', 0, ''
[insertsql]

[deletesql_selected]

[deletesql]

[refreshsql]
select * from agents_contracts_status where id=:id

[selectsqlwithdeleted]

[selectsql]
select * from agents_contracts_status where id <> -1 order by id

[main]
sourcetablename=AGENTS_CONTRACTS_STATUS
returnfieldname=id
captionfieldname=caption
keyfieldname=id
ViewID=agents_contracts_status
RootGroupTableName=
ShowCaption=Статус
GetCaption=Статус
GroupSelect=0
foldergroup=
initfolder_id=
dataset=0
InitTMSGroup_id=0
folders_visible=0
Canfloating=0
hidetoppanel=0
ActivateDictAction=0

[cfSelect]
selectfieldexpression=caption
AllwaysPartial=1

[form_show]
position=8
left=0
Top=0
Width=300
Height=200
MaxWidth=0
MaxHeight=0
MinWidth=300
MinHeight=200

[form_get]
position=8
left=0
Top=0
Width=300
Height=200
MaxWidth=0
MaxHeight=0
MinWidth=300
MinHeight=200

[childs]
bottomdock_units=0
bottomdock_size=0
rightdock_units=0
rightdock_size=0

[editfields]
CAPTION=default

[addfields]
CAPTION=default
'', NULL, NULL, NULL);';
END^

execute procedure pr_alter_view('DOCS','DOCS_BI','if (new.agents_contract_id is null) then
    new.agents_contract_id = (select first 1 id from agents_contracts where agent_id = new.agent_id and status = 1);
  if (new.agents_contract_id is null) then new.agents_contract_id = 0;','TRIGGER','BEFORE INSERT')

--execute procedure PR_ALTER_VIEW('VW_DOCS','AGENT_CONTRACT_CAPTION','w.mgn_id','VIEW'); join пока нет возможности в автоматическом режиме добавлять

В процедуре 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 count(*) 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);

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
      into :ware_id;
      if ((select id from wares where id = :ware_id) is null) then ware_id = null;
  end
  else
  begin
    select first 1 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
;


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:=5000;
 tmRefresh.OnTimer:='tmRefreshTimer';
end;
 

Вызов ТМС проверки накладных (!!!ТОЛЬКО ДЛЯ ПРОДУКТОВ!!!)

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

uses
  Graphics, Controls, Forms, Dialogs, StdCtrls, undm, unMain,
  ComCtrls, ExtCtrls, StrUtils, Windows, Classes, 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, если ниже, это значит, что УТМ тестовый.

Версия УТМ

Проверка

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

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

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

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

при отбитии пивного чека бывает ошибка, где написано 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 where dd.doc_id = :doc_id and char_length(dda.egais_barcode) > 0;
  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={%'))
      )

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Ошибка 50 или 51

Если при продаже алкоголя выходит незавершенка и пишет ошибку 50 или 51 некорретные данные - это значит проблема не в отправке данных, а непосредственно при печати qr кода кассовым аппаратом. Делаем проверку - в настройках оставляем галочку отправлять данные в егаис, но при этом ставим еще галочку не печатать qr код. Если чек выходит, значит проблема или с тем, что ккм не поддерживает печатать кодов или нужно объяснить прошивку. В крайнем случае оставляем все как есть и объясняем клиенту, что РАР разрешил на время переходного периода не печатать qr код если печатается ссылка, говорим что в ближайшее время исправим эту ситуацию и сообщаем о таких клиентах отделу внедрения.

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

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

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

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

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

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