Обновление базы для маркировки ЛС — различия между версиями

Материал из wiki.standart-n.ru
Перейти к: навигация, поиск
(Выполняем скрипт)
Строка 234: Строка 234:
  
 
SET SQL DIALECT 3;
 
SET SQL DIALECT 3;
 
 
 
 
SET TERM ^ ;
 
SET TERM ^ ;
  
Строка 250: Строка 247:
 
   if (new.marking=1) then
 
   if (new.marking=1) then
 
   begin
 
   begin
 +
-- 20/10/2020 для корректировки выходим без определения группы
 +
    if ((select d.doc_type from docs d where  d.id=new.doc_id) in (7,8,17,18,23)) then
 +
      exit;
 +
--Проверяем есть ли группа, если есть уже - выходим
 +
    if (((select count(id) from GROUP_DETAIL where GROUP_ID =-43 and GROUPTABLE='DOC_DETAIL_ACTIVE' and GROUPTABLE_ID=new.id)>0) OR
 +
    ((select count(id) from GROUP_DETAIL where GROUP_ID =-43 and GROUPTABLE='PARTS' and GROUPTABLE_ID=new.part_id)>0)) then
 +
    exit;
 
     if ((not exists(select id from GROUP_DETAIL where GROUP_ID=-43 and GROUPTABLE_ID=new.id and GROUPTABLE='DOC_DETAIL_ACTIVE'))) then
 
     if ((not exists(select id from GROUP_DETAIL where GROUP_ID=-43 and GROUPTABLE_ID=new.id and GROUPTABLE='DOC_DETAIL_ACTIVE'))) then
 
     UPDATE OR INSERT INTO GROUP_DETAIL (GROUP_ID, PARENT_ID, GROUPTABLE_ID, GROUPTABLE) VALUES (-43, 0, new.id, 'DOC_DETAIL_ACTIVE')
 
     UPDATE OR INSERT INTO GROUP_DETAIL (GROUP_ID, PARENT_ID, GROUPTABLE_ID, GROUPTABLE) VALUES (-43, 0, new.id, 'DOC_DETAIL_ACTIVE')
 
         MATCHING (GROUP_ID, PARENT_ID, GROUPTABLE_ID, GROUPTABLE);
 
         MATCHING (GROUP_ID, PARENT_ID, GROUPTABLE_ID, GROUPTABLE);
 
   end
 
   end
 +
 
end
 
end
 
^
 
^
  
 
SET TERM ; ^
 
SET TERM ; ^
 +
 +
/* Privileges of triggers */
 +
GRANT SELECT ON DOCS TO TRIGGER SET_MARKING_GROUP;
 +
GRANT UPDATE, REFERENCES ON DOC_DETAIL_ACTIVE TO TRIGGER SET_MARKING_GROUP;
 +
GRANT SELECT, INSERT, UPDATE ON GROUP_DETAIL TO TRIGGER SET_MARKING_GROUP;
 +
  
 
CREATE INDEX MARK_DETAIL_IDX4 ON MARK_DETAIL (DDA_ID);
 
CREATE INDEX MARK_DETAIL_IDX4 ON MARK_DETAIL (DDA_ID);

Версия 22:18, 20 октября 2020

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

Заменить ManagerXP2.exe на версию 274_47_8 от июля 2020 г. или более новую.

Выполняем скрипт


SET TERM ^ ;
create or alter procedure PR_COPY_MARK_DETAIL (
    DOC_ID_IN integer,
    DOC_ID_OUT integer)
as
begin
INSERT INTO MARK_DETAIL (DOC_ID, PART_ID, MARK_DATA, QUANT, COMMITDATE, INSERTDT, DOCNUM, DOC_DATE, DDA_ID,
PLACE_ID_IN, PLACE_ID_OUT, GTIN, SERIES_NUMBER, EXPIRATION_DATE, ACTIVEPOS, SERIA, KIZ,  SSCC, ACCEPTED)
    select :DOC_ID_OUT, PART_ID, MARK_DATA, -QUANT, COMMITDATE, INSERTDT, DOCNUM, DOC_DATE,(select first 1 id from doc_detail_active dd where dd.doc_id=:doc_id_out and dd.part_id=md.part_id),
