Установка НДС 20% — различия между версиями

Материал из wiki.standart-n.ru
Перейти к: навигация, поиск
(Новая страница: «==Добавить отделы через скрипт или вручную (таблица DEPS)== <pre> INSERT INTO DEPS (ID, CAPTION, NDS, NDSR, STATUS) VALU…»)
 
(Как проверить?)
Строка 239: Строка 239:
 
==Как проверить?==
 
==Как проверить?==
 
* До 2019 г. любые манипуляции с НДС 20%, например, приход товара, должны быть запрещены;
 
* До 2019 г. любые манипуляции с НДС 20%, например, приход товара, должны быть запрещены;
* После начала 2019 г. любые манипуляции (кроме корректировки), должны быть запрещены;
+
* После начала 2019 г. любые манипуляции (кроме корректировки) с отделами 18%, должны быть запрещены;
 
* При "отбитии" чека с НДС 18% с 2019 г. должен создаваться документ корректировки и автоматически корректировать позиции с 18% на 20%.
 
* При "отбитии" чека с НДС 18% с 2019 г. должен создаваться документ корректировки и автоматически корректировать позиции с 18% на 20%.
 
Чек уже проводить с НДС 20%.
 
Чек уже проводить с НДС 20%.

Версия 19:03, 21 декабря 2018

Добавить отделы через скрипт или вручную (таблица DEPS)

INSERT INTO DEPS (ID, CAPTION, NDS, NDSR, STATUS) VALUES (9, 'НДС 20%', 20, 20, 0);
INSERT INTO DEPS (ID, CAPTION, NDS, NDSR, STATUS) VALUES (10, 'опт 0% розн 20%', 0, 20, 0);
INSERT INTO DEPS (ID, CAPTION, NDS, NDSR, STATUS) VALUES (11, 'опт 18% розн 20%', 18, 20, 0);
INSERT INTO DEPS (ID, CAPTION, NDS, NDSR, STATUS) VALUES (12, 'опт 10% розн 20%', 10, 20, 0);

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

CREATE EXCEPTION EX_NODOC 'Не удалось создать документ корректировки';
CREATE EXCEPTION EX_NODEP 'Не найден отдел';
CREATE EXCEPTION EX_NOPART 'Не удалось добавить партию в корректировку';
CREATE EXCEPTION EX_NDS20 'Запрет установки НДС 20% до 2019';
CREATE EXCEPTION EX_NDS18 'Запрет установки NDS 18% после 2019';


SET TERM ^ ;

create or alter procedure PR_HASNDS (
    DOC_ID DM_ID,
    NDSR DM_STATUS)
returns (
    HASNDS DM_STATUS)
as
begin
  hasnds = 0;
  if ( exists(select first 1 dda.id from doc_detail_active dda
    left join parts p on dda.part_id = p.id
    left join deps dep on iif(p.id > 0, p.dep, dda.dep) = dep.id
    where dda.doc_id = :doc_id and dep.ndsr = :ndsr) )
  then hasnds = 1;
  suspend;
end^

SET TERM ; ^

/* Following GRANT statements are generated automatically */

GRANT SELECT ON DOC_DETAIL_ACTIVE TO PROCEDURE PR_HASNDS;
GRANT SELECT ON PARTS TO PROCEDURE PR_HASNDS;
GRANT SELECT ON DEPS TO PROCEDURE PR_HASNDS;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE PR_HASNDS TO SYSDBA;



SET TERM ^ ;

create or alter procedure PR_GET_DEP (
    NDS DM_STATUS,
    NDSR DM_STATUS)
returns (
    ID DM_ID)
as
begin

  select first 1 id from deps where nds = :nds and ndsr = :ndsr into :id;

  if (id is null) then
  begin
    --exception EX_NODEP;
    id = (select max(id)+1 from deps);
    insert into deps (id, nds, ndsr) values (:id, :nds, :ndsr);
  end

  suspend;
end^

SET TERM ; ^

/* Following GRANT statements are generated automatically */

GRANT SELECT,INSERT ON DEPS TO PROCEDURE PR_GET_DEP;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE PR_GET_DEP TO PROCEDURE PR_AUTO_PART_CORRECT;
GRANT EXECUTE ON PROCEDURE PR_GET_DEP TO SYSDBA;



SET TERM ^ ;

create or alter procedure PR_CORRECTPART_NDS (
    DOC_ID type of DM_ID,
    PART_ID type of DM_ID,
    QUANT type of DM_DOUBLE,
    DONTCHECKQUANT DM_STATUS = null)
returns (
    ID type of DM_ID,
    MSG DM_TEXT)
as
declare variable NAC type of DM_DOUBLE;
declare variable PARENT_ID type of DM_ID;
begin
  if (QUANT < 0) then
    QUANT = 0;
  select ID, MSG from PR_RASHODPART(:DOC_ID, :PART_ID, :QUANT, null, null, :dontcheckquant, null, 1)
  into :PARENT_ID, :MSG;
  if (PARENT_ID <= 0) then
  begin
    ID = PARENT_ID;
    suspend;
    exit;
    --exception EX_RASHOD_ERROR;
  end
  select ID from DOC_DETAIL_ACTIVE where DOC_ID = :DOC_ID and
        PARENT_ID = :PARENT_ID and
        PART_ID = 0
  into ID;
  if (ID is null) then
  begin
    ID = gen_id(GEN_DOC_DETAIL_ACTIVE_ID, 1);
    insert into DOC_DETAIL_ACTIVE (ID, PARENT_ID, DOC_ID, PART_ID, QUANT, NAC, KOEF, MOTHERPART_ID)
    values (:ID, :PARENT_ID, :DOC_ID, :PART_ID, :QUANT, :NAC, 0, :PART_ID);
    update DOC_DETAIL_ACTIVE set PART_ID = 0 where ID = :ID;
    insert into GROUP_DETAIL (GROUP_ID, PARENT_ID, GROUPTABLE_ID, GROUPTABLE)
    select GROUP_ID, 0, :ID, 'DOC_DETAIL_ACTIVE' from GROUP_DETAIL where GROUPTABLE_ID = :PART_ID and
          GROUPTABLE = 'PARTS';
  end
  else
  begin
    update DOC_DETAIL_ACTIVE set QUANT = :QUANT,
                                 SUMMA = :QUANT * PRICE,
                                 SUMMA_O = :QUANT * PRICE_O,
                                 SUM_NDSO = round((:QUANT * PRICE_O) * NDS / (100 + NDS), 2),
                                 SUM_NDSR = (:QUANT * PRICE) * (select D.NDSR from DEPS D where D.ID = DEP) / (100 + (select D.NDSR from DEPS D where D.ID = DEP)) where ID = :ID;
  end
  suspend;
end^

SET TERM ; ^

/* Following GRANT statements are generated automatically */

GRANT EXECUTE ON PROCEDURE PR_RASHODPART TO PROCEDURE PR_CORRECTPART_NDS;
GRANT SELECT,INSERT,UPDATE ON DOC_DETAIL_ACTIVE TO PROCEDURE PR_CORRECTPART_NDS;
GRANT SELECT,INSERT ON GROUP_DETAIL TO PROCEDURE PR_CORRECTPART_NDS;
GRANT SELECT ON DEPS TO PROCEDURE PR_CORRECTPART_NDS;

/* Existing privileges on this procedure */

GRANT EXECUTE ON PROCEDURE PR_CORRECTPART_NDS TO PROCEDURE PR_AUTO_PART_CORRECT;
GRANT EXECUTE ON PROCEDURE PR_CORRECTPART_NDS TO SYSDBA;

Исправить PR_DOC_COMMIT

перед строкой

if (base_type = 4) then execute procedure pr_doc_virtual_commit(:doc_id);

добавить блок

  if ( current_date >= '01.01.2019' and base_type = 2 and (select hasnds from PR_HASNDS(:doc_id, 18)) > 0 ) then
    execute procedure PR_AUTO_PART_CORRECT(:doc_id, :session_id);

  if ( base_type <> 3 ) then
  begin
    if (current_date < '01.01.2019' and (select hasnds from PR_HASNDS(:doc_id, 20)) > 0 ) then
      exception EX_NDS20;
    if (current_date >= '01.01.2019' and (select hasnds from PR_HASNDS(:doc_id, 18)) > 0 ) then
      exception EX_NDS18;
  end

ТМС по автоматической настройке отделов (ставим НЕ ВСЕМ, только опционально, ТМС -327)

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

var
  mainForm: TForm1;
  qWork: TIBQuery;

  t_zkassa:string;
  t_bat, ver:string;
  File_manager: TextFile;   
  File_bat: TextFile;


procedure set_nds_deps;
var
  iq: tibquery;
  i: integer;
  Deps: array;
  ini: tmeminifile;
  sl: tstringlist;
begin
  sl := tstringlist.create;
  ini := tmeminifile.Create('tmp.ini');
  iq := tibquery.create(nil);
  try
    iq.Transaction := CreateWT(CurrDB);
    iq.Transaction.StartTransaction;
    Deps := [2, 3, 4, 4, 2, 3, 2, 4, 3, 3, 3];
    for i := 0 to 10 do
    begin
      iq.SQL.Text := 'select dep_data from deps where id = :id';
      iq.Params[0].AsInteger := i + 1;
      iq.Open;
      sl.Text := iq.Fields[0].AsString;
      ini.SetStrings(sl);
      sl.Clear;
      ini.WriteInteger('FR' + FR_SerialNumber, 'TaxType', Deps[i]);
      ini.GetStrings(sl);

      iq.SQL.Text := 'update deps set dep_data = :data where id = :id';
      iq.Params[0].AsString := sl.Text;
      iq.Params[1].AsInteger := i + 1;
      iq.ExecSQL;
    end;
    iq.Transaction.Commit;
  finally
    iq.free;
    ini.Free;
    sl.Free;
  end;
end;



begin
  set_nds_deps;
end;

Как проверить?

  • До 2019 г. любые манипуляции с НДС 20%, например, приход товара, должны быть запрещены;
  • После начала 2019 г. любые манипуляции (кроме корректировки) с отделами 18%, должны быть запрещены;
  • При "отбитии" чека с НДС 18% с 2019 г. должен создаваться документ корректировки и автоматически корректировать позиции с 18% на 20%.

Чек уже проводить с НДС 20%.