Calcul promoție
Funcțiile customizate de tipul "Calcul promoție" sunt de două tipuri: STANDARD și INLINE și ajută la aplicarea promoțiilor în funcție de filtrele stabilite în funcție.
Pentru funcțiile INLINE se va realiza un select care să returneze structura prezentată, iar pentru funcțiile STANDARD se va realiza un INSERT INTO @ret_table, respectând aceeași structură.
În modulul Promoții se va selecta funcția customizată dorită.
Parametri funcție customizată
Parametru | Tip | Descriere |
---|---|---|
@nume_tabel | VARCHAR(128) | Denumirea tabelului înregistrării asociate (OPȚIONAL) |
@al_tabel | VARCHAR(6) | ANLUNA, parte din cheia primară a înregistrării asociate |
@pl_tabel | SMALLINT | PCT_LCR, parte din cheia primară a înregistrării asociate |
@id_tabel | NUMERIC(18,0) | ID, parte din cheia primară a înregistrării asociate |
@liniiPromoJSON | NVARCHAR(MAX) | Liniile documentului în format JSON. Nu e obligatoriu să se folosească. Structura JSON-ului este următoarea: pl_lin - (SMALLINT) - Punctul de lucru al liniei documentului, face parte din cheia primară id_lin - (NUMERIC(18,0)) - Id-ul intern al liniei documentului, face parte din cheia primara pl_pr - (SMALLINT) - Punctul de lucru al produsului id_pr - (NUMERIC(18,0)) - Id-ul intern al produsului cod_pr - (VARCHAR(3)) - Codul din 3 caractere corespunzător tipului de produs definit în nomenclatorul de bunuri și servicii pr_tva - (NUMERIC(2,0)) - Procentul TVA cantitate - (NUMERIC(13,3)) - Cantitatea produsului puv - (MONEY) - Prețul de vânzare fără TVA al produsului puv_tva - (MONEY) - Prețul de vânzare cu TVA al produsului pl_dev - (SMALLINT) - Punctul de lucru al devizului id_dev - (NUMERIC(18,0)) - Id-ul intern al devizului pr_disc_bonus - (NUMERIC(2,0)) - Procentul discount-ului bonus id_promop - (NUMERIC(18,0)) - Id-ul intern al promoției dorite data_cr - (DATETIME) - Data creării liniei documentului |
Structura returnată de funcția customizată
Structură | Tip | Descriere |
---|---|---|
pl_lin | SMALLINT | PCT_LCR, parte din cheia primară a liniei de document |
id_lin | NUMERIC(18,0) | ID, parte din cheia primară a liniei de document |
puv | MONEY | Noul preț de vânzare fără TVA, rezultat din calculul promoției |
puv_tva | MONEY | Noul preț de vânzare cu TVA, rezultat din calculul promoției |
pr_disc | NUMERIC(2,0) | Procentul de discount acordat în baza promoției |
val_disc | MONEY | Valoare discount acordată în baza promoției |
detalii | VARCHAR(500) | Detalii suplimentare legate de promoția aplicată, ce se vor salva în denumirea suplimentară a liniei de discount (OPȚIONAL) |
Exemplu de funcție customizată INLINE pentru calculul promoției: Se acordă 10% discount pentru clienții care au vânzări mai mari de 5000 lei
Pentru funcția STANDARD se va insera în tabela @ret_table, urmat de același select:
INSERT INTO @ret_table(pl_lin, id_lin, puv, puv_tva, pr_disc, val_disc, detalii)
SELECT CAST(p.pl_lin AS SMALLINT) AS pl_lin,
CAST(p.id_lin AS NUMERIC(18,0)) AS id_lin,
ROUND(ROUND(l.puv_tva * 0.9, 2) / (1 + l.pr_tva_o / 100), 2) AS puv,
ROUND((((l.puv * l.pr_tva_o) / 100 + l.puv) * 0.9), 2) AS puv_tva,
10 AS pr_disc,
l.cantitate * l.puv * 0.1 AS val_disc,
'Discount aferent vanzarilor peste 5000 lei' AS detalii
FROM OPENJSON(@liniiPromoJSON)
WITH (
pl_lin SMALLINT,
id_lin NUMERIC(18, 0),
pl_pr SMALLINT,
id_pr NUMERIC(18, 0),
cod_pr CHAR(3),
pr_tva NUMERIC(4, 2),
cantitate NUMERIC(15, 3),
puv NUMERIC(16, 4),
puv_tva NUMERIC(16, 4),
pl_dev SMALLINT,
id_dev SMALLINT,
pr_disc_bonus NUMERIC(5, 2),
id_promop NUMERIC(18, 0),
id_promo NUMERIC(18, 0)) AS p
INNER JOIN linfactclienti l ON l.anluna = @al_tabel AND l.pl_cli = @pl_tabel AND l.id_cli = @id_tabel AND l.pct_lcr = p.pl_lin AND l.id = p.id_lin
INNER JOIN cli c ON l.anluna = c.anluna AND l.pl_cli = c.pct_lcr AND l.id_cli = c.id
INNER JOIN (SELECT pl_411, id_411
FROM cli
GROUP BY pl_411, id_411
HAVING SUM(cli.valoarev + cli.tvav) >= 5000) vanzari ON c.pl_411 = vanzari.pl_411 AND c.id_411 = vanzari.id_411