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:
Claude Agent
2026-03-20 15:07:53 +00:00
parent 0666d6bcdf
commit b221b257a3
5 changed files with 189 additions and 37 deletions

View File

@@ -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