SET TERM ^ ; create or alter procedure PR_EDITCUSTOMDOC ( DOC_ID type of DM_ID, SESSION_ID type of DM_ID, RGUID type of DM_RGUID) returns ( CUR_DOC_ID type of DM_ID) as declare variable VNUM type of DM_ID_NULL; declare variable DOC_TYPE type of DM_ID; declare variable DOC_BASE_TYPE type of DM_ID; declare variable DOC_STATUS type of DM_STATUS; declare variable DOC_AGENT_ID type of DM_ID; declare variable DOCNUM type of DM_TEXT; declare variable DOC_CAPTION type of DM_TEXT; declare variable BASE_AGENT_ID integer; declare variable DOCDATE type of DM_DATETIME; declare variable EGAIS_NUM DM_TEXT; declare variable EGAIS_ID DM_TEXT; declare variable EGAIS_UNITTYPE DM_TEXT; declare variable EGAIS_STATUS DM_STATUS; declare variable AGENTS_CONTRACT_ID DM_ID; declare variable PART_ID DM_ID; declare variable QUANT DM_DOUBLE; declare variable SUMMA DM_DOUBLE; declare variable SUM_DSC DM_DOUBLE; declare variable DISCOUNT DM_DOUBLE; declare variable SUM_NDSO DM_DOUBLE; declare variable ACCEPTANCE DM_TEXT; declare variable AGENT_FIRST DM_TEXT1024; declare variable DATE_FIRST_PRIHOD DM_DATE; declare variable MARKING DM_ID; declare variable DATEPROD DM_DATE; declare variable GTIN_SUBJ DM_TEXT; declare variable ACCEPTTYPE DM_ID; declare variable CUR_DDA_ID DM_ID; declare variable DCARD DM_TEXT; declare variable SUMMA_O DM_DOUBLE; declare variable NAC DM_DOUBLE; declare variable COMMENTS DM_BLOBTEXT; declare variable AGENT_PLACE DM_TEXT; declare variable OWNER_ID DM_ID; declare variable DOWNER DM_ID; declare variable DCREATER DM_ID; declare variable DOC_TREB_ID DM_ID_NULL; declare variable FIRST_AGENT_ID DM_ID_NULL; declare variable COMMITDATE DM_DATETIME; begin select d.doc_type, d.status, dt.base_type, dt.caption, d.docnum, d.docdate, d.commitdate, d.agent_id, d.vnum, d.base_agent_id, EGAIS_NUM, EGAIS_ID, EGAIS_UNITTYPE, EGAIS_STATUS, d.AGENTS_CONTRACT_ID, d.COMMENTS, d.agent_place,d.owner,d.creater, d.doc_treb_id, d.first_agent_id from docs d left join doc_types dt on d.doc_type=dt.id where d.id=:doc_id into :doc_type, :doc_status, :doc_base_type, :doc_caption, :docnum, :docdate, :COMMITDATE, :doc_AGENT_ID,:vnum, :BASE_AGENT_ID, :EGAIS_NUM, :EGAIS_ID, :EGAIS_UNITTYPE, :EGAIS_STATUS, :AGENTS_CONTRACT_ID, :COMMENTS, :agent_place,:downer,:dcreater,:doc_treb_id,:first_agent_id; if (doc_type is null) then exception EX_CANTFINDDOC_ID; if (doc_status in (0,-2,2)) then exception EX_WRONGDOCSTATUS; if (doc_base_type=3) then exception EX_WRONGDOC_BASE_TYPE; /*add AVO 17/09/2020*/ if (DOC_STATUS = 1) then --если документ проведен begin --проверям собственника документа, если не он сообщаем и выходим select USER_ID from sessions where id=:SESSION_ID into :owner_id; if ((:owner_id<>:downer) or (:owner_id<>:dcreater)) then begin if (not exists (select gd.id from group_detail gd where gd.grouptable='USERS' and gd.grouptable_id=:owner_id and gd.group_id=-12)) then exception ex_wrongdocstatus 'Документ создан другим пользователем '||(select username from users where id=:dcreater)||'. Удаление или редактирование возможно только под ним!'; end end /*end add*/ cur_doc_id=gen_id(gen_docs_id,1); insert into docs (ID,PARENT_ID,DOC_TYPE,STATUS,AGENT_ID,RGUID,AUDIT_ID,VNUM,caption,DOCNUM,DOCDATE,COMMITDATE,DELETED_DOC_ID, BASE_AGENT_ID, EGAIS_NUM, EGAIS_ID, EGAIS_UNITTYPE, EGAIS_STATUS,AGENTS_CONTRACT_ID, COMMENTS, agent_place) values (:cur_doc_id,0,:DOC_TYPE,0,:doc_AGENT_ID,:RGUID,:session_ID,:vnum,:doc_caption, :DOCNUM,:DOCDATE,:COMMITDATE,:DOC_ID, :BASE_AGENT_ID, :EGAIS_NUM, :EGAIS_ID, :EGAIS_UNITTYPE, :EGAIS_STATUS,:AGENTS_CONTRACT_ID, :COMMENTS,:agent_place); -- Обновление номера документа на старое значение UPDATE docs set vnum = :vnum, caption=:doc_caption || ' №' || :vnum, agent_place=:agent_place where id = :cur_doc_id; if (doc_base_type=1) then --приход begin if (doc_status=1) then -- begin UPDATE docs set vnum = :vnum, caption=:doc_caption || ' №' || :docnum, agent_place=:agent_place,doc_treb_id=:doc_treb_id, first_agent_id=:first_agent_id where id = :cur_doc_id; /* insert into DOC_DETAIL_ACTIVE (doc_id,part_id,quant,summa,discount,koef,sum_dsc,sum_ndso) select :cur_doc_id,part_id,quant,summa,discount,0,sum_dsc,sum_ndso from doc_detail where doc_id=:doc_id;*/ for select PART_ID, QUANT, SUMMA, DISCOUNT, SUM_DSC, SUM_NDSO, ACCEPTANCE, AGENT_FIRST, DATE_FIRST_PRIHOD, MARKING, DATEPROD, GTIN_SUBJ, ACCEPTTYPE from DOC_DETAIL where DOC_ID = :DOC_ID into :PART_ID, :QUANT, :SUMMA, :DISCOUNT, :SUM_DSC, :SUM_NDSO, :ACCEPTANCE, :AGENT_FIRST, :DATE_FIRST_PRIHOD, :MARKING, :DATEPROD, :GTIN_SUBJ, :ACCEPTTYPE do begin CUR_DDA_ID = gen_id(GEN_DOC_DETAIL_ACTIVE_ID, 1); insert into DOC_DETAIL_ACTIVE (ID, DOC_ID, PART_ID, QUANT, SUMMA, DISCOUNT, KOEF, SUM_DSC, SUM_NDSO, ACCEPTANCE, AGENT_FIRST, DATE_FIRST_PRIHOD, MARKING, DATEPROD, GTIN_SUBJ, ACCEPTTYPE) values (:CUR_DDA_ID, :CUR_DOC_ID, :PART_ID, :QUANT, :SUMMA, :DISCOUNT, 0, :SUM_DSC, :SUM_NDSO, :ACCEPTANCE, :AGENT_FIRST, :DATE_FIRST_PRIHOD, :MARKING, :DATEPROD, :GTIN_SUBJ, :ACCEPTTYPE); update MARK_DETAIL M set M.DOC_ID = :CUR_DOC_ID, M.DDA_ID = :CUR_DDA_ID where M.DOC_ID = :DOC_ID and M.PART_ID = :PART_ID; /*add AVO 07/09/2020 Группу маркированного товара переводим на DOC_DETAIL_ACTIVE*/ if (:MARKING=1) then update GROUP_DETAIL gd set gd.grouptable_id=:CUR_DDA_ID, gd.grouptable='DOC_DETAIL_ACTIVE' where gd.grouptable='PARTS' and gd.group_id=-43 and gd.group_id=:PART_ID; end update DOC_DETAIL_ACTIVE dda set dda.part_id=iif((select count(*) from doc_detail where part_id = dda.part_id) > 1,dda.part_id,0) where dda.doc_id=:cur_doc_id; end else begin if (doc_status=-1) then begin insert into DOC_DETAIL_ACTIVE (doc_id,part_id,quant,summa,discount,koef,sum_dsc) select :cur_doc_id,part_id,quant,summa,discount,0,sum_dsc from doc_detail_deleted where doc_id=:doc_id; update DOC_DETAIL_ACTIVE dda set dda.part_id=iif((select count(*) from doc_detail where part_id = dda.part_id) > 1,dda.part_id,0) where dda.doc_id=:cur_doc_id; end end end else if ((doc_base_type=2) or (doc_base_type=7)) then --расход begin if (doc_status=1) then begin /* insert into doc_detail_active (doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,koef,sum_dsc) select :cur_doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,1,sum_dsc from doc_detail where doc_id=:doc_id;*/ for select PART_ID, QUANT, DCARD, SUMMA, SUMMA_O, NAC, DISCOUNT, SUM_NDSO, SUM_DSC, ACCEPTANCE, AGENT_FIRST, DATE_FIRST_PRIHOD, MARKING, DATEPROD, GTIN_SUBJ, ACCEPTTYPE from DOC_DETAIL where DOC_ID = :DOC_ID into :PART_ID, :QUANT, :DCARD, :SUMMA, :SUMMA_O, :NAC, :DISCOUNT, :SUM_NDSO, :SUM_DSC, :ACCEPTANCE, :AGENT_FIRST, :DATE_FIRST_PRIHOD, :MARKING, :DATEPROD, :GTIN_SUBJ, :ACCEPTTYPE do begin CUR_DDA_ID = gen_id(GEN_DOC_DETAIL_ACTIVE_ID, 1); insert into DOC_DETAIL_ACTIVE (ID, DOC_ID, PART_ID, QUANT, DCARD, SUMMA, SUMMA_O, NAC, DISCOUNT, SUM_NDSO, KOEF, SUM_DSC, ACCEPTANCE, AGENT_FIRST, DATE_FIRST_PRIHOD, MARKING, DATEPROD, GTIN_SUBJ, ACCEPTTYPE) values (:CUR_DDA_ID, :CUR_DOC_ID, :PART_ID, :QUANT, :DCARD, :SUMMA, :SUMMA_O, :NAC, :DISCOUNT, :SUM_NDSO, 1, :SUM_DSC, :ACCEPTANCE, :AGENT_FIRST, :DATE_FIRST_PRIHOD, :MARKING, :DATEPROD, :GTIN_SUBJ, :ACCEPTTYPE); update MARK_DETAIL M set M.DOC_ID = :CUR_DOC_ID, M.DDA_ID = :CUR_DDA_ID where M.DOC_ID = :DOC_ID and M.PART_ID = :PART_ID; end end else begin if (doc_status=-1) then begin insert into doc_detail_active (doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,koef,sum_dsc) select :cur_doc_id,part_id,quant,dcard,summa,summa_o,nac,discount,sum_ndso,1,sum_dsc from doc_detail_deleted where doc_id=:doc_id; end end end suspend; end^ SET TERM ; ^ /* Следующие операторы GRANT сгенерированы автоматически */ GRANT SELECT,INSERT,UPDATE ON DOCS TO PROCEDURE PR_EDITCUSTOMDOC; GRANT SELECT ON DOC_TYPES TO PROCEDURE PR_EDITCUSTOMDOC; GRANT SELECT ON SESSIONS TO PROCEDURE PR_EDITCUSTOMDOC; GRANT SELECT,UPDATE ON GROUP_DETAIL TO PROCEDURE PR_EDITCUSTOMDOC; GRANT SELECT ON USERS TO PROCEDURE PR_EDITCUSTOMDOC; GRANT SELECT ON DOC_DETAIL TO PROCEDURE PR_EDITCUSTOMDOC; GRANT SELECT,INSERT,UPDATE ON DOC_DETAIL_ACTIVE TO PROCEDURE PR_EDITCUSTOMDOC; GRANT SELECT,UPDATE ON MARK_DETAIL TO PROCEDURE PR_EDITCUSTOMDOC; GRANT SELECT ON DOC_DETAIL_DELETED TO PROCEDURE PR_EDITCUSTOMDOC; /* Существующие привилегии на эту процедуру */ GRANT EXECUTE ON PROCEDURE PR_EDITCUSTOMDOC TO STANDART; GRANT EXECUTE ON PROCEDURE PR_EDITCUSTOMDOC TO SYSDBA;