fix: price sync kit components + vat_included type bug
- Fix vat_included comparison: GoMag API returns int 1, not str "1", causing all prices to be multiplied by TVA again (double TVA) - Normalize vat_included to string in gomag_client at parse time - Price sync now processes kit components individually by looking up each component's CODMAT as standalone GoMag product - Add _insert_component_price for components without existing Oracle price - resolve_mapped_codmats: ROW_NUMBER dedup for CODMATs with multiple NOM_ARTICOLE entries, prefer article with current stock - pack_import_comenzi: merge_or_insert_articol to merge quantities when same article appears from kit + individual on same order Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -62,6 +62,7 @@
|
||||
-- END;
|
||||
-- 20.03.2026 - dual policy vanzare/productie, kit pricing distributed/separate_line, SKU→CODMAT via ARTICOLE_TERTI
|
||||
-- 20.03.2026 - kit discount deferred cross-kit (separate_line, merge-on-collision)
|
||||
-- 20.03.2026 - merge_or_insert_articol: merge cantitati cand kit+individual au acelasi articol/pret
|
||||
-- ====================================================================
|
||||
CREATE OR REPLACE PACKAGE PACK_IMPORT_COMENZI AS
|
||||
|
||||
@@ -175,6 +176,56 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_COMENZI AS
|
||||
RETURN v_result;
|
||||
END resolve_id_articol;
|
||||
|
||||
-- ================================================================
|
||||
-- Helper: merge-or-insert articol pe comanda
|
||||
-- Daca aceeasi combinatie (ID_COMANDA, ID_ARTICOL, PTVA, PRET, SIGN(CANTITATE))
|
||||
-- exista deja, aduna cantitatea; altfel insereaza linie noua.
|
||||
-- Previne crash la duplicate cand acelasi articol apare din kit + individual.
|
||||
-- ================================================================
|
||||
PROCEDURE merge_or_insert_articol(
|
||||
p_id_comanda IN NUMBER,
|
||||
p_id_articol IN NUMBER,
|
||||
p_id_pol IN NUMBER,
|
||||
p_cantitate IN NUMBER,
|
||||
p_pret IN NUMBER,
|
||||
p_id_util IN NUMBER,
|
||||
p_id_sectie IN NUMBER,
|
||||
p_ptva IN NUMBER
|
||||
) IS
|
||||
v_cnt NUMBER;
|
||||
BEGIN
|
||||
SELECT COUNT(*) INTO v_cnt
|
||||
FROM COMENZI_ELEMENTE
|
||||
WHERE ID_COMANDA = p_id_comanda
|
||||
AND ID_ARTICOL = p_id_articol
|
||||
AND NVL(PTVA, 0) = NVL(p_ptva, 0)
|
||||
AND PRET = p_pret
|
||||
AND SIGN(CANTITATE) = SIGN(p_cantitate)
|
||||
AND STERS = 0;
|
||||
|
||||
IF v_cnt > 0 THEN
|
||||
UPDATE COMENZI_ELEMENTE
|
||||
SET CANTITATE = CANTITATE + p_cantitate
|
||||
WHERE ID_COMANDA = p_id_comanda
|
||||
AND ID_ARTICOL = p_id_articol
|
||||
AND NVL(PTVA, 0) = NVL(p_ptva, 0)
|
||||
AND PRET = p_pret
|
||||
AND SIGN(CANTITATE) = SIGN(p_cantitate)
|
||||
AND STERS = 0
|
||||
AND ROWNUM = 1;
|
||||
ELSE
|
||||
PACK_COMENZI.adauga_articol_comanda(
|
||||
V_ID_COMANDA => p_id_comanda,
|
||||
V_ID_ARTICOL => p_id_articol,
|
||||
V_ID_POL => p_id_pol,
|
||||
V_CANTITATE => p_cantitate,
|
||||
V_PRET => p_pret,
|
||||
V_ID_UTIL => p_id_util,
|
||||
V_ID_SECTIE => p_id_sectie,
|
||||
V_PTVA => p_ptva);
|
||||
END IF;
|
||||
END merge_or_insert_articol;
|
||||
|
||||
-- ================================================================
|
||||
-- Procedura principala pentru importul unei comenzi
|
||||
-- ================================================================
|
||||
@@ -439,15 +490,15 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_COMENZI AS
|
||||
(v_discount_share / v_kit_comps(i_comp).cantitate_roa);
|
||||
|
||||
BEGIN
|
||||
PACK_COMENZI.adauga_articol_comanda(
|
||||
V_ID_COMANDA => v_id_comanda,
|
||||
V_ID_ARTICOL => v_kit_comps(i_comp).id_articol,
|
||||
V_ID_POL => v_kit_comps(i_comp).id_pol_comp,
|
||||
V_CANTITATE => v_kit_comps(i_comp).cantitate_roa * v_cantitate_web,
|
||||
V_PRET => v_pret_ajustat,
|
||||
V_ID_UTIL => c_id_util,
|
||||
V_ID_SECTIE => p_id_sectie,
|
||||
V_PTVA => v_kit_comps(i_comp).ptva);
|
||||
merge_or_insert_articol(
|
||||
p_id_comanda => v_id_comanda,
|
||||
p_id_articol => v_kit_comps(i_comp).id_articol,
|
||||
p_id_pol => v_kit_comps(i_comp).id_pol_comp,
|
||||
p_cantitate => v_kit_comps(i_comp).cantitate_roa * v_cantitate_web,
|
||||
p_pret => v_pret_ajustat,
|
||||
p_id_util => c_id_util,
|
||||
p_id_sectie => p_id_sectie,
|
||||
p_ptva => v_kit_comps(i_comp).ptva);
|
||||
v_articole_procesate := v_articole_procesate + 1;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
@@ -473,15 +524,15 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_COMENZI AS
|
||||
FOR i_comp IN 1 .. v_kit_comps.COUNT LOOP
|
||||
IF v_kit_comps(i_comp).id_articol IS NOT NULL THEN
|
||||
BEGIN
|
||||
PACK_COMENZI.adauga_articol_comanda(
|
||||
V_ID_COMANDA => v_id_comanda,
|
||||
V_ID_ARTICOL => v_kit_comps(i_comp).id_articol,
|
||||
V_ID_POL => v_kit_comps(i_comp).id_pol_comp,
|
||||
V_CANTITATE => v_kit_comps(i_comp).cantitate_roa * v_cantitate_web,
|
||||
V_PRET => v_kit_comps(i_comp).pret_cu_tva,
|
||||
V_ID_UTIL => c_id_util,
|
||||
V_ID_SECTIE => p_id_sectie,
|
||||
V_PTVA => v_kit_comps(i_comp).ptva);
|
||||
merge_or_insert_articol(
|
||||
p_id_comanda => v_id_comanda,
|
||||
p_id_articol => v_kit_comps(i_comp).id_articol,
|
||||
p_id_pol => v_kit_comps(i_comp).id_pol_comp,
|
||||
p_cantitate => v_kit_comps(i_comp).cantitate_roa * v_cantitate_web,
|
||||
p_pret => v_kit_comps(i_comp).pret_cu_tva,
|
||||
p_id_util => c_id_util,
|
||||
p_id_sectie => p_id_sectie,
|
||||
p_ptva => v_kit_comps(i_comp).ptva);
|
||||
v_articole_procesate := v_articole_procesate + 1;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
@@ -576,14 +627,14 @@ CREATE OR REPLACE PACKAGE BODY PACK_IMPORT_COMENZI AS
|
||||
END;
|
||||
|
||||
BEGIN
|
||||
PACK_COMENZI.adauga_articol_comanda(V_ID_COMANDA => v_id_comanda,
|
||||
V_ID_ARTICOL => v_id_articol,
|
||||
V_ID_POL => NVL(v_id_pol_articol, p_id_pol),
|
||||
V_CANTITATE => v_cantitate_roa,
|
||||
V_PRET => v_pret_unitar,
|
||||
V_ID_UTIL => c_id_util,
|
||||
V_ID_SECTIE => p_id_sectie,
|
||||
V_PTVA => v_vat);
|
||||
merge_or_insert_articol(p_id_comanda => v_id_comanda,
|
||||
p_id_articol => v_id_articol,
|
||||
p_id_pol => NVL(v_id_pol_articol, p_id_pol),
|
||||
p_cantitate => v_cantitate_roa,
|
||||
p_pret => v_pret_unitar,
|
||||
p_id_util => c_id_util,
|
||||
p_id_sectie => p_id_sectie,
|
||||
p_ptva => v_vat);
|
||||
v_articole_procesate := v_articole_procesate + 1;
|
||||
EXCEPTION
|
||||
WHEN OTHERS THEN
|
||||
|
||||
Reference in New Issue
Block a user