* probe_12b_s4b_matrice.prg * Plan #12b, S4b - proba A (matrice, zero date) + "mutatie de control" pe pachetul de DINAINTE * de S4b. Starea curenta a schemei (MARIUSM_AUTO) la data rularii: S4a aplicat (functia * pack_facturare.cont_venit_articol_stoc exista), dar cursor_articol din contabilizeaza_articol * NU citeste inca A.ID_NOTA, nu deduce SCC din cont si nu are garda FACT-033 - SCD/SCC/ASCD/ASCC * vin azi INTOTDEAUNA din nota politicii (B.ID_NOTA), indiferent de politica sau de articol. * * Apeleaza direct pack_facturare.contabilizeaza_articol(v_row) cu un rand * VANZARI_DETALII_TEMP%ROWTYPE construit in PL/SQL (fara sa treaca prin RPC-ul de adaugare * linie/UI), citeste rezultatul din ACT_TEMP (GTT ON COMMIT DELETE ROWS) in aceeasi tranzactie * manuala (Transactions=2). Fiecare caz care muta date (ID_NOTA pe rand sau pe politica, CONT pe * articol) isi restaureaza mutatia INAUNTRUL propriului bloc PL/SQL (pe calea de succes SI pe * exceptie, ca sa nu contamineze cazurile urmatoare cand acest script va fi rerulat dupa ce S4b * va introduce chiar erorile FACT-033 asteptate) - ROLLBACK-ul final e doar plasa de siguranta. * * Asteptarile (valorile "S4b" din sectiunea 3 a planului) sunt calculate independent de codul * testat: din baseline_12b.md sectiunea 6 (notele 5 si 6, statice) si din interogari separate * (nota politicii reale, pack_facturare.GetAnaliticByGrupUtilizatori) - nu din cursor_articol. * * Rulare: powershell -ExecutionPolicy Bypass -File ruleaza_suita.ps1 -Nume probe_12b_s4b_matrice * Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_12b_s4b_matrice.log SET SAFETY OFF SET TALK OFF SET NOTIFY OFF CLOSE DATABASES PUBLIC gcLog, gcCaz, gnPass, gnFail, gnTransOriginal, gcErrMsg gcErrMsg = "" gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_12b_s4b_matrice.log" IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out") MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out" ENDIF STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog) gcCaz = "" gnPass = 0 gnFail = 0 ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0 DO AfLog WITH "FAIL: conexiune Oracle esuata" DO Final ENDIF gnIdUtil = 8 DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) gnTransOriginal = SQLGETPROP(gnHandle, "Transactions") SQLSETPROP(gnHandle, "Transactions", 2) DO AfLog WITH "Transactions manual, original=" + TRANSFORM(gnTransOriginal) *---------------------------------------------------------------------------------------- * precondition: nid_politica_stoc = 41 dupa initializeaza_facturare(8) - altfel ramurile * "politica reala" ar trece tautologic (nimic nu ar mai fi cu adevarat "politica de stoc") gcCaz = "[precondition] " LOCAL lnOk, lcSql * pack_facturare are propriile variabile de antet de document (nnumar_act, cserie_act, datele, * nid_moneda_nationala, nperechec, nid_fdoc, nid_factc, nid_part, nid_partc, nid_set - toate * NOT NULL in ACT_TEMP sau folosite in DECODE-uri care ajung acolo) - neinitializate de * initializeaza_facturare (care seteaza doar politica de stoc) si nici de test_init_env_auto_*. * Fara ele contabilizeaza_articol pica pe ORA-01400 (NRACT/PERECHEC/ID_SET) inainte sa ajunga la * SCD/SCC - descoperit prin proba directa pe sqlplus, nu presupus. lcSql = [begin pack_facturare.initializeaza_facturare(8); ] + ; [if nvl(pack_facturare.nid_politica_stoc,0) <> 41 then raise_application_error(-20900,'nid_politica_stoc='||to_char(pack_facturare.nid_politica_stoc)); end if; ] + ; [pack_facturare.nnumar_act := 999999; pack_facturare.cserie_act := 'TST'; ] + ; [pack_facturare.ddata_ireg := sysdate; pack_facturare.ddata_act := sysdate; pack_facturare.ddata_scadenta := sysdate; ] + ; [pack_facturare.nid_moneda_nationala := 3; pack_facturare.nperechec := 0; pack_facturare.nid_fdoc := 0; ] + ; [pack_facturare.nid_factc := 0; pack_facturare.nid_part := 0; pack_facturare.nid_partc := 0; pack_facturare.nid_set := 25000; ] + ; [pack_facturare.nid_sectie_stoc := nvl(pack_facturare.nid_sectie_stoc,1); end;] lnOk = SQLEXEC(gnHandle, lcSql) DO Verdict WITH lnOk > 0, "initializeaza_facturare(8) + antet document proba + precondition nid_politica_stoc=41" IF lnOk <= 0 DO AfLog WITH "BLOCAT: precondition esuata, opresc" DO Final ENDIF *---------------------------------------------------------------------------------------- * descoperire (read-only): articolul singurei politici 32/33, politica reala a articolului 1 * (D5), nota acelei politici reale, si analiticele de grup (GetAnaliticByGrupUtilizatori) pentru * conturile folosite mai jos - toate independente de cursor_articol gcCaz = "[descoperire] " LOCAL lnArtPol32, lnArtPol33, lnPolReala1, lnNotaRealaOrig lnArtPol32 = 0 lnArtPol33 = 0 lnPolReala1 = 0 lnNotaRealaOrig = 0 lnOk = SQLEXEC(gnHandle, "select id_articol from crm_politici_pret_art where id_pol = 32 and rownum = 1", "crsp32") IF lnOk > 0 AND USED('crsp32') AND RECCOUNT('crsp32') = 1 lnArtPol32 = crsp32.id_articol ENDIF IF USED('crsp32') USE IN crsp32 ENDIF DO AfLog WITH "articol politica 32 (HOTEL TAXE) = " + TRANSFORM(lnArtPol32) lnOk = SQLEXEC(gnHandle, "select id_articol from crm_politici_pret_art where id_pol = 33 and rownum = 1", "crsp33") IF lnOk > 0 AND USED('crsp33') AND RECCOUNT('crsp33') = 1 lnArtPol33 = crsp33.id_articol ENDIF IF USED('crsp33') USE IN crsp33 ENDIF DO AfLog WITH "articol politica 33 (HOTEL CAZARE) = " + TRANSFORM(lnArtPol33) lnOk = SQLEXEC(gnHandle, "select id_pol from crm_politici_pret_art where id_articol = 1 and id_pol <> 41 and rownum = 1", "crspr1") IF lnOk > 0 AND USED('crspr1') AND RECCOUNT('crspr1') = 1 lnPolReala1 = crspr1.id_pol ENDIF IF USED('crspr1') USE IN crspr1 ENDIF DO AfLog WITH "politica reala a articolului 1 (D5) = " + TRANSFORM(lnPolReala1) IF lnArtPol32 = 0 OR lnArtPol33 = 0 OR lnPolReala1 = 0 DO AfLog WITH "BLOCAT: descoperire incompleta (art32=" + TRANSFORM(lnArtPol32) + " art33=" + TRANSFORM(lnArtPol33) + " polreala1=" + TRANSFORM(lnPolReala1) + ")" DO Final ENDIF LOCAL lcScdReal, lcAscdReal, lcSccReal, lcAsccReal lcScdReal = "" lcAscdReal = "" lcSccReal = "" lcAsccReal = "" lcSql = "select b.id_nota, nvl(d.scd,'') scd, nvl(d.ascd,'') ascd, nvl(d.scc,'') scc, nvl(d.ascc,'') ascc" + ; " from crm_politici_preturi b join crm_note_vanzari c on b.id_nota = c.id_nota join note_contabile d on c.id_set = d.id_set" + ; " where b.id_pol = " + TRANSFORM(lnPolReala1) lnOk = SQLEXEC(gnHandle, lcSql, "crsnr") IF lnOk > 0 AND USED('crsnr') AND RECCOUNT('crsnr') = 1 lnNotaRealaOrig = crsnr.id_nota lcScdReal = ALLTRIM(crsnr.scd) lcAscdReal = ALLTRIM(crsnr.ascd) lcSccReal = ALLTRIM(crsnr.scc) lcAsccReal = ALLTRIM(crsnr.ascc) ELSE DO AfLog WITH "BLOCAT: nu am gasit nota politicii reale " + TRANSFORM(lnPolReala1) DO Final ENDIF IF USED('crsnr') USE IN crsnr ENDIF DO AfLog WITH "nota politicii reale " + TRANSFORM(lnPolReala1) + " = id_nota " + TRANSFORM(lnNotaRealaOrig) + " SCD=" + lcScdReal + " ASCD=" + lcAscdReal + " SCC=" + lcSccReal + " ASCC=" + lcAsccReal LOCAL lcAsc4111, lcAsc461, lcAsc7583, lcAsc707, lcAsc7015, lcAsc418, lcAscScdReal, lcAscSccReal lcSql = "select nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'4111'),'') a1, nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'461'),'') a2," + ; " nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'7583'),'') a3, nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'707'),'') a4," + ; " nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'7015'),'') a5, nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'418'),'') a6," + ; " nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'" + lcScdReal + "'),'') a7, nvl(pack_facturare.GetAnaliticByGrupUtilizatori(8,'" + lcSccReal + "'),'') a8" + ; " from dual" lnOk = SQLEXEC(gnHandle, lcSql, "crsga") IF lnOk > 0 AND USED('crsga') AND RECCOUNT('crsga') = 1 lcAsc4111 = ALLTRIM(crsga.a1) lcAsc461 = ALLTRIM(crsga.a2) lcAsc7583 = ALLTRIM(crsga.a3) lcAsc707 = ALLTRIM(crsga.a4) lcAsc7015 = ALLTRIM(crsga.a5) lcAsc418 = ALLTRIM(crsga.a6) lcAscScdReal = ALLTRIM(crsga.a7) lcAscSccReal = ALLTRIM(crsga.a8) ELSE DO AfLog WITH "BLOCAT: nu am putut citi analiticele de grup" DO Final ENDIF IF USED('crsga') USE IN crsga ENDIF * fallback NVL ca in cod: daca nota nu are ASCD/ASCC propriu, cel efectiv e cel din grup IF lcAscdReal == "" lcAscdReal = lcAscScdReal ENDIF IF lcAsccReal == "" lcAsccReal = lcAscSccReal ENDIF DO AfLog WITH "GetAnaliticByGrupUtilizatori(8,.): 4111=" + lcAsc4111 + " 461=" + lcAsc461 + " 7583=" + lcAsc7583 + " 707=" + lcAsc707 + " 7015=" + lcAsc7015 + " 418=" + lcAsc418 DO AfLog WITH "ASCD/ASCC efective (dupa fallback NVL) ale politicii reale " + TRANSFORM(lnPolReala1) + ": ASCD=" + lcAscdReal + " ASCC=" + lcAsccReal * nota 6 (PRODUCTIE, politica 41) si nota 5 (VANZARE MARFA) - statice, din baseline_12b.md sect. 6 LOCAL lcN6Scd, lcN6Ascd, lcN6Scc, lcN6Ascc, lcN5Scd, lcN5Ascd, lcN5Scc, lcN5Ascc lcN6Scd = "4111" lcN6Ascd = lcAsc4111 && nota 6 are ASCD gol -> fallback grup lcN6Scc = "7015" lcN6Ascc = lcAsc7015 && nota 6 are ASCC gol -> fallback grup lcN5Scd = "4111" lcN5Ascd = "11" lcN5Scc = "707" lcN5Ascc = "11" *---------------------------------------------------------------------------------------- * CAZ 1: nota pe rand (A.ID_NOTA) 461=7583, creata in tranzactie pe un articol fara nota proprie * Tinta S4b (D10 regula 1): SCD/SCC/ASCD/ASCC din nota RANDULUI = 461/7583/asc461/asc7583 gcCaz = "[caz1-nota-pe-rand-461-7583] " lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; v_id_nota crm_note_vanzari.id_nota%TYPE; v_id_set crm_note_vanzari.id_set%TYPE; ] + ; [BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901000; ] + ; [INSERT INTO crm_note_vanzari (denumire, id_util, id_sectie, dataora) VALUES ('PROBA S4B CAZ1', 8, 1, SYSDATE) RETURNING id_nota, id_set INTO v_id_nota, v_id_set; ] + ; [INSERT INTO note_contabile (explicatie, scd, scc, ordine, cu_tva, ptva, id_set, in_valuta, id_jtva_coloana) VALUES ('PROBA S4B CAZ1', '461', '7583', 1, 1, 21, v_id_set, 0, 35); ] + ; [UPDATE crm_politici_pret_art SET id_nota = v_id_nota WHERE id_pol = 41 AND id_articol = 4294507216; ] + ; [v_row.id_pol := 41; v_row.id_articol := 4294507216; v_row.cont_venit := NULL; ] + ; [v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ; [v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ; [v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ1'; v_row.proc_tvav := 1.19; ] + ; [BEGIN v_res := pack_facturare.contabilizeaza_articol(v_row); ] + ; [EXCEPTION WHEN OTHERS THEN UPDATE crm_politici_pret_art SET id_nota = NULL WHERE id_pol = 41 AND id_articol = 4294507216; RAISE; END; ] + ; [UPDATE crm_politici_pret_art SET id_nota = NULL WHERE id_pol = 41 AND id_articol = 4294507216; END;] lnOk = SQLEXEC(gnHandle, lcSql) DO Verdict WITH lnOk > 0, "apelul a trecut fara eroare (azi nicio garda pe nota randului)" IF lnOk > 0 DO LeaActTemp WITH -900999 IF USED('crsact') AND RECCOUNT('crsact') = 1 DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " ASCD=" + ALLTRIM(crsact.ascd) + " SCC=" + ALLTRIM(crsact.scc) + " ASCC=" + ALLTRIM(crsact.ascc) DO AfLog WITH "asteptat S4b: SCD=461 ASCD=" + lcAsc461 + " SCC=7583 ASCC=" + lcAsc7583 DO Verdict WITH ALLTRIM(crsact.scd) == "461" AND ALLTRIM(crsact.scc) == "7583", "SCD/SCC = nota randului (461/7583) - tinta S4b regula 1" ELSE DO Verdict WITH .F., "nicio linie in ACT_TEMP (neasteptat)" ENDIF ENDIF IF USED('crsact') USE IN crsact ENDIF *---------------------------------------------------------------------------------------- * CAZ 2: articol CONT=371 (CORESP->707) pe politica 41, cu nota 5 (ASCC=11) fortata temporar ca * nota implicita a politicii 41. Tinta S4b (D10 regula 2): SCC=707 (dedus), ASCC din grup - NU 11 gcCaz = "[caz2-cont371-nota5-ascc-grup] " lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; v_orig NUMBER; ] + ; [BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901100; ] + ; [SELECT id_nota INTO v_orig FROM crm_politici_preturi WHERE id_pol = 41; ] + ; [UPDATE crm_politici_preturi SET id_nota = 5 WHERE id_pol = 41; ] + ; [v_row.id_pol := 41; v_row.id_articol := 2910202427; v_row.cont_venit := NULL; ] + ; [v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ; [v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ; [v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ2'; v_row.proc_tvav := 1.19; ] + ; [BEGIN v_res := pack_facturare.contabilizeaza_articol(v_row); ] + ; [EXCEPTION WHEN OTHERS THEN UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = 41; RAISE; END; ] + ; [UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = 41; END;] lnOk = SQLEXEC(gnHandle, lcSql) DO Verdict WITH lnOk > 0, "apelul a trecut fara eroare" IF lnOk > 0 DO LeaActTemp WITH -901099 IF USED('crsact') AND RECCOUNT('crsact') = 1 DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " ASCD=" + ALLTRIM(crsact.ascd) + " SCC=" + ALLTRIM(crsact.scc) + " ASCC=" + ALLTRIM(crsact.ascc) DO AfLog WITH "asteptat S4b: SCD=" + lcN5Scd + " ASCD=" + lcN5Ascd + " SCC=707 ASCC(grup)=" + lcAsc707 + " [azi foloseste ASCC-ul notei=11, nu grupul]" DO Verdict WITH ALLTRIM(crsact.scc) == "707" AND ALLTRIM(crsact.ascc) == lcAsc707, "SCC dedus (707) SI ASCC din grup (nu 11 din nota) - tinta S4b regula 2" ELSE DO Verdict WITH .F., "nicio linie in ACT_TEMP (neasteptat)" ENDIF ENDIF IF USED('crsact') USE IN crsact ENDIF *---------------------------------------------------------------------------------------- * CAZ 3: articol scratch (4294507213, DISCOUNT) cu CONT temporar '707' (incepe cu 7 -> dedus = * el insusi), pe politica 41 cu nota implicita neatinsa (nota 6). Tinta S4b: SCC=707 (dedus), * nu 7015 (nota politicii, cum e azi) gcCaz = "[caz3-cont707-dedus] " lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; v_orig_cont nom_articole.cont%TYPE; ] + ; [BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901200; ] + ; [SELECT cont INTO v_orig_cont FROM nom_articole WHERE id_articol = 4294507213; ] + ; [UPDATE nom_articole SET cont = '707' WHERE id_articol = 4294507213; ] + ; [v_row.id_pol := 41; v_row.id_articol := 4294507213; v_row.cont_venit := NULL; ] + ; [v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ; [v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ; [v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ3'; v_row.proc_tvav := 1.19; ] + ; [BEGIN v_res := pack_facturare.contabilizeaza_articol(v_row); ] + ; [EXCEPTION WHEN OTHERS THEN UPDATE nom_articole SET cont = v_orig_cont WHERE id_articol = 4294507213; RAISE; END; ] + ; [UPDATE nom_articole SET cont = v_orig_cont WHERE id_articol = 4294507213; END;] lnOk = SQLEXEC(gnHandle, lcSql) DO Verdict WITH lnOk > 0, "apelul a trecut fara eroare" IF lnOk > 0 DO LeaActTemp WITH -901199 IF USED('crsact') AND RECCOUNT('crsact') = 1 DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " ASCD=" + ALLTRIM(crsact.ascd) + " SCC=" + ALLTRIM(crsact.scc) + " ASCC=" + ALLTRIM(crsact.ascc) DO AfLog WITH "asteptat S4b: SCD=" + lcN6Scd + " ASCD=" + lcN6Ascd + " SCC=707 ASCC(grup)=" + lcAsc707 DO Verdict WITH ALLTRIM(crsact.scc) == "707", "SCC = cont dedus (707), nu nota politicii (7015) - tinta S4b regula 2" ELSE DO Verdict WITH .F., "nicio linie in ACT_TEMP (neasteptat)" ENDIF ENDIF IF USED('crsact') USE IN crsact ENDIF *---------------------------------------------------------------------------------------- * CAZ 4: articol fara cont (CONT NULL), pe politica 41, fara nicio mutatie. Tinta S4b (regula 3, * fallback) = nota politicii = azi (4111/7015) - neschimbat de S4b gcCaz = "[caz4-faracont-notapolitica] " lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; ] + ; [BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901300; ] + ; [v_row.id_pol := 41; v_row.id_articol := 4294507216; v_row.cont_venit := NULL; ] + ; [v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ; [v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ; [v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ4'; v_row.proc_tvav := 1.19; ] + ; [v_res := pack_facturare.contabilizeaza_articol(v_row); END;] lnOk = SQLEXEC(gnHandle, lcSql) DO Verdict WITH lnOk > 0, "apelul a trecut fara eroare" IF lnOk > 0 DO LeaActTemp WITH -901299 IF USED('crsact') AND RECCOUNT('crsact') = 1 DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " ASCD=" + ALLTRIM(crsact.ascd) + " SCC=" + ALLTRIM(crsact.scc) + " ASCC=" + ALLTRIM(crsact.ascc) DO AfLog WITH "asteptat S4b: SCD=" + lcN6Scd + " ASCD=" + lcN6Ascd + " SCC=" + lcN6Scc + " ASCC=" + lcN6Ascc DO Verdict WITH ALLTRIM(crsact.scd) == lcN6Scd AND ALLTRIM(crsact.scc) == lcN6Scc, "SCD/SCC = nota politicii (4111/7015) - neschimbat de S4b" ELSE DO Verdict WITH .F., "nicio linie in ACT_TEMP (neasteptat)" ENDIF ENDIF IF USED('crsact') USE IN crsact ENDIF *---------------------------------------------------------------------------------------- * CAZ 5: politica de stoc cu ID_NOTA (al politicii) NULL temporar + articol fara cont. Tinta S4b: * FACT-033 (SCC final NULL -> refuz). Azi: nicio garda, linia se scrie cu SCD/SCC NULL (gaura V2) gcCaz = "[caz5-politicastoc-faranota-faracont] " lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; v_orig NUMBER; ] + ; [BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901400; ] + ; [SELECT id_nota INTO v_orig FROM crm_politici_preturi WHERE id_pol = 41; ] + ; [UPDATE crm_politici_preturi SET id_nota = NULL WHERE id_pol = 41; ] + ; [v_row.id_pol := 41; v_row.id_articol := 4294507216; v_row.cont_venit := NULL; ] + ; [v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ; [v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ; [v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ5'; v_row.proc_tvav := 1.19; ] + ; [BEGIN v_res := pack_facturare.contabilizeaza_articol(v_row); ] + ; [EXCEPTION WHEN OTHERS THEN UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = 41; RAISE; END; ] + ; [UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = 41; END;] lnOk = SQLEXEC(gnHandle, lcSql) IF lnOk <= 0 DO LogErr DO Verdict WITH .T., "S4b implementat: garda a refuzat linia fara cont de venit (asteptarea planului)" DO VerifMesajFact033 WITH 4294507216, 41 ELSE DO LeaActTemp WITH -901399 IF USED('crsact') AND RECCOUNT('crsact') = 1 DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " SCC=" + ALLTRIM(crsact.scc) + " (asteptat S4b: eroare FACT-033, nicio linie)" DO Verdict WITH .F., "FACT-033 absenta - linia s-a scris cu SCD/SCC NULL (gaura V2, S4b trebuie sa o astupe)" ELSE DO Verdict WITH .F., "nicio linie si nicio eroare (neasteptat)" ENDIF ENDIF IF USED('crsact') USE IN crsact ENDIF *---------------------------------------------------------------------------------------- * CAZ 6: nota politicii cu AL DOILEA rand adaugat in NOTE_CONTABILE (acelasi ID_SET). Tinta S4b: * FACT-033 (garda pe nota cu mai mult de un rand). Azi: WHILE cursor_articol%FOUND dubleaza * venitul - 2 randuri in ACT_TEMP, fara nicio eroare gcCaz = "[caz6-nota-dublu-rand] " lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; v_orig NUMBER; v_id_nota crm_note_vanzari.id_nota%TYPE; v_id_set crm_note_vanzari.id_set%TYPE; ] + ; [BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901500; ] + ; [SELECT id_nota INTO v_orig FROM crm_politici_preturi WHERE id_pol = 41; ] + ; [INSERT INTO crm_note_vanzari (denumire, id_util, id_sectie, dataora) VALUES ('PROBA S4B CAZ6', 8, 1, SYSDATE) RETURNING id_nota, id_set INTO v_id_nota, v_id_set; ] + ; [INSERT INTO note_contabile (explicatie, scd, scc, ordine, cu_tva, ptva, id_set, in_valuta, id_jtva_coloana) VALUES ('PROBA S4B CAZ6 rand1', '461', '7583', 1, 1, 21, v_id_set, 0, 35); ] + ; [INSERT INTO note_contabile (explicatie, scd, scc, ordine, cu_tva, ptva, id_set, in_valuta, id_jtva_coloana) VALUES ('PROBA S4B CAZ6 rand2', '462', '7584', 2, 1, 21, v_id_set, 0, 35); ] + ; [UPDATE crm_politici_preturi SET id_nota = v_id_nota WHERE id_pol = 41; ] + ; [v_row.id_pol := 41; v_row.id_articol := 4294507216; v_row.cont_venit := NULL; ] + ; [v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ; [v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ; [v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ6'; v_row.proc_tvav := 1.19; ] + ; [BEGIN v_res := pack_facturare.contabilizeaza_articol(v_row); ] + ; [EXCEPTION WHEN OTHERS THEN UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = 41; RAISE; END; ] + ; [UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = 41; END;] lnOk = SQLEXEC(gnHandle, lcSql) IF lnOk <= 0 DO LogErr DO Verdict WITH .T., "S4b implementat: garda a refuzat nota cu mai mult de un rand (asteptarea planului)" DO VerifMesajFact033 WITH 4294507216, 41 ELSE LOCAL lnCnt lnCnt = 0 IF USED('crscnt') USE IN crscnt ENDIF lnOk = SQLEXEC(gnHandle, "select count(*) cnt from act_temp where id_act between -901499 and -901498", "crscnt") IF lnOk > 0 AND USED('crscnt') lnCnt = crscnt.cnt ENDIF IF USED('crscnt') USE IN crscnt ENDIF DO AfLog WITH "obtinut azi: " + TRANSFORM(lnCnt) + " randuri in ACT_TEMP (asteptat S4b: 0, eroare FACT-033)" IF lnCnt = 2 DO LeaActTemp WITH -901499 IF USED('crsact') AND RECCOUNT('crsact') = 1 DO AfLog WITH " rand1: SCD=" + ALLTRIM(crsact.scd) + " SCC=" + ALLTRIM(crsact.scc) ENDIF IF USED('crsact') USE IN crsact ENDIF DO LeaActTemp WITH -901498 IF USED('crsact') AND RECCOUNT('crsact') = 1 DO AfLog WITH " rand2: SCD=" + ALLTRIM(crsact.scd) + " SCC=" + ALLTRIM(crsact.scc) ENDIF IF USED('crsact') USE IN crsact ENDIF ENDIF DO Verdict WITH .F., "FACT-033 absenta - venitul se dubleaza tacut (" + TRANSFORM(lnCnt) + " randuri), S4b trebuie sa refuze" ENDIF *---------------------------------------------------------------------------------------- * CAZ 7: acelasi articol D5 (id=1, CONT=371) pe politica REALA (nu de stoc), fara nicio mutatie. * Tinta S4b: nota politicii reale, neschimbata - regulile D9/D10 nu ating politicile reale gcCaz = "[caz7-articol1-politica-reala] " lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; ] + ; [BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901600; ] + ; [v_row.id_pol := ] + TRANSFORM(lnPolReala1) + [; v_row.id_articol := 1; v_row.cont_venit := NULL; ] + ; [v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ; [v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ; [v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ7'; v_row.proc_tvav := 1.19; ] + ; [v_res := pack_facturare.contabilizeaza_articol(v_row); END;] lnOk = SQLEXEC(gnHandle, lcSql) DO Verdict WITH lnOk > 0, "apelul a trecut fara eroare" IF lnOk > 0 DO LeaActTemp WITH -901599 IF USED('crsact') AND RECCOUNT('crsact') = 1 DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " ASCD=" + ALLTRIM(crsact.ascd) + " SCC=" + ALLTRIM(crsact.scc) + " ASCC=" + ALLTRIM(crsact.ascc) DO AfLog WITH "asteptat (azi si dupa S4b, neschimbat): SCD=" + lcScdReal + " ASCD=" + lcAscdReal + " SCC=" + lcSccReal + " ASCC=" + lcAsccReal DO Verdict WITH ALLTRIM(crsact.scd) == lcScdReal AND ALLTRIM(crsact.scc) == lcSccReal, "SCD/SCC = nota politicii reale, neschimbat de S4b" ELSE DO Verdict WITH .F., "nicio linie in ACT_TEMP (neasteptat)" ENDIF ENDIF IF USED('crsact') USE IN crsact ENDIF *---------------------------------------------------------------------------------------- * CAZ 8: politica 32 (HOTEL TAXE), fara nota deloc. Tinta S4b: FACT-033. Azi: SCD/SCC NULL, fara eroare gcCaz = "[caz8-politica32-faranota] " lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; ] + ; [BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901700; ] + ; [v_row.id_pol := 32; v_row.id_articol := ] + TRANSFORM(lnArtPol32) + [; v_row.cont_venit := NULL; ] + ; [v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ; [v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ; [v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ8'; v_row.proc_tvav := 1.19; ] + ; [v_res := pack_facturare.contabilizeaza_articol(v_row); END;] lnOk = SQLEXEC(gnHandle, lcSql) IF lnOk <= 0 DO LogErr DO Verdict WITH .T., "S4b implementat: garda a refuzat politica 32 fara nota (asteptarea planului)" DO VerifMesajFact033 WITH lnArtPol32, 32 ELSE DO LeaActTemp WITH -901699 IF USED('crsact') AND RECCOUNT('crsact') = 1 DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " SCC=" + ALLTRIM(crsact.scc) + " (asteptat S4b: eroare FACT-033)" ENDIF DO Verdict WITH .F., "FACT-033 absenta - politica reala fara nota trece tacut azi" ENDIF IF USED('crsact') USE IN crsact ENDIF *---------------------------------------------------------------------------------------- * CAZ 9: politica 33 (HOTEL CAZARE), fara nota deloc. Tinta S4b: FACT-033. Azi: idem caz 8 gcCaz = "[caz9-politica33-faranota] " lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; ] + ; [BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901800; ] + ; [v_row.id_pol := 33; v_row.id_articol := ] + TRANSFORM(lnArtPol33) + [; v_row.cont_venit := NULL; ] + ; [v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ; [v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ; [v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ9'; v_row.proc_tvav := 1.19; ] + ; [v_res := pack_facturare.contabilizeaza_articol(v_row); END;] lnOk = SQLEXEC(gnHandle, lcSql) IF lnOk <= 0 DO LogErr DO Verdict WITH .T., "S4b implementat: garda a refuzat politica 33 fara nota (asteptarea planului)" DO VerifMesajFact033 WITH lnArtPol33, 33 ELSE DO LeaActTemp WITH -901799 IF USED('crsact') AND RECCOUNT('crsact') = 1 DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " SCC=" + ALLTRIM(crsact.scc) + " (asteptat S4b: eroare FACT-033)" ENDIF DO Verdict WITH .F., "FACT-033 absenta - politica reala fara nota trece tacut azi" ENDIF IF USED('crsact') USE IN crsact ENDIF *---------------------------------------------------------------------------------------- * CAZ 10: politica reala D5 (a articolului 1) cu ID_NOTA pus pe NULL temporar. Tinta S4b: * FACT-033 (garda "pe orice politica", nu doar de stoc). Azi: SCD/SCC NULL, fara eroare gcCaz = "[caz10-politicareala-notanull] " lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; v_orig NUMBER; ] + ; [BEGIN pack_facturare.ntip := 1; pack_facturare.nid_act := -901900; ] + ; [SELECT id_nota INTO v_orig FROM crm_politici_preturi WHERE id_pol = ] + TRANSFORM(lnPolReala1) + [; ] + ; [UPDATE crm_politici_preturi SET id_nota = NULL WHERE id_pol = ] + TRANSFORM(lnPolReala1) + [; ] + ; [v_row.id_pol := ] + TRANSFORM(lnPolReala1) + [; v_row.id_articol := 1; v_row.cont_venit := NULL; ] + ; [v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ; [v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ; [v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ10'; v_row.proc_tvav := 1.19; ] + ; [BEGIN v_res := pack_facturare.contabilizeaza_articol(v_row); ] + ; [EXCEPTION WHEN OTHERS THEN UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = ] + TRANSFORM(lnPolReala1) + [; RAISE; END; ] + ; [UPDATE crm_politici_preturi SET id_nota = v_orig WHERE id_pol = ] + TRANSFORM(lnPolReala1) + [; END;] lnOk = SQLEXEC(gnHandle, lcSql) IF lnOk <= 0 DO LogErr DO Verdict WITH .T., "S4b implementat: garda a refuzat politica reala fara nota (asteptarea planului)" DO VerifMesajFact033 WITH 1, lnPolReala1 ELSE DO LeaActTemp WITH -901899 IF USED('crsact') AND RECCOUNT('crsact') = 1 DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " SCC=" + ALLTRIM(crsact.scc) + " (asteptat S4b: eroare FACT-033)" ENDIF DO Verdict WITH .F., "FACT-033 absenta - garda azi nu exista pe nicio politica" ENDIF IF USED('crsact') USE IN crsact ENDIF * verificare restaurare politica reala (defensiv, inainte de ROLLBACK-ul final) lnOk = SQLEXEC(gnHandle, "select id_nota from crm_politici_preturi where id_pol = " + TRANSFORM(lnPolReala1), "crschk") IF lnOk > 0 AND USED('crschk') AND RECCOUNT('crschk') = 1 DO Verdict WITH crschk.id_nota == lnNotaRealaOrig, "restaurare in tranzactie: politica reala " + TRANSFORM(lnPolReala1) + " are din nou id_nota=" + TRANSFORM(lnNotaRealaOrig) ENDIF IF USED('crschk') USE IN crschk ENDIF *---------------------------------------------------------------------------------------- * CAZ 11 (aviz, ntip=22): articol CONT=371 (CORESP->707) pe politica 41, nota implicita restaurata * (nota 6). SCD e fortat 418 pe avize INDIFERENT de S4b (cod neschimbat); SCC: azi=nota (7015), * tinta S4b=dedus (707) gcCaz = "[caz11-aviz-scd418-sccdedus] " lcSql = [DECLARE v_row vanzari_detalii_temp%ROWTYPE; v_res NUMBER; ] + ; [BEGIN pack_facturare.ntip := 22; pack_facturare.nid_act := -902000; ] + ; [v_row.id_pol := 41; v_row.id_articol := 2910202427; v_row.cont_venit := NULL; ] + ; [v_row.cantitate := 1; v_row.pret := 10; v_row.discount_unitar := 0; v_row.pret_cu_tva := 0; ] + ; [v_row.id_valuta := 3; v_row.curs := 1; v_row.multiplicator := 1; v_row.id_gestiune := -1000; ] + ; [v_row.in_stoc := 0; v_row.explicatia := 'PROBA S4B CAZ11'; v_row.proc_tvav := 1.19; ] + ; [v_res := pack_facturare.contabilizeaza_articol(v_row); END;] lnOk = SQLEXEC(gnHandle, lcSql) DO Verdict WITH lnOk > 0, "apelul a trecut fara eroare" IF lnOk > 0 DO LeaActTemp WITH -901999 IF USED('crsact') AND RECCOUNT('crsact') = 1 DO AfLog WITH "obtinut azi: SCD=" + ALLTRIM(crsact.scd) + " ASCD=" + ALLTRIM(crsact.ascd) + " SCC=" + ALLTRIM(crsact.scc) + " ASCC=" + ALLTRIM(crsact.ascc) DO AfLog WITH "asteptat S4b: SCD=418 ASCD=" + lcAsc418 + " SCC=707 ASCC(grup)=" + lcAsc707 DO Verdict WITH ALLTRIM(crsact.scd) == "418", "SCD=418 pe aviz - neschimbat de S4b (cod deja existent)" DO Verdict WITH ALLTRIM(crsact.scc) == "707", "SCC = cont dedus (707), nu nota politicii (7015) - tinta S4b regula 2, valabila si pe aviz" ELSE DO Verdict WITH .F., "nicio linie in ACT_TEMP (neasteptat)" ENDIF ENDIF IF USED('crsact') USE IN crsact ENDIF DO Final *---------------------------------------------------------------------------------------- PROCEDURE LogErr LOCAL laErr[1] AERROR(laErr) gcErrMsg = TRANSFORM(laErr[2]) DO AfLog WITH " eroare reala: " + TRANSFORM(laErr[1]) + " / " + gcErrMsg ENDPROC PROCEDURE VerifMesajFact033 * verifica ca mesajul FACT-033 (gcErrMsg, populat de LogErr) numeste articolul si politica - * denumirile vin din tabele, in afara pachetului testat LPARAMETERS tnIdArticol, tnIdPol LOCAL lcDenArt, lcDenPol lcDenArt = "" lcDenPol = "" IF USED('crsver') USE IN crsver ENDIF IF SQLEXEC(gnHandle, "select denumire from nom_articole where id_articol = " + TRANSFORM(tnIdArticol), "crsver") > 0 AND USED('crsver') lcDenArt = ALLTRIM(crsver.denumire) ENDIF IF USED('crsver') USE IN crsver ENDIF IF SQLEXEC(gnHandle, "select nume_lista_preturi from crm_politici_preturi where id_pol = " + TRANSFORM(tnIdPol), "crsver") > 0 AND USED('crsver') lcDenPol = ALLTRIM(crsver.nume_lista_preturi) ENDIF IF USED('crsver') USE IN crsver ENDIF DO Verdict WITH !EMPTY(lcDenArt) AND !EMPTY(lcDenPol) AND lcDenArt $ gcErrMsg AND lcDenPol $ gcErrMsg, ; "mesajul FACT-033 numeste articolul (" + lcDenArt + ") si politica (" + lcDenPol + "): " + gcErrMsg ENDPROC PROCEDURE LeaActTemp LPARAMETERS tnIdAct LOCAL lnRet IF USED('crsact') USE IN crsact ENDIF lnRet = SQLEXEC(gnHandle, "select nvl(scd,'') scd, nvl(ascd,'') ascd, nvl(scc,'') scc, nvl(ascc,'') ascc from act_temp where id_act = " + TRANSFORM(tnIdAct), "crsact") RETURN lnRet ENDPROC PROCEDURE Verdict LPARAMETERS tlCond, tcMsg IF tlCond gnPass = gnPass + 1 DO AfLog WITH "PASS: " + gcCaz + tcMsg ELSE gnFail = gnFail + 1 DO AfLog WITH "FAIL: " + gcCaz + tcMsg ENDIF ENDPROC PROCEDURE AfLog LPARAMETERS tcMsg STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) ENDPROC PROCEDURE AfErr LPARAMETERS tnErr, tcMsg, tcProg, tnLine DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + gcCaz + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg ENDPROC PROCEDURE Final LOCAL lnOk gcCaz = "[final] " lnOk = SQLEXEC(gnHandle, "ROLLBACK") DO AfLog WITH "ROLLBACK lnOk=" + TRANSFORM(lnOk) IF TYPE('gnTransOriginal') = 'N' SQLSETPROP(gnHandle, "Transactions", gnTransOriginal) ENDIF DO AfLog WITH "TOTAL PASS=" + TRANSFORM(gnPass) + " FAIL=" + TRANSFORM(gnFail) DO AfLog WITH "END " + TTOC(DATETIME()) QUIT ENDPROC