PLACE_ID_IN, PLACE_ID_OUT, GTIN, SERIES_NUMBER, EXPIRATION_DATE, 2, SERIA, KIZ, SSCC, ACCEPTED
from  MARK_DETAIL md where doc_id = :DOC_ID_IN ;
end^

SET TERM ; ^

SET TERM ^ ;
create or alter procedure PR_DOC_CANCEL (
    DOC_ID type of DM_ID,
    DOC_CANCEL type of DM_STATUS,
    AUDIT_ID type of DM_ID,
    OWNER_ID type of DM_ID)
returns (
    CANCEL_RESULT integer)
as
declare variable DELETED_DOC_ID bigint;
declare variable DOC_STATUS type of DM_STATUS;
declare variable CONTRACT_ID DM_ID;
begin
  /*
cancel_result:
0 - удаление проведенного документа
1 - удаление рабочего/отложенного документа
2 - откладываем рабочий документ
3 - отложенный документ делаем рабочим
*/
  select STATUS, CONTRACT_ID, DELETED_DOC_ID
  from DOCS
  where ID = :DOC_ID
  into :DOC_STATUS, :CONTRACT_ID, :DELETED_DOC_ID;
  if (DOC_STATUS = 1) then --если документ проведен
  begin
    delete from DOC_DETAIL
    where DOC_ID = :DOC_ID;
    update DOCS
    set STATUS = -1,
        COMMITSESSION_ID = :AUDIT_ID
    where ID = :DOC_ID;
    if (CONTRACT_ID <> 0) then
    begin
      execute procedure PR_CREDITCOMMIT(:CONTRACT_ID);
    end
    CANCEL_RESULT = 0;
  end
  else
  if (DOC_STATUS in (0, 2)) then --документ рабочий или отложенный
    if (DOC_CANCEL = 1) then --документ отменяем
    begin
      insert into DOCS_CANCELED (ID, PARENT_ID, DOC_TYPE, STATUS, AGENT_ID, DOCNUM, DOCDATE, CAPTION, RGUID, INSERTDT,
                                 POSTDT, AUDIT_ID, VNUM, VSHIFT, CREATER, OWNER, COMMITDATE, PACKET, DEVICE_NUM, SUMMA,
                                 SUMMA_O, SUM_NDSO, SUM_NDSR, CALCSUMMA, COMMENTS, SUMM1, SUMM2, SUMM3, SUMM4,
                                 CHECKDATA, COMMITSESSION_ID, SUM_DSC, CASHDATA, PRICE_TYPE, CURRENCY_ID, BASE_AGENT_ID,
                                 CONTRACT_ID, LINK_ID, DELETED_DOC_ID, OPLATA, DATE_OPL, MAKE_ID, DOC_PAY_DATE, BONUS,
                                 D$UUID, D$SRVUPDDT)
      select ID, PARENT_ID, DOC_TYPE, STATUS, AGENT_ID, DOCNUM, DOCDATE, CAPTION, RGUID, INSERTDT, POSTDT, AUDIT_ID,
             VNUM, VSHIFT, CREATER, OWNER, COMMITDATE, PACKET, DEVICE_NUM, SUMMA, SUMMA_O, SUM_NDSO, SUM_NDSR,
             CALCSUMMA, COMMENTS, SUMM1, SUMM2, SUMM3, SUMM4, CHECKDATA, COMMITSESSION_ID, SUM_DSC, CASHDATA,
             PRICE_TYPE, CURRENCY_ID, BASE_AGENT_ID, CONTRACT_ID, LINK_ID, DELETED_DOC_ID, OPLATA, DATE_OPL, MAKE_ID,
             DOC_PAY_DATE, BONUS, D$UUID, D$SRVUPDDT
      from DOCS
      where ID = :DOC_ID;
      insert into DOC_DETAIL_ACTIVE_CANCELED (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, GODENDO, SERIA, NDS, SUM_NDSO, SUM_NDSR, 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, BCODE_IZG, HUMAN_QUANT, SUM_DSC,
                                              CUSTOMDRAW, STATUS, PART_TYPE, BASE_AGENT_ID, GROUP_ID, PACKET, VPART_ID,
                                              GNVLS, MAKE_ID, MNN, ACCOMP_ID, MOTHERPART_UUID)
      select 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, GODENDO, SERIA, NDS, SUM_NDSO, SUM_NDSR,
             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, BCODE_IZG, HUMAN_QUANT, SUM_DSC, CUSTOMDRAW, STATUS, PART_TYPE,
             BASE_AGENT_ID, GROUP_ID, PACKET, VPART_ID, GNVLS, MAKE_ID, MNN, ACCOMP_ID, MOTHERPART_UUID
      from DOC_DETAIL_ACTIVE
      where DOC_ID = :DOC_ID;
      delete from DOC_DETAIL_ACTIVE_MMBSH
      where DOC_ID = :DOC_ID;
      delete from DOC_DETAIL_ACTIVE
      where DOC_ID = :DOC_ID;
      delete from DOCS
      where ID = :DOC_ID;
      if (DELETED_DOC_ID > 0) then
      begin
        update DOCS
        set STATUS = 1,
            COMMITSESSION_ID = :AUDIT_ID
        where ID = :DELETED_DOC_ID;
        insert into DOC_DETAIL (PART_TYPE, PARENT_ID, DOC_ID, PART_ID, QUANT, DCARD, SUMMA, SUMMA_O, NAC, DISCOUNT,
                                SUM_NDSO, SUM_NDSR, SUM_DSC)
        select (select PART_TYPE
                from PARTS
                where ID = DDD.PART_ID), PARENT_ID, :DELETED_DOC_ID, PART_ID, QUANT, DCARD, SUMMA, SUMMA_O, NAC,
                DISCOUNT, SUM_NDSO, SUM_NDSR, SUM_DSC
        from DOC_DETAIL_DELETED DDD
        where DOC_ID = :DELETED_DOC_ID;
        delete from DOC_DETAIL_DELETED
        where DOC_ID = :DELETED_DOC_ID;
      end
      CANCEL_RESULT = 1;
    end
    else
    if (DOC_CANCEL = 0) then --откладываем либо возвращаем документ
      if (DOC_STATUS = 0) then --откладываем рабочий документ
      begin
        update DOCS
        set STATUS = 2,
            COMMITSESSION_ID = :AUDIT_ID
        where ID = :DOC_ID;
        CANCEL_RESULT = 2;
      end
      else --возвращаем отложенный документ
      begin
        update DOCS
        set STATUS = 0,
            AUDIT_ID = :AUDIT_ID,
            OWNER = :OWNER_ID
        where ID = :DOC_ID;
        CANCEL_RESULT = 3;
      end
    else
      exception EX_WRONGDOCSTATUS; --передали неправильный статус
  execute procedure PR_UPDBLOCKINFO_BY_DOC(:DOC_ID, :DOC_STATUS);
  execute procedure PR_DOEVENT('EV_DOCCANCEL');
  
    --Удаляме данные из mark_detail при отмене документа
    delete from mark_detail where doc_id = :doc_id;
  suspend;
end^
SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DOCS_CANCELED_BI_DISTR FOR DOCS_CANCELED
ACTIVE BEFORE INSERT POSITION 0
AS
begin
  if (new.d$uuid is null) then
  begin
    new.d$uuid=UUID_TO_CHAR(GEN_UUID());
    new.d$srvupddt='2000-01-01';
--    update or insert into g$distribute (TABLENAME,UUID,SOPER,FROM_PROFILE_ID) values ('DOCS_CANCELED',new.d$uuid,0,null) matching (TABLENAME,UUID);
  end
end
^

SET TERM ; ^

SET TERM ^ ;


CREATE OR ALTER TRIGGER AGENTS_CHANGE_MARK_TYPE_BU FOR AGENTS
ACTIVE AFTER UPDATE POSITION 0
AS
begin
update doc_detail_active dd set dd.accepttype=new.mark_type where
dd.doc_id in (select d.id from docs d left join doc_detail_active dd1 on dd1.doc_id=d.id where d.agent_id=new.id);
end
^

SET TERM ; ^

SET TERM ^ ;

CREATE OR ALTER TRIGGER DOC_DETAIL_ACTIVE_MARK_BI FOR DOC_DETAIL_ACTIVE
ACTIVE BEFORE INSERT OR UPDATE POSITION 0
AS
begin
if (new.marking is null ) then
new.marking=0;

if (exists (select 1 from group_detail gd where gd.group_id=-43 and gd.grouptable='PARTS' and gd.grouptable_id=new.part_id)) then
new.marking=1;

--if (new.accepttype is null) then
new.accepttype=(select a.mark_type from docs d join agents a on d.agent_id=a.id where d.id=new.doc_id);
end
^

SET TERM ; ^

SET TERM ^ ;
CREATE OR ALTER TRIGGER GROUP_DETAIL_AD0 FOR GROUP_DETAIL
ACTIVE AFTER DELETE POSITION 0
AS
begin
  if ((old.group_id=-43) and (old.grouptable='DOC_DETAIL_ACTIVE')) then
   begin
    
   if ((select PARAM_VALUE from PR_GETPARAMVALUE('MARK_TWOFIRM',0))=1) then
     update doc_detail_active dd set dd.marking=0, dd.base_agent_id=0 where id=old.grouptable_id;
    else
     update doc_detail_active dd set dd.marking=0 where id=old.grouptable_id;
   end
end
^
SET TERM ; ^

SET TERM ^ ;
CREATE OR ALTER TRIGGER GROUP_DETAIL_AIU0 FOR GROUP_DETAIL
ACTIVE AFTER INSERT OR UPDATE POSITION 0
AS
begin
  if ((new.group_id=-43) and (new.grouptable='DOC_DETAIL_ACTIVE')) then
   begin
    if ((select PARAM_VALUE from PR_GETPARAMVALUE('MARK_TWOFIRM',0))=1) then
     update doc_detail_active dd set dd.marking=1, dd.base_agent_id=-10 where id=new.grouptable_id;
    else
    update doc_detail_active dd set dd.marking=1 where id=new.grouptable_id;
   end
end
^
SET TERM ; ^



SET SQL DIALECT 3;
SET TERM ^ ;



CREATE OR ALTER TRIGGER SET_MARKING_GROUP FOR DOC_DETAIL_ACTIVE
ACTIVE AFTER INSERT OR UPDATE POSITION 0
AS
begin
/*add AVO 04/09/2020
Для позиций проверяем, если товар маркированный, то ставим группу маркировки принудительно
*/
  if (new.marking=1) then
   begin
-- 20/10/2020 для корректировки выходим без определения группы
    if ((select d.doc_type from docs d where  d.id=new.doc_id) in (7,8,17,18,23)) then
      exit;
--Проверяем есть ли группа, если есть уже - выходим
    if (((select count(id) from GROUP_DETAIL where GROUP_ID =-43 and GROUPTABLE='DOC_DETAIL_ACTIVE' and GROUPTABLE_ID=new.id)>0) OR
     ((select count(id) from GROUP_DETAIL where GROUP_ID =-43 and GROUPTABLE='PARTS' and GROUPTABLE_ID=new.part_id)>0)) then
     exit;
    if ((not exists(select id from GROUP_DETAIL where GROUP_ID=-43 and GROUPTABLE_ID=new.id and GROUPTABLE='DOC_DETAIL_ACTIVE'))) then
     UPDATE OR INSERT INTO GROUP_DETAIL (GROUP_ID, PARENT_ID, GROUPTABLE_ID, GROUPTABLE) VALUES (-43, 0, new.id, 'DOC_DETAIL_ACTIVE')
         MATCHING (GROUP_ID, PARENT_ID, GROUPTABLE_ID, GROUPTABLE);
   end

end
^

SET TERM ; ^

/* Privileges of triggers */
GRANT SELECT ON DOCS TO TRIGGER SET_MARKING_GROUP;
GRANT UPDATE, REFERENCES ON DOC_DETAIL_ACTIVE TO TRIGGER SET_MARKING_GROUP;
GRANT SELECT, INSERT, UPDATE ON GROUP_DETAIL TO TRIGGER SET_MARKING_GROUP;


CREATE INDEX MARK_DETAIL_IDX4 ON MARK_DETAIL (DDA_ID);
CREATE INDEX MARK_REQUESTS_IDX1 ON MARK_REQUESTS (DOCNUM);


Поправить VW_DOCS и VW_DOC_DETAIL_ACTIVE

  • заменить первую строку в VW_DOCS (для больниц)

на

iif(docs.doc_type=60,1, (select MARKING_STATUS from PR_MARK_STATUS(docnum))),
  • заменить в VW_DOC_DETAIL_ACTIVE вызов pr_mark_count

на

iif(da.marking=1, (select concatenation from pr_mark_count(da.id)),null),

Дополнительно обновить процедуры

!!!Файл:PR EDITCUSTOMDOC типовая! 10092020.txt
!!!Файл:PR CORRECTPART типовая.txt

!!! аккуратнее, возможна остановка торговли

!!!Файл:PR DOC DETAIL INSERT типовая.txt
!!!Файл:PR DOC PRIHOD COMMIT RECURSE типовая.txt     для БезНДСников закомментировать поле SUM_NDSR!
!!!Файл:PR DOC RASHOD COMMIT типовая.txt
после этого перекомпилировать процедуру PR_DOC_COMMIT

Проверить, что в "Менеджере групп" группа "ЖНВЛС" вверху списка по группам

Настроить сетки в активных документах и журнале документов

  • Поле VW_DOC_DETAIL_ACTIVE.MARK_BARCODE (datamatrix)
  • Поле VW_DOCS.MARK_STATUS (статус документа в ЧЗ)

ТМС Проведение с авторасходом (пока не тестировалось, не накатывать пока)

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

1) добавить копирование кодов в расходный документ

        EndIBTransaction(trn1,1);
        STARTIBTRANSACTION(trn1,1);
        try
         query3:=ExecIBQuery(trn1,'execute procedure PR_COPY_MARK_DETAIL('+doc_id2+','+comdoc2+');',1);   //провел расход перемещения
        except          
         EndIBTransaction(trn1,0);      
         exit;
        end;     

2) убрать автоматическое проведение документа

примерно так Авторасход, маркировка.png

Теги: маркировка, МДЛП


конвертор

В накладные в ОЗ были добавлены, такие же нужно добавить в поля в конвертор

MARKING tinyint(4) NULL; --Маркировка: Признак маркировки: 0 – не маркированный товар, 1- маркированный, 2- Короб SSCC
GTIN varchar(20) NULL; --Маркировка: GTIN код упаковки
GTIN_SUBJ varchar(20) NULL; --Маркировка: ID места деятельности
GSERNUM varchar(20) NULL; --Маркировка: Серийный номер упаковки
ACCEPTTYPE tinyint(4) NULL; --Маркировка: Тип акцепта: 0 – обратная, 1- прямая
DATEPROD double NULL; --Маркировка: Дата производства 

возможные проблемы

  • ошибка типа conversion error MARK_DETAIL_BIU0
ALTER TABLE MARK_DETAIL ALTER COLUMN SERIES_NUMBER TYPE DM_TEXT;
  • тормозит добавление в активные документы прихода/расхода, особенно на больших накладных
CREATE INDEX MARK_DETAIL_IDX4 ON MARK_DETAIL (DDA_ID);
  • тормозит журнал документов при открытии
CREATE INDEX MARK_REQUESTS_IDX1 ON MARK_REQUESTS (DOCNUM);

Добавление предприятия -10 (МДЛП)

INSERT INTO AGENTS (ID, CAPTION, FULLNAME, ADDR_ID, FACTADDR_ID, STATUS, INSERTDT, INN, DIRECTOR_NAME, BUH_NAME, EMAIL, PHONENUMBERS, DELETEDT, DOVER_FACE, DOLZHNOST, DOVERKA, DOVERKA_DT, BASE_AGENT_ID, ADDR, FACTADDR, BIK, BANK, RS, KS, KPP, KREDITDAY, BANK_ID, FOLDER_ID, GOR, KORSHET, CREDIT_DEPTH, EGAIS_ID, EGAIS_COUNTRY_ID, EGAIS_REGION_ID, FILEMASK, GLOBAL_AGENT_ID, MARK_TYPE, PARENT_ID, AGENT_PLACE_ID, TRUSTED, OGRN) VALUES (-10, 'Предприятие ОСН', 'МДЛП', 0, 0, 0, '14-SEP-2020 13:28:39.944', NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL, 0, NULL, NULL, NULL, NULL);
INSERT INTO GROUP_DETAIL (GROUP_ID, PARENT_ID, GROUPTABLE_ID, INSERTDT, GROUPTABLE) VALUES (-7, 0, '-10', '14-SEP-2020 13:28:40.007', 'AGENTS');

Фильтр "Документы, отправленные в МДЛП"

mark_status > 0

Инструкции

Маркировка лекарственных средств