Metode de calcul - Tichete de masa

In ceea ce priveste calculul tichetelor de masa, programul adauga implicit o formula care tine cont, pe fiecare salariat,  de nr. de zile lucrate, zilele de concediu medical/odihna:


Mai jos vom exemplifica si alte situatii in care formula de pe nr. tichelor de masa este diferita:

Situatia 1 - Formula care tine cont de nr. de zile lucrate, zilele de CO/CM, insa cu posibilitatea de a se modifica manual nr. de tichete
In Salarii -> Metode de calcul -> NrTic schimbam formula cu cea de mai jos -> Salvez

IF EXISTS(SELECT c.id
FROM c12 c
CROSS APPLY dbo.sal_CM_contracte(c.pl_cm, c.id_cm, dbo.data_fin(c.anluna))  cm
WHERE c.anluna = @anluna AND c.pct_lcr = @pl_c12  AND c.id = @id_c12 AND cm.calc_tic=0
)
SELECT @retval = c.nr_tic
FROM c12 c
WHERE c.anluna = @anluna AND c.pct_lcr = @pl_c12  AND c.id = @id_c12
ELSE
SELECT @retval = IIF(AVG(c.nr_tic) = 0,dbo.minim(ISNULL(CEILING(SUM(b.ore_reg / b.ore_norm - b.zz_diurna)), 0),@ore_lun/8),AVG(c.nr_tic))
FROM blc_view b
INNER JOIN c12 c ON b.anluna = c.anluna AND b.pl_c12 = c.pct_lcr AND b.id_c12 = c.id
WHERE b.anluna = @anluna AND b.pl_c12 = @pl_c12  AND b.id_c12 = @id_c12

Astfel, in salarii, la un calcul pe lichidare pe un salariat, sunt calculate implicit 22 tichete de masa conform nr. de zile lucratoare din luna:

Cu formula de mai sus, avem posibilitatea de a modifica manual nr. de tichete - dublu click pe linia cu lichidare -> modificam nr. tichete de masa ->salvez



Situatia 2- Formula care tine cont de nr. de zile lucrate, zilele de CO/CM, dar si de jurnalizarea de pe contract
In Salarii -> Metode de calcul -> NrTic schimbam formula cu cea de mai jos -> Salvez

DECLARE @data_fin_mes DATE = dbo.data_fin(@anluna);
SET @retval = 0;
IF EXISTS (SELECT 1 FROM c12 c
   CROSS APPLY dbo.sal_CM_contracte(c.pl_cm, c.id_cm, @data_fin_mes) cm
  WHERE c.anluna = @anluna
    AND c.pct_lcr = @pl_c12
    AND c.id = @id_c12
    AND ISNULL(cm.calc_tic, 0) = 0
)
{expand:Show more}
AND NOT EXISTS (SELECT 1 FROM c12 c
  INNER JOIN blc_view b
      ON b.anluna = c.anluna
     AND b.pl_c12 = c.pct_lcr
     AND b.id_c12 = c.id
  INNER JOIN sal_pontaj p
      ON b.pct_lcr = p.pl_blc
     AND b.id = p.id_blc
     AND p.anluna = b.anluna
  CROSS APPLY dbo.sal_CM_contracte(c.pl_cm, c.id_cm, p.data) cm
  WHERE c.anluna = @anluna
    AND c.pct_lcr = @pl_c12
    AND c.id = @id_c12
    AND p.data >= CONVERT(DATE, LEFT(CONVERT(VARCHAR(6), @anluna), 4)

    + RIGHT(CONVERT(VARCHAR(6), @anluna), 2) + '01'
)
AND p.data <= @data_fin_mes
AND ISNULL(cm.calc_tic, 0) = 1
)
BEGIN
  SELECT @retval = c.nr_tic
  FROM c12 c
  WHERE c.anluna = @anluna
    AND c.pct_lcr = @pl_c12
    AND c.id = @id_c12;
END
ELSE
BEGIN
  DECLARE @zile_eligibile INT;

  SELECT @zile_eligibile = COUNT(DISTINCT p.data)
  FROM c12 c
  INNER JOIN blc_view b
      ON b.anluna = c.anluna
     AND b.pl_c12 = c.pct_lcr
     AND b.id_c12 = c.id
  INNER JOIN sal_pontaj p
      ON b.pct_lcr = p.pl_blc
     AND b.id = p.id_blc
     AND p.anluna = b.anluna
  CROSS APPLY dbo.sal_CM_contracte(
      c.pl_cm, c.id_cm, p.data
  ) cm
  WHERE c.anluna = @anluna
    AND c.pct_lcr = @pl_c12
    AND c.id = @id_c12
    AND p.data >= CONVERT(
        DATE,
        LEFT(CONVERT(VARCHAR(6), @anluna), 4)
   + RIGHT(CONVERT(VARCHAR(6), @anluna), 2) + '01'
)
AND p.data <= @data_fin_mes
AND ISNULL(cm.calc_tic, 0) = 1;
  SELECT @retval = dbo.minim(ISNULL(CEILING(SUM(b.ore_reg / NULLIF(b.ore_norm, 0)- b.zz_diurna)),0),ISNULL(@zile_eligibile, 0))
  FROM blc_view b
  WHERE b.anluna = @anluna
    AND b.pl_c12 = @pl_c12
    AND b.id_c12 = @id_c12;
END;

In exemplul de mai jos, pe contractul de munca al salariatului, avem o modificare de contract de acordare tichete de masa, cu data consemnare 01.09 si inca o modificare de eliminare acordare tichete de masa cu data de 20.09; practic, salariatul va primi tichete de masa doar pentru zilele lucratoare din perioada 01 - 19.09 inclusiv , respectiv 14 tichete.




Situatia 3- Formula care tine cont de nr. de zile lucrate, zilele de CO/CM, dar si de orele de tip liber in compensare sarbatori legale
In Salarii -> Metode de calcul -> NrTic schimbam formula cu cea de mai jos -> Salvez

IF EXISTS(SELECT c.id
FROM c12 c
CROSS APPLY dbo.sal_CM_contracte(c.pl_cm, c.id_cm, dbo.data_fin(c.anluna))  cm
WHERE c.anluna = @anluna AND c.pct_lcr = @pl_c12  AND c.id = @id_c12 AND cm.calc_tic=0
)
SELECT @retval = c.nr_tic
FROM c12 c
WHERE c.anluna = @anluna AND c.pct_lcr = @pl_c12  AND c.id = @id_c12
ELSE
SELECT @retval = dbo.minim(ISNULL(CEILING(SUM((b.ore_reg+b.ore_lib_sar) / b.ore_norm - b.zz_diurna)), 0),@ore_lun/8)
FROM blc_view b
INNER JOIN c12 c ON b.anluna = c.anluna AND b.pl_c12 = c.pct_lcr AND b.id_c12 = c.id
WHERE b.anluna = @anluna AND b.pl_c12 = @pl_c12  AND b.id_c12 = @id_c12

Mai multe detalii despre diferenta din pontaj intre ore de tip "liber in compensare sarbatori legale" si "lucrate in compensare sarbatori legale" le regasiti in imagine:

In exemplul acesta, vom adauga in pontaj ore de tip "libere in compensare sarbatori legale"