powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Удержать 0.5% из зарплаты - элементарно?
12 сообщений из 12, страница 1 из 1
Удержать 0.5% из зарплаты - элементарно?
    #33152188
Фотография PVP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
На первый взгляд, задача расчета «удержаний в процентах» не представляет ни какой сложности. Имеется сумма заработка, задан процент удержания. Для получения результата используется элементарная формула. Но это только на первый взгляд. На практике решение задачи расчета удержаний этого вида является громоздкой и сложной задачей. Подробности в статье, загрузить которую можно в формате Word . Может это перебор, заблуждение? Как ваше мнение?
...
Рейтинг: 0 / 0
Удержать 0.5% из зарплаты - элементарно?
    #33152265
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PVPНа первый взгляд, задача расчета «удержаний в процентах» не представляет ни какой сложности. Имеется сумма заработка, задан процент удержания. Для получения результата используется элементарная формула. Но это только на первый взгляд. На практике решение задачи расчета удержаний этого вида является громоздкой и сложной задачей. Подробности в статье, загрузить которую можно в формате Word . Может это перебор, заблуждение? Как ваше мнение?

Прочитал. Все нормально, нет никакого перебора. Надо считать так, как положено. А модель у каждого своя. В чем сомневаетесь?
Если что-то межет менятся во времени, то надо хранить историю.
...
Рейтинг: 0 / 0
Удержать 0.5% из зарплаты - элементарно?
    #33152270
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А документация - мечта удава. Как же Вы себя заставляете?
...
Рейтинг: 0 / 0
Удержать 0.5% из зарплаты - элементарно?
    #33161621
Фотография PVP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сахават ЮсифовА документация - мечта удава. Как же Вы себя заставляете?Иногда под впечатлением общения с клиентами - надоедает им объяснять, беру и выкладываю содержание последних бесед на бумагу. Иногда из-за проигранной битвы за пульт управления телевизором - приходится садится за компьютер и давить на клавиши (не смотреть же "ищу тебя" в то время, как по другому каналу детектив идет). А иногда серьезно - если пишешь книгу до разработки, то все задачи очень хорошо раскладываются по полочкам, а если после-то натыкается на многие вопросы, которые забыты при разработке.

Про 0.5% - это к тому, что в такой "простой задаче" как Бухучет есть "элементарный раздел" Зарплата, в котором "яйца выеденного не стоит" надо сделать расчет некоторых удержаний (сотни строк в процедуре на ТSQL). Какие же тогда задачи сложные?
...
Рейтинг: 0 / 0
Удержать 0.5% из зарплаты - элементарно?
    #33161815
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PVP
Про 0.5% - это к тому, что в такой "простой задаче" как Бухучет есть "элементарный раздел" Зарплата, в котором "яйца выеденного не стоит" надо сделать расчет некоторых удержаний (сотни строк в процедуре на ТSQL). Какие же тогда задачи сложные?

Сложные задачи связаны :
1. Объемной оптимизацией распределения ресурсов
2. Оптимизацией активаций во времени
3. Сбором и обработкой данных в реальном времени
4. Структруированием данных (не путать нормализацией таблиц) для принятия решения
....

А все начисления, отчисления и удержания - один Unit.
...
Рейтинг: 0 / 0
Удержать 0.5% из зарплаты - элементарно?
    #33161898
Фотография PVP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сахават Юсифов
....А все начисления, отчисления и удержания - один Unit.Второй раз сегодня не могу перевести с английского, надо что то делать. один Unit - как это по русски? (здесь, разумеется).
...
Рейтинг: 0 / 0
Удержать 0.5% из зарплаты - элементарно?
    #33161956
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
РФ - удержания.


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
166.
167.
168.
169.
170.
171.
172.
173.
174.
175.
176.
177.
178.
179.
180.
181.
182.
183.
184.
185.
186.
187.
188.
189.
190.
191.
192.
193.
194.
195.
196.
197.
198.
199.
200.
201.
202.
203.
204.
205.
206.
207.
208.
209.
210.
211.
212.
213.
214.
215.
216.
217.
218.
219.
220.
221.
222.
223.
224.
225.
226.
227.
228.
229.
230.
231.
232.
233.
234.
235.
236.
237.
238.
239.
240.
241.
242.
243.
244.
245.
246.
247.
248.
249.
250.
251.
252.
253.
254.
255.
256.
257.
258.
259.
260.
261.
262.
263.
264.
265.
266.
267.
268.
269.
270.
271.
272.
273.
274.
275.
276.
277.
278.
279.
280.
281.
282.
283.
284.
285.
286.
287.
288.
289.
290.
291.
292.
293.
294.
295.
296.
297.
298.
299.
300.
301.
302.
303.
304.
305.
306.
307.
308.
309.
310.
311.
312.
313.
314.
315.
316.
317.
318.
319.
320.
321.
322.
323.
324.
325.
326.
327.
328.
329.
330.
331.
332.
333.
334.
335.
336.
337.
338.
339.
340.
341.
342.
343.
344.
345.
346.
347.
348.
349.
350.
351.
352.
353.
354.
355.
356.
357.
358.
359.
360.
361.
362.
363.
364.
365.
366.
367.
368.
369.
370.
371.
372.
373.
374.
375.
376.
377.
378.
379.
380.
381.
382.
383.
384.
385.
386.
387.
388.
389.
390.
391.
392.
393.
394.
395.
396.
397.
398.
399.
400.
401.
402.
403.
404.
405.
406.
407.
408.
409.
410.
411.
412.
413.
414.
415.
416.
417.
418.
419.
420.
421.
422.
423.
424.
425.
426.
427.
428.
429.
430.
431.
432.
433.
434.
435.
436.
437.
438.
439.
440.
441.
442.
443.
444.
445.
446.
447.
448.
449.
450.
451.
452.
453.
454.
455.
456.
457.
458.
459.
460.
461.
462.
463.
464.
465.
466.
467.
468.
469.
470.
471.
472.
473.
474.
475.
476.
477.
478.
479.
480.
481.
482.
483.
484.
485.
486.
487.
488.
489.
490.
491.
492.
493.
494.
495.
496.
497.
498.
499.
500.
501.
502.
503.
504.
505.
506.
507.
508.
509.
510.
511.
512.
513.
514.
515.
516.
517.
518.
519.
520.
521.
522.
523.
524.
525.
526.
527.
528.
529.
530.
531.
532.
533.
534.
535.
536.
537.
//--------Подоходный налог--------------------------------

  FSax.InitPerem;

  Nashli := False;
  SumUd  :=  0 ;
  Vychet :=  0 ;

  DM.Vnal.First;
  while not DM.Vnal.Eof do
  begin
    if DM.Vnal.FieldByName('VID').AsString = 'ПН' then
    begin
      Nashli := True;
      Break;
    end;
    DM.Vnal.Next;
  end;

  if Nashli then
  begin
    FormulaP := DM.Vnal.FieldByName('FORMULA').AsString;

    R_data  := MF.DTP.Date;
    DecodeDate(R_data,Year,Month,Day);
    if Trunc(DM.CRab.FieldByName('DATAPOST').AsDateTime) <
       Trunc(EncodeDate(Year, 1 , 1 ))
    then R_data := EncodeDate(Year, 1 , 1 )
    else R_data := DM.CRab.FieldByName('DATAPOST').AsDateTime;
    DecodeDate(R_data,R_Year,R_Month,Day);
    R_data := EncodeDate(R_Year,R_Month, 1 );

    RR_data := DM.CRab.FieldByName('DATAUVOL').AsDateTime;
    DecodeDate(RR_data,RR_Year,RR_Month,Day);

    while ((R_Year <= Year) and (R_Month < Month)) do
    begin
      DM.CS1.Close;
      DM.CS1.Params.Clear;
      DM.CS1.Params.CreateParam(ftString,'P_Tabn',ptInput);
      DM.CS1.Params.CreateParam(ftDate,'P_DateYn',ptInput);
      DM.CS1.Params.CreateParam(ftDate,'P_DateYk',ptInput);
      DM.CS1.Params.ParamByName('P_Tabn').AsString := DM.CRab.FieldByName('TABN').AsString;
      DM.CS1.Params.ParamByName('P_DateYn').AsDate := EncodeDate(R_Year,R_Month, 1 );
      DM.CS1.Params.ParamByName('P_DateYk').AsDate := EncodeDate(R_Year,R_Month,MonthDays[IsLeapYear(R_Year),R_Month]);
      DM.CS1.IndexFieldNames := '';
      DM.CS1.CommandText     := 'Select * from Nachis where'
                               +' (TABN=:P_Tabn) and'
                               +' (DATA>=:P_DateYn) and'
                               +' (DATA<=:P_DateYk)';

      DM.CS1.Open;
      DM.CS1.First;
      while not DM.CS1.Eof do
      begin
        if DM.Vnal.FieldByName('DIAPOZON').AsString = 'Только' then
        begin
          if Pos(DM.CS1.FieldByName('VOP').AsString,
                 DM.Vnal.FieldByName('VXODIT').AsString) =  0  then
          begin
            DM.CS1.Next;
            Continue;
          end;
        end
        else
        begin
          if Pos(DM.CS1.FieldByName('VOP').AsString,
                 DM.Vnal.FieldByName('VXODIT').AsString) <>  0  then
          begin
            DM.CS1.Next;
            Continue;
          end;
        end;

        DM.Dox.First;
        while not DM.Dox.Eof do
        begin
          if Pos(DM.CS1.FieldByName('VOP').AsString,
                 DM.Dox.FieldByName('VXODIT').AsString) <>  0  then
          begin
            Nashli := False;
            DM.CSkid.First;
            while not DM.CSkid.Eof do
            begin
              if (DM.CSkid.FieldByName('KOD').AsString =
                  DM.Dox.FieldByName('KOD').AsString)   then
              begin
                Nashli := True;
                Break;
              end;
              DM.CSkid.Next;
            end;
            if not Nashli then DM.CSkid.Append;
            DM.CSkid.Edit;
            DM.CSkid['DATA']   := MF.DTP.Date;
            DM.CSkid['KOD']    := DM.Dox.FieldByName('KOD').AsString;
            DM.CSkid['NAIM']   := DM.Dox.FieldByName('NAME').AsString;
            DM.CSkid['KSKID']  := DM.Dox.FieldByName('KSKID').AsString;
            DM.CSkid['SUMMA']  := DM.CSkid.FieldByName('SUMMA').AsFloat+
                                  DM.CS1.FieldByName('SUMMA').AsFloat;
            DM.Skid.EditKey;
            DM.Skid.FieldByName('KOD').AsString := DM.Dox.FieldByName('KSKID').AsString;
            if DM.Skid.GotoKey then
            begin
              if DM.Skid.FieldByName('RAZMER').AsFloat =  0  then
                 DM.CSkid['SUMMAS'] := DM.CSkid.FieldByName('SUMMA').AsFloat
              else
              begin
                if (DM.Skid.FieldByName('RAZMER').AsFloat >
                    DM.CSkid.FieldByName('SUMMA').AsFloat) then
                   DM.CSkid['SUMMAS'] := DM.CSkid.FieldByName('SUMMA').AsFloat
                else
                   DM.CSkid['SUMMAS'] := DM.Skid.FieldByName('RAZMER').AsFloat;
              end;
            end;
            DM.CSkid['AVTO']  := 'А';
            DM.CSkid.Post;
            Break;
          end;
          DM.Dox.Next;
        end;
        DM.CS1.Next;
      end;

      if (RR_data >  0 ) and ((RR_Year <= R_Year) and (RR_Month < R_Month)) then
      begin
//      если уволен
        R_data := IncMonth(R_data, 1 );
        DecodeDate(R_data,R_Year,R_Month,Day);
        Continue;
      end;

      Summa :=  0 ;
      DM.CSkid.First;
      while not DM.CSkid.Eof do
      begin
        Summa := Summa + (DM.CSkid.FieldByName('SUMMA').AsFloat
                       - DM.CSkid.FieldByName('SUMMAS').AsFloat);
        DM.CSkid.Next;
      end;

      DM.CVych.First;
      while not DM.CVych.Eof do
      begin
        DM.Vic.EditKey;
        DM.Vic.FieldByName('KOD').AsString := DM.CVych.FieldByName('KOD').AsString;
        if DM.Vic.GotoKey then
        begin
          if (DM.Vic.FieldByName('MAXS').AsFloat =  0 ) or
             (Summa <= DM.Vic.FieldByName('MAXS').AsFloat) then
          begin
            D_dnach := DM.CVych.FieldByName('NACH').AsDateTime;
            D_dkon  := DM.CVych.FieldByName('KON').AsDateTime;
            if ((R_data >= D_dnach) and ((R_data <= D_dkon) or (D_dkon =  0 ))) then
            begin
              Vychet := Vychet + DM.CVych.FieldByName('SUMMA').AsFloat;
              Nashli := False;
              DM.CLgot.First;
              while not DM.CLgot.Eof do
              begin
                if (DM.CLgot.FieldByName('KOD').AsString =
                    DM.CVych.FieldByName('KOD').AsString)  then
                begin
                  Nashli := True;
                  Break;
                end;
                DM.CLgot.Next;
              end;
              if not Nashli then DM.CLgot.Append;
              DM.CLgot.Edit;
              DM.CLgot['DATA']  := MF.DTP.Date;
              DM.CLgot['KOD']   := DM.CVych.FieldByName('KOD').AsString;
              DM.CLgot['NAIM']  := DM.CVych.FieldByName('NAIM').AsString;
              DM.CLgot['SUMMA'] := DM.CLgot.FieldByName('SUMMA').AsFloat+
                                   DM.CVych.FieldByName('SUMMA').AsFloat;
              DM.CLgot['AVTO']  := 'А';
              DM.CLgot.Post;
            end;
          end;
        end;
        DM.CVych.Next;
      end;
      R_data := IncMonth(R_data, 1 );
      DecodeDate(R_data,R_Year,R_Month,Day);
    end;
    DM.CS1.Close;
    DM.CS1.Params.Clear;
    DM.CS1.IndexFieldNames := '';
    DM.CS1.CommandText     := '';

    DM.CNach.First;
    while not DM.CNach.Eof do
    begin
      if DM.Vnal.FieldByName('DIAPOZON').AsString = 'Только' then
      begin
        if Pos(DM.CNach.FieldByName('VOP').AsString,
               DM.Vnal.FieldByName('VXODIT').AsString) =  0  then
        begin
          DM.CNach.Next;
          Continue;
        end;
      end
      else
      begin
        if Pos(DM.CNach.FieldByName('VOP').AsString,
               DM.Vnal.FieldByName('VXODIT').AsString) <>  0  then
        begin
          DM.CNach.Next;
          Continue;
        end;
      end;

      DM.Dox.First;
      while not DM.Dox.Eof do
      begin
        if Pos(DM.CNach.FieldByName('VOP').AsString,
               DM.Dox.FieldByName('VXODIT').AsString) <>  0  then
        begin
          Nashli := False;
          DM.CSkid.First;
          while not DM.CSkid.Eof do
          begin
            if (DM.CSkid.FieldByName('KOD').AsString =
                DM.Dox.FieldByName('KOD').AsString)   then
            begin
              Nashli := True;
              Break;
            end;
            DM.CSkid.Next;
          end;
          if not Nashli then DM.CSkid.Append;
          DM.CSkid.Edit;
          DM.CSkid['DATA']   := MF.DTP.Date;
          DM.CSkid['KOD']    := DM.Dox.FieldByName('KOD').AsString;
          DM.CSkid['NAIM']   := DM.Dox.FieldByName('NAME').AsString;
          DM.CSkid['KSKID']  := DM.Dox.FieldByName('KSKID').AsString;
          DM.CSkid['SUMMA']  := DM.CSkid.FieldByName('SUMMA').AsFloat+
                                DM.CNach.FieldByName('SUMMA').AsFloat;
          DM.Skid.EditKey;
          DM.Skid.FieldByName('KOD').AsString := DM.Dox.FieldByName('KSKID').AsString;
          if DM.Skid.GotoKey then
          begin
            if DM.Skid.FieldByName('RAZMER').AsFloat =  0  then
               DM.CSkid['SUMMAS'] := DM.CSkid.FieldByName('SUMMA').AsFloat
            else
            begin
              if (DM.Skid.FieldByName('RAZMER').AsFloat >
                  DM.CSkid.FieldByName('SUMMA').AsFloat) then
                 DM.CSkid['SUMMAS'] := DM.CSkid.FieldByName('SUMMA').AsFloat
              else
                 DM.CSkid['SUMMAS'] := DM.Skid.FieldByName('RAZMER').AsFloat;
            end;
          end;
          DM.CSkid['AVTO']  := 'А';
          DM.CSkid.Post;
          Break;
        end;
        DM.Dox.Next;
      end;
      DM.CNach.Next;
    end;

    R_data := MF.DTP.Date;
    DecodeDate(R_data,Year,Month,Day);
    if not ((RR_data >  0 ) and ((RR_Year <= Year) and (RR_Month < Month))) then
    begin
//      если не уволен
      Summa :=  0 ;
      DM.CSkid.First;
      while not DM.CSkid.Eof do
      begin
        Summa := Summa + (DM.CSkid.FieldByName('SUMMA').AsFloat
                       - DM.CSkid.FieldByName('SUMMAS').AsFloat);
        DM.CSkid.Next;
      end;

      DM.CVych.First;
      while not DM.CVych.Eof do
      begin
        DM.Vic.EditKey;
        DM.Vic.FieldByName('KOD').AsString := DM.CVych.FieldByName('KOD').AsString;
        if DM.Vic.GotoKey then
        begin
          if (DM.Vic.FieldByName('MAXS').AsFloat =  0 ) or
             (Summa <= DM.Vic.FieldByName('MAXS').AsFloat) then
          begin
            D_dnach := DM.CVych.FieldByName('NACH').AsDateTime;
            D_dkon  := DM.CVych.FieldByName('KON').AsDateTime;
            if ((R_data >= D_dnach) and ((R_data <= D_dkon) or (D_dkon =  0 ))) then
            begin
              Vychet := Vychet + DM.CVych.FieldByName('SUMMA').AsFloat;
              Nashli := False;
              DM.CLgot.First;
              while not DM.CLgot.Eof do
              begin
                if (DM.CLgot.FieldByName('KOD').AsString =
                    DM.CVych.FieldByName('KOD').AsString)   then
                begin
                  Nashli := True;
                  Break;
                end;
                DM.CLgot.Next;
              end;
              if not Nashli then DM.CLgot.Append;
              DM.CLgot.Edit;
              DM.CLgot['DATA']  := MF.DTP.Date;
              DM.CLgot['KOD']   := DM.CVych.FieldByName('KOD').AsString;
              DM.CLgot['NAIM']  := DM.CVych.FieldByName('NAIM').AsString;
              DM.CLgot['SUMMA'] := DM.CLgot.FieldByName('SUMMA').AsFloat+
                                   DM.CVych.FieldByName('SUMMA').AsFloat;
              DM.CLgot['AVTO']  := 'А';
              DM.CLgot.Post;
            end;
          end;
        end;
        DM.CVych.Next;
      end;
    end;

    Summa :=  0 ;
    DM.CSkid.First;
    while not DM.CSkid.Eof do
    begin
      Summa := Summa + (DM.CSkid.FieldByName('SUMMA').AsFloat
                     - DM.CSkid.FieldByName('SUMMAS').AsFloat);
      DM.CSkid.Next;
    end;

    if Summa < Vychet then
    begin
//    возврат вычетов
      Vychet := Vychet - Summa;
      Summa  :=  0 ;
      DM.CLgot.Last;
      while not DM.CLgot.Bof do
      begin
        if Vychet > DM.CLgot.FieldByName('SUMMA').AsFloat then
        begin
          Vychet := Vychet - DM.CLgot.FieldByName('SUMMA').AsFloat;
          DM.CLgot.Delete;
          Continue;
        end;
        if Vychet = DM.CLgot.FieldByName('SUMMA').AsFloat then
        begin
          DM.CLgot.Delete;
        end;
        if Vychet < DM.CLgot.FieldByName('SUMMA').AsFloat then
        begin
          DM.CLgot.Edit;
          DM.CLgot['SUMMA'] := DM.CLgot.FieldByName('SUMMA').AsFloat -
                               Vychet;
          DM.CLgot.Post;
        end;
        Break;
      end;
    end
    else
    begin
// уменшение суммы облагаемого дохода
      Summa := Summa - Vychet;
    end;

//  расчет налога
    if Summa >  0  then
    begin
      If (DM.CRab.FieldByName('REZIDENT').AsString = 'Н') then
           FSax.SetPerem('REZ', 0 )
      else FSax.SetPerem('REZ', 1 );
      FSax.SetPerem('SUMMA',Summa);
      Summa := StrToFloat(FSax.Expr(FormulaP));
    end;
    if Summa <  0  then Summa :=  0 ;

//  удержан до зтого
    R_data := MF.DTP.Date;
    DecodeDate(R_data,Year,Month,Day);
    DM.CS1.Close;
    DM.CS1.Params.Clear;
    DM.CS1.Params.CreateParam(ftString,'P_Tabn',ptInput);
    DM.CS1.Params.CreateParam(ftDate,'P_DateYn',ptInput);
    DM.CS1.Params.CreateParam(ftDate,'P_DateYk',ptInput);
    DM.CS1.Params.ParamByName('P_Tabn').AsString := DM.CRab.FieldByName('TABN').AsString;
    DM.CS1.Params.ParamByName('P_DateYn').AsDate := EncodeDate(Year, 1 , 1 );
    DM.CS1.Params.ParamByName('P_DateYk').AsDate := EncodeDate(Year,Month, 1 );
    DM.CS1.IndexFieldNames := 'DATA';
    DM.CS1.CommandText     := 'Select * from Uderz where'
                           +' (TABN=:P_Tabn) and'
                           +' (DATA>=:P_DateYn) and'
                           +' (DATA<:P_DateYk)';
    DM.CS1.Open;
    DM.CS1.First;
    while not DM.CS1.Eof do
    begin
      if DM.CS1.FieldByName('VID').AsString = 'Налоги' then
         Summa := Summa - DM.CS1.FieldByName('SUMMA').AsFloat;
      DM.CS1.Next;
    end;
    DM.CS1.Close;
    DM.CS1.Params.Clear;
    DM.CS1.IndexFieldNames := '';
    DM.CS1.CommandText     := '';
    if Abs(Summa)>=  0 . 01  then
    begin
      DM.CUderz.Append;
      DM.CUderz.Edit;
      DM.CUderz['DATA']  := MF.DTP.Date;
      DM.CUderz['AVTO']  := 'А';
      DM.CUderz['VOP']   := DM.Vnal['KOD'];
      DM.CUderz['VID']   := 'Налоги';
      DM.CUderz['DBT']   := DM.Vnal['DBT'];
      DM.CUderz['KDT']   := DM.Vnal['KDT'];
      DM.CUderz['TABN']  := DM.CRab.FieldByName('TABN').AsString;
      DM.CUderz['CEX']   := DM.CRab.FieldByName('CEX').AsString;
      DM.CUderz['TIPKTO'] := DM.Vnal['TIPKTO'];
      DM.CUderz['KTO']    := DM.Vnal['KTO'];
      DM.CUderz['SUMMA']  := FormatFloat('0.00',Summa);
      DM.CUderz.Post;
    end;
  end;
  if DM.CUderz.State in [dsedit,dsInsert] then DM.CUderz.Post;
  DM.CUderz.ApplyUpdates( 0 );

//--------Удержания--------------------------------

  FSax.InitPerem;
  R_data  := Trunc(MF.DTP.Date);

  SumUd :=  0 ;
  DM.CUder.First;
  while not DM.CUder.Eof do
  begin
    D_dnach := DM.CUder.FieldByName('NACH').AsDateTime;
    D_dkon  := DM.CUder.FieldByName('KON').AsDateTime;
    if not ((R_data >= D_dnach) and ((R_data <= D_dkon) or (D_dkon =  0 ))) then
    begin
      DM.CUder.Next;
      Continue;
    end;

    DM.Vud.EditKey;
    DM.Vud.FieldByName('KOD').AsString := DM.CUder.FieldByName('VOP').AsString;
    if not DM.Vud.GotoKey then
    begin
      DM.CUder.Next;
      Continue;
    end;
    FormulaP := DM.Vud.FieldByName('FORMULA').AsString;
    FSax.SetPerem('UDER',DM.CUder.FieldByName('SUMMA').AsFloat);

    Nalog  :=  0 ;
    if Pos('NALOG',UpperCase(FormulaP)) >  0  then
    begin
      DM.CUderz.First;
      while not DM.CUderz.Eof do
      begin
       if DM.CUderz.FieldByName('VID').AsString = 'Налоги' then
          Nalog := Nalog + DM.CUderz.FieldByName('SUMMA').AsFloat;
       DM.CUderz.Next;
      end;
    end;
    FSax.SetPerem('NALOG',Nalog);

    Summa     :=  0 ;
    SumDljaUd :=  0 ;
    DM.CNach.First;
    while not DM.CNach.Eof do
    begin
      SumDljaUd := SumDljaUd + DM.CNach.FieldByName('SUMMA').AsFloat;

      if DM.Vud.FieldByName('DIAPOZON').AsString = 'Только' then
      begin
        if Pos(DM.CNach.FieldByName('VOP').AsString,
               DM.Vud.FieldByName('VXODIT').AsString) =  0  then
        begin
          DM.CNach.Next;
          Continue;
        end;
      end
      else
      begin
        if Pos(DM.CNach.FieldByName('VOP').AsString,
               DM.Vud.FieldByName('VXODIT').AsString) <>  0  then
        begin
          DM.CNach.Next;
          Continue;
        end;
      end;
      Summa := Summa + DM.CNach.FieldByName('SUMMA').AsFloat;
      DM.CNach.Next;
    end;
    SumDljaUd := SumDljaUd/ 2 ;
    if (SumDljaUd <=  0 ) or (Summa <=  0 ) then
    begin
      DM.CUder.Next;
      Continue;
    end;
    FSax.SetPerem('SUMMA',Summa);
    Summa     := StrToFloat(FSax.Expr(FormulaP));
    if DM.Vud.FieldByName('OBJAZ').AsString <> 'Д' then
    begin
      if (SumDljaUd-SumUd) >  0  then
      begin
        if (Summa > (SumDljaUd-SumUd)) then
        begin
          Summa  := SumDljaUd-SumUd;
        end;
      end
      else
      begin
        Summa :=  0 ;
      end;
    end;
    if Summa <=  0  then
    begin
      DM.CUder.Next;
      Continue;
    end;
    SumUd     := SumUd + Summa;

    DM.CUderz.Append;
    DM.CUderz.Edit;
    DM.CUderz['DATA']  := R_data;
    DM.CUderz['AVTO']  := 'А';
    DM.CUderz['VOP']   := DM.Vud['KOD'];
    DM.CUderz['VID']   := 'Удержания';
    DM.CUderz['DBT']   := DM.Vud['DBT'];
    DM.CUderz['KDT']   := DM.Vud['KDT'];
    DM.CUderz['TABN']  := DM.CRab.FieldByName('TABN').AsString;
    DM.CUderz['CEX']   := DM.CRab.FieldByName('CEX').AsString;
    DM.CUderz['TIPKTO'] := DM.CUder['TIPKTO'];
    DM.CUderz['KTO']    := DM.CUder['KTO'];
    DM.CUderz['SUMMA']  := FormatFloat('0.00',Summa);
    DM.CUderz.Post;

    DM.CUder.Next;
  end;
  if DM.CUderz.State in [dsedit,dsInsert] then DM.CUderz.Post;
  DM.CUderz.ApplyUpdates( 0 );
...
Рейтинг: 0 / 0
Удержать 0.5% из зарплаты - элементарно?
    #33161980
Фотография PVP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сахават,
сегодня уже не могу, но завтра обязательно посмотрю. Кстати, как Вы подключаете исходники?
...
Рейтинг: 0 / 0
Удержать 0.5% из зарплаты - элементарно?
    #33162004
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ctrl-C, Ctrl-V.
...
Рейтинг: 0 / 0
Удержать 0.5% из зарплаты - элементарно?
    #33167736
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PVP!
Ну что, посмотрели?
...
Рейтинг: 0 / 0
Удержать 0.5% из зарплаты - элементарно?
    #33169860
Фотография PVP
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Посмотрел. Пытался разобраться, как делаются удержания.
Остались вопросы:
- какой состав удержаний, где они хранятся, где находятся правила расчета (процент, диапазон)?
- как делаются бухгалтерские проводки?
- все удержания линейные? И поэтому не требуются перерасчты при корректировке зарплаты?
- нет никаких исключений в расчете удержаний (например, с пенсионеров не делать отчисления в пенсионный фонд)?
...
Рейтинг: 0 / 0
Удержать 0.5% из зарплаты - элементарно?
    #33169908
Сахават Юсифов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Все расчетные функции выведены наружу.
Движок подготавливает расчетные данные и инициирует всевозможные переменные (каскадно по приоритетам) - диапазон включемых(исключаемых) в/о,количество месяцев, статус (пенсионер, нерезидент,...,объязательность удержания,частичность удержания,сальдирование удежаний,перерасчет, min,max...), формулы (script)... и т.д. Проводки формируются каскадно по приоритетам из разных мест (настойки, п/с, данные о работнике, табель, в/о/у, формула,script...).
На момент расчета инициализированы все (с избытком) переменные и синхронизированы все таблицы.
Так же и начисления (кроме сделки, там свой движок) (максимум что делаю - открываю новые переменные для внешней настройки).
Годами не меняю движок.
Скачайте зарплату, посмотрите.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Разработка информационных систем [игнор отключен] [закрыт для гостей] / Удержать 0.5% из зарплаты - элементарно?
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]