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

Материал из wiki.standart-n.ru
Перейти к: навигация, поиск
(Инструкции)
 
(не показано 30 промежуточных версии 4 участников)
Строка 1: Строка 1:
 
==Заменить версию Менеджера==
 
==Заменить версию Менеджера==
 
Заменить '''ManagerXP2.exe''' на версию '''274_47_8''' от июля 2020 г. или более новую.
 
Заменить '''ManagerXP2.exe''' на версию '''274_47_8''' от июля 2020 г. или более новую.
 +
 +
НЕ ОБНОВЛЯТЬ ТРИГГЕРЫ, ЕСЛИ 2 ПРЕДПРИЯТИЯ!!!
  
 
==Выполняем скрипт==
 
==Выполняем скрипт==
  
 
<pre>
 
<pre>
 +
 +
ALTER TABLE DOCS ADD DOC_TREB_ID DM_ID_NULL;
 +
ALTER TABLE DOCS ADD FIRST_AGENT_ID DM_ID_NULL;
 +
ALTER TABLE PARAMS ADD CONSTRAINT UNQ1_PARAMS UNIQUE (PARAM_ID);
 +
ALTER TABLE DOCS_TREB ADD G$PROFILE_ID DM_ID;
 +
ALTER TABLE DOCS_TREB ADD FIRST_AGENT DM_ID;
 +
ALTER TABLE PARTS ADD D$UUID DM_UUID_NULL;
 +
ALTER TABLE DOC_DETAIL_ACTIVE_TREB ADD TO_PROFILE_ID DM_ID;
 +
ALTER TABLE DOC_DETAIL_ACTIVE_TREB ADD MOTHERPART_UUID DM_UUID_NULL;
 +
ALTER TABLE DOCS_CANCELED ADD D$UUID DM_UUID_NULL;
 +
ALTER TABLE DOCS_CANCELED ADD D$SRVUPDDT DM_DATETIME;
 +
ALTER TABLE DOCS ADD D$UUID DM_UUID_NULL;
 +
ALTER TABLE DOCS ADD D$SRVUPDDT DM_DATETIME;
 +
ALTER TABLE DOC_DETAIL_ACTIVE_CANCELED ADD MOTHERPART_UUID DM_UUID_NULL;
 +
ALTER TABLE DOCS_TREB ADD AGENT_PLACE DM_TEXT
 +
 +
  
 
SET TERM ^ ;
 
SET TERM ^ ;
create or alter procedure PR_COPY_MARK_DETAIL (
+
 
     DOC_ID_IN integer,
+
create or alter procedure GM$PR_PRIHOD_DOC_TREB (
    DOC_ID_OUT integer)
+
     DOC_ID integer)
 
as
 
as
 +
declare variable DOC_TYPE DM_STATUS;
 +
declare variable AGENT_ID DM_ID_NULL;
 +
declare variable G$PROFILE_ID DM_ID_NULL;
 +
declare variable DOC_COMMITDATE DM_DATE;
 +
declare variable DOC_UUID DM_ID_NULL;
 +
declare variable TO_PROFILE_ID DM_ID_NULL;
 +
declare variable FIRST_AGENT_ID DM_ID_NULL;
 +
declare variable CODE_PROFILE DM_TEXT;
 
begin
 
begin
INSERT INTO MARK_DETAIL (DOC_ID, PART_ID, MARK_DATA, QUANT, COMMITDATE, INSERTDT, DOCNUM, DOC_DATE, DDA_ID,
+
  select doc_type, agent_id, cast(commitdate as dm_date)
PLACE_ID_IN, PLACE_ID_OUT, GTIN, SERIES_NUMBER, EXPIRATION_DATE, ACTIVEPOS, SERIA, KIZSSCC, ACCEPTED)
+
  from docs where id=:doc_id into :doc_type, :agent_id, :doc_commitdate;
    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),
+
  if (doc_type not in (6,11)) then  exit;
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 ;
+
  --select gp.id from G$PROFILES gp where gp.agent_id=:agent_id into :g$profile_id;
 +
  select (select N from GET_INTEGER(email)) from agents where id=:agent_id into :to_profile_id;
 +
  select (select N from GET_INTEGER(p.param_value)) from params p where p.param_id='CODE_PROFILE' into :g$profile_id;
 +
  if (g$profile_id is null or to_profile_id is null) then exit;
 +
 
 +
  DOC_TYPE=40; -- приход поставщика будет документ на точке
 +
 
 +
  --Сохраняем контрагента в переменной FIRST_AGENT_ID если есть необходимо расскомментировтаь
 +
  select FIRST_AGENT_ID from docs where id=:doc_id into :FIRST_AGENT_ID;
 +
  if (FIRST_AGENT_ID is null) then FIRST_AGENT_ID = (select id from agents where email=(select p.param_value from params p where p.param_id='CODE_PROFILE'));
 +
 
 +
  --Если нужно получить на конечной точке приход перемещеним раскомментировать данный функционал
 +
  /* Берем код профиля у контрагента, если он наш, то меняем тип документа отправляемого на точку*/
 +
  /*select coalesce(a.email,0) from agents a where a.id=:FIRST_AGENT_ID into :CODE_PROFILE;
 +
  if (((CHARACTER_LENGTH(CODE_PROFILE)=1) or (CHARACTER_LENGTH(CODE_PROFILE)=2) or (CHARACTER_LENGTH(CODE_PROFILE)=3)) and (CODE_PROFILE<>'0')) then
 +
  DOC_TYPE=41;-- приход перемещением будет документ на точке*/
 +
 
 +
  --27/05/2020 AVO Добавлено полуение ID  первоначального контрагента
 +
  INSERT INTO DOCS_TREB (ID,PARENT_ID, DOC_TYPE, STATUS, AGENT_ID, DOCNUM, DOCDATE,
 +
  RGUID, INSERTDT, POSTDT, AUDIT_ID, VNUM, VSHIFT, CREATER, OWNER, COMMITDATE,
 +
  DEVICE_NUM, SUMMA, SUMMA_O, SUM_NDSO, CALCSUMMA, COMMENTS, SUMM1, SUMM2, SUMM3, SUMM4,
 +
  CHECKDATA, COMMITSESSION_ID, SUM_DSC, CASHDATA, PRICE_TYPE, CURRENCY_ID, BASE_AGENT_ID,
 +
  CONTRACT_ID, G$PROFILE_ID, LINK_ID, DELETED_DOC_ID,TO_PROFILE_ID,/*27/05/2020 add AVO*/FIRST_AGENT,
 +
  /*04/09/2020 add AVO*/AGENT_PLACE)
 +
  select ID,PARENT_ID,:doc_type, 1 as STATUS, AGENT_ID, DOCNUM, DOCDATE,
 +
        RGUID, INSERTDT, POSTDT, AUDIT_ID, VNUM, VSHIFT, CREATER, OWNER, COMMITDATE,
 +
        DEVICE_NUM, SUMMA, SUMMA_O, SUM_NDSO, CALCSUMMA, COMMENTS, SUMM1, SUMM2, SUMM3, SUMM4,
 +
        CHECKDATA, COMMITSESSION_ID, SUM_DSC, CASHDATA, PRICE_TYPE, CURRENCY_ID, BASE_AGENT_ID,
 +
        CONTRACT_ID, :g$profile_id as G$PROFILE_ID, LINK_ID, DELETED_DOC_ID,:to_profile_id as TO_PROFILE_ID,
 +
        /*27/05/2020 add AVO*/:first_agent_id as first_agent_id,/*04/09/2020 add AVO*/AGENT_PLACE
 +
  from docs where id=:doc_id
 +
  returning id into :doc_uuid;
 +
 
 +
  INSERT INTO DOC_DETAIL_ACTIVE_TREB
 +
  (ID,PARENT_ID, PART_ID, PRICE,PRICE_O, QUANT, DISCOUNT, SUMMA,
 +
  SUMMA_O, DCARD, INSERTDT, SUM_NDSO, NAC,  HUMAN_QUANT, SUM_DSC,
 +
  PART_TYPE, BASE_AGENT_ID, G$PROFILE_ID, TO_PROFILE_ID,
 +
  STATUS, DOC_ID, SNAME, SUM_NDSR, ORIG_CODE, SKLAD_ID,
 +
  BARCODE1, BCODE_IZG,BARCODE, PRICE_Z, PRICE_R, SERIA, NDS, SERT, DATESERT, KEMVSERT,SDSERT,
 +
  GODENDO, REGN, NGTD, EDIZM, SIZG, SCOUNTRYDEP, GNVLS, SORIG_NAME,SORIG_IZG,SORIG_COUNTRY,MNN,
 +
  WARE_ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,MOTHERPART_UUID,
 +
  -- 23/07/2020 AVO Добавлены поля для передачи по маркировке
 +
  MARKING,GTIN_SUBJ,ACCEPTTYPE,DATEPROD)
 +
  select
 +
  dd.ID,0, 0, p.PRICE,p.PRICE_O, -1*(dd.QUANT), dd.DISCOUNT, -1*(dd.SUMMA),
 +
  -1*(dd.SUMMA_O),dd.DCARD, dd.INSERTDT, -1*(dd.SUM_NDSO), p.NAC, dd.HUMAN_QUANT,
 +
  dd.SUM_DSC,p.PART_TYPE, 0, :g$profile_id, :to_profile_id,
 +
  0, :doc_uuid, vn.svalue,  dd.SUM_NDSR,  w.ORIG_CODE,  p.SKLAD_ID,
 +
  p.BARCODE1, w.barcode,p.BARCODE, p.PRICE_Z, p.PRICE_R, p.SERIA, p.NDS, p.SERT, p.DATESERT, p.KEMVSERT,
 +
  p.SDSERT, p.GODENDO, p.REGN, p.NGTD, p.EDIZM, vi.svalue, vc.svalue,p.DEP,
 +
  '',--AVO 04/12/2020 отключил, слишком много групп и падало на них, группы ходят по синхронизации
 +
  --(select membership from PR_MEMBERSHIPS('PARTS=' || part_id || ';PARTS.NAME_ID=' || name_id ||';',ascii_char(13)||ascii_char(10),1)),
 +
  '','','','',p.WARE_ID,w.NAME_ID,w.IZG_ID,w.COUNTRY_ID,
 +
  w.ORIG_NAME_ID,w.ORIG_IZG_ID,w.ORIG_COUNTRY_ID,p.d$uuid,MARKING,GTIN_SUBJ,ACCEPTTYPE,DATEPROD
 +
  from doc_detail dd
 +
  left join parts p on p.id=dd.part_id
 +
  left join wares w on w.id=p.ware_id
 +
  left join vals vn on vn.id=w.name_id
 +
  left join vals vi on vi.id=w.izg_id
 +
  left join vals vc on vc.id=w.country_id
 +
  where dd.doc_id=:doc_id;
 
end^
 
end^
  
 
SET TERM ; ^
 
SET TERM ; ^
 +
 +
/* Следующие операторы GRANT сгенерированы автоматически */
 +
 +
GRANT SELECT ON DOCS TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
 +
GRANT EXECUTE ON PROCEDURE GET_INTEGER TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
 +
GRANT SELECT ON AGENTS TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
 +
GRANT SELECT ON PARAMS TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
 +
GRANT INSERT ON DOCS_TREB TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
 +
GRANT INSERT ON DOC_DETAIL_ACTIVE_TREB TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
 +
GRANT SELECT ON DOC_DETAIL TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
 +
GRANT SELECT ON PARTS TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
 +
GRANT SELECT ON WARES TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
 +
GRANT SELECT ON VALS TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
 +
 +
/* Существующие привилегии на эту процедуру */
 +
 +
GRANT EXECUTE ON PROCEDURE GM$PR_PRIHOD_DOC_TREB TO PROCEDURE PR_DOC_RASHOD_COMMIT;
 +
GRANT EXECUTE ON PROCEDURE GM$PR_PRIHOD_DOC_TREB TO PROCEDURE PR_ENAKL_PRIHOD_DOC_TREB_RESEND;
 +
GRANT EXECUTE ON PROCEDURE GM$PR_PRIHOD_DOC_TREB TO SYSDBA;
  
 
SET TERM ^ ;
 
SET TERM ^ ;
create or alter procedure PR_DOC_CANCEL (
+
 
     DOC_ID type of DM_ID,
+
create or alter procedure PR_UPDATEMARKBYPART (
     DOC_CANCEL type of DM_STATUS,
+
     DOC_ID DM_ID,
    AUDIT_ID type of DM_ID,
+
     PART_ID DM_ID,
     OWNER_ID type of DM_ID)
+
     ACTIVE_ID DM_ID)
returns (
+
    CANCEL_RESULT integer)
+
 
as
 
as
declare variable DELETED_DOC_ID bigint;
 
declare variable DOC_STATUS type of DM_STATUS;
 
declare variable CONTRACT_ID DM_ID;
 
 
begin
 
begin
  /*
+
--Если не переоценка то
cancel_result:
+
--Обновляем партию привязанную к SGTIN
0 - удаление проведенного документа
+
   if ((select D.DOC_TYPE
1 - удаление рабочего/отложенного документа
+
      from DOCS D
2 - откладываем рабочий документ
+
      where D.ID = :DOC_ID) not in (8,58)) then
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
 
   begin
    delete from DOC_DETAIL
+
     update MARK_DETAIL
    where DOC_ID = :DOC_ID;
+
     set PART_ID = :PART_ID
     update DOCS
+
     where DDA_ID = :ACTIVE_ID;
     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
 
   end
 
   else
 
   else
  if (DOC_STATUS in (0, 2)) then --документ рабочий или отложенный
+
-- При переоценки вставляем записи в mark_detail
    if (DOC_CANCEL = 1) then --документ отменяем
+
  begin
     begin
+
     insert into MARK_DETAIL (DOC_ID, PART_ID, MARK_DATA, QUANT, DOCNUM, DOC_DATE, DDA_ID, PLACE_ID_IN, PLACE_ID_OUT,
      insert into DOCS_CANCELED (ID, PARENT_ID, DOC_TYPE, STATUS, AGENT_ID, DOCNUM, DOCDATE, CAPTION, RGUID, INSERTDT,
+
                            GTIN, SERIES_NUMBER, EXPIRATION_DATE, ACTIVEPOS, SERIA, KIZ, SSCC, ACCEPTED, MDLP_STATUS,
                                POSTDT, AUDIT_ID, VNUM, VSHIFT, CREATER, OWNER, COMMITDATE, PACKET, DEVICE_NUM, SUMMA,
+
                            ERRORTEXT)
                                SUMMA_O, SUM_NDSO, SUM_NDSR, CALCSUMMA, COMMENTS, SUMM1, SUMM2, SUMM3, SUMM4,
+
    select :DOC_ID, :PART_ID, MARK_DATA, -QUANT, DOCNUM, DOC_DATE, DDA_ID, PLACE_ID_IN, PLACE_ID_OUT, GTIN,
                                CHECKDATA, COMMITSESSION_ID, SUM_DSC, CASHDATA, PRICE_TYPE, CURRENCY_ID, BASE_AGENT_ID,
+
          SERIES_NUMBER, EXPIRATION_DATE, 1, SERIA, KIZ, SSCC, ACCEPTED, 1, ''
                                CONTRACT_ID, LINK_ID, DELETED_DOC_ID, OPLATA, DATE_OPL, MAKE_ID, DOC_PAY_DATE, BONUS,
+
     from MARK_DETAIL MD
                                D$UUID, D$SRVUPDDT)
+
     where MD.DDA_ID = :ACTIVE_ID;
      select ID, PARENT_ID, DOC_TYPE, STATUS, AGENT_ID, DOCNUM, DOCDATE, CAPTION, RGUID, INSERTDT, POSTDT, AUDIT_ID,
+
  end
            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 при отмене документа
+
     --AVO теряем данные delete from mark_detail where doc_id = :doc_id;
+
 
   suspend;
 
   suspend;
 
end^
 
end^
 +
 
SET TERM ; ^
 
SET TERM ; ^
 +
 +
 +
 +
/* Следующие операторы GRANT сгенерированы автоматически */
 +
 +
GRANT SELECT ON DOCS TO PROCEDURE PR_UPDATEMARKBYPART;
 +
GRANT SELECT,INSERT,UPDATE ON MARK_DETAIL TO PROCEDURE PR_UPDATEMARKBYPART;
 +
 +
/* Существующие привилегии на эту процедуру */
 +
 +
GRANT EXECUTE ON PROCEDURE PR_UPDATEMARKBYPART TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;
 +
GRANT EXECUTE ON PROCEDURE PR_UPDATEMARKBYPART TO SYSDBA;
 +
 +
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 ^ ;
 
SET TERM ^ ;
Строка 188: Строка 230:
 
new.marking=0;
 
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
+
if (exists (select 1 from group_detail gd where gd.group_id=-43 and gd.grouptable='PARTS' and gd.grouptable_id=cast(new.part_id as dm_text))) then
 
new.marking=1;
 
new.marking=1;
  
Строка 198: Строка 240:
 
SET TERM ; ^
 
SET TERM ; ^
  
INSERT INTO PARAMS (PARENT_ID, PARAM_ID, PARAM_CAPTION, PARAM_TYPE, PARAM_VALUE, AUDIT_ID, IMAGEINDEX, STATUS, SORTING, PARAM_TYPE_DATA)
 
            VALUES (199, 'NEW_MARK_TWOFIRM', 'Разведение маркированного товара на два предприятия (Новый)', 14, '0', 1124, 0, 0, 99, 'FIXEDITEMS SHOWONLYVALUES RETURNNAME
 
0=Выключено
 
1=Включено');
 
 
update PARAMS set PARAM_VALUE='0' where PARAM_ID='MARK_TWOFIRM';
 
 
COMMIT WORK;
 
  
 
SET SQL DIALECT 3;
 
SET SQL DIALECT 3;
Строка 347: Строка 381:
  
 
SET TERM ; ^
 
SET TERM ; ^
 +
 +
 +
SET SQL DIALECT 3;
 +
  
  
Строка 366: Строка 404:
 
       exit;
 
       exit;
 
--Проверяем есть ли группа, если есть уже - выходим
 
--Проверяем есть ли группа, если есть уже - выходим
     if (((select count(id) from GROUP_DETAIL where GROUP_ID =-43 and GROUPTABLE='DOC_DETAIL_ACTIVE' and GROUPTABLE_ID=new.id)>0) OR
+
     if (((select count(id) from GROUP_DETAIL where GROUP_ID =-43 and GROUPTABLE='DOC_DETAIL_ACTIVE' and GROUPTABLE_ID=cast(new.id as dm_text))>0) OR
     ((select count(id) from GROUP_DETAIL where GROUP_ID =-43 and GROUPTABLE='PARTS' and GROUPTABLE_ID=new.part_id)>0)) then
+
     ((select count(id) from GROUP_DETAIL where GROUP_ID =-43 and GROUPTABLE='PARTS' and GROUPTABLE_ID=cast(new.part_id as dm_text))>0)) then
 
     exit;
 
     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=cast(new.id as dm_text) 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);
Строка 378: Строка 416:
  
 
SET TERM ; ^
 
SET TERM ; ^
 +
  
 
/* Privileges of triggers */
 
/* Privileges of triggers */
Строка 383: Строка 422:
 
GRANT UPDATE, REFERENCES ON DOC_DETAIL_ACTIVE 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;
 
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);
 
CREATE INDEX MARK_REQUESTS_IDX1 ON MARK_REQUESTS (DOCNUM);
 
CREATE INDEX MARK_REQUESTS_IDX1 ON MARK_REQUESTS (DOCNUM);
 +
 +
 +
SET TERM ^ ;
 +
 +
create or alter procedure PR_MARK_COUNT (
 +
    DDA_ID DM_ID)
 +
returns (
 +
    CNT DM_TEXT,
 +
    CONCATENATION DM_TEXT)
 +
as
 +
declare variable DOC_TYPE DM_ID;
 +
declare variable DOC_ID DM_ID;
 +
declare variable Q1 DM_ID;
 +
declare variable Q2 DM_ID;
 +
declare variable QUANT DM_ID;
 +
declare variable MARKING DM_STATUS;
 +
begin
 +
  --В активном документе
 +
  select QUANT,doc_id, coalesce(marking,0)
 +
  from DOC_DETAIL_ACTIVE DD
 +
  where DD.ID = :DDA_ID
 +
  into QUANT,:doc_id,:marking;
 +
 +
  if (marking is null) then marking=0;
 +
  if (marking=0) then
 +
  begin
 +
    CONCATENATION=''; CNT='';
 +
    suspend;
 +
    exit;
 +
  end
 +
 +
  select d.doc_type from docs d where d.id=:doc_id into :doc_type;
 +
--на приход
 +
  select cast(count(M.MARK_DATA) as DM_ID)
 +
  from MARK_DETAIL M
 +
  where M.DDA_ID = :DDA_ID and
 +
        M.ACTIVEPOS = 1
 +
  into Q1;
 +
--на расход
 +
  select cast(count(M.MARK_DATA) as DM_ID)
 +
  from MARK_DETAIL M
 +
  where M.DDA_ID = :DDA_ID and
 +
        M.ACTIVEPOS = 2
 +
  into Q2;
 +
  if (:doc_type not in (8,58)) then
 +
  begin
 +
    if (QUANT > 0) then
 +
    begin
 +
      select 'Кол-во: ' || :QUANT || ' / Неверных: ' ||(:QUANT - :Q1), :Q1
 +
      from RDB$DATABASE
 +
      into :CONCATENATION, :CNT;
 +
    end
 +
    else
 +
    begin
 +
      select 'Кол-во: ' ||(:QUANT * -1) || ' / Неверных: ' ||((:QUANT * -1) - :Q2), :Q2
 +
      from RDB$DATABASE
 +
      into :CONCATENATION, :CNT;
 +
    end
 +
  end
 +
  else
 +
  --Переоценка
 +
  begin
 +
    select 'Кол-во: ' ||(:QUANT ) || ' / Неверных: ' ||((:QUANT ) - :Q2), :Q2
 +
    from RDB$DATABASE
 +
    into :CONCATENATION, :CNT;
 +
  end
 +
  suspend;
 +
end^
 +
 +
SET TERM ; ^
 +
 +
/* Следующие операторы GRANT сгенерированы автоматически */
 +
 +
GRANT SELECT ON DOC_DETAIL_ACTIVE TO PROCEDURE PR_MARK_COUNT;
 +
GRANT SELECT ON DOCS TO PROCEDURE PR_MARK_COUNT;
 +
GRANT SELECT ON MARK_DETAIL TO PROCEDURE PR_MARK_COUNT;
 +
 +
/* Существующие привилегии на эту процедуру */
 +
 +
GRANT EXECUTE ON PROCEDURE PR_MARK_COUNT TO VIEW VW_DOC_DETAIL_ACTIVE;
 +
GRANT EXECUTE ON PROCEDURE PR_MARK_COUNT TO SYSDBA;
 +
 +
SET TERM ^ ;
 +
 +
create or alter procedure PR_DOC_DETAIL_ACTIVE_MMBSH_COMM (
 +
    DOC_ID type of DM_ID)
 +
as
 +
declare variable GROUPTABLE type of DM_METADATANAME;
 +
declare variable GROUP_ID type of DM_ID;
 +
declare variable TABLE_ID DM_ID_NULL;
 +
declare variable NAME_ID type of DM_UUID_NULL;
 +
declare variable IZG_ID type of DM_UUID_NULL;
 +
declare variable COUNTRY_ID type of DM_UUID_NULL;
 +
declare variable ORIG_NAME_ID type of DM_UUID_NULL;
 +
declare variable ORIG_IZG_ID type of DM_UUID_NULL;
 +
declare variable ORIG_COUNTRY_ID type of DM_UUID_NULL;
 +
begin
 +
  for
 +
    select m.group_id, m.detail_id, g.grouptable, da.name_id, da.izg_id, da.country_id, da.orig_name_id, da.orig_izg_id, da.orig_country_id
 +
    from DOC_DETAIL_ACTIVE_MMBSH m left join groups g on m.group_id=g.id left join doc_detail_active da on m.detail_id=da.id
 +
    where m.doc_id=:doc_id and m.status=0
 +
    into :group_id, :table_id, :grouptable, :name_id, :izg_id, :country_id, :orig_name_id, :orig_izg_id, :orig_country_id
 +
  do
 +
  begin
 +
    if (trim(grouptable)='PARTS') then
 +
      if (not exists (select 1 from group_detail where GROUPTABLE='DOC_DETAIL_ACTIVE' and group_id=:group_id and GROUPTABLE_ID=:table_id)) then
 +
      insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE');
 +
 +
    if (trim(grouptable)='PARTS.NAME_ID') then
 +
    begin
 +
      if ( (:name_id='0') or (:name_id='') )  then
 +
        insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE');
 +
      else
 +
      begin
 +
        if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :name_id) is null) then
 +
          insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:name_id);
 +
      end
 +
    end
 +
    if (trim(grouptable)='PARTS.IZG_ID') then
 +
    begin
 +
      if ( (:izg_id='0') or (:izg_id='') ) then
 +
        insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE');
 +
      else
 +
      begin
 +
        if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :izg_id) is null) then
 +
          insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:izg_id);
 +
      end
 +
    end
 +
    if (trim(grouptable)='PARTS.COUNTRY_ID') then
 +
    begin
 +
      if ( (:country_id=0) or (:country_id='') ) then
 +
        insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE');
 +
      else
 +
      begin
 +
        if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :country_id) is null) then
 +
          insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:country_id);
 +
      end
 +
    end
 +
    if (trim(grouptable)='PARTS.ORIG_NAME_ID') then
 +
    begin
 +
      if ( (:orig_name_id=0) or (:orig_name_id='') ) then
 +
        insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE');
 +
      else
 +
      begin
 +
        if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :orig_name_id) is null) then
 +
          insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:orig_name_id);
 +
      end
 +
    end
 +
    if (trim(grouptable)='PARTS.ORIG_IZG_ID') then
 +
    begin
 +
      if ( (:orig_izg_id=0) or (:orig_izg_id='') ) then
 +
        insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE');
 +
      else
 +
      begin
 +
        if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :orig_izg_id) is null) then
 +
          insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:orig_izg_id);
 +
      end
 +
    end
 +
    if (trim(grouptable)='PARTS.ORIG_COUNTRY_ID') then
 +
    begin
 +
      if ( (:orig_country_id=0) or (:orig_country_id='') ) then
 +
        insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE');
 +
      else
 +
      begin
 +
        if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :orig_country_id) is null) then
 +
          insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:orig_country_id);
 +
      end
 +
    end
 +
  end
 +
end^
 +
 +
SET TERM ; ^
 +
 +
/* Следующие операторы GRANT сгенерированы автоматически */
 +
 +
GRANT SELECT ON DOC_DETAIL_ACTIVE_MMBSH TO PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM;
 +
GRANT SELECT ON GROUPS TO PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM;
 +
GRANT SELECT ON DOC_DETAIL_ACTIVE TO PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM;
 +
GRANT SELECT,INSERT ON GROUP_DETAIL TO PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM;
 +
 +
/* Существующие привилегии на эту процедуру */
 +
 +
GRANT EXECUTE ON PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM TO STANDART;
 +
GRANT EXECUTE ON PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM TO SYSDBA;
 +
 +
 +
SET SQL DIALECT 3;
 +
 +
 +
 +
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
 +
update doc_detail_active dd set dd.marking=0 where id=old.grouptable_id;
 +
end
 +
end
 +
^
 +
 +
SET TERM ; ^
  
  
Строка 405: Строка 649:
  
 
==Дополнительно обновить процедуры==
 
==Дополнительно обновить процедуры==
  !!![[Файл:PR_EDITCUSTOMDOC_типовая!_10092020.txt]]
+
  !!![[Файл:PR NEW PART 20210318.txt]]
 +
!!![[Файл:PR DOC PRIHOD COMMIT RECURSE 20210402.txt]]
 +
!!![[Файл:PR_EDITCUSTOMDOC_16032021.txt]]
 
  !!![[Файл:PR CORRECTPART типовая.txt]]
 
  !!![[Файл:PR CORRECTPART типовая.txt]]
 +
!!![[Файл:PR DOC CANCEL 20211025.txt]]
  
 
<b>!!! аккуратнее, возможна остановка торговли</b>
 
<b>!!! аккуратнее, возможна остановка торговли</b>
 
25/11/2020 обновленный вариант процедур проведения документа с записью в таблицы информации о маркированном товаре
 
для версии менеджера 274.49.32 и выше здесь '''[[Обновление процедур проведения документа - маркировка]]'''
 
после этого перекомпилировать процедуру PR_DOC_COMMIT
 
 
Старые версии без сохранения информации о маркировке:
 
!!![[Файл:PR DOC DETAIL INSERT типовая.txt]]
 
!!![[Файл:PR DOC PRIHOD COMMIT RECURSE типовая 20201126.txt]]    для БезНДСников закомментировать поле SUM_NDSR!
 
!!![[Файл:PR DOC RASHOD COMMIT типовая.txt]]
 
 
 
  после этого перекомпилировать процедуру PR_DOC_COMMIT
 
  после этого перекомпилировать процедуру PR_DOC_COMMIT
  
Строка 473: Строка 710:
 
CREATE INDEX MARK_REQUESTS_IDX1 ON MARK_REQUESTS (DOCNUM);
 
CREATE INDEX MARK_REQUESTS_IDX1 ON MARK_REQUESTS (DOCNUM);
 
</pre>
 
</pre>
 +
*при переоценке datamatrix коды "не пересаживаются" на новую партию или продажи не было, но марка списалась
 +
нужно обновить PR_DOC_PRIHOD_COMMIT_RECURSE, как на вики/дистрибах
 +
+ применить корректировочную процедуру [[Файл:PR REPAIR REPRICE MDLP 20220426.txt]]
  
 
==Добавление предприятия -10 (МДЛП)==
 
==Добавление предприятия -10 (МДЛП)==
Строка 701: Строка 941:
 
==Инструкции==
 
==Инструкции==
 
[[Маркировка лекарственных средств]]
 
[[Маркировка лекарственных средств]]
 +
 +
[[Файл:Таблица соответствий документов менеджера и мдлп.pdf]]
 +
 +
[[Файл:Добавить корневой сертификат.pdf]]

Текущая версия на 15:24, 17 августа 2022

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

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

НЕ ОБНОВЛЯТЬ ТРИГГЕРЫ, ЕСЛИ 2 ПРЕДПРИЯТИЯ!!!

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


ALTER TABLE DOCS ADD DOC_TREB_ID DM_ID_NULL;
ALTER TABLE DOCS ADD FIRST_AGENT_ID DM_ID_NULL;
ALTER TABLE PARAMS ADD CONSTRAINT UNQ1_PARAMS UNIQUE (PARAM_ID);
ALTER TABLE DOCS_TREB ADD G$PROFILE_ID DM_ID;
ALTER TABLE DOCS_TREB ADD FIRST_AGENT DM_ID;
ALTER TABLE PARTS ADD D$UUID DM_UUID_NULL;
ALTER TABLE DOC_DETAIL_ACTIVE_TREB ADD TO_PROFILE_ID DM_ID;
ALTER TABLE DOC_DETAIL_ACTIVE_TREB ADD MOTHERPART_UUID DM_UUID_NULL;
ALTER TABLE DOCS_CANCELED ADD D$UUID DM_UUID_NULL;
ALTER TABLE DOCS_CANCELED ADD D$SRVUPDDT DM_DATETIME;
ALTER TABLE DOCS ADD D$UUID DM_UUID_NULL;
ALTER TABLE DOCS ADD D$SRVUPDDT DM_DATETIME;
ALTER TABLE DOC_DETAIL_ACTIVE_CANCELED ADD MOTHERPART_UUID DM_UUID_NULL;
ALTER TABLE DOCS_TREB ADD AGENT_PLACE DM_TEXT



SET TERM ^ ;

create or alter procedure GM$PR_PRIHOD_DOC_TREB (
    DOC_ID integer)
as
declare variable DOC_TYPE DM_STATUS;
declare variable AGENT_ID DM_ID_NULL;
declare variable G$PROFILE_ID DM_ID_NULL;
declare variable DOC_COMMITDATE DM_DATE;
declare variable DOC_UUID DM_ID_NULL;
declare variable TO_PROFILE_ID DM_ID_NULL;
declare variable FIRST_AGENT_ID DM_ID_NULL;
declare variable CODE_PROFILE DM_TEXT;
begin
  select doc_type, agent_id, cast(commitdate as dm_date)
  from docs where id=:doc_id into :doc_type, :agent_id, :doc_commitdate;
  if (doc_type not in (6,11)) then  exit;

  --select gp.id from G$PROFILES gp where gp.agent_id=:agent_id into :g$profile_id;
  select (select N from GET_INTEGER(email)) from agents where id=:agent_id into :to_profile_id;
  select (select N from GET_INTEGER(p.param_value)) from params p where p.param_id='CODE_PROFILE' into :g$profile_id;
  if (g$profile_id is null or to_profile_id is null) then exit;

  DOC_TYPE=40; -- приход поставщика будет документ на точке

  --Сохраняем контрагента в переменной FIRST_AGENT_ID если есть необходимо расскомментировтаь
  select FIRST_AGENT_ID from docs where id=:doc_id into :FIRST_AGENT_ID;
  if (FIRST_AGENT_ID is null) then FIRST_AGENT_ID = (select id from agents where email=(select p.param_value from params p where p.param_id='CODE_PROFILE'));

  --Если нужно получить на конечной точке приход перемещеним раскомментировать данный функционал
  /* Берем код профиля у контрагента, если он наш, то меняем тип документа отправляемого на точку*/
  /*select coalesce(a.email,0) from agents a where a.id=:FIRST_AGENT_ID into :CODE_PROFILE;
  if (((CHARACTER_LENGTH(CODE_PROFILE)=1) or (CHARACTER_LENGTH(CODE_PROFILE)=2) or (CHARACTER_LENGTH(CODE_PROFILE)=3)) and (CODE_PROFILE<>'0')) then
   DOC_TYPE=41;-- приход перемещением будет документ на точке*/

  --27/05/2020 AVO Добавлено полуение ID  первоначального контрагента
  INSERT INTO DOCS_TREB (ID,PARENT_ID, DOC_TYPE, STATUS, AGENT_ID, DOCNUM, DOCDATE,
  RGUID, INSERTDT, POSTDT, AUDIT_ID, VNUM, VSHIFT, CREATER, OWNER, COMMITDATE,
  DEVICE_NUM, SUMMA, SUMMA_O, SUM_NDSO, CALCSUMMA, COMMENTS, SUMM1, SUMM2, SUMM3, SUMM4,
  CHECKDATA, COMMITSESSION_ID, SUM_DSC, CASHDATA, PRICE_TYPE, CURRENCY_ID, BASE_AGENT_ID,
  CONTRACT_ID, G$PROFILE_ID, LINK_ID, DELETED_DOC_ID,TO_PROFILE_ID,/*27/05/2020 add AVO*/FIRST_AGENT,
  /*04/09/2020 add AVO*/AGENT_PLACE)
  select ID,PARENT_ID,:doc_type, 1 as STATUS, AGENT_ID, DOCNUM, DOCDATE,
         RGUID, INSERTDT, POSTDT, AUDIT_ID, VNUM, VSHIFT, CREATER, OWNER, COMMITDATE,
         DEVICE_NUM, SUMMA, SUMMA_O, SUM_NDSO, CALCSUMMA, COMMENTS, SUMM1, SUMM2, SUMM3, SUMM4,
         CHECKDATA, COMMITSESSION_ID, SUM_DSC, CASHDATA, PRICE_TYPE, CURRENCY_ID, BASE_AGENT_ID,
         CONTRACT_ID, :g$profile_id as G$PROFILE_ID, LINK_ID, DELETED_DOC_ID,:to_profile_id as TO_PROFILE_ID,
         /*27/05/2020 add AVO*/:first_agent_id as first_agent_id,/*04/09/2020 add AVO*/AGENT_PLACE
  from docs where id=:doc_id
  returning id into :doc_uuid;

  INSERT INTO DOC_DETAIL_ACTIVE_TREB
  (ID,PARENT_ID, PART_ID, PRICE,PRICE_O, QUANT, DISCOUNT, SUMMA,
   SUMMA_O, DCARD, INSERTDT, SUM_NDSO, NAC,  HUMAN_QUANT, SUM_DSC,
   PART_TYPE, BASE_AGENT_ID, G$PROFILE_ID, TO_PROFILE_ID,
   STATUS, DOC_ID, SNAME, SUM_NDSR, ORIG_CODE, SKLAD_ID,
   BARCODE1, BCODE_IZG,BARCODE, PRICE_Z, PRICE_R, SERIA, NDS, SERT, DATESERT, KEMVSERT,SDSERT,
   GODENDO, REGN, NGTD, EDIZM, SIZG, SCOUNTRY,  DEP, GNVLS, SORIG_NAME,SORIG_IZG,SORIG_COUNTRY,MNN,
   WARE_ID,NAME_ID,IZG_ID,COUNTRY_ID,ORIG_NAME_ID,ORIG_IZG_ID,ORIG_COUNTRY_ID,MOTHERPART_UUID,
   -- 23/07/2020 AVO Добавлены поля для передачи по маркировке
   MARKING,GTIN_SUBJ,ACCEPTTYPE,DATEPROD)
   select
   dd.ID,0, 0, p.PRICE,p.PRICE_O, -1*(dd.QUANT), dd.DISCOUNT, -1*(dd.SUMMA),
   -1*(dd.SUMMA_O),dd.DCARD, dd.INSERTDT, -1*(dd.SUM_NDSO), p.NAC, dd.HUMAN_QUANT,
   dd.SUM_DSC,p.PART_TYPE, 0, :g$profile_id, :to_profile_id,
   0, :doc_uuid, vn.svalue,  dd.SUM_NDSR,  w.ORIG_CODE,  p.SKLAD_ID,
   p.BARCODE1, w.barcode,p.BARCODE, p.PRICE_Z, p.PRICE_R, p.SERIA, p.NDS, p.SERT, p.DATESERT, p.KEMVSERT,
   p.SDSERT, p.GODENDO, p.REGN, p.NGTD, p.EDIZM, vi.svalue, vc.svalue,p.DEP,
   '',--AVO 04/12/2020 отключил, слишком много групп и падало на них, группы ходят по синхронизации
   --(select membership from PR_MEMBERSHIPS('PARTS=' || part_id || ';PARTS.NAME_ID=' || name_id ||';',ascii_char(13)||ascii_char(10),1)),
   '','','','',p.WARE_ID,w.NAME_ID,w.IZG_ID,w.COUNTRY_ID,
   w.ORIG_NAME_ID,w.ORIG_IZG_ID,w.ORIG_COUNTRY_ID,p.d$uuid,MARKING,GTIN_SUBJ,ACCEPTTYPE,DATEPROD
   from doc_detail dd
   left join parts p on p.id=dd.part_id
   left join wares w on w.id=p.ware_id
   left join vals vn on vn.id=w.name_id
   left join vals vi on vi.id=w.izg_id
   left join vals vc on vc.id=w.country_id
   where dd.doc_id=:doc_id;
end^

SET TERM ; ^

/* Следующие операторы GRANT сгенерированы автоматически */

GRANT SELECT ON DOCS TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
GRANT EXECUTE ON PROCEDURE GET_INTEGER TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
GRANT SELECT ON AGENTS TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
GRANT SELECT ON PARAMS TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
GRANT INSERT ON DOCS_TREB TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
GRANT INSERT ON DOC_DETAIL_ACTIVE_TREB TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
GRANT SELECT ON DOC_DETAIL TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
GRANT SELECT ON PARTS TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
GRANT SELECT ON WARES TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;
GRANT SELECT ON VALS TO PROCEDURE GM$PR_PRIHOD_DOC_TREB;

/* Существующие привилегии на эту процедуру */

GRANT EXECUTE ON PROCEDURE GM$PR_PRIHOD_DOC_TREB TO PROCEDURE PR_DOC_RASHOD_COMMIT;
GRANT EXECUTE ON PROCEDURE GM$PR_PRIHOD_DOC_TREB TO PROCEDURE PR_ENAKL_PRIHOD_DOC_TREB_RESEND;
GRANT EXECUTE ON PROCEDURE GM$PR_PRIHOD_DOC_TREB TO SYSDBA;

SET TERM ^ ;

create or alter procedure PR_UPDATEMARKBYPART (
    DOC_ID DM_ID,
    PART_ID DM_ID,
    ACTIVE_ID DM_ID)
as
begin
--Если не переоценка то
--Обновляем партию привязанную к SGTIN
  if ((select D.DOC_TYPE
       from DOCS D
       where D.ID = :DOC_ID) not in (8,58)) then
  begin
    update MARK_DETAIL
    set PART_ID = :PART_ID
    where DDA_ID = :ACTIVE_ID;
  end
  else
-- При переоценки вставляем записи в mark_detail
  begin
    insert into MARK_DETAIL (DOC_ID, PART_ID, MARK_DATA, QUANT, DOCNUM, DOC_DATE, DDA_ID, PLACE_ID_IN, PLACE_ID_OUT,
                             GTIN, SERIES_NUMBER, EXPIRATION_DATE, ACTIVEPOS, SERIA, KIZ, SSCC, ACCEPTED, MDLP_STATUS,
                             ERRORTEXT)
    select :DOC_ID, :PART_ID, MARK_DATA, -QUANT, DOCNUM, DOC_DATE, DDA_ID, PLACE_ID_IN, PLACE_ID_OUT, GTIN,
           SERIES_NUMBER, EXPIRATION_DATE, 1, SERIA, KIZ, SSCC, ACCEPTED, 1, ''
    from MARK_DETAIL MD
    where MD.DDA_ID = :ACTIVE_ID;
  end
  suspend;
end^

SET TERM ; ^



/* Следующие операторы GRANT сгенерированы автоматически */

GRANT SELECT ON DOCS TO PROCEDURE PR_UPDATEMARKBYPART;
GRANT SELECT,INSERT,UPDATE ON MARK_DETAIL TO PROCEDURE PR_UPDATEMARKBYPART;

/* Существующие привилегии на эту процедуру */

GRANT EXECUTE ON PROCEDURE PR_UPDATEMARKBYPART TO PROCEDURE PR_DOC_PRIHOD_COMMIT_RECURSE;
GRANT EXECUTE ON PROCEDURE PR_UPDATEMARKBYPART TO SYSDBA;

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 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=cast(new.part_id as dm_text))) 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 SQL DIALECT 3;



SET TERM ^ ;



CREATE OR ALTER TRIGGER AIU_MARK_GROUP FOR GROUP_DETAIL
ACTIVE AFTER INSERT OR UPDATE POSITION 0
AS
begin
  /*add avo 16/12/2020 and d.id>0*/
  if ((new.grouptable='DOC_DETAIL_ACTIVE')) then
   begin
    if (new.group_id=-43) then
     begin
      --21/10/2020 смотрим на параметр и в зависимости от него снимаем/ставим предприятие и ставку НДС новую
      if (((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) and ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1)) then
        update doc_detail_active dd set
         dd.marking=1,
         dd.base_agent_id=-10,
         dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id desc )
        where dd.id=new.grouptable_id;
      --03/09/2020 смотрим на параметр и в зависимости от него снимаем/ставим предприятие и ставку НДС новую
      else if ((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) then
        update doc_detail_active dd set
         dd.marking=1,
         dd.base_agent_id=-10
        where dd.id=new.grouptable_id;
      --21/10/2020 смотрим на параметр и в зависимости от него снимаем/ставим ставку НДС новую
      else if ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1) then
        update doc_detail_active dd set
         dd.marking=1,
         dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id desc )
        where dd.id=new.grouptable_id;
      else
        update doc_detail_active dd set dd.marking=1 where dd.id=new.grouptable_id and dd.marking<>1;
     end
   end
  if (new.grouptable='PARTS') then
   begin
    if (new.group_id=-43) then
     begin
      --21/10/2020 смотрим на параметр и в зависимости от него снимаем/ставим предприятие и ставку НДС новую
      if (((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) and ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1)) then
        update doc_detail_active dd set
         dd.marking=1,
         dd.base_agent_id=-10,
         dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id desc )
        where dd.part_id=new.grouptable_id;
      --03/09/2020 смотрим на параметр и в зависимости от него снимаем/ставим предприятие и ставку НДС новую
      else if ((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) then
        update doc_detail_active dd set
         dd.marking=1,
         dd.base_agent_id=-10
        where dd.part_id=new.grouptable_id;
      --21/10/2020 смотрим на параметр и в зависимости от него снимаем/ставим ставку НДС новую
      else if ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1) then
        update doc_detail_active dd set
         dd.marking=1,
         dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id desc )
        where dd.part_id=new.grouptable_id;
      else
        update doc_detail_active dd set dd.marking=1 where dd.part_id=new.grouptable_id and dd.marking<>1;
     end
   end

end
^

SET TERM ; ^

DROP TRIGGER GROUP_DETAIL_AIU0;
DROP TRIGGER GROUP_DETAIL_AD0;

SET TERM ^ ;



CREATE OR ALTER TRIGGER AD_MARK_GROUP FOR GROUP_DETAIL
ACTIVE AFTER DELETE POSITION 0
AS
begin
  /*add avo 16/12/2020 and d.id>0*/
  if ((old.grouptable='DOC_DETAIL_ACTIVE')) then
   begin
    if (old.group_id=-43) then
     begin
      --03/09/2020 смотрим на параметр и в зависимости от него снимаем/ставим предприятие
      if (((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) and ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1)) then
        update doc_detail_active dd set
         dd.marking=0,
         dd.base_agent_id=0,
         dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id )
        where dd.id=old.grouptable_id;
      else if ((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) then
        update doc_detail_active dd set
         dd.marking=0,
         dd.base_agent_id=0
        where dd.id=old.grouptable_id;
      else if ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1) then
        update doc_detail_active dd set
         dd.marking=0,
         dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id )
        where dd.id=old.grouptable_id;
      else
        update doc_detail_active dd set dd.marking=0 where dd.id=old.grouptable_id and dd.marking<>0; 
     end
   end
  if (old.grouptable='PARTS') then
   begin
    if (old.group_id=-43) then
     begin
      --03/09/2020 смотрим на параметр и в зависимости от него снимаем/ставим предприятие
      if (((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) and ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1)) then
        update doc_detail_active dd set
         dd.marking=0,
         dd.base_agent_id=0,
         dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id )
        where dd.part_id=old.grouptable_id;
      else if ((select PARAM_VALUE from PR_GETPARAMVALUE('NEW_MARK_TWOFIRM',0))=1) then
        update doc_detail_active dd set
         dd.marking=0,
         dd.base_agent_id=0
        where dd.part_id=old.grouptable_id;
      else if ((select PARAM_VALUE from PR_GETPARAMVALUE('MARKING_NDS',0))=1) then
        update doc_detail_active dd set
         dd.marking=0,
         dd.dep=(select first 1 d.id from deps d where d.nds=(select nds from deps where id=dd.dep) and d.id>0 order by d.id )
        where dd.part_id=old.grouptable_id;
      else
        update doc_detail_active dd set dd.marking=0 where dd.part_id=old.grouptable_id and dd.marking<>0;
     end
   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=cast(new.id as dm_text))>0) OR
     ((select count(id) from GROUP_DETAIL where GROUP_ID =-43 and GROUPTABLE='PARTS' and GROUPTABLE_ID=cast(new.part_id as dm_text))>0)) then
     exit;
    if ((not exists(select id from GROUP_DETAIL where GROUP_ID=-43 and GROUPTABLE_ID=cast(new.id as dm_text) 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);


SET TERM ^ ;

create or alter procedure PR_MARK_COUNT (
    DDA_ID DM_ID)
returns (
    CNT DM_TEXT,
    CONCATENATION DM_TEXT)
as
declare variable DOC_TYPE DM_ID;
declare variable DOC_ID DM_ID;
declare variable Q1 DM_ID;
declare variable Q2 DM_ID;
declare variable QUANT DM_ID;
declare variable MARKING DM_STATUS;
begin
  --В активном документе
  select QUANT,doc_id, coalesce(marking,0)
  from DOC_DETAIL_ACTIVE DD
  where DD.ID = :DDA_ID
  into QUANT,:doc_id,:marking;

  if (marking is null) then marking=0;
  if (marking=0) then
   begin
    CONCATENATION=''; CNT='';
    suspend;
    exit;
   end

  select d.doc_type from docs d where d.id=:doc_id into :doc_type;
--на приход
  select cast(count(M.MARK_DATA) as DM_ID)
  from MARK_DETAIL M
  where M.DDA_ID = :DDA_ID and
        M.ACTIVEPOS = 1
  into Q1;
--на расход
  select cast(count(M.MARK_DATA) as DM_ID)
  from MARK_DETAIL M
  where M.DDA_ID = :DDA_ID and
        M.ACTIVEPOS = 2
  into Q2;
  if (:doc_type not in (8,58)) then
   begin
    if (QUANT > 0) then
     begin
      select 'Кол-во: ' || :QUANT || ' / Неверных: ' ||(:QUANT - :Q1), :Q1
      from RDB$DATABASE
      into :CONCATENATION, :CNT;
     end
    else
     begin
      select 'Кол-во: ' ||(:QUANT * -1) || ' / Неверных: ' ||((:QUANT * -1) - :Q2), :Q2
      from RDB$DATABASE
      into :CONCATENATION, :CNT;
     end
   end
  else
  --Переоценка
   begin
    select 'Кол-во: ' ||(:QUANT ) || ' / Неверных: ' ||((:QUANT ) - :Q2), :Q2
     from RDB$DATABASE
     into :CONCATENATION, :CNT;
   end
  suspend;
end^

SET TERM ; ^

/* Следующие операторы GRANT сгенерированы автоматически */

GRANT SELECT ON DOC_DETAIL_ACTIVE TO PROCEDURE PR_MARK_COUNT;
GRANT SELECT ON DOCS TO PROCEDURE PR_MARK_COUNT;
GRANT SELECT ON MARK_DETAIL TO PROCEDURE PR_MARK_COUNT;

/* Существующие привилегии на эту процедуру */

GRANT EXECUTE ON PROCEDURE PR_MARK_COUNT TO VIEW VW_DOC_DETAIL_ACTIVE;
GRANT EXECUTE ON PROCEDURE PR_MARK_COUNT TO SYSDBA;

SET TERM ^ ;

create or alter procedure PR_DOC_DETAIL_ACTIVE_MMBSH_COMM (
    DOC_ID type of DM_ID)
as
declare variable GROUPTABLE type of DM_METADATANAME;
declare variable GROUP_ID type of DM_ID;
declare variable TABLE_ID DM_ID_NULL;
declare variable NAME_ID type of DM_UUID_NULL;
declare variable IZG_ID type of DM_UUID_NULL;
declare variable COUNTRY_ID type of DM_UUID_NULL;
declare variable ORIG_NAME_ID type of DM_UUID_NULL;
declare variable ORIG_IZG_ID type of DM_UUID_NULL;
declare variable ORIG_COUNTRY_ID type of DM_UUID_NULL;
begin
  for
    select m.group_id, m.detail_id, g.grouptable, da.name_id, da.izg_id, da.country_id, da.orig_name_id, da.orig_izg_id, da.orig_country_id
     from DOC_DETAIL_ACTIVE_MMBSH m left join groups g on m.group_id=g.id left join doc_detail_active da on m.detail_id=da.id
     where m.doc_id=:doc_id and m.status=0
    into :group_id, :table_id, :grouptable, :name_id, :izg_id, :country_id, :orig_name_id, :orig_izg_id, :orig_country_id
  do
  begin
    if (trim(grouptable)='PARTS') then
      if (not exists (select 1 from group_detail where GROUPTABLE='DOC_DETAIL_ACTIVE' and group_id=:group_id and GROUPTABLE_ID=:table_id)) then
      insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE');

    if (trim(grouptable)='PARTS.NAME_ID') then
    begin
      if ( (:name_id='0') or (:name_id='') )  then
        insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE');
      else
      begin
        if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :name_id) is null) then
          insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:name_id);
      end
    end
    if (trim(grouptable)='PARTS.IZG_ID') then
    begin
      if ( (:izg_id='0') or (:izg_id='') ) then
        insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE');
      else
      begin
        if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :izg_id) is null) then
          insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:izg_id);
      end
    end
    if (trim(grouptable)='PARTS.COUNTRY_ID') then
    begin
      if ( (:country_id=0) or (:country_id='') ) then
        insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE');
      else
      begin
        if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :country_id) is null) then
          insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:country_id);
      end
    end
    if (trim(grouptable)='PARTS.ORIG_NAME_ID') then
    begin
      if ( (:orig_name_id=0) or (:orig_name_id='') ) then
        insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE');
      else
      begin
        if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :orig_name_id) is null) then
          insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:orig_name_id);
      end
    end
    if (trim(grouptable)='PARTS.ORIG_IZG_ID') then
    begin
      if ( (:orig_izg_id=0) or (:orig_izg_id='') ) then
        insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE');
      else
      begin
        if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :orig_izg_id) is null) then
          insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:orig_izg_id);
      end
    end
    if (trim(grouptable)='PARTS.ORIG_COUNTRY_ID') then
    begin
      if ( (:orig_country_id=0) or (:orig_country_id='') ) then
        insert into group_detail (group_id,parent_id,GROUPTABLE_ID,GROUPTABLE) values (:group_id,0,:table_id,'DOC_DETAIL_ACTIVE');
      else
      begin
        if ((select id from group_detail where group_id=:group_id and GROUPTABLE_ID = :orig_country_id) is null) then
          insert into group_detail (group_id,parent_id,GROUPTABLE_ID) values (:group_id,0,:orig_country_id);
      end
    end
  end
end^

SET TERM ; ^

/* Следующие операторы GRANT сгенерированы автоматически */

GRANT SELECT ON DOC_DETAIL_ACTIVE_MMBSH TO PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM;
GRANT SELECT ON GROUPS TO PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM;
GRANT SELECT ON DOC_DETAIL_ACTIVE TO PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM;
GRANT SELECT,INSERT ON GROUP_DETAIL TO PROCEDURE PR_DOC_DETAIL_ACTIVE_MMBSH_COMM;

/* Существующие привилегии на эту процедуру */

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


SET SQL DIALECT 3;



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
update doc_detail_active dd set dd.marking=0 where id=old.grouptable_id;
end
end
^

SET TERM ; ^


Поправить 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 NEW PART 20210318.txt
!!!Файл:PR DOC PRIHOD COMMIT RECURSE 20210402.txt
!!!Файл:PR EDITCUSTOMDOC 16032021.txt
!!!Файл:PR CORRECTPART типовая.txt
!!!Файл:PR DOC CANCEL 20211025.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);
  • при переоценке datamatrix коды "не пересаживаются" на новую партию или продажи не было, но марка списалась
нужно обновить PR_DOC_PRIHOD_COMMIT_RECURSE, как на вики/дистрибах
+ применить корректировочную процедуру Файл:PR REPAIR REPRICE MDLP 20220426.txt

Добавление предприятия -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

Старая схема отправки маркированной накладной по почте на примере подпрограммы "Переотправить документ"

program GroupProgram;
var
  query, con: cardinal; 
  trn, query1: cardinal;
  t,adr_otprav,adr_poluch,f,katalog,
  docnum,docdate,organization,doc_id,
  adr_smtp,adr_port,adr_psw,ssl, sUser,ORG_MD: string;
  i,mb_res,base_type: integer;

function SS_filename(ss: string):string;
begin
  result:=StringReplace(ss, '''', '', 1);
  result:=StringReplace(result, '"', '', 1);
  result:=StringReplace(result, ':', '', 1);
  result:=StringReplace(result, '`', '', 1);
  result:=StringReplace(result, ',', '.', 1);
end;

begin

  doc_id:=inttostr(m_docarchive.FOCUSEDID);
  
  trn:=CREATEIBTRANSACTION;    
  STARTIBTRANSACTION(trn,1);  
  t:='select dt.base_type,d.vnum,d.commitdate from docs d left join doc_types dt on d.doc_type=dt.id where d.id='+doc_id;
  query1:=ExecIBQuery(trn,t,1);
  if not IBQUERY_EOF(query1) then
   begin
    base_type:=IBQuery_FieldByName_i(query1, 'base_type');
    docnum:=IBQuery_FieldByName_s(query1, 'vnum');
    docdate:=IBQuery_FieldByName_s(query1, 'commitdate');
   end;            
  if base_type  <> 2 then
     exit; 
  t:='select PARAM_VALUE from PARAMS where PARAM_ID=''PARAMS_TEMP_PATH''';
  query1:=ExecIBQuery(trn,t,1);
  if not IBQUERY_EOF(query1) then
   katalog:=IBQuery_FieldByName_s(query1, 'PARAM_VALUE')+'\';
  deletefilemask(katalog+'*.dbf');
  
  t:='select PARAM_VALUE from PARAMS where PARAM_ID=''PARAMS_SMTP''';
  query1:=ExecIBQuery(trn,t,1);
  if not IBQUERY_EOF(query1) then
   adr_smtp:=IBQuery_FieldByName_s(query1, 'PARAM_VALUE');
   
  t:='select PARAM_VALUE from PARAMS where PARAM_ID=''PARAMS_PORT''';
  query1:=ExecIBQuery(trn,t,1);
  if not IBQUERY_EOF(query1) then
   adr_port:=IBQuery_FieldByName_s(query1, 'PARAM_VALUE');
  
  t:='select PARAM_VALUE from PARAMS where PARAM_ID=''PARAMS_PSW''';
  query1:=ExecIBQuery(trn,t,1);
  if not IBQUERY_EOF(query1) then
   adr_psw:=IBQuery_FieldByName_s(query1, 'PARAM_VALUE');  
  
  t:='select PARAM_VALUE from PARAMS where PARAM_ID=''EMAIL''';
  query1:=ExecIBQuery(trn,t,1);
  if not IBQUERY_EOF(query1) then
   adr_otprav:=IBQuery_FieldByName_s(query1, 'PARAM_VALUE');
 
  t:='select PARAM_VALUE from PARAMS where PARAM_ID=''ORG_NAME_NAKL''';
  query1:=ExecIBQuery(trn,t,1);
  if not IBQUERY_EOF(query1) then
   organization:=IBQuery_FieldByName_s(query1, 'PARAM_VALUE');
  
  ssl := '';
  t:='select PARAM_VALUE from PARAMS where PARAM_ID=''PARAMS_AUTOTLS''';
  query1:=ExecIBQuery(trn,t,1);
  if not IBQUERY_EOF(query1) then
   begin
    if (IBQuery_FieldByName_s(query1, 'PARAM_VALUE')='Да') then
     ssl := ssl + 'AUTOTLS';
   end;
  t:='select PARAM_VALUE from PARAMS where PARAM_ID=''PARAMS_FULLSSL''';
  query1:=ExecIBQuery(trn,t,1);
  if not IBQUERY_EOF(query1) then
   begin
    if (IBQuery_FieldByName_s(query1, 'PARAM_VALUE')='Да') then
     ssl := ssl + ' FULLSSL';
   end;
   t:='select PARAM_VALUE from PARAMS where PARAM_ID=''ORG_MD''';
  query1:=ExecIBQuery(trn,t,1);
  if not IBQUERY_EOF(query1) then
  ORG_MD:=Trim(IBQuery_FieldByName_s(query1, 'PARAM_VALUE'));
  
  t:='select a.email from docs d left join agents a on d.agent_id=a.id where d.id='+doc_id;
  query1:=ExecIBQuery(trn,t,1);
  if not IBQUERY_EOF(query1) then
   adr_poluch:=IBQuery_FieldByName_s(query1, 'EMAIL');

  if (trim(adr_otprav)<>'') and (trim(adr_poluch)<>'') then 
  mb_res:=application.messagebox(PChar('У контрагента быд обнаружен электронный адрес.'+#13#10+'Отправить докумен как электронную накладную?'),'',$00000004+$00000020)
  else
  exit;
  if mb_res<>6 then
   exit;    
  con:=CreateADOConnection('Provider=Microsoft.Jet.OLEDB.4.0;Extended Properties=dBASE IV;User ID=Admin;Password=;Data Source='+katalog);
 if not FileExists(katalog+'temp.dbf') then 
  begin
     t:='CREATE TABLE temp (DOCNUM CHAR(50),DOCDATE DATE,TOVAR CHAR(250),ORIG_TOVAR CHAR(250),SER CHAR(100),'+
     'QUANT NUMERIC(18,5),PRICE_Z NUMERIC(18,5),PRICE_O NUMERIC(15,5),NDSO NUMERIC(18,5),SUM_NDSO NUMERIC(18,5),'+
     'PRICE_R NUMERIC(18,5),IZG CHAR(250),SERT CHAR(250),SDSERT DATE,KEMVSERT CHAR(250),REGN CHAR(250),DATESERT DATE,'+
     'GODENDO DATE,NGTD CHAR(250),STRANA CHAR(250),PRICE NUMERIC(18,5),BARCODE CHAR(250),GNVLS CHAR(10),'+
     'ORIG_CODE CHAR(100),PART CHAR(10),SUM_NDSR NUMERIC(18,5),SKLAD_ID CHAR(150),MARKING CHAR(10),'+
     'ACCEPTTYPE CHAR(10),GTIN_SUBJ CHAR(50))';
   //m_manager.Logit(t);
   ExecADOQuery(con, t);
  end         
   t:='select abs(dd.summa_o) as summa_o,abs(dd.price*quant) as summa, d.vnum,cast(d.commitdate as dm_date) as commitdate,'+
  'dd.sname,dd.seria,abs(dd.quant) as quant,iif(dd.price_z is null,0,dd.price_z) as price_z,'+
  'iif(dd.price_r is null,0,dd.price_r) as price_r,dd.nds,-dd.sum_ndso as SUM_NDSO,dd.price_r,dd.sizg,'+
  'dd.sert,iif(dd.sdsert is null,''01.01.2000'', cast(dd.sdsert as  dm_date )) as sdsert,dd.kemvsert,dd.regn,'+
  'iif(dd.datesert is null,''01.01.2000'',cast(dd.datesert as  dm_date )) as datesert,'+
  'iif(dd.godendo is null,''01.01.2000'',cast(dd.godendo as  dm_date )) as godendo,dd.ngtd,dd.SCOUNTRY,dd.price,dd.BCODE_IZG,dd.part_id,'+
  'iif(dd.mmbsh containing ''ЖНВЛС'',1,0) as gnvls,iif(dd.mmbsh containing ''делим'',1,0) as part,dd.MARKING, '+
  '(select (select a.caption from agents a where a.id=pr.agent_id) from PR_GETMOTHERPART(dd.part_id) pr) as sklad_id '+
  'from vw_doc_detail_active dd left join vw_docs d on dd.doc_id=d.id where d.id='+doc_id;
  ExecADOquery(con, 'delete from temp.dbf');
  //m_manager.Logit(t);
  query1:=ExecIBQuery(trn,t,1); 
  while not IBQUERY_EOF(query1) do
   begin
    t:='insert into temp (DOCNUM,DOCDATE,TOVAR,ORIG_TOVAR,SER,QUANT,PRICE_Z,PRICE_O,NDSO,SUM_NDSO,PRICE_R,'
	+'IZG,SERT,SDSERT,KEMVSERT,REGN,DATESERT,GODENDO,NGTD,STRANA,PRICE,BARCODE,GNVLS,ORIG_CODE,PART,SUM_NDSR,SKLAD_ID,MARKING,ACCEPTTYPE,GTIN_SUBJ) values (';
    t:=t+''''+DOCNUM+''',';
    try if length(DOCDATE) < 5 then t:=t+'''0:0:0'',' else t:=t+''''+stringreplace(DOCDATE,'''','',1)+''','; except t:=t+'''0:0:0'','; end;
    t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'sname'))+''',';
    t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'sname'))+''',';
    t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'seria'))+''',';
    try if IBQuery_FieldByName_s(query1, 'quant') = '' then t:=t+'0,' else t:=t+stringreplace(IBQuery_FieldByName_s(query1, 'quant'),',','.',1)+','; except t:=t+'0,'; end;
    try if IBQuery_FieldByName_s(query1, 'price_z') = '' then t:=t+'0,' else t:=t+stringreplace(IBQuery_FieldByName_s(query1, 'price_z'),',','.',1)+','; except t:=t+'0,'; end;
    try if IBQuery_FieldByName_s(query1, 'SUMMA_O') = '' then t:=t+'0,' else t:=t+stringreplace(IBQuery_FieldByName_s(query1, 'SUMMA_O'),',','.',1)+','; except t:=t+'0,'; end;
    try if IBQuery_FieldByName_s(query1, 'NDS') = '' then t:=t+'0,' else t:=t+stringreplace(IBQuery_FieldByName_s(query1, 'NDS'),',','.',1)+','; except t:=t+'0,'; end;
    try if IBQuery_FieldByName_s(query1, 'SUM_NDSO') = '' then t:=t+'0,' else t:=t+stringreplace(IBQuery_FieldByName_s(query1, 'SUM_NDSO'),',','.',1)+','; except t:=t+'0,'; end;
    try if IBQuery_FieldByName_s(query1, 'price_r') = '' then t:=t+'0,' else t:=t+stringreplace(IBQuery_FieldByName_s(query1, 'price_r'),',','.',1)+','; except t:=t+'0,'; end;
    t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'sizg'))+''',';
    t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'sert'))+''',';
    try if length(IBQuery_FieldByName_s(query1, 'sdsert')) < 5 then t:=t+'''0:0:0'',' else t:=t+''''+stringreplace(IBQuery_FieldByName_s(query1, 'sdsert'),'''','',1)+''','; except t:=t+'''0:0:0'','; end;
    t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'KEMVSERT'))+''','; 
    t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'REGN'))+''',';
    try if length(IBQuery_FieldByName_s(query1, 'DATESERT')) < 5 then t:=t+'''0:0:0'',' else  t:=t+''''+stringreplace(IBQuery_FieldByName_s(query1, 'DATESERT'),'''','',1)+''','; except t:=t+'''0:0:0'','; end;
    try if length(IBQuery_FieldByName_s(query1, 'GODENDO')) < 5 then t:=t+'''0:0:0'',' else  t:=t+''''+stringreplace(IBQuery_FieldByName_s(query1, 'GODENDO'),'''','',1)+''','; except t:=t+'''0:0:0'','; end;
    t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'NGTD'))+''',';
    t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'SCOUNTRY'))+''',';
    try if IBQuery_FieldByName_s(query1, 'price') = '' then t:=t+'0,' else t:=t+stringreplace(IBQuery_FieldByName_s(query1, 'price'),',','.',1)+','; except t:=t+'0,'; end;
    t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'BCODE_IZG'))+''',';
    try if IBQuery_FieldByName_s(query1, 'gnvls') = '' then t:=t+'0,' else t:=t+IBQuery_FieldByName_s(query1, 'gnvls')+','; except t:=t+'0,'; end;
    t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'part_id'))+''',';
    t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'part'))+''',';
    t:=t+'0,';
    t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'SKLAD_ID'))+''',';
    t:=t+''''+SS_filename(IBQuery_FieldByName_s(query1, 'MARKING'))+''',';
    t:=t+'1,';
    t:=t+''''+stringreplace(ORG_MD,'''','',1)+''')';
    //m_manager.Logit(t);
    ExecADOquery(con, t);
    IBQUERY_NEXT(query1);
   end   
  FreeADOConnection(con);  
  
  f:=katalog+organization+' №'+docnum+' от '+docdate+'.dbf';  
  m_manager.Logit('Пробуем отправить по почте файл '+f);
  
  copyfile(katalog+'temp.dbf',f,true);
  sUser := Copy(adr_otprav, 1, Pos('@', adr_otprav)-1);
  //m_manager.Logit(sUser); 
  t:=ssl+' host='+adr_smtp+' port='+adr_port+' User='+sUser+' Pass='+adr_psw+' FROMEMAIL='+adr_otprav+' TOEMAIL='+adr_poluch+' SUBJ="Электронные накладные" BODY="Электронные накладные" file0="'+f+'"';
  m_manager.logit(katalog+'VGMCSend.exe '+t);
  i:=ShellExecute(0, 'open',katalog+'VGMCSend.exe', t, '', 5);
  if i<32 then
  begin 
   showmessage('Ошибка отправки почты: '+ShellExecuteError(i));
   exit;
  end 
  //deletefile(f);
  m_manager.logit('Электронная накладная от '+adr_otprav+' с вложением "'+organization+' №'+docnum+' от '+docdate+'.dbf" для '+adr_poluch+' отправляется,  через 5-10 минут отобразиться у получателя');
end. 


Настройка под работу с УСН (2 предприятия)

Выполнить скрипт

Файл:МДЛП - настройка под УСН для точки-.txt

Настроить кассовое место

  • перезапустить кассира
  • для предприятия -10 скопировать настройки
  • настроить режим работы с УСН
  • скопировать настройки для всех пользователей

Подключение регистратора выбытия (РВ, регистратор выбытия)

Файл:Подключение регистратора выбытия.doc

запрет на снятие группы МДЛП для остатков (не обязательно ставить)

SET SQL DIALECT 3;

SET TERM ^ ;

CREATE OR ALTER TRIGGER GROUP_DETAIL_982164_BD0 FOR GROUP_DETAIL
ACTIVE BEFORE DELETE POSITION 0
AS
begin
  --ставим запрет на снятие группы МДЛП, т.к. по непонятным причинам эта группа снимается
 if ((old.group_id = -43) and (old.grouptable='PARTS')) then
  if (exists(select id from mark_detail m where m.part_id = cast(old.grouptable_id as dm_id) )) then
    exception EX_WRONG_OPER ' Позиция маркирована. Сброс группы запрещен. (Партия '||old.grouptable_id||')';
end
^

SET TERM ; ^

Инструкции

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

Файл:Таблица соответствий документов менеджера и мдлп.pdf

Файл:Добавить корневой сертификат.pdf