Generare comenzi de aprovizionare pentru depozit
Funcțiile customizate de tipul "Generare comenzi de aprovizionare pentru depozit" sunt de două tipuri: STANDARD și INLINE și au fost create cu scopul de a genera comenzile interne pentru aprovizionare, cu posibilitatea de stabilire a unor filtre noi. În cazul în care există funcții custom de tipul "Generare comenzi de aprovizionare pentru depozit", meniul Asistent din modulul "Comenzi interne" va conține itemi pentru fiecare funcție existentă. De asemenea, există posibilitatea de a genera comenzi interne prin crearea unui task programat, din Execuție proceduri (procedura "Comandă internă aprovizionare - funcție custom").
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ă.
Parametri funcție customizată
Parametru | Tip | Descriere |
---|---|---|
@data_ini | DATE | Data de început a perioadei de căutare |
@data_fin | DATE | Data de sfârșit a perioadei de căutare |
@nr_zile_aprov | INT | Numărul de zile pentru calculul necesarului de marfă (OPȚIONAL) |
Structura returnată de funcția customizată
Structură | Tip | Descriere |
---|---|---|
serie_document | VARCHAR(10) | Seria comenzii interne |
numar_document | VARCHAR(20) | Numărul comenzii interne (OPȚIONAL, dacă se specifică id_carnet) |
data_document | DATE | Data comenzii interne |
id_document | VARCHAR(25) | Identificator al documentului ce va fi salvat în câmpul id_extern din comanda internă (OPȚIONAL) |
id_carnet | NUMERIC(18,0) | ID-ul carnetului, în cazul în care se dorește generarea automată a numărului de document (OPȚIONAL) |
id_gestiune | VARCHAR(25) | Codul gestiunii sursă, în format ID(PCT_LCR) |
id_gestiune_in | VARCHAR(25) | Codul gestiunii destinație, în format ID(PCT_LCR) |
id_produs | VARCHAR(25) | Codul produsului, în format ID(PCT_LCR) |
tip_produs | VARCHAR(3) | Codul contului articolului (din nomenclator bunuri și servicii: FAA, GAA, etc.) |
cota_tva_ies | NUMERIC(3,0) | Cota TVA de ieșire |
pret_vanzare_tva | MONEY | Prețul de vânzare cu TVA (OPȚIONAL) |
cantitate | NUMERIC(15,3) | Cantitate comandată |
aprobare | BIT | Câmp ce indică dacă documentul se va aproba automat la validare (OPȚIONAL, implicit 1) |
Exemplu de funcție customizată INLINE pentru generarea comenzilor de aprovizionare pentru depozit
Pentru funcția STANDARD se va insera în tabela @ret_table, urmat de același select:
INSERT INTO @ret_table(data_document, id_document, id_carnet, den_gestiune, id_gestiune_in, id_produs, tip_produs, cota_tva_ies, pret_vanzare, pret_vanzare_tva, pret_furnizor, cantitate)
SELECT data_document = CAST(GETDATE() AS DATE),
id_document = RANK() OVER(ORDER BY g.id_car_cmdint, pg.pl_gest, pg.id_gest),
id_carnet = CAST(g.id_car_cmdint AS NUMERIC(18,0)),
den_gestiune = 'DEPOZIT',
id_gestiune_in = dbo.id2cod(pg.pl_gest, pg.id_gest),
id_produs = dbo.id2cod(n.pct_lcr, n.id),
tip_produs = m.cod_bs,
cota_tva_ies = n.tva_o,
pret_vanzare = CAST(p.puv AS money),
pret_vanzare_tva = CAST(p.puv_tva AS money),
pret_furnizor = CAST(ISNULL(o.pu, n.pu_furn) AS money),
cantitate = IIF(n.ambalare = 0, IIF(ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comanda_int, 0) < ISNULL(l.cant_aprov, 0), ISNULL(l.cant_aprov, 0), ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comanda_int, 0)), CEILING((IIF(ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comanda_int, 0) < ISNULL(l.cant_aprov, 0), ISNULL(l.cant_aprov, 0), ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comanda_int, 0))) / n.ambalare) * n.ambalare)
FROM nomen1 c
INNER JOIN
nomen3 n ON n.pl_clasa = c.pct_lcr AND n.id_clasa = c.id
INNER JOIN preturi_ma_linii p ON n.pct_lcr = p.pl_pr AND n.id = p.id_pr
INNER JOIN preturi_ma m ON p.pl_ant = m.pct_lcr AND p.id_ant = m.id AND m.cod_bs LIKE 'G%' AND m.anulat = 0 AND m.valid = 1 AND m.pl_part IS NULL AND m.id_part IS NULL AND m.id_disc IS NULL
INNER JOIN preturi_ma_gestiuni pg ON p.pl_ant = pg.pl_lista AND p.id_ant = pg.id_lista
INNER JOIN gestiuni g ON pg.pl_gest = g.pct_lcr AND pg.id_gest = g.id
LEFT JOIN
(SELECT l.pl_pr, l.id_pr, l.pu, d.presc, l.pl_dev, l.id_dev, ROW_NUMBER() OVER(PARTITION BY l.pl_pr, l.id_pr ORDER BY a.data_doc DESC, l.pu) AS rowNo
FROM oferte_furnizori_lin l
INNER JOIN oferte_furnizori a ON l.pl_ofr = a.pct_lcr AND l.id_ofr = a.id
INNER JOIN devize d ON l.pl_dev = d.pct_lcr AND l.id_dev = d.id
WHERE a.valid = 1 AND a.anulat = 0 AND CAST(GETDATE() AS date) BETWEEN a.data_doc AND a.data_exp AND l.pu != 0) o ON o.pl_pr = n.pct_lcr AND o.id_pr = n.id AND o.rowNo = 1
LEFT JOIN dbo.cant_limite l ON l.pl_pr = n.pct_lcr AND l.id_pr = n.id AND l.pl_gest = pg.pl_gest AND l.id_gest = pg.id_gest
LEFT JOIN
(SELECT pl_gest, id_gest, pl_pr, id_pr, cod_pr, SUM(cantitate) AS cantitate
FROM dbo.sel_stoc(dbo.anluna(GETDATE()))
WHERE pl_cmd IS NULL AND id_cmd IS NULL
GROUP BY pl_gest, id_gest, pl_pr, id_pr, cod_pr
HAVING (SUM(cantitate) > 0)) s ON s.pl_gest = pg.pl_gest AND s.id_gest = pg.id_gest AND s.pl_pr = n.pct_lcr AND s.id_pr = n.id AND s.cod_pr = m.cod_bs
OUTER APPLY
(SELECT a.pl_gest, a.id_gest, l.pl_pr, l.id_pr, SUM(l.cantitate - l.onorat) AS comanda_int
FROM lincomnzclienti_view l
INNER JOIN comenziclienti a ON l.anluna = a.anluna AND l.pl_comcli = a.pct_lcr AND l.id_comcli = a.id AND l.cod_pr = m.cod_bs AND a.valid = 1 AND a.anulat = 0 AND a.data_inchid IS NULL AND l.cantitate - l.onorat > 0 AND a.tip_doc = 'Comanda interna'
WHERE a.pl_g_i = pg.pl_gest AND a.id_g_i = pg.id_gest AND l.pl_pr = n.pct_lcr AND l.id_pr = n.id AND l.cod_pr = m.cod_bs
GROUP BY a.pl_gest, a.id_gest, l.pl_pr, l.id_pr) f
LEFT JOIN cant_limite b ON b.pl_pr = n.pct_lcr AND b.id_pr = n.id AND b.pl_gest = pg.pl_gest AND b.id_gest = pg.id_gest AND (b.cant_max <= 0 OR b.cant_max <= ISNULL(s.cantitate, 0))
WHERE b.id IS NULL AND n.tip_produs != 'C' AND n.aproviz_depozit = 1 AND g.id_car_cmdint IS NOT NULL
AND IIF(n.ambalare = 0, IIF(ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comanda_int, 0) < ISNULL(l.cant_aprov, 0), ISNULL(l.cant_aprov, 0), ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comanda_int, 0)), CEILING((IIF(ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comanda_int, 0) < ISNULL(l.cant_aprov, 0), ISNULL(l.cant_aprov, 0), ISNULL(l.cant_min, 0) - ISNULL(s.cantitate, 0) - ISNULL(f.comanda_int, 0))) / n.ambalare) * n.ambalare) > 0