diff --git a/.gitignore b/.gitignore index 222de41..09068b3 100644 --- a/.gitignore +++ b/.gitignore @@ -132,6 +132,7 @@ bash.exe.stackdump # (numele reale poarta sufixul scenariului: screenshots_total/, uisync_212/, ...) utile/Teste/**/screenshots*/ utile/Teste/**/uisync*/ -utile/Teste/**/*_log.txt +utile/Teste/**/*_log*.txt utile/Teste/**/watchdog_out/ utile/Teste/**/*_dialog*.png +utile/Teste/**/out/ diff --git a/clase/caut_ora.vc2 b/clase/caut_ora.vc2 index 7e056b8..3a085bd 100644 --- a/clase/caut_ora.vc2 +++ b/clase/caut_ora.vc2 @@ -717,7 +717,9 @@ DEFINE CLASS ct_clb_cautare AS _container OF "_baza.vcx" * *m: do_activeaza *m: do_apeleaza + *m: do_blocheaza_real *m: do_dezactiveaza + *m: do_reactiveaza_real *m: do_schimba_explicatia && Schimba caption-ul de la label1. *p: cconditie && Conditia pentru care se apeleaza procedura din cprocedura. *p: clista_parametri && Lista parametri pentru procedura din cparametri ( separati prin virgula ). @@ -797,6 +799,12 @@ DEFINE CLASS ct_clb_cautare AS _container OF "_baza.vcx" This.clb_tx_cautare.text_simplu1.Refresh() ENDPROC + PROCEDURE do_blocheaza_real + This.do_dezactiveaza() + This.clb_tx_cautare.text_simplu1.ReadOnly = .T. + This.clb_tx_cautare.text_simplu1.TabStop = .F. + ENDPROC + PROCEDURE do_dezactiveaza This.lactiv = .F. This.img_cautare.Visible = .F. @@ -805,6 +813,12 @@ DEFINE CLASS ct_clb_cautare AS _container OF "_baza.vcx" This.clb_tx_cautare.text_simplu1.Refresh() ENDPROC + PROCEDURE do_reactiveaza_real + This.do_activeaza() + This.clb_tx_cautare.text_simplu1.ReadOnly = .F. + This.clb_tx_cautare.text_simplu1.TabStop = .T. + ENDPROC + PROCEDURE do_schimba_explicatia && Schimba caption-ul de la label1. Lparameters tcExplicatie This.clb_tx_cautare.lb_SIMPLU1.Caption = Alltrim(tcExplicatie) diff --git a/clase/ferestre_cere_date.vc2 b/clase/ferestre_cere_date.vc2 index cdb75f8..1a724d9 100644 --- a/clase/ferestre_cere_date.vc2 +++ b/clase/ferestre_cere_date.vc2 @@ -2725,6 +2725,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx" Thisform.clb_incasat.Refresh() thisform.chkPOS.Value = 0 + thisform.chkPOS.Valid() thisform.chkDetaliat.Value = 0 thisform.chkPOS.Visible = .F. thisform.chkDetaliat.Visible = .F. @@ -2782,6 +2783,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx" Thisform.clb_incasat.Refresh() Thisform.clb_serie_chit.genereazaNumar() thisform.chkPOS.Value = 0 + thisform.chkPOS.Valid() thisform.chkPOS.Visible = .F. thisform.chkDetaliat.Value = 0 thisform.chkDetaliat.Visible = .F. @@ -2811,6 +2813,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx" Thisform.clb_incasat.Refresh() thisform.chkPOS.Value = 0 + thisform.chkPOS.Valid() thisform.chkPOS.Visible = .T. thisform.chkDetaliat.Value = 0 thisform.chkDetaliat.Visible = .T. @@ -2838,7 +2841,6 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx" Thisform.lb_simplu1.Visible=.T. Thisform.cmdModificaBon.Visible=.T. && modifica nr bon fiscal Thisform.clb_nrchit.text_simplu1.ReadOnly = .T. - thisform.cb_casa._lbbase1.Caption = 'Banca POS' Thisform.nnrbon = 0 poDate.nr_incasare = 0 Thisform.do_aloca_nr_pos([CLICK]) @@ -2848,6 +2850,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx" Thisform.clb_incasat.Refresh() thisform.chkPOS.Value = 1 + thisform.chkPOS.Valid() thisform.chkPOS.Visible = .F. thisform.chkDetaliat.Value = 0 thisform.chkDetaliat.Visible = .F. @@ -3024,6 +3027,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx" If Type('poGeneratorNumere') = 'O' poGeneratorNumere.dezaloca_numar(16) poGeneratorNumere.dezaloca_numar(3) + poGeneratorNumere.dezaloca_numar(26) Thisform.nnrbon = 0 poDate.nr_incasare = 0 @@ -3108,7 +3112,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx" *!* modificare ROAFACTURARE v 2.0.67 If poDate.eProforma = 0 *!* modificare ROAFACTURARE v 2.0.67 ^ - If Empty(Nvl(poDate.id_delegat,0)) And Empty(Nvl(poDate.id_masina,0)) + If !poDate.lEditare And Empty(Nvl(poDate.id_delegat,0)) And Empty(Nvl(poDate.id_masina,0)) && la editare, nu suprascrie delegatul/masina documentului cu ultimul folosit poDate.id_delegat = 0 poDate.id_masina = 0 @@ -3146,7 +3150,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx" Thisform.AutoCenter = .T. Thisform.Refresh() - If poDate.incasat <> 0 + If !poDate.lEditare And poDate.incasat <> 0 Thisform.opt_incasat.Value = 2 Endif @@ -3162,7 +3166,7 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx" Else Thisform.cb_casa._cBBASE1.RowSource = [v_nom_casa.nume,id_part] Thisform.cb_casa._cBBASE1.RowSourceType = 6 - If !Empty(gnid_part_casa) + If !poDate.lEditare And !Empty(gnid_part_casa) Select v_nom_casa Locate For id_part = gnid_part_casa If Found() @@ -3174,13 +3178,13 @@ DEFINE CLASS frm_alte_date AS _frmbase OF "_frm_base.vcx" Endif *!* modificare 01.08 ^ *!* modificare ROAFACTURARE v 2.0.46 - If This.opt_incasat.Value = 2 + If !poDate.lEditare And This.opt_incasat.Value = 2 poDate.incasat = poDate.totalctva Endif *!* modificare ROAFACTURARE v 2.0.46 ^ *!* modificare ROAFACTURARE v 2.0.67 *!* modificare ROACONTRACTE v 2.0.38 - IF poDate.tip = 2 AND poDate.afisare_scadenta = 0 AND AT([Scadenta la ],poDate.text_aditional) = 0 + IF !poDate.lEditare AND poDate.tip = 2 AND poDate.afisare_scadenta = 0 AND AT([Scadenta la ],poDate.text_aditional) = 0 poDate.text_aditional = [Scadenta la ] + ALLTRIM(STR(poDate.datascad - poDate.dataact)) + [ zile.] + poDate.text_aditional ENDIF *!* modificare ROACONTRACTE v 2.0.38 ^ diff --git a/clase/ocomenzi.vc2 b/clase/ocomenzi.vc2 index e1e79b1..6941a12 100644 --- a/clase/ocomenzi.vc2 +++ b/clase/ocomenzi.vc2 @@ -1578,12 +1578,12 @@ DEFINE CLASS ct_comenzi AS _ctfrmbase OF "_ct_base.vcx" ENDPROC PROCEDURE do_factura - LOCAL lnRec + LOCAL lnRec, loComanda SELECT crsComenzi - SCATTER NAME goComanda MEMO + SCATTER NAME loComanda MEMO lnRec = RECNO() - DO facturare_comenzi IN oproceduri_facturare.prg + DO facturare_comenzi WITH loComanda IN oproceduri_facturare.prg this.do_cauta() diff --git a/clase/ofacturare.vc2 b/clase/ofacturare.vc2 index 9bb65a7..2db5583 100644 --- a/clase/ofacturare.vc2 +++ b/clase/ofacturare.vc2 @@ -375,6 +375,161 @@ DEFINE CLASS clb_tx_sume_valuta1501 AS _container OF "..\comun\clase\_baza.vcx" ENDDEFINE +DEFINE CLASS clb_tx_sume_valuta2 AS clb_tx_sume_valuta OF "ofacturare.vcx" + *< CLASSDATA: Baseclass="container" Timestamp="" Scale="Pixels" Uniqueid="" /> + + * + Height = 48 + Name = "clb_tx_sume_valuta2" + Width = 276 + tx_suma_val.FontName = "Arial" + tx_suma_val.Left = 4 + tx_suma_val.Top = 22 + tx_suma_val.Width = 85 + lb_explicatie.FontName = "Arial" + lb_explicatie.Top = 2 + tx_suma_nat.FontName = "Arial" + tx_suma_nat.Left = 142 + tx_suma_nat.Top = 22 + tx_suma_nat.Width = 85 + lb_nume_val.FontName = "Arial" + lb_nume_val.Left = 92 + lb_nume_val.Top = 24 + lb_nume_nat.FontName = "Arial" + lb_nume_nat.Left = 230 + lb_nume_nat.Top = 24 + lb_explicatii.FontName = "Arial" + lb_explicatii.Top = 2 + * + +ENDDEFINE + +DEFINE CLASS combosql_cautare AS combosql OF "_cb_base.vcx" + *< CLASSDATA: Baseclass="combobox" Timestamp="" Scale="Pixels" Uniqueid="" /> + + * + *m: creeaza_cursor_gol + *m: cursor_preturi_call + *m: reordoneaza + *p: cfiltrucod && sablonul trimis pe V_FILTRU_COD (cautare dupa codmat) + *p: cfiltruden && sablonul trimis pe V_FILTRU_DEN (cautare dupa denumire) + *p: ntipcautare && tipul cautarii in curs: 0 = INIT, 1 = incepe cu, 2 = contine + * + + * + cfiltrucod = + cfiltruden = + Name = "combosql_cautare" + ntipcautare = 0 + * + + PROCEDURE creeaza_cursor_gol + Lparameters tcCursor + Set Multilocks On + If This.pFieldActiv = [codmat] + Create Cursor (m.tcCursor) (codmat C(100), denumire C(100), um C(10), pret N(20,4), ; + nume_val C(20), nume_lista_preturi C(100), proc_tvav N(20,4), codbare C(50), id_articol N(20), ; + id_pol N(20), gestionabil N(1), preturi_cu_tva N(1), tip_valuta N(1), curs N(20,4), ; + multiplicator N(10), id_valuta N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; + cantitate N(20,4), pret_val N(20,4)) + Else + Create Cursor (m.tcCursor) (denumire C(100), codmat C(100), um C(10), pret N(20,4), ; + nume_val C(20), nume_lista_preturi C(100), proc_tvav N(20,4), codbare C(50), id_articol N(20), ; + id_pol N(20), gestionabil N(1), preturi_cu_tva N(1), tip_valuta N(1), curs N(20,4), ; + multiplicator N(10), id_valuta N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; + cantitate N(20,4), pret_val N(20,4)) + Endif + Cursorsetprop([Buffering], 3, m.tcCursor) + Return .T. + ENDPROC + + PROCEDURE cursor_preturi_call + Local lcId, lcCall + If poDate.tip = 41 + lcCall = [{call ] + gcS + [.pack_facturare.cursor_gestiune(?poDate.zi_curs,?poDate.id_pol,] + ; + [?poDate.id_client,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?pcFiltruCod,?pcFiltruDen)}] + Return m.lcCall + Endif + If poDate.tip = 45 + lcId = [poDate.listaid] + Else + lcId = [poDate.id_gestiune_init] + Endif + lcCall = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + [?] + m.lcId + [,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?pcFiltruCod,?pcFiltruDen)}] + Return m.lcCall + ENDPROC + + PROCEDURE refreshdata + Lparameters tnTip + Local lnTip, lcCall, lcCursor, llSucces + Private pcFiltruCod, pcFiltruDen + pcFiltruCod = '' + pcFiltruDen = '' + lnTip = Iif(Type('tnTip') = 'N', m.tnTip, 0) + If m.lnTip <> 0 And Len(Alltrim(This.cSearchString)) <= This.nCharCountBegin + Return .T. + Endif + This.ntipcautare = m.lnTip + This.cfiltrucod = '' + This.cfiltruden = '' + Do Case + Case m.lnTip = 1 + If This.pFieldActiv = [codmat] + This.cfiltrucod = This.cSearchString + '%' + Else + This.cfiltruden = This.cSearchString + '%' + Endif + Case m.lnTip = 2 + If This.pFieldActiv = [codmat] + This.cfiltrucod = '%' + This.cSearchString + '%' + Else + This.cfiltruden = '%' + This.cSearchString + '%' + Endif + Endcase + pcFiltruCod = This.cfiltrucod + pcFiltruDen = This.cfiltruden + lcCursor = 's' + This.pCursorName + lcCall = This.cursor_preturi_call() + llSucces = This.SelectData(m.lcCall, m.lcCursor) + Return m.llSucces + ENDPROC + + PROCEDURE reordoneaza + Lparameters tcRaw, tcCursor + If This.pFieldActiv = [codmat] + Select codmat, denumire, um, pret, nume_val, nume_lista_preturi, proc_tvav, codbare, id_articol, ; + id_pol, gestionabil, preturi_cu_tva, tip_valuta, curs, multiplicator, id_valuta, ; + discount_unitar, discount_unitar_val, cantitate, pret_val ; + From (m.tcRaw) Into Cursor (m.tcCursor) + Else + Select denumire, codmat, um, pret, nume_val, nume_lista_preturi, proc_tvav, codbare, id_articol, ; + id_pol, gestionabil, preturi_cu_tva, tip_valuta, curs, multiplicator, id_valuta, ; + discount_unitar, discount_unitar_val, cantitate, pret_val ; + From (m.tcRaw) Into Cursor (m.tcCursor) + Endif + Return .T. + ENDPROC + + PROCEDURE selectdata + Lparameters tcSql, tcCursor + Local lcRaw, llSucces + If This.ntipcautare = 0 + Return This.creeaza_cursor_gol(m.tcCursor) + Endif + lcRaw = This.pCursorName + 'Raw' + llSucces = goExecutor.oExecuta(m.tcSql, m.lcRaw) + If !m.llSucces + If goExecutor.nEroare = 20005 + vizualizeaza_curs(poDate.zi_curs) + Endif + Return .F. + Endif + Return This.reordoneaza(m.lcRaw, m.tcCursor) + ENDPROC + +ENDDEFINE + DEFINE CLASS cus_odata_nomrute AS _cusodatabase OF "..\comun\clase\_cus_odata_base.vcx" *< CLASSDATA: Baseclass="custom" Timestamp="" Scale="Pixels" Uniqueid="" /> @@ -13192,6 +13347,21 @@ DEFINE CLASS frm_facturare_articole AS _frmbase OF "_frm_base.vcx" Select crsarticole Go lnNrInregistrare Endscan + Local lcJtvaLipsa, lnRecFactura, lnSelFactura + lcJtvaLipsa = [] + lnSelFactura = Select() + Select crsfactura + lnRecFactura = Recno() + Scan For Empty(Nvl(id_jtva_coloana, 0)) And !Isnull(proc_tvav) + lcJtvaLipsa = m.lcJtvaLipsa + Chr(13) + Alltrim(denumire) + [ - cota ] + Alltrim(Str(proc_tvav * 100 - 100, 6, 2)) + [%] + Endscan + If Between(m.lnRecFactura, 1, Reccount()) + Go m.lnRecFactura + Endif + Select (m.lnSelFactura) + If !Empty(m.lcJtvaLipsa) + aMessageBox("Nu exista explicatie de TVA in perioada de lucru pentru " + Alltrim(Str(Occurs(Chr(13), m.lcJtvaLipsa))) + " linii:" + m.lcJtvaLipsa, 48, "Atentie") + Endif Else aMessageBox("Nu exista articole de adaugat!", 48, "Atentie") Endif @@ -13681,6 +13851,23 @@ DEFINE CLASS frm_facturare_articole AS _frmbase OF "_frm_base.vcx" If Type('toArticol.id_jtva_coloana') = 'U' AddProperty(toArticol,'id_jtva_coloana',0) Endif + If Empty(Nvl(toArticol.id_jtva_coloana,0)) And !Isnull(toArticol.proc_tvav) + Local lnSelJtva, lnCotaJtva, lnRecJtva + lnSelJtva = Select() + lnCotaJtva = toArticol.proc_tvav * 100 - 100 + Select jtva_coloane + lnRecJtva = Recno() + * filtrul lasat de frm_articol_factura trimite la un poArticol care nu mai exista + Set Filter To + Locate For cota_tva = m.lnCotaJtva + If Found() + toArticol.id_jtva_coloana = jtva_coloane.id_jtva_coloana + Endif + If Between(m.lnRecJtva, 1, Reccount()) + Go m.lnRecJtva + Endif + Select (lnSelJtva) + Endif If Type('toArticol.taxcode') = 'U' AddProperty(toArticol,'taxcode',0) Endif @@ -14071,7 +14258,7 @@ DEFINE CLASS frm_facturare_articole AS _frmbase OF "_frm_base.vcx" ['] + OracleSpecialCharacters(Alltrim(Nvl(poArt.serie,[]))) + [',] + ; ['] + OracleSpecialCharacters(Alltrim(Nvl(poArt.explicatie,''))) + [',] + Nvl(Alltrim(Str(poArt.id_pol)),[NULL]) + [,] + ; Nvl(Alltrim(Str(poArt.id_gestiune)),[NULL]) + [,] + Alltrim(Str(poArt.pret_achizitie,18,Max(gnPPret,4))) + [,] + ; - Alltrim(Str(poArt.pretd,18,Max(gnPPretval,4))) + [,] + ; + Iif(Isnull(poArt.pretd),[NULL],Alltrim(Str(poArt.pretd,18,Max(gnPPretval,4)))) + [,] + ; Iif(Isnull(poArt.id_valuta_d),[NULL],Alltrim(Str(poArt.id_valuta_d))) + [,] + ; IIF(poArt.cu_tva=0,; IIF(poArt.tip_valuta = 0,Alltrim(Str(poArt.pretftva,18,gnPPretV)),Alltrim(Str(poArt.vpretftva,18,gnPVal))),; @@ -14088,6 +14275,8 @@ DEFINE CLASS frm_facturare_articole AS _frmbase OF "_frm_base.vcx" Nvl(Alltrim(Str(poArt.id_set_fact)),[NULL]) + [,] + NVL(ALLTRIM(STR(poArt.id_ctr)),[NULL]) + [,] + Alltrim(Str(gnIdUtil)) + [,] + ; NVL(ALLTRIM(STR(poArt.taxcode)),[NULL]) + ; [,'] + OracleSpecialCharacters(Alltrim(Nvl(poArt.lot,[]))) + ['] + ; + [,NULL] + ; + Iif(Empty(Nvl(poArt.id_pol,0)),[,'] + OracleSpecialCharacters(deriva_cont_venit_fara_pol(poArt.id_articol,poArt.Cont)) + ['],[,NULL]) + ; [);] *!* v 2.0.13 ^ *!* modificare v 2.0.67 @@ -14247,6 +14436,9 @@ DEFINE CLASS frm_facturare_articole AS _frmbase OF "_frm_base.vcx" lcListaIncasare = lcListaIncasare + ['5|] + Alltrim(Str(poDate.incasatTichete,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;'] Endif Endcase + If Empty(m.lcListaIncasare) + lcListaIncasare = [NULL] + Endif Else lcListaIncasare = [NULL] @@ -14542,6 +14734,9 @@ DEFINE CLASS frm_facturare_articole AS _frmbase OF "_frm_base.vcx" Endif && eProforma = 0 Endif && llSucces + If m.llReturn + llReturn = scrie_legatura_proforma() && ofacturare_comun.prg + Endif If m.llReturn llReturn = Thisform.do_inchide_tranzactie(1) Else @@ -15780,59 +15975,169 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="Gridextra3" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Clb_nract" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Ct_clb_valuta" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="grd_cursuri" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="grd_cursuri.cCurs.Header1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="grd_cursuri.cCurs.Text1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="grd_cursuri.cNume_val.Header1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="grd_cursuri.cNume_val.Text1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="grd_cursuri.cMultiplicator.Header1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="grd_cursuri.cMultiplicator.Text1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="lb_cursuri" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="but_cursuri" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Clb_serie_act1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="_checkbox1" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="ck_discountevidentiat" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Clb_zi_curs" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ck_discountevidentiat" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Clb_dataact" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Clb_discount" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Clb_discount.Procent" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Clb_discount.Lb_simplu2" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Clb_total_tva" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Clb_total_factura" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Clb_total_baza" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Clb_discount_articole" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_total_baza" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="tx_total_baza_val" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_total_baza_val" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="tx_total_baza_nat" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_total_baza_ron" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_disc_articole" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="tx_disc_articole_val" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_disc_articole_val" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="tx_disc_articole_nat" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_disc_articole_ron" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_disc_factura" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="tx_disc_factura_val" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_disc_factura_val" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="tx_disc_factura_nat" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_disc_factura_ron" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="tx_disc_factura_procent" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_disc_factura_procent_semn" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_total_tva" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="tx_total_tva_val" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_total_tva_val" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="tx_total_tva_nat" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_total_tva_ron" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_total_factura" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="tx_total_factura_val" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_total_factura_val" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="tx_total_factura_nat" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_total_factura_ron" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Clb_motiv_discount" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Clb_data_scadenta" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Ct_clb_nume_client" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Ct_clb_responsabil" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="Ct_clb_altele" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Ct_clb_lucrare" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Ct_clb_sectie" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Ct_clb_venchelt" UniqueID="" Timestamp="" /> - *< OBJECTDATA: ObjPath="Ed_tx_simplu1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="clb_fdoc" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="clb_fdoc.cboFdoc" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="But_nou1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Clb_dataireg" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="Ct_clb_politici_preturi" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="txtSoldLei" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lblSoldLei" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="txtCodFiscal" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lblCodFiscal" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lblTipDoc" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="But_verifica1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="but_incarca_articole" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="but_modifica_antet" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_antet_alte_date" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="lb_antet_incasare" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="chk_alte_date" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="chk_incasare" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_contabilitate" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_contabilitate.Ct_clb_responsabil" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_contabilitate.Ct_clb_lucrare" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_contabilitate.Ct_clb_sectie" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_contabilitate.Ct_clb_venchelt" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_contabilitate.Ed_tx_simplu1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_contabilitate.Ct_clb_gestiune_init" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_contabilitate.lb_grup_contabilitate" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_document" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_document.cboTipFactura" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_document.lblTipFactura" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_document.Ed_tx_aditional" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_document.ck_listare_detaliata" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_document.lb_grup_document" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_incasare" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_incasare.Clb_incasat" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_incasare.opt_incasat" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_incasare.Clb_nrchit" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_incasare.Clb_serie_chit" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_incasare.chkPOS" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_incasare.chkDetaliat" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_incasare.cmdModificaBon" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_incasare.Cb_casa" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_livrare" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_livrare.Ct_clb_agent" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_livrare.Ct_clb_delegat" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_livrare.But_modifica1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_livrare.Ct_clb_masina" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_livrare.Clb_dataora_exp" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_livrare.clb_adresa_facturare" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="ct_livrare.lb_grup_livrare" UniqueID="" Timestamp="" /> * + *m: actualizeaza_tipincasare *m: actualizeaza_total_mod + *m: aseaza_alte_date + *m: aseaza_totaluri + *m: blocheaza_antet + *m: deblocheaza_antet + *m: do_activeaza + *m: do_actualizeaza_lbval + *m: do_actualizeaza_vizibilitate_curs *m: do_adauga_articol + *m: do_adauga_articol_cautat *m: do_adauga_rata *m: do_adauga_tot *m: do_alege_stoc + *m: do_aloca_nr_bon + *m: do_aloca_nr_pos *m: do_calculeaza_discount *m: do_calculeaza_totaluri + *m: do_cauta_adresa + *m: do_cauta_agent + *m: do_cauta_altele + *m: do_cauta_avize + *m: do_cauta_client + *m: do_cauta_comanda + *m: do_cauta_contract + *m: do_cauta_delegat + *m: do_cauta_factura + *m: do_cauta_facturi + *m: do_cauta_fdoc + *m: do_cauta_gestiune_dest + *m: do_cauta_gestiune_init + *m: do_cauta_locatii + *m: do_cauta_lucrare + *m: do_cauta_masina + *m: do_cauta_politica + *m: do_cauta_responsabil + *m: do_cauta_sectie + *m: do_cauta_valuta + *m: do_cauta_venchelt + *m: do_comuta_alte_date + *m: do_comuta_antet + *m: do_comuta_incasare *m: do_creeaza_filtru + *m: do_deschide_cursuri + *m: do_dezactiveaza + *m: do_exista_obiect + *m: do_incarca_articole *m: do_initializeaza_articol + *m: do_modifica_bon + *m: do_modifica_pos *m: do_retur + *m: do_schimba_tipdoc *m: do_scrie_articole *m: do_scrie_factura *m: do_scrie_proforma *m: do_urmator2 *m: do_verifica_articol + *m: marcheaza_linii_proforma + *m: memoreaza_asezare *m: modifica_lista_preturi + *m: nmod_incasare + *m: rezumat_alte_date + *m: rezumat_incasare + *m: seteaza_mod_incasare + *p: cgestiune_init && Numele gestiunii alese ca gestiune sursa. *p: clistaidarticoleretur && Lista articole retur id_articol:id_vanzare,id_articol:id_vanzare *p: cmesaj_cantitate *p: cnewvalue *p: coldvalue + *p: lalte_date_deschis && .T. daca sectiunea pliata Alte date e deschisa. + *p: lantet_deblocat && .T. dupa deblocarea antetului prin but_modifica_antet (S8c). + *p: larticoleincarcate && .T. dupa incarcarea articolelor facturii (do_incarca_articole). + *p: lasezare_memorata && .T. dupa citirea pozitiilor design-time in Init (memoreaza_asezare). + *p: lcopiere && Copiere factura/aviz + *p: lincasare_deschis && .T. daca sectiunea pliata Incasare e deschisa. + *p: ltotaluri_asezate && .T. dupa asezarea initiala a benzii de totaluri. *p: nbazafdiscount *p: nbazafdiscountval *p: nbazaron @@ -15844,24 +16149,42 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" *p: ndiscron *p: ndiscval *p: nid + *p: nid_tip + *p: nnrbon *p: nnrinregvizibile && Numarul de inregistrari vizibile in gridul cu elementele facturii. *p: nproc_disc_mem && Procentul de discount memorat. *p: nproc_tvav + *p: nrezultatserii + *p: nsoldlei && Sold lei client + *p: nsoldvaluta && Sold valuta client + *p: ntip *p: ntotalron *p: ntotalval *p: ntvaron *p: ntvaval + *p: oantet && Cautarile de antet (oAntetFacturare, ofacturare_antet.prg). + *p: oasezareoffset && Collection cu inaltimile stivei de sub grila, Top-offsetii fata de originea zonei alte date si Left-ul design brut al controalelor care aluneca. + *p: olatimigrid && Distribuie latimile coloanelor gridului la Resize (COMUN\programe\ogrid_latimi.prg). *p: orec * * + cgestiune_init = cgridsortlist = grd_factura clistaidarticoleretur = cmesaj_cantitate = .F. cnewvalue = coldvalue = DoCreate = .T. - Height = 586 + Height = 830 + lactiv3 = .T. + lalte_date_deschis = .F. + lantet_deblocat = .F. + larticoleincarcate = .F. + lasezare_memorata = .F. + lcopiere = .F. + lincasare_deschis = .F. + ltotaluri_asezate = .F. Name = "frm_facturare_articole2" nbazafdiscount = 0 nbazafdiscountval = 0 @@ -15873,30 +16196,38 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" ndiscfactval = 0 ndiscron = 0 ndiscval = 0 + nid_tip = 0 + nnrbon = 0 nnrinregvizibile = 16 nproc_disc_mem = 0 nproc_tvav = 0 + nrezultatserii = 0 + nsoldlei = 0 + nsoldvaluta = 0 + ntip = 0 ntotalron = 0 ntotalval = 0 ntvaron = 0 ntvaval = 0 - Width = 781 + oasezareoffset = .NULL. + Width = 990 WindowState = 2 _memberdata = + _shape1.Anchor = 10 _shape1.Height = 29 _shape1.Left = 0 _shape1.Name = "_shape1" _shape1.Top = 0 - _shape1.Width = 780 + _shape1.Width = 990 _shape1.ZOrderSet = 1 _shape2.Anchor = 8 _shape2.Height = 29 - _shape2.Left = 712 + _shape2.Left = 896 _shape2.Name = "_shape2" _shape2.Top = 0 _shape2.Width = 69 @@ -15904,49 +16235,85 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Lb_titlu_alb_b121.Caption = "FACTURA" Lb_titlu_alb_b121.FontBold = .T. Lb_titlu_alb_b121.Name = "Lb_titlu_alb_b121" - Lb_titlu_alb_b121.TabIndex = 24 + Lb_titlu_alb_b121.TabIndex = 53 Lb_titlu_alb_b121.ZOrderSet = 3 BUT_TERMIN1.Anchor = 8 BUT_TERMIN1.Height = 27 - BUT_TERMIN1.Left = 748 + BUT_TERMIN1.Left = 957 BUT_TERMIN1.Name = "BUT_TERMIN1" - BUT_TERMIN1.TabIndex = 17 + BUT_TERMIN1.TabIndex = 55 BUT_TERMIN1.Top = 1 BUT_TERMIN1.Width = 30 BUT_TERMIN1.ZOrderSet = 4 Gridsort1.Left = 192 Gridsort1.Name = "Gridsort1" - Gridsort1.Top = 569 + Gridsort1.Top = 527 * ADD OBJECT '_checkbox1' AS _checkbox WITH ; Alignment = 0, ; AutoSize = .T., ; - Caption = "TVA la încasare", ; + Caption = "TVA la incasare", ; ControlSource = "poDate.tva_incasare", ; - Height = 34, ; - Left = 372, ; + Height = 18, ; + Left = 852, ; Name = "_checkbox1", ; - TabIndex = 23, ; - Top = 36, ; - Width = 70, ; + TabIndex = 13, ; + Top = 108, ; + Width = 109, ; WordWrap = .T. *< END OBJECT: ClassLib="_baza.vcx" BaseClass="checkbox" /> + ADD OBJECT 'but_cursuri' AS buton WITH ; + Anchor = 0, ; + caction = do_deschide_cursuri, ; + Caption = "Curs", ; + Height = 27, ; + Left = 876, ; + Name = "but_cursuri", ; + SpecialEffect = 0, ; + TabIndex = 32, ; + ToolTipText = "Cursurile valutare ale documentului", ; + Top = 76, ; + Width = 80 + *< END OBJECT: ClassLib="_cmd_base.vcx" BaseClass="commandbutton" /> + + ADD OBJECT 'but_incarca_articole' AS buton WITH ; + caction = do_incarca_articole, ; + Caption = "Incarca articole", ; + Height = 27, ; + Left = 277, ; + Name = "but_incarca_articole", ; + SpecialEffect = 0, ; + TabIndex = 15, ; + ToolTipText = "Incarca articolele facturii", ; + Top = 149, ; + Width = 102 + *< END OBJECT: ClassLib="_cmd_base.vcx" BaseClass="commandbutton" /> + + ADD OBJECT 'but_modifica_antet' AS but_modifica WITH ; + caction = do_comuta_antet, ; + Left = 835, ; + Name = "but_modifica_antet", ; + TabStop = .F., ; + ToolTipText = "Modificare antet", ; + Top = 149 + *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> + ADD OBJECT 'But_nou1' AS but_nou WITH ; Anchor = 8, ; - Left = 719, ; + Left = 898, ; Name = "But_nou1", ; - TabIndex = 14, ; - Top = 175 + TabIndex = 16, ; + Top = 150 *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> ADD OBJECT 'But_renunt1' AS but_renunt WITH ; Anchor = 8, ; Height = 27, ; - Left = 716, ; + Left = 929, ; Name = "But_renunt1", ; - TabIndex = 18, ; + TabIndex = 60, ; Top = 1, ; Width = 30, ; ZOrderSet = 6 @@ -15954,657 +16321,1063 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" ADD OBJECT 'But_sterge1' AS but_sterge WITH ; Anchor = 8, ; - Left = 747, ; + Left = 936, ; Name = "But_sterge1", ; - TabIndex = 15, ; - Top = 175 + TabIndex = 17, ; + Top = 150 *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> - ADD OBJECT 'ck_discountevidentiat' AS _checkbox WITH ; + ADD OBJECT 'But_verifica1' AS but_verifica WITH ; + Left = 668, ; + Name = "But_verifica1", ; + TabIndex = 10, ; + Top = 102 + *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> + + ADD OBJECT 'chk_alte_date' AS _checkbox WITH ; Alignment = 0, ; - Anchor = 12, ; + Anchor = 0, ; AutoSize = .F., ; - Caption = "Se pune în evidenta discount-ul pe articole în notele contabile si pe factura", ; + Caption = "Alte date", ; + Height = 24, ; + Left = 406, ; + Name = "chk_alte_date", ; + TabIndex = 63, ; + Top = 378, ; + Visible = .F., ; + Width = 100, ; + WordWrap = .F. + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="checkbox" /> + + ADD OBJECT 'chk_incasare' AS _checkbox WITH ; + Alignment = 0, ; + Anchor = 0, ; + AutoSize = .F., ; + Caption = "Incasare", ; + Height = 24, ; + Left = 12, ; + Name = "chk_incasare", ; + TabIndex = 62, ; + Top = 374, ; + Visible = .F., ; + Width = 100, ; + WordWrap = .F. + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="checkbox" /> + + ADD OBJECT 'ck_discountevidentiat' AS _checkbox WITH ; + Alignment = 1, ; + Anchor = 4, ; + AutoSize = .F., ; + Caption = "Evidentiat", ; ControlSource = "poDate.discount_evidentiat", ; Height = 24, ; - Left = 360, ; + Left = 530, ; Name = "ck_discountevidentiat", ; - TabIndex = 27, ; - Top = 446, ; - Width = 431, ; - WordWrap = .T., ; + TabIndex = 52, ; + ToolTipText = "Se pune in evidenta discount-ul pe articole in notele contabile si pe factura", ; + Top = 729, ; + Width = 85, ; + WordWrap = .F., ; ZOrderSet = 17 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="checkbox" /> ADD OBJECT 'Clb_data_scadenta' AS clb_tx_data WITH ; - Height = 29, ; - Left = 172, ; + BorderWidth = 0, ; + Height = 42, ; + Left = 554, ; Name = "Clb_data_scadenta", ; TabIndex = 5, ; - Top = 87, ; - Width = 180, ; + Top = 34, ; + Width = 124, ; TEXT_SIMPLU1.ControlSource = "poDate.datascad", ; TEXT_SIMPLU1.FontBold = .T., ; TEXT_SIMPLU1.Height = 23, ; - TEXT_SIMPLU1.Left = 69, ; + TEXT_SIMPLU1.Left = 2, ; TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; - TEXT_SIMPLU1.Top = 3, ; - TEXT_SIMPLU1.Width = 77, ; - LB_SIMPLU1.Caption = "Data scad.", ; - LB_SIMPLU1.FontBold = .T., ; + TEXT_SIMPLU1.Top = 16, ; + TEXT_SIMPLU1.Width = 86, ; + LB_SIMPLU1.Caption = "Scadenta", ; + LB_SIMPLU1.FontBold = .F., ; + LB_SIMPLU1.Left = 2, ; LB_SIMPLU1.Name = "LB_SIMPLU1", ; - CMD_BUTON1.Left = 147, ; + LB_SIMPLU1.Top = 0, ; + CMD_BUTON1.Left = 91, ; CMD_BUTON1.Name = "CMD_BUTON1", ; - CMD_BUTON1.Top = 2 + CMD_BUTON1.Top = 15 *< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" /> ADD OBJECT 'Clb_dataact' AS clb_tx_data WITH ; - Height = 29, ; - Left = 17, ; + BorderWidth = 0, ; + Height = 42, ; + Left = 414, ; Name = "Clb_dataact", ; TabIndex = 4, ; - Top = 87, ; - Width = 156, ; + Top = 34, ; + Width = 124, ; TEXT_SIMPLU1.ControlSource = "poDate.dataact", ; TEXT_SIMPLU1.Height = 23, ; - TEXT_SIMPLU1.Left = 44, ; + TEXT_SIMPLU1.Left = 2, ; TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; - TEXT_SIMPLU1.Top = 3, ; - TEXT_SIMPLU1.Width = 77, ; + TEXT_SIMPLU1.Top = 16, ; + TEXT_SIMPLU1.Width = 86, ; LB_SIMPLU1.Caption = "Data", ; - LB_SIMPLU1.FontBold = .T., ; + LB_SIMPLU1.FontBold = .F., ; + LB_SIMPLU1.Left = 2, ; LB_SIMPLU1.Name = "LB_SIMPLU1", ; - CMD_BUTON1.Left = 123, ; + LB_SIMPLU1.Top = 0, ; + CMD_BUTON1.Left = 91, ; CMD_BUTON1.Name = "CMD_BUTON1", ; - CMD_BUTON1.Top = 2 + CMD_BUTON1.Top = 15 *< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" /> - ADD OBJECT 'Clb_discount' AS clb_tx_sume_valuta WITH ; - Anchor = 12, ; - Height = 53, ; - Left = 228, ; - Name = "Clb_discount", ; - TabIndex = 20, ; - Top = 523, ; - Width = 255, ; - ZOrderSet = 20, ; - TX_SUMA_VAL.ControlSource = "thisform.ndiscfactval", ; - TX_SUMA_VAL.Left = 66, ; - TX_SUMA_VAL.Name = "TX_SUMA_VAL", ; - TX_SUMA_VAL.Top = 27, ; - LB_EXPLICATIE.Caption = "Discount pe factura (fara TVA)", ; - LB_EXPLICATIE.Left = 4, ; - LB_EXPLICATIE.Name = "LB_EXPLICATIE", ; - LB_EXPLICATIE.Top = 5, ; - TX_SUMA_NAT.ControlSource = "thisform.ndiscfactron", ; - TX_SUMA_NAT.InputMask = (get_mask(14,gnPc)), ; - TX_SUMA_NAT.Left = 164, ; - TX_SUMA_NAT.Name = "TX_SUMA_NAT", ; - TX_SUMA_NAT.Top = 27, ; - LB_NUME_VAL.Left = 128, ; - LB_NUME_VAL.Name = "LB_NUME_VAL", ; - LB_NUME_VAL.Top = 30, ; - LB_NUME_NAT.Left = 227, ; - LB_NUME_NAT.Name = "LB_NUME_NAT", ; - LB_NUME_NAT.Top = 30, ; - lb_explicatii.Left = 151, ; - lb_explicatii.Name = "lb_explicatii", ; - lb_explicatii.Top = 5 - *< END OBJECT: ClassLib="ofacturare.vcx" BaseClass="container" /> - - ADD OBJECT 'Clb_discount.Lb_simplu2' AS lb_simplu WITH ; - Caption = "%", ; - Left = 237, ; - Name = "Lb_simplu2", ; - TabIndex = 4, ; - Top = 6 - *< END OBJECT: ClassLib="lb.vcx" BaseClass="label" /> - - ADD OBJECT 'Clb_discount.Procent' AS _txbase WITH ; - Alignment = 3, ; - FontName = "Arial Narrow", ; - Format = "!K", ; - Height = 23, ; - InputMask = "9 999.99", ; - Left = 185, ; - Name = "Procent", ; - TabIndex = 1, ; - Top = 3, ; - Value = 0, ; - Width = 46 - *< END OBJECT: ClassLib="_tx_base.vcx" BaseClass="textbox" /> - - ADD OBJECT 'Clb_discount_articole' AS clb_tx_sume_valuta WITH ; - Anchor = 12, ; - Height = 53, ; - Left = 228, ; - Name = "Clb_discount_articole", ; - TabIndex = 29, ; - Top = 471, ; - Width = 255, ; - ZOrderSet = 24, ; - tx_suma_val.ControlSource = "thisform.ndiscval", ; - tx_suma_val.Left = 66, ; - tx_suma_val.Name = "tx_suma_val", ; - tx_suma_val.Top = 27, ; - lb_explicatie.Caption = "Discount articole (fara TVA)", ; - lb_explicatie.Left = 4, ; - lb_explicatie.Name = "lb_explicatie", ; - lb_explicatie.Top = 6, ; - tx_suma_nat.ControlSource = "thisform.ndiscron", ; - tx_suma_nat.InputMask = (get_mask(14,gnPc)), ; - tx_suma_nat.Left = 164, ; - tx_suma_nat.Name = "tx_suma_nat", ; - tx_suma_nat.Top = 27, ; - lb_nume_val.Left = 128, ; - lb_nume_val.Name = "lb_nume_val", ; - lb_nume_val.Top = 30, ; - lb_nume_nat.Left = 227, ; - lb_nume_nat.Name = "lb_nume_nat", ; - lb_nume_nat.Top = 30, ; - lb_explicatii.Left = 154, ; - lb_explicatii.Name = "lb_explicatii", ; - lb_explicatii.Top = 6 - *< END OBJECT: ClassLib="ofacturare.vcx" BaseClass="container" /> + ADD OBJECT 'Clb_dataireg' AS clb_tx_data WITH ; + BorderWidth = 0, ; + Height = 42, ; + Left = 694, ; + Name = "Clb_dataireg", ; + TabIndex = 6, ; + Top = 34, ; + Width = 124, ; + Text_simplu1.ControlSource = "poDate.dataireg", ; + Text_simplu1.Height = 23, ; + Text_simplu1.Left = 2, ; + Text_simplu1.Name = "Text_simplu1", ; + Text_simplu1.Top = 16, ; + Text_simplu1.Width = 86, ; + Lb_simplu1.Caption = "Inregistrare", ; + Lb_simplu1.Left = 2, ; + Lb_simplu1.Name = "Lb_simplu1", ; + Lb_simplu1.Top = 0, ; + Cmd_buton1.Left = 91, ; + Cmd_buton1.Name = "Cmd_buton1", ; + Cmd_buton1.Top = 15 + *< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" /> ADD OBJECT 'clb_fdoc' AS _container WITH ; - Height = 29, ; - Left = 17, ; + BorderWidth = 0, ; + Height = 26, ; + Left = 12, ; Name = "clb_fdoc", ; TabIndex = 1, ; - Top = 59, ; - Width = 128 + Top = 50, ; + Width = 146 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="container" /> ADD OBJECT 'clb_fdoc.cboFdoc' AS _combobox WITH ; ColumnWidths = "100,0", ; ControlSource = "", ; Height = 23, ; - Left = 4, ; + Left = 2, ; Name = "cboFdoc", ; RowSource = "FACTURA,PROFORMA,BON FISCAL", ; RowSourceType = 1, ; SpecialEffect = 1, ; - Top = 3, ; + Top = 2, ; Value = FACTURA, ; - Width = 119 + Width = 140 *< END OBJECT: ClassLib="_baza.vcx" BaseClass="combobox" /> - ADD OBJECT 'Clb_nract' AS clb_tx_simplu WITH ; + ADD OBJECT 'Clb_motiv_discount' AS clb_tx_simplu WITH ; + Anchor = 4, ; + BorderWidth = 0, ; Height = 29, ; - Left = 299, ; + Left = 459, ; + Name = "Clb_motiv_discount", ; + TabIndex = 53, ; + Top = 792, ; + Width = 186, ; + Text_simplu1.ControlSource = "poDate.motiv_discount", ; + Text_simplu1.Height = 23, ; + Text_simplu1.Left = 46, ; + Text_simplu1.Name = "Text_simplu1", ; + Text_simplu1.ToolTipText = "Motivul discountului; deocamdata nu se pastreaza dupa emiterea documentului", ; + Text_simplu1.Top = 1, ; + Text_simplu1.Width = 137, ; + Lb_simplu1.Caption = "Motiv", ; + Lb_simplu1.Left = 8, ; + Lb_simplu1.Name = "Lb_simplu1", ; + Lb_simplu1.Top = 0 + *< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" /> + + ADD OBJECT 'Clb_nract' AS clb_tx_simplu WITH ; + BorderWidth = 0, ; + Height = 42, ; + Left = 288, ; Name = "Clb_nract", ; TabIndex = 3, ; - Top = 59, ; - Width = 179, ; + Top = 34, ; + Width = 110, ; TEXT_SIMPLU1.ControlSource = "poDate.nract", ; TEXT_SIMPLU1.Height = 23, ; TEXT_SIMPLU1.InputMask = (get_mask(14,0)), ; - TEXT_SIMPLU1.Left = 54, ; + TEXT_SIMPLU1.Left = 2, ; TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; - TEXT_SIMPLU1.Top = 3, ; - TEXT_SIMPLU1.Width = 121, ; + TEXT_SIMPLU1.Top = 16, ; + TEXT_SIMPLU1.Width = 106, ; LB_SIMPLU1.Caption = "Numar", ; - LB_SIMPLU1.FontBold = .T., ; - LB_SIMPLU1.Left = 8, ; + LB_SIMPLU1.FontBold = .F., ; + LB_SIMPLU1.Left = 2, ; LB_SIMPLU1.Name = "LB_SIMPLU1", ; - LB_SIMPLU1.Top = 6 + LB_SIMPLU1.Top = 0 *< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" /> ADD OBJECT 'Clb_serie_act1' AS clb_serie_act WITH ; + BorderWidth = 0, ; cvariabila = serie_act, ; cvariabiladoc = nract, ; - Height = 29, ; - Left = 144, ; + Height = 42, ; + Left = 160, ; Name = "Clb_serie_act1", ; nid_tipdoc = 5, ; pcobj = poDate, ; TabIndex = 2, ; - Top = 59, ; - Width = 156, ; + Top = 34, ; + Width = 120, ; TEXT_SIMPLU1.ControlSource = "poDate.serie_act", ; TEXT_SIMPLU1.Height = 23, ; - TEXT_SIMPLU1.Left = 43, ; + TEXT_SIMPLU1.Left = 2, ; TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; - TEXT_SIMPLU1.Top = 3, ; - TEXT_SIMPLU1.Width = 110, ; + TEXT_SIMPLU1.Top = 16, ; + TEXT_SIMPLU1.Width = 116, ; _CBBASE1.Height = 23, ; - _CBBASE1.Left = 44, ; + _CBBASE1.Left = 2, ; _CBBASE1.Name = "_CBBASE1", ; - _CBBASE1.Top = 3, ; - _CBBASE1.Width = 108, ; + _CBBASE1.Top = 16, ; + _CBBASE1.Width = 116, ; _LBBASE1.Caption = "Serie", ; - _LBBASE1.FontBold = .T., ; - _LBBASE1.Name = "_LBBASE1" + _LBBASE1.FontBold = .F., ; + _LBBASE1.Left = 2, ; + _LBBASE1.Name = "_LBBASE1", ; + _LBBASE1.Top = 0 *< END OBJECT: ClassLib="serii_numere.vcx" BaseClass="container" /> - ADD OBJECT 'Clb_total_baza' AS clb_tx_sume_valuta WITH ; - Anchor = 12, ; - Height = 30, ; - Left = 482, ; - Name = "Clb_total_baza", ; - TabIndex = 21, ; - Top = 471, ; - Width = 290, ; - ZOrderSet = 23, ; - tx_suma_val.ControlSource = "thisform.nbazaval", ; - tx_suma_val.Left = 111, ; - tx_suma_val.Name = "tx_suma_val", ; - tx_suma_val.Top = 4, ; - lb_explicatie.Caption = "Total (baza)", ; - lb_explicatie.Left = 4, ; - lb_explicatie.Name = "lb_explicatie", ; - lb_explicatie.Top = 7, ; - tx_suma_nat.ControlSource = "thisform.nbazaron", ; - tx_suma_nat.InputMask = (get_mask(14,gnPc)), ; - tx_suma_nat.Left = 203, ; - tx_suma_nat.Name = "tx_suma_nat", ; - tx_suma_nat.Top = 4, ; - lb_nume_val.Left = 175, ; - lb_nume_val.Name = "lb_nume_val", ; - lb_nume_val.Top = 7, ; - lb_nume_nat.Left = 263, ; - lb_nume_nat.Name = "lb_nume_nat", ; - lb_nume_nat.Top = 7, ; - lb_explicatii.Left = 80, ; - lb_explicatii.Name = "lb_explicatii", ; - lb_explicatii.Top = 7 - *< END OBJECT: ClassLib="ofacturare.vcx" BaseClass="container" /> - - ADD OBJECT 'Clb_total_factura' AS clb_tx_sume_valuta WITH ; - Anchor = 12, ; - Height = 47, ; - Left = 482, ; - Name = "Clb_total_factura", ; - TabIndex = 28, ; - Top = 529, ; - Width = 290, ; - ZOrderSet = 22, ; - tx_suma_val.ControlSource = "thisform.ntotalval", ; - tx_suma_val.FontBold = .T., ; - tx_suma_val.Left = 112, ; - tx_suma_val.Name = "tx_suma_val", ; - tx_suma_val.Top = 20, ; - lb_explicatie.Caption = "TOTAL FACTURA", ; - lb_explicatie.FontBold = .T., ; - lb_explicatie.Left = 4, ; - lb_explicatie.Name = "lb_explicatie", ; - lb_explicatie.Top = 4, ; - tx_suma_nat.ControlSource = "thisform.ntotalron", ; - tx_suma_nat.FontBold = .T., ; - tx_suma_nat.InputMask = (get_mask(14,gnPc)), ; - tx_suma_nat.Left = 204, ; - tx_suma_nat.Name = "tx_suma_nat", ; - tx_suma_nat.Top = 20, ; - lb_nume_val.FontBold = .T., ; - lb_nume_val.Left = 176, ; - lb_nume_val.Name = "lb_nume_val", ; - lb_nume_val.Top = 23, ; - lb_nume_nat.FontBold = .T., ; - lb_nume_nat.Left = 264, ; - lb_nume_nat.Name = "lb_nume_nat", ; - lb_nume_nat.Top = 23, ; - lb_explicatii.Left = 119, ; - lb_explicatii.Name = "lb_explicatii", ; - lb_explicatii.Top = 4 - *< END OBJECT: ClassLib="ofacturare.vcx" BaseClass="container" /> - - ADD OBJECT 'Clb_total_tva' AS clb_tx_sume_valuta WITH ; - Anchor = 12, ; - Height = 30, ; - Left = 482, ; - Name = "Clb_total_tva", ; - TabIndex = 22, ; - Top = 500, ; - Width = 290, ; - ZOrderSet = 21, ; - tx_suma_val.ControlSource = "thisform.ntvaval", ; - tx_suma_val.Left = 111, ; - tx_suma_val.Name = "tx_suma_val", ; - tx_suma_val.Top = 4, ; - lb_explicatie.Caption = "TVA", ; - lb_explicatie.Left = 4, ; - lb_explicatie.Name = "lb_explicatie", ; - lb_explicatie.Top = 7, ; - tx_suma_nat.ControlSource = "thisform.ntvaron", ; - tx_suma_nat.InputMask = (get_mask(14,gnPc)), ; - tx_suma_nat.Left = 203, ; - tx_suma_nat.Name = "tx_suma_nat", ; - tx_suma_nat.Top = 4, ; - lb_nume_val.Left = 175, ; - lb_nume_val.Name = "lb_nume_val", ; - lb_nume_val.Top = 7, ; - lb_nume_nat.Left = 263, ; - lb_nume_nat.Name = "lb_nume_nat", ; - lb_nume_nat.Top = 7, ; - lb_explicatii.Left = 80, ; - lb_explicatii.Name = "lb_explicatii", ; - lb_explicatii.Top = 7 - *< END OBJECT: ClassLib="ofacturare.vcx" BaseClass="container" /> - ADD OBJECT 'Clb_zi_curs' AS clb_tx_data WITH ; - Height = 29, ; - Left = 172, ; + BorderWidth = 0, ; + Height = 42, ; + Left = 834, ; Name = "Clb_zi_curs", ; TabIndex = 7, ; - Top = 115, ; - Width = 180, ; + Top = 34, ; + Width = 124, ; TEXT_SIMPLU1.ControlSource = "poDate.zi_curs", ; TEXT_SIMPLU1.Height = 23, ; - TEXT_SIMPLU1.Left = 69, ; + TEXT_SIMPLU1.Left = 2, ; TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; - TEXT_SIMPLU1.Top = 3, ; - TEXT_SIMPLU1.Width = 77, ; + TEXT_SIMPLU1.Top = 16, ; + TEXT_SIMPLU1.Width = 86, ; LB_SIMPLU1.BackColor = 0,0,0, ; LB_SIMPLU1.Caption = "Data curs", ; - LB_SIMPLU1.FontBold = .T., ; + LB_SIMPLU1.FontBold = .F., ; + LB_SIMPLU1.Left = 2, ; LB_SIMPLU1.Name = "LB_SIMPLU1", ; - CMD_BUTON1.Left = 147, ; + LB_SIMPLU1.Top = 0, ; + CMD_BUTON1.Left = 91, ; CMD_BUTON1.Name = "CMD_BUTON1", ; - CMD_BUTON1.Top = 2 + CMD_BUTON1.Top = 15 *< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" /> ADD OBJECT 'Ct_clb_altele' AS ct_clb_cautare WITH ; - Anchor = 8, ; cconditie = EMPTY(NVL(poDate.listaid,'')), ; cprocedura = thisform.do_cauta_altele, ; cvar_afisata = poDate.descriere, ; - Height = 31, ; - Left = 560, ; + Height = 42, ; + Left = 12, ; Name = "Ct_clb_altele", ; - TabIndex = 13, ; - Top = 142, ; - Width = 215, ; - IMG_CAUTARE.Left = 190, ; + TabIndex = 14, ; + Top = 134, ; + Width = 258, ; + IMG_CAUTARE.Left = 236, ; IMG_CAUTARE.Name = "IMG_CAUTARE", ; - IMG_CAUTARE.Top = 5, ; + IMG_CAUTARE.Top = 17, ; + CLB_TX_CAUTARE.BorderWidth = 0, ; + CLB_TX_CAUTARE.Height = 39, ; CLB_TX_CAUTARE.LB_SIMPLU1.Caption = "Altele", ; - CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .T., ; + CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .F., ; + CLB_TX_CAUTARE.LB_SIMPLU1.Left = 2, ; CLB_TX_CAUTARE.LB_SIMPLU1.Name = "LB_SIMPLU1", ; + CLB_TX_CAUTARE.LB_SIMPLU1.Top = 0, ; + CLB_TX_CAUTARE.Left = 0, ; CLB_TX_CAUTARE.Name = "CLB_TX_CAUTARE", ; CLB_TX_CAUTARE.TEXT_SIMPLU1.Height = 23, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 80, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 2, ; CLB_TX_CAUTARE.TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 3, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 100, ; - CLB_TX_CAUTARE.Width = 185 - *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> - - ADD OBJECT 'Ct_clb_lucrare' AS ct_clb_cautare WITH ; - Anchor = 8, ; - cconditie = EMPTY(NVL(poDate.id_lucrare,0)), ; - cprocedura = thisform.do_cauta_lucrare, ; - cvar_afisata = poDate.nrord, ; - Height = 31, ; - Left = 560, ; - Name = "Ct_clb_lucrare", ; - TabIndex = 9, ; - Top = 30, ; - Width = 215, ; - IMG_CAUTARE.Left = 190, ; - IMG_CAUTARE.Name = "IMG_CAUTARE", ; - IMG_CAUTARE.Top = 5, ; - CLB_TX_CAUTARE.LB_SIMPLU1.Caption = "Lucrare", ; - CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .T., ; - CLB_TX_CAUTARE.LB_SIMPLU1.Name = "LB_SIMPLU1", ; - CLB_TX_CAUTARE.Name = "CLB_TX_CAUTARE", ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Height = 23, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 80, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 3, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 100, ; - CLB_TX_CAUTARE.Width = 185 + CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 16, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 226, ; + CLB_TX_CAUTARE.Top = 0, ; + CLB_TX_CAUTARE.Width = 230 *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> ADD OBJECT 'Ct_clb_nume_client' AS ct_clb_cautare WITH ; cconditie = EMPTY(poDate.id_client) or ISNULL(poDate.id_client), ; cprocedura = thisform.do_cauta_client, ; cvar_afisata = poDate.nume_client, ; - Height = 31, ; - Left = 16, ; + Height = 42, ; + Left = 12, ; Name = "Ct_clb_nume_client", ; - TabIndex = 19, ; - Top = 30, ; - Width = 332, ; - IMG_CAUTARE.Left = 309, ; + TabIndex = 8, ; + Top = 84, ; + Width = 480, ; + IMG_CAUTARE.Left = 456, ; IMG_CAUTARE.Name = "IMG_CAUTARE", ; - IMG_CAUTARE.Top = 5, ; - CLB_TX_CAUTARE.Height = 29, ; + IMG_CAUTARE.Top = 17, ; + CLB_TX_CAUTARE.BorderWidth = 0, ; + CLB_TX_CAUTARE.Height = 39, ; CLB_TX_CAUTARE.LB_SIMPLU1.Caption = "Client", ; - CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .T., ; + CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .F., ; + CLB_TX_CAUTARE.LB_SIMPLU1.Left = 2, ; CLB_TX_CAUTARE.LB_SIMPLU1.Name = "LB_SIMPLU1", ; - CLB_TX_CAUTARE.Left = 1, ; + CLB_TX_CAUTARE.LB_SIMPLU1.Top = 0, ; + CLB_TX_CAUTARE.Left = 0, ; CLB_TX_CAUTARE.Name = "CLB_TX_CAUTARE", ; CLB_TX_CAUTARE.TEXT_SIMPLU1.Height = 23, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 44, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 2, ; CLB_TX_CAUTARE.TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 3, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 247, ; - CLB_TX_CAUTARE.Top = 1, ; - CLB_TX_CAUTARE.Width = 295 + CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 16, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 446, ; + CLB_TX_CAUTARE.Top = 0, ; + CLB_TX_CAUTARE.Width = 450 *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> - ADD OBJECT 'Ct_clb_responsabil' AS ct_clb_cautare WITH ; - Anchor = 8, ; - cconditie = EMPTY(NVL(poDate.id_responsabil,0)), ; - cprocedura = thisform.do_cauta_responsabil, ; - cvar_afisata = poDate.responsabil, ; - Height = 31, ; - Left = 560, ; - Name = "Ct_clb_responsabil", ; - TabIndex = 12, ; - Top = 114, ; - Width = 215, ; - IMG_CAUTARE.Left = 190, ; - IMG_CAUTARE.Name = "IMG_CAUTARE", ; - IMG_CAUTARE.Top = 5, ; - CLB_TX_CAUTARE.LB_SIMPLU1.Caption = "Responsabil", ; - CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .T., ; - CLB_TX_CAUTARE.LB_SIMPLU1.Name = "LB_SIMPLU1", ; - CLB_TX_CAUTARE.Name = "CLB_TX_CAUTARE", ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Height = 23, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 80, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 3, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 100, ; - CLB_TX_CAUTARE.Width = 185 - *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> - - ADD OBJECT 'Ct_clb_sectie' AS ct_clb_cautare WITH ; - Anchor = 8, ; - cconditie = EMPTY(NVL(poDate.id_sectie,0)), ; - cprocedura = thisform.do_cauta_sectie, ; - cvar_afisata = poDate.sectie, ; - Height = 31, ; - Left = 560, ; - Name = "Ct_clb_sectie", ; - TabIndex = 10, ; - Top = 58, ; - Width = 215, ; - IMG_CAUTARE.Left = 190, ; - IMG_CAUTARE.Name = "IMG_CAUTARE", ; - IMG_CAUTARE.Top = 5, ; - CLB_TX_CAUTARE.LB_SIMPLU1.Caption = "Secție", ; - CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .T., ; - CLB_TX_CAUTARE.LB_SIMPLU1.Name = "LB_SIMPLU1", ; - CLB_TX_CAUTARE.Name = "CLB_TX_CAUTARE", ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 80, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 3, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 100, ; - CLB_TX_CAUTARE.Width = 185 + ADD OBJECT 'Ct_clb_politici_preturi' AS ct_clb_cautare WITH ; + cconditie = ISNULL(poDate.id_pol) or EMPTY(poDate.id_pol), ; + cprocedura = thisform.do_cauta_politica, ; + cvar_afisata = poDate.nume_politica, ; + Height = 42, ; + Left = 403, ; + Name = "Ct_clb_politici_preturi", ; + TabIndex = 18, ; + Top = 134, ; + Width = 258, ; + img_cautare.Left = 236, ; + img_cautare.Name = "img_cautare", ; + img_cautare.Top = 17, ; + clb_tx_cautare.BorderWidth = 0, ; + clb_tx_cautare.Height = 39, ; + clb_tx_cautare.LB_SIMPLU1.Caption = "Politica de prețuri", ; + clb_tx_cautare.LB_SIMPLU1.FontBold = .F., ; + clb_tx_cautare.LB_SIMPLU1.Left = 2, ; + clb_tx_cautare.LB_SIMPLU1.Name = "LB_SIMPLU1", ; + clb_tx_cautare.LB_SIMPLU1.Top = 0, ; + clb_tx_cautare.Left = 0, ; + clb_tx_cautare.Name = "clb_tx_cautare", ; + clb_tx_cautare.TEXT_SIMPLU1.Height = 23, ; + clb_tx_cautare.TEXT_SIMPLU1.Left = 2, ; + clb_tx_cautare.TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; + clb_tx_cautare.TEXT_SIMPLU1.Top = 16, ; + clb_tx_cautare.TEXT_SIMPLU1.Width = 226, ; + clb_tx_cautare.Top = 0, ; + clb_tx_cautare.Width = 230 *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> ADD OBJECT 'Ct_clb_valuta' AS ct_clb_cautare WITH ; cconditie = EMPTY(NVL(poDate.id_valuta,0)), ; cprocedura = thisform.do_cauta_valuta, ; cvar_afisata = poDate.nume_valuta, ; - Height = 31, ; - Left = 16, ; + Height = 46, ; + Left = 708, ; Name = "Ct_clb_valuta", ; - TabIndex = 6, ; - Top = 114, ; - Width = 157, ; - IMG_CAUTARE.Left = 130, ; + TabIndex = 12, ; + Top = 130, ; + Width = 120, ; + IMG_CAUTARE.Left = 92, ; IMG_CAUTARE.Name = "IMG_CAUTARE", ; - IMG_CAUTARE.Top = 5, ; + IMG_CAUTARE.Top = 20, ; + CLB_TX_CAUTARE.BorderWidth = 0, ; + CLB_TX_CAUTARE.Height = 55, ; CLB_TX_CAUTARE.LB_SIMPLU1.Caption = "Valută", ; - CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .T., ; + CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .F., ; + CLB_TX_CAUTARE.LB_SIMPLU1.Left = 6, ; CLB_TX_CAUTARE.LB_SIMPLU1.Name = "LB_SIMPLU1", ; + CLB_TX_CAUTARE.LB_SIMPLU1.Top = 2, ; + CLB_TX_CAUTARE.Left = 1, ; CLB_TX_CAUTARE.Name = "CLB_TX_CAUTARE", ; CLB_TX_CAUTARE.TEXT_SIMPLU1.Height = 23, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 44, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 6, ; CLB_TX_CAUTARE.TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 3, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 19, ; CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 77, ; + CLB_TX_CAUTARE.Top = 0, ; CLB_TX_CAUTARE.Width = 125 *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> - ADD OBJECT 'Ct_clb_venchelt' AS ct_clb_cautare WITH ; - Anchor = 8, ; + ADD OBJECT 'ct_contabilitate' AS _container WITH ; + Anchor = 0, ; + BorderColor = 192,192,192, ; + BorderWidth = 1, ; + Height = 85, ; + Left = 12, ; + Name = "ct_contabilitate", ; + TabIndex = 66, ; + Top = 550, ; + Visible = .F., ; + Width = 963 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_contabilitate.Ct_clb_gestiune_init' AS ct_clb_cautare WITH ; + cprocedura = thisform.do_cauta_gestiune_init, ; + cvar_afisata = thisform.cgestiune_init, ; + Height = 42, ; + Left = 655, ; + Name = "Ct_clb_gestiune_init", ; + TabIndex = 6, ; + ToolTipText = " Daca nu alegeti gestiunea, la scaderea din stoc a unui articol va vor fi aratate stocurile tuturor gestiunilor pe care aveti drepturi.", ; + Top = 0, ; + Width = 205, ; + ZOrderSet = 6, ; + img_cautare.Left = 181, ; + img_cautare.Name = "img_cautare", ; + img_cautare.Top = 17, ; + clb_tx_cautare.BorderWidth = 0, ; + clb_tx_cautare.Height = 39, ; + clb_tx_cautare.Lb_simplu1.Caption = "Gestiunea initiala", ; + clb_tx_cautare.Lb_simplu1.FontBold = .F., ; + clb_tx_cautare.Lb_simplu1.Left = 2, ; + clb_tx_cautare.Lb_simplu1.Name = "Lb_simplu1", ; + clb_tx_cautare.Lb_simplu1.Top = 0, ; + clb_tx_cautare.Left = 0, ; + clb_tx_cautare.Name = "clb_tx_cautare", ; + clb_tx_cautare.Text_simplu1.Height = 23, ; + clb_tx_cautare.Text_simplu1.Left = 2, ; + clb_tx_cautare.Text_simplu1.Name = "Text_simplu1", ; + clb_tx_cautare.Text_simplu1.Top = 16, ; + clb_tx_cautare.Text_simplu1.Width = 171, ; + clb_tx_cautare.Top = 0, ; + clb_tx_cautare.Width = 175 + *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_contabilitate.Ct_clb_lucrare' AS ct_clb_cautare WITH ; + cconditie = EMPTY(NVL(poDate.id_lucrare,0)), ; + cprocedura = thisform.do_cauta_lucrare, ; + cvar_afisata = poDate.nrord, ; + Height = 42, ; + Left = 444, ; + Name = "Ct_clb_lucrare", ; + TabIndex = 4, ; + Top = 0, ; + Width = 205, ; + ZOrderSet = 2, ; + IMG_CAUTARE.Left = 181, ; + IMG_CAUTARE.Name = "IMG_CAUTARE", ; + IMG_CAUTARE.Top = 17, ; + CLB_TX_CAUTARE.BorderWidth = 0, ; + CLB_TX_CAUTARE.Height = 39, ; + CLB_TX_CAUTARE.LB_SIMPLU1.Caption = "Lucrare", ; + CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .F., ; + CLB_TX_CAUTARE.LB_SIMPLU1.Left = 2, ; + CLB_TX_CAUTARE.LB_SIMPLU1.Name = "LB_SIMPLU1", ; + CLB_TX_CAUTARE.LB_SIMPLU1.Top = 0, ; + CLB_TX_CAUTARE.Left = 0, ; + CLB_TX_CAUTARE.Name = "CLB_TX_CAUTARE", ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Height = 23, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 2, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 16, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 171, ; + CLB_TX_CAUTARE.Width = 175 + *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_contabilitate.Ct_clb_responsabil' AS ct_clb_cautare WITH ; + cconditie = EMPTY(NVL(poDate.id_responsabil,0)), ; + cprocedura = thisform.do_cauta_responsabil, ; + cvar_afisata = poDate.responsabil, ; + Height = 42, ; + Left = 444, ; + Name = "Ct_clb_responsabil", ; + TabIndex = 5, ; + Top = 40, ; + Width = 205, ; + ZOrderSet = 1, ; + IMG_CAUTARE.Left = 181, ; + IMG_CAUTARE.Name = "IMG_CAUTARE", ; + IMG_CAUTARE.Top = 17, ; + CLB_TX_CAUTARE.BorderWidth = 0, ; + CLB_TX_CAUTARE.Height = 39, ; + CLB_TX_CAUTARE.LB_SIMPLU1.Caption = "Responsabil", ; + CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .F., ; + CLB_TX_CAUTARE.LB_SIMPLU1.Left = 2, ; + CLB_TX_CAUTARE.LB_SIMPLU1.Name = "LB_SIMPLU1", ; + CLB_TX_CAUTARE.LB_SIMPLU1.Top = 0, ; + CLB_TX_CAUTARE.Left = 0, ; + CLB_TX_CAUTARE.Name = "CLB_TX_CAUTARE", ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Height = 23, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 2, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 16, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 171, ; + CLB_TX_CAUTARE.Width = 175 + *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_contabilitate.Ct_clb_sectie' AS ct_clb_cautare WITH ; + cconditie = EMPTY(NVL(poDate.id_sectie,0)), ; + cprocedura = thisform.do_cauta_sectie, ; + cvar_afisata = poDate.sectie, ; + Height = 42, ; + Left = 222, ; + Name = "Ct_clb_sectie", ; + TabIndex = 3, ; + Top = 39, ; + Width = 205, ; + ZOrderSet = 3, ; + IMG_CAUTARE.Left = 181, ; + IMG_CAUTARE.Name = "IMG_CAUTARE", ; + IMG_CAUTARE.Top = 17, ; + CLB_TX_CAUTARE.BorderWidth = 0, ; + CLB_TX_CAUTARE.Height = 39, ; + CLB_TX_CAUTARE.LB_SIMPLU1.Caption = "Secție", ; + CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .F., ; + CLB_TX_CAUTARE.LB_SIMPLU1.Left = 2, ; + CLB_TX_CAUTARE.LB_SIMPLU1.Name = "LB_SIMPLU1", ; + CLB_TX_CAUTARE.LB_SIMPLU1.Top = 0, ; + CLB_TX_CAUTARE.Left = 0, ; + CLB_TX_CAUTARE.Name = "CLB_TX_CAUTARE", ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Height = 23, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 2, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 16, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 171, ; + CLB_TX_CAUTARE.Width = 175 + *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_contabilitate.Ct_clb_venchelt' AS ct_clb_cautare WITH ; cconditie = EMPTY(NVL(poDate.id_venchelt,0)), ; cprocedura = thisform.do_cauta_venchelt, ; cvar_afisata = poDate.venchelt, ; - Height = 31, ; - Left = 560, ; + Height = 42, ; + Left = 221, ; Name = "Ct_clb_venchelt", ; - TabIndex = 11, ; - Top = 86, ; - Width = 215, ; - IMG_CAUTARE.Left = 190, ; + TabIndex = 2, ; + Top = 0, ; + Width = 205, ; + ZOrderSet = 4, ; + IMG_CAUTARE.Left = 181, ; IMG_CAUTARE.Name = "IMG_CAUTARE", ; - IMG_CAUTARE.Top = 5, ; - CLB_TX_CAUTARE.LB_SIMPLU1.Caption = "Venit", ; - CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .T., ; + IMG_CAUTARE.Top = 17, ; + CLB_TX_CAUTARE.BorderWidth = 0, ; + CLB_TX_CAUTARE.Height = 39, ; + CLB_TX_CAUTARE.LB_SIMPLU1.Caption = "Venit/cheltuiala", ; + CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .F., ; + CLB_TX_CAUTARE.LB_SIMPLU1.Left = 2, ; CLB_TX_CAUTARE.LB_SIMPLU1.Name = "LB_SIMPLU1", ; + CLB_TX_CAUTARE.LB_SIMPLU1.Top = 0, ; + CLB_TX_CAUTARE.Left = 0, ; CLB_TX_CAUTARE.Name = "CLB_TX_CAUTARE", ; CLB_TX_CAUTARE.TEXT_SIMPLU1.Height = 23, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 80, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 2, ; CLB_TX_CAUTARE.TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 3, ; - CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 100, ; - CLB_TX_CAUTARE.Width = 185 + CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 16, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 171, ; + CLB_TX_CAUTARE.Width = 175 *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> - ADD OBJECT 'Ed_tx_simplu1' AS ed_tx_simplu WITH ; - Height = 28, ; - Left = 17, ; + ADD OBJECT 'ct_contabilitate.Ed_tx_simplu1' AS ed_tx_simplu WITH ; + BorderWidth = 0, ; + Height = 42, ; + Left = 4, ; Name = "Ed_tx_simplu1", ; - TabIndex = 8, ; - Top = 143, ; - Width = 335, ; + TabIndex = 1, ; + Top = 39, ; + Width = 205, ; + ZOrderSet = 5, ; _EDBASE1.ControlSource = "poDate.explicatia4", ; _EDBASE1.Format = "!K", ; - _EDBASE1.Height = 22, ; - _EDBASE1.Left = 68, ; + _EDBASE1.Height = 23, ; + _EDBASE1.Left = 2, ; _EDBASE1.MaxLength = 100, ; _EDBASE1.Name = "_EDBASE1", ; - _EDBASE1.Top = 2, ; - _EDBASE1.Width = 262, ; - _LBBASE1.Caption = "Explicatia", ; - _LBBASE1.FontBold = .T., ; + _EDBASE1.Top = 16, ; + _EDBASE1.Width = 201, ; + _LBBASE1.Caption = "Explicatie Reg. Jurnal", ; + _LBBASE1.FontBold = .F., ; _LBBASE1.Height = 18, ; - _LBBASE1.Left = 4, ; + _LBBASE1.Left = 2, ; _LBBASE1.Name = "_LBBASE1", ; _LBBASE1.ToolTipText = "Explicatia Reg. Jurnal (max. 100 caractere) ", ; - _LBBASE1.Top = 6, ; - _LBBASE1.Width = 63, ; + _LBBASE1.Top = 0, ; + _LBBASE1.Width = 126, ; _LBBASE1.WordWrap = .T. *< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" /> - ADD OBJECT 'grd_cursuri' AS _grdrow WITH ; - Anchor = 6, ; - ColumnCount = 3, ; - DeleteMark = .F., ; - FontName = "Arial Narrow", ; - Height = 77, ; - Left = 15, ; - Name = "grd_cursuri", ; - Panel = 1, ; - RecordSource = "crscursuri", ; - ScrollBars = 2, ; - TabIndex = 26, ; + ADD OBJECT 'ct_contabilitate.lb_grup_contabilitate' AS lb_simplu WITH ; + Caption = "CONTABILITATE", ; + FontBold = .T., ; + ForeColor = 0,0,0, ; + Left = 10, ; + Name = "lb_grup_contabilitate", ; + Top = 10, ; + ZOrderSet = 7 + *< END OBJECT: ClassLib="lb.vcx" BaseClass="label" /> + + ADD OBJECT 'ct_document' AS _container WITH ; + Anchor = 0, ; + BorderColor = 192,192,192, ; + BorderWidth = 1, ; + Height = 84, ; + Left = 12, ; + Name = "ct_document", ; + TabIndex = 65, ; + Top = 467, ; + Visible = .F., ; + Width = 963 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_document.cboTipFactura' AS _combobox WITH ; + BoundColumn = 2, ; + BoundTo = .T., ; + ColumnCount = 1, ; + ColumnLines = .F., ; + ColumnWidths = "150", ; + ControlSource = "poDate.tip_saft", ; + Height = 24, ; + Left = 595, ; + Name = "cboTipFactura", ; + RowSource = "select tip_saftname, cod from saft_tip_facturi into cursor cTipFacturaX", ; + RowSourceType = 3, ; + TabIndex = 1, ; + Top = 42, ; + Width = 142, ; + ZOrderSet = 1 + *< END OBJECT: ClassLib="..\..\..\roagest\comun\clase\_baza.vcx" BaseClass="combobox" /> + + ADD OBJECT 'ct_document.ck_listare_detaliata' AS _checkbox WITH ; + Alignment = 0, ; + Anchor = 0, ; + AutoSize = .T., ; + Caption = "Listare detaliata", ; + ControlSource = "poDate.nListareDetaliata", ; + Left = 753, ; + Name = "ck_listare_detaliata", ; + TabIndex = 3, ; + ToolTipText = "Se listeaza articolele detaliat pe factura sau se cumuleaza cantitatea pe articole", ; + Top = 40, ; + ZOrderSet = 4 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="checkbox" /> + + ADD OBJECT 'ct_document.Ed_tx_aditional' AS ed_tx_simplu WITH ; + BorderWidth = 0, ; + Height = 58, ; + Left = 3, ; + Name = "Ed_tx_aditional", ; + TabIndex = 2, ; + Top = 24, ; + Width = 576, ; + ZOrderSet = 3, ; + _EDBASE1.ControlSource = "poDate.text_aditional", ; + _EDBASE1.Format = "!", ; + _EDBASE1.Height = 37, ; + _EDBASE1.Left = 3, ; + _EDBASE1.MaxLength = 1000, ; + _EDBASE1.Name = "_EDBASE1", ; + _EDBASE1.TabStop = .F., ; + _EDBASE1.Top = 18, ; + _EDBASE1.Width = 570, ; + _LBBASE1.AutoSize = .T., ; + _LBBASE1.Caption = "Text aditional (max. 1000 caractere)", ; + _LBBASE1.Height = 18, ; + _LBBASE1.Left = 8, ; + _LBBASE1.Name = "_LBBASE1", ; + _LBBASE1.Top = 1, ; + _LBBASE1.Width = 210, ; + _LBBASE1.WordWrap = .F. + *< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_document.lb_grup_document' AS lb_simplu WITH ; + Caption = "DOCUMENT", ; + FontBold = .T., ; + ForeColor = 0,0,0, ; + Left = 10, ; + Name = "lb_grup_document", ; + Top = 3, ; + ZOrderSet = 5 + *< END OBJECT: ClassLib="lb.vcx" BaseClass="label" /> + + ADD OBJECT 'ct_document.lblTipFactura' AS _label WITH ; + Caption = "Tip factura", ; + FontBold = .F., ; + Height = 18, ; + Left = 595, ; + Name = "lblTipFactura", ; + Top = 24, ; + Width = 62, ; + ZOrderSet = 2 + *< END OBJECT: ClassLib="..\..\..\roagest\comun\clase\_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'ct_incasare' AS _container WITH ; + Anchor = 0, ; + BorderWidth = 0, ; + Height = 74, ; + Left = 12, ; + Name = "ct_incasare", ; + TabIndex = 64, ; + Top = 395, ; + Visible = .F., ; + Width = 963 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_incasare.Cb_casa' AS cb_tx_simplu WITH ; + Anchor = 0, ; + BorderWidth = 0, ; + Height = 42, ; + Left = 286, ; + Name = "Cb_casa", ; + TabIndex = 5, ; + Top = 25, ; + Width = 166, ; + _CBBASE1.Height = 23, ; + _CBBASE1.Left = 2, ; + _CBBASE1.Name = "_CBBASE1", ; + _CBBASE1.Top = 16, ; + _CBBASE1.Width = 160, ; + _LBBASE1.Caption = "Casa", ; + _LBBASE1.FontBold = .F., ; + _LBBASE1.Left = 2, ; + _LBBASE1.Name = "_LBBASE1", ; + _LBBASE1.Top = 0 + *< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_incasare.chkDetaliat' AS _checkbox WITH ; + Alignment = 0, ; + Anchor = 0, ; + Caption = "Bon detaliat", ; + ControlSource = "poDate.nBonDetaliat", ; + Left = 655, ; + Name = "chkDetaliat", ; + TabIndex = 8, ; + ToolTipText = 'Se listeaza articolele detaliat pe bonul fiscal sau "Contravaloare factura ..."', ; + Top = 41, ; + WordWrap = .T. + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="checkbox" /> + + ADD OBJECT 'ct_incasare.chkPOS' AS _checkbox WITH ; + Alignment = 0, ; + Anchor = 0, ; + Caption = "POS", ; + ControlSource = "poDate.nIncasatPos", ; + Left = 598, ; + Name = "chkPOS", ; + TabIndex = 7, ; + ToolTipText = "Incasare bon fiscal prin CARD la POS", ; + Top = 42 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="checkbox" /> + + ADD OBJECT 'ct_incasare.Clb_incasat' AS clb_tx_simplu WITH ; + Anchor = 0, ; + BorderWidth = 0, ; + Height = 42, ; + Left = 456, ; + Name = "Clb_incasat", ; + TabIndex = 6, ; + Top = 25, ; + Width = 141, ; + Text_simplu1.ControlSource = "poDate.incasat", ; + Text_simplu1.Format = "RK", ; + Text_simplu1.Height = 23, ; + Text_simplu1.InputMask = (get_mask(12,gnPc)), ; + Text_simplu1.Left = 2, ; + Text_simplu1.Name = "Text_simplu1", ; + Text_simplu1.Top = 16, ; + Text_simplu1.Width = 134, ; + Lb_simplu1.Caption = "Incasat", ; + Lb_simplu1.FontBold = .F., ; + Lb_simplu1.Left = 2, ; + Lb_simplu1.Name = "Lb_simplu1", ; + Lb_simplu1.Top = 0 + *< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_incasare.Clb_nrchit' AS clb_tx_simplu WITH ; + Anchor = 0, ; + BorderWidth = 0, ; + Height = 42, ; + Left = 112, ; + Name = "Clb_nrchit", ; + TabIndex = 2, ; + Top = 26, ; + Width = 144, ; + Text_simplu1.ControlSource = "poDate.nr_incasare", ; + Text_simplu1.Height = 23, ; + Text_simplu1.InputMask = (get_mask(14,0)), ; + Text_simplu1.Left = 2, ; + Text_simplu1.Name = "Text_simplu1", ; + Text_simplu1.Top = 16, ; + Text_simplu1.Width = 132, ; + Lb_simplu1.Caption = "Nr. chitanta", ; + Lb_simplu1.FontBold = .F., ; + Lb_simplu1.Left = 2, ; + Lb_simplu1.Name = "Lb_simplu1", ; + Lb_simplu1.Top = 0 + *< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_incasare.Clb_serie_chit' AS clb_serie_act WITH ; + Anchor = 0, ; + BorderWidth = 0, ; + cvariabila = serie_chit, ; + cvariabiladoc = nr_incasare, ; + Height = 42, ; + Left = 5, ; + Name = "Clb_serie_chit", ; + nid_tipdoc = 16, ; + pcobj = poDate, ; + TabIndex = 4, ; + Top = 27, ; + Width = 104, ; + Text_simplu1.ControlSource = "poDate.serie_act", ; + Text_simplu1.Height = 23, ; + Text_simplu1.Left = 2, ; + Text_simplu1.Name = "Text_simplu1", ; + Text_simplu1.TabIndex = 2, ; + Text_simplu1.Top = 16, ; + Text_simplu1.Width = 236, ; + _cbbase1.Height = 23, ; + _cbbase1.Left = 2, ; + _cbbase1.Name = "_cbbase1", ; + _cbbase1.TabIndex = 1, ; + _cbbase1.Top = 16, ; + _cbbase1.Width = 98, ; + _lbbase1.Caption = "Serie chitanta", ; + _lbbase1.FontBold = .F., ; + _lbbase1.Left = 2, ; + _lbbase1.Name = "_lbbase1", ; + _lbbase1.TabIndex = 3, ; + _lbbase1.Top = 0 + *< END OBJECT: ClassLib="serii_numere.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_incasare.cmdModificaBon' AS but_modifica WITH ; + Anchor = 0, ; + caction = do_modifica_bon, ; + Left = 250, ; + Name = "cmdModificaBon", ; + TabIndex = 3, ; TabStop = .F., ; - Top = 499, ; - Width = 177, ; - ZOrderSet = 13, ; - Column1.ColumnOrder = 3, ; - Column1.ControlSource = "curs", ; - Column1.FontName = "Arial Narrow", ; - Column1.InputMask = (get_mask(14,gnPCurs)), ; - Column1.Name = "cCurs", ; - Column1.Width = 38, ; - Column2.ColumnOrder = 2, ; - Column2.ControlSource = "nume_val", ; - Column2.FontName = "Arial Narrow", ; - Column2.Name = "cNume_val", ; - Column2.Width = 56, ; - Column3.ColumnOrder = 1, ; - Column3.ControlSource = "multiplicator", ; - Column3.FontName = "Arial Narrow", ; - Column3.InputMask = (get_mask(10,0)), ; - Column3.Name = "cMultiplicator", ; - Column3.Width = 49 - *< END OBJECT: ClassLib="_grd_base.vcx" BaseClass="grid" /> + Top = 40, ; + Width = 30 + *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> - ADD OBJECT 'grd_cursuri.cCurs.Header1' AS header WITH ; - Alignment = 2, ; - Caption = "Curs", ; - FontName = "Arial Narrow", ; - Name = "Header1" - *< END OBJECT: BaseClass="header" /> - - ADD OBJECT 'grd_cursuri.cCurs.Text1' AS textbox WITH ; - BackColor = 255,255,255, ; + ADD OBJECT 'ct_incasare.opt_incasat' AS _optiongrup WITH ; + Anchor = 0, ; + AutoSize = .F., ; BorderStyle = 0, ; - FontName = "Arial Narrow", ; + ButtonCount = 3, ; + Height = 26, ; + Left = 7, ; + Name = "opt_incasat", ; + SpecialEffect = 1, ; + TabIndex = 1, ; + Top = 1, ; + Value = 1, ; + Width = 270, ; + Option1.AutoSize = .T., ; + Option1.Caption = "Chitanta", ; + Option1.Left = 5, ; + Option1.Name = "Option1", ; + Option1.TabIndex = 1, ; + Option1.Top = 6, ; + Option1.Value = 1, ; + Option2.AutoSize = .T., ; + Option2.Caption = "Bon fiscal", ; + Option2.Left = 108, ; + Option2.Name = "Option2", ; + Option2.TabIndex = 2, ; + Option2.Top = 6, ; + Option2.Value = 0, ; + Option3.AutoSize = .T., ; + Option3.BackStyle = 0, ; + Option3.Caption = "POS Card", ; + Option3.Height = 17, ; + Option3.Left = 186, ; + Option3.Name = "Option3", ; + Option3.TabIndex = 3, ; + Option3.ToolTipText = "Se foloseste la emitere factura incasata prin POS/Card. Este echivalenta cu o incasare prin banca. Nu se listeaza la casa de marcat, spre deosebire de Bon fiscal.", ; + Option3.Top = 6, ; + Option3.Value = 0, ; + Option3.Width = 73 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="optiongroup" /> + + ADD OBJECT 'ct_livrare' AS _container WITH ; + Anchor = 0, ; + BorderColor = 192,192,192, ; + BorderWidth = 1, ; + Height = 88, ; + Left = 12, ; + Name = "ct_livrare", ; + TabIndex = 67, ; + Top = 634, ; + Visible = .F., ; + Width = 963 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_livrare.But_modifica1' AS but_modifica WITH ; + Left = 330, ; + Name = "But_modifica1", ; + TabIndex = 3, ; + TabStop = .F., ; + Top = 56, ; + ZOrderSet = 18 + *< END OBJECT: ClassLib="cmd_butoane.vcx" BaseClass="commandbutton" /> + + ADD OBJECT 'ct_livrare.clb_adresa_facturare' AS ct_clb_cautare WITH ; + Anchor = 0, ; + cconditie = 1=2, ; + cprocedura = thisform.do_cauta_adresa, ; + cvar_afisata = poDate.adresa_facturare, ; + Height = 42, ; + Left = 626, ; + Name = "clb_adresa_facturare", ; + TabIndex = 6, ; + Top = 1, ; + Width = 252, ; + ZOrderSet = 23, ; + img_cautare.Left = 228, ; + img_cautare.Name = "img_cautare", ; + img_cautare.Top = 17, ; + clb_tx_cautare.BorderWidth = 0, ; + clb_tx_cautare.Height = 39, ; + clb_tx_cautare.Lb_simplu1.Caption = "Adresa facturare", ; + clb_tx_cautare.Lb_simplu1.FontBold = .F., ; + clb_tx_cautare.Lb_simplu1.Left = 2, ; + clb_tx_cautare.Lb_simplu1.Name = "Lb_simplu1", ; + clb_tx_cautare.Lb_simplu1.Top = 0, ; + clb_tx_cautare.Left = 0, ; + clb_tx_cautare.Name = "clb_tx_cautare", ; + clb_tx_cautare.Text_simplu1.Height = 23, ; + clb_tx_cautare.Text_simplu1.Left = 2, ; + clb_tx_cautare.Text_simplu1.Name = "Text_simplu1", ; + clb_tx_cautare.Text_simplu1.Top = 16, ; + clb_tx_cautare.Text_simplu1.Width = 218, ; + clb_tx_cautare.Top = 0, ; + clb_tx_cautare.Width = 222 + *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_livrare.Clb_dataora_exp' AS clb_tx_simplu WITH ; + Anchor = 0, ; + BorderWidth = 0, ; + Height = 42, ; + Left = 367, ; + Name = "Clb_dataora_exp", ; + TabIndex = 5, ; + Top = 44, ; + Width = 252, ; + ZOrderSet = 17, ; + Text_simplu1.ControlSource = "poDate.dataora_exp", ; + Text_simplu1.Height = 23, ; + Text_simplu1.Left = 2, ; + Text_simplu1.Name = "Text_simplu1", ; + Text_simplu1.Top = 16, ; + Text_simplu1.Width = 248, ; + Lb_simplu1.Caption = "Data si ora expedierii", ; + Lb_simplu1.FontBold = .F., ; + Lb_simplu1.Left = 2, ; + Lb_simplu1.Name = "Lb_simplu1", ; + Lb_simplu1.Top = 0 + *< END OBJECT: ClassLib="lb_tx.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_livrare.Ct_clb_agent' AS ct_clb_cautare WITH ; + cconditie = 1=2, ; + cprocedura = thisform.do_cauta_agent, ; + cvar_afisata = poDate.nume_agent, ; + Height = 42, ; + Left = 108, ; + Name = "Ct_clb_agent", ; + TabIndex = 1, ; + Top = 2, ; + Width = 252, ; + ZOrderSet = 11, ; + IMG_CAUTARE.Left = 228, ; + IMG_CAUTARE.Name = "IMG_CAUTARE", ; + IMG_CAUTARE.Top = 17, ; + CLB_TX_CAUTARE.BorderWidth = 0, ; + CLB_TX_CAUTARE.Height = 39, ; + CLB_TX_CAUTARE.LB_SIMPLU1.Caption = "Agent", ; + CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .F., ; + CLB_TX_CAUTARE.LB_SIMPLU1.Left = 2, ; + CLB_TX_CAUTARE.LB_SIMPLU1.Name = "LB_SIMPLU1", ; + CLB_TX_CAUTARE.LB_SIMPLU1.Top = 0, ; + CLB_TX_CAUTARE.Left = 0, ; + CLB_TX_CAUTARE.Name = "CLB_TX_CAUTARE", ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Height = 23, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 2, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 16, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 218, ; + CLB_TX_CAUTARE.Width = 222 + *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_livrare.Ct_clb_delegat' AS ct_clb_cautare WITH ; + cconditie = ISNULL(poDate.id_delegat), ; + cprocedura = thisform.do_cauta_delegat, ; + cvar_afisata = poDate.nume_delegat, ; + Height = 42, ; + Left = 108, ; + Name = "Ct_clb_delegat", ; + TabIndex = 2, ; + Top = 44, ; + Width = 218, ; + ZOrderSet = 9, ; + IMG_CAUTARE.Left = 194, ; + IMG_CAUTARE.Name = "IMG_CAUTARE", ; + IMG_CAUTARE.Top = 17, ; + CLB_TX_CAUTARE.BorderWidth = 0, ; + CLB_TX_CAUTARE.Height = 39, ; + CLB_TX_CAUTARE.LB_SIMPLU1.Caption = "Delegat", ; + CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .F., ; + CLB_TX_CAUTARE.LB_SIMPLU1.Left = 2, ; + CLB_TX_CAUTARE.LB_SIMPLU1.Name = "LB_SIMPLU1", ; + CLB_TX_CAUTARE.LB_SIMPLU1.Top = 0, ; + CLB_TX_CAUTARE.Left = 0, ; + CLB_TX_CAUTARE.Name = "CLB_TX_CAUTARE", ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Height = 23, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 2, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 16, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 184, ; + CLB_TX_CAUTARE.Width = 188 + *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_livrare.Ct_clb_masina' AS ct_clb_cautare WITH ; + cconditie = empty(NVL(poDate.nrinmat,0)), ; + cprocedura = thisform.do_cauta_masina, ; + cvar_afisata = poDate.nrinmat, ; + Height = 42, ; + Left = 367, ; + Name = "Ct_clb_masina", ; + TabIndex = 4, ; + Top = 2, ; + Width = 252, ; + ZOrderSet = 10, ; + IMG_CAUTARE.Left = 228, ; + IMG_CAUTARE.Name = "IMG_CAUTARE", ; + IMG_CAUTARE.Top = 17, ; + CLB_TX_CAUTARE.BorderWidth = 0, ; + CLB_TX_CAUTARE.Height = 39, ; + CLB_TX_CAUTARE.LB_SIMPLU1.Caption = "Masina", ; + CLB_TX_CAUTARE.LB_SIMPLU1.FontBold = .F., ; + CLB_TX_CAUTARE.LB_SIMPLU1.Left = 2, ; + CLB_TX_CAUTARE.LB_SIMPLU1.Name = "LB_SIMPLU1", ; + CLB_TX_CAUTARE.LB_SIMPLU1.Top = 0, ; + CLB_TX_CAUTARE.Left = 0, ; + CLB_TX_CAUTARE.Name = "CLB_TX_CAUTARE", ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Height = 23, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Left = 2, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Name = "TEXT_SIMPLU1", ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Top = 16, ; + CLB_TX_CAUTARE.TEXT_SIMPLU1.Width = 218, ; + CLB_TX_CAUTARE.Width = 222 + *< END OBJECT: ClassLib="caut_ora.vcx" BaseClass="container" /> + + ADD OBJECT 'ct_livrare.lb_grup_livrare' AS lb_simplu WITH ; + Caption = "LIVRARE", ; + FontBold = .T., ; ForeColor = 0,0,0, ; - Margin = 0, ; - Name = "Text1", ; - SelectedBackColor = 0,64,128 - *< END OBJECT: BaseClass="textbox" /> - - ADD OBJECT 'grd_cursuri.cMultiplicator.Header1' AS header WITH ; - Alignment = 2, ; - Caption = "Multiplicator", ; - FontName = "Arial Narrow", ; - Name = "Header1" - *< END OBJECT: BaseClass="header" /> - - ADD OBJECT 'grd_cursuri.cMultiplicator.Text1' AS textbox WITH ; - BackColor = 255,255,255, ; - BorderStyle = 0, ; - FontName = "Arial Narrow", ; - ForeColor = 0,0,0, ; - Margin = 0, ; - Name = "Text1", ; - SelectedBackColor = 100,185,255 - *< END OBJECT: BaseClass="textbox" /> - - ADD OBJECT 'grd_cursuri.cNume_val.Header1' AS header WITH ; - Alignment = 2, ; - Caption = "Valuta", ; - FontName = "Arial Narrow", ; - Name = "Header1" - *< END OBJECT: BaseClass="header" /> - - ADD OBJECT 'grd_cursuri.cNume_val.Text1' AS textbox WITH ; - BackColor = 255,255,255, ; - BorderStyle = 0, ; - FontName = "Arial Narrow", ; - ForeColor = 0,0,0, ; - Margin = 0, ; - Name = "Text1", ; - SelectedBackColor = 0,64,128 - *< END OBJECT: BaseClass="textbox" /> + Left = 10, ; + Name = "lb_grup_livrare", ; + Top = 10 + *< END OBJECT: ClassLib="lb.vcx" BaseClass="label" /> ADD OBJECT 'grd_factura' AS _grdrow WITH ; - Anchor = 15, ; + Anchor = 10, ; ColumnCount = 14, ; DeleteMark = .F., ; FontName = "Arial", ; HeaderHeight = 18, ; - Height = 240, ; + Height = 183, ; HighlightStyle = 1, ; Left = 12, ; Name = "grd_factura", ; @@ -16612,9 +17385,9 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" ReadOnly = .F., ; RecordSource = "crsfactura", ; RowHeight = 18, ; - TabIndex = 16, ; - Top = 204, ; - Width = 765, ; + TabIndex = 19, ; + Top = 184, ; + Width = 960, ; ZOrderSet = 8, ; Column1.ColumnOrder = 2, ; Column1.ControlSource = "crsFactura.denumire", ; @@ -16703,7 +17476,7 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Column11.ReadOnly = .F., ; Column11.Width = 87, ; Column12.ColumnOrder = 3, ; - Column12.ControlSource = "crsFactura.gestiune", ; + Column12.ControlSource = "crsFactura.nume_gestiune", ; Column12.CurrentControl = "cCboGestiune", ; Column12.FontName = "Arial", ; Column12.FontSize = 9, ; @@ -16724,7 +17497,7 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Column14.Format = "RK", ; Column14.InputMask = "99 999.99", ; Column14.Name = "cProcentDiscount", ; - Column14.ReadOnly = .F., ; + Column14.ReadOnly = .T., ; Column14.Width = 85 *< END OBJECT: ClassLib="_grd_base.vcx" BaseClass="grid" /> @@ -16748,19 +17521,21 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" SelectedBackColor = 0,64,128 *< END OBJECT: BaseClass="textbox" /> - ADD OBJECT 'grd_factura.cCodMat.cboCodmat' AS combosql WITH ; + ADD OBJECT 'grd_factura.cCodMat.cboCodmat' AS combosql_cautare WITH ; ColumnCount = 6, ; - ColumnWidths = "50,150,50,100,100,100", ; + ColumnWidths = "70,180,40,80,45,155", ; ControlSource = "crsFactura.codmat", ; csourcesql = select codmat, denumire, um, grupa, subgrupa, codbare, id_articol from vnom_articole, ; csourcewhere = inactiv = 0, ; FontSize = 9, ; Left = 25, ; Name = "cboCodmat", ; + ncharcountbegin = 2, ; pcursorname = crsCodmat, ; pfieldactiv = codmat, ; - Top = 71 - *< END OBJECT: ClassLib="cautare.vcx" BaseClass="combobox" /> + Top = 71, ; + Width = 570 + *< END OBJECT: ClassLib="ofacturare.vcx" BaseClass="combobox" /> ADD OBJECT 'grd_factura.cCodMat.Header1' AS header WITH ; Alignment = 2, ; @@ -16782,19 +17557,21 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" SelectedBackColor = 100,185,255 *< END OBJECT: BaseClass="textbox" /> - ADD OBJECT 'grd_factura.cDenumire.cCboDenumire' AS combosql WITH ; + ADD OBJECT 'grd_factura.cDenumire.cCboDenumire' AS combosql_cautare WITH ; ColumnCount = 6, ; - ColumnWidths = "150,50,50,100,100,100", ; + ColumnWidths = "180,70,40,80,45,155", ; ControlSource = "crsFactura.denumire", ; csourcesql = select denumire, codmat, um, grupa, subgrupa, codbare, id_articol from vnom_articole, ; csourcewhere = inactiv = 0, ; FontSize = 9, ; Left = 81, ; Name = "cCboDenumire", ; + ncharcountbegin = 2, ; pcursorname = crsDenumire, ; pfieldactiv = denumire, ; - Top = 71 - *< END OBJECT: ClassLib="cautare.vcx" BaseClass="combobox" /> + Top = 71, ; + Width = 570 + *< END OBJECT: ClassLib="ofacturare.vcx" BaseClass="combobox" /> ADD OBJECT 'grd_factura.cDenumire.Header1' AS header WITH ; Alignment = 2, ; @@ -16869,7 +17646,7 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" pcursorname = crsGestiuni, ; pfieldactiv = nume_gestiune, ; Top = 47 - *< END OBJECT: ClassLib="cautare.vcx" BaseClass="combobox" /> + *< END OBJECT: ClassLib="_cb_base.vcx" BaseClass="combobox" /> ADD OBJECT 'grd_factura.cGestiune.Header1' AS header WITH ; Alignment = 2, ; @@ -17060,38 +17837,537 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" allowgridpreferences = .F., ; gridexpression = Thisform.grd_factura, ; Height = 17, ; - Left = 756, ; + Left = 936, ; Name = "Gridextra3", ; - Top = 432, ; + Top = 372, ; Width = 24 *< END OBJECT: ClassLib="..\utile\gridextras\gridextras.vcx" BaseClass="custom" /> - ADD OBJECT 'lb_cursuri' AS lb_simplu WITH ; - Anchor = 6, ; - Caption = "Curs valutar (ZZ/LL/AAAA)", ; - Left = 15, ; - Name = "lb_cursuri", ; - TabIndex = 25, ; - Top = 479, ; - ZOrderSet = 14 + ADD OBJECT 'lb_antet_alte_date' AS lb_simplu WITH ; + Alignment = 0, ; + Anchor = 0, ; + AutoSize = .F., ; + BackColor = 230,230,230, ; + BackStyle = 0, ; + Caption = "", ; + FontBold = .T., ; + ForeColor = 60,60,60, ; + Height = 24, ; + Left = 482, ; + MousePointer = 15, ; + Name = "lb_antet_alte_date", ; + Top = 381, ; + Width = 386 *< END OBJECT: ClassLib="lb.vcx" BaseClass="label" /> + ADD OBJECT 'lb_antet_incasare' AS lb_simplu WITH ; + Alignment = 0, ; + Anchor = 0, ; + AutoSize = .F., ; + BackColor = 230,230,230, ; + BackStyle = 0, ; + Caption = "", ; + FontBold = .T., ; + ForeColor = 60,60,60, ; + Height = 24, ; + Left = 87, ; + MousePointer = 15, ; + Name = "lb_antet_incasare", ; + Top = 374, ; + Width = 294 + *< END OBJECT: ClassLib="lb.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_disc_articole' AS _label WITH ; + Anchor = 4, ; + Caption = "Discount articole (fara TVA)", ; + Height = 18, ; + Left = 183, ; + Name = "lb_disc_articole", ; + Top = 729, ; + Width = 158, ; + WordWrap = .T. + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_disc_articole_ron' AS _label WITH ; + Anchor = 4, ; + Caption = "RON", ; + Left = 291, ; + Name = "lb_disc_articole_ron", ; + Top = 747 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_disc_articole_val' AS _label WITH ; + Anchor = 4, ; + Left = 183, ; + Name = "lb_disc_articole_val", ; + Top = 773 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_disc_factura' AS _label WITH ; + Anchor = 4, ; + Caption = "Discount pe factura (fara TVA)", ; + Height = 18, ; + Left = 351, ; + Name = "lb_disc_factura", ; + Top = 730, ; + Width = 173, ; + WordWrap = .T. + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_disc_factura_procent_semn' AS _label WITH ; + Anchor = 4, ; + Caption = "%", ; + Left = 601, ; + Name = "lb_disc_factura_procent_semn", ; + Top = 769 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_disc_factura_ron' AS _label WITH ; + Anchor = 4, ; + Caption = "RON", ; + Left = 460, ; + Name = "lb_disc_factura_ron", ; + Top = 747 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_disc_factura_val' AS _label WITH ; + Anchor = 4, ; + Left = 351, ; + Name = "lb_disc_factura_val", ; + Top = 773 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_total_baza' AS _label WITH ; + Anchor = 4, ; + Caption = "Total (baza)", ; + Left = 17, ; + Name = "lb_total_baza", ; + Top = 727 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_total_baza_ron' AS _label WITH ; + Anchor = 4, ; + Caption = "RON", ; + Left = 120, ; + Name = "lb_total_baza_ron", ; + Top = 747 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_total_baza_val' AS _label WITH ; + Anchor = 4, ; + Left = 17, ; + Name = "lb_total_baza_val", ; + Top = 773 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_total_factura' AS _label WITH ; + Anchor = 12, ; + Caption = "TOTAL FACTURA", ; + FontBold = .T., ; + Left = 833, ; + Name = "lb_total_factura", ; + Top = 726 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_total_factura_ron' AS _label WITH ; + Anchor = 12, ; + Caption = "RON", ; + FontBold = .T., ; + Left = 936, ; + Name = "lb_total_factura_ron", ; + Top = 744 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_total_factura_val' AS _label WITH ; + Anchor = 12, ; + FontBold = .T., ; + Left = 832, ; + Name = "lb_total_factura_val", ; + Top = 768 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + ADD OBJECT 'lb_total_mod' AS lb_simplu WITH ; Alignment = 1, ; Anchor = 12, ; AutoSize = .F., ; Caption = "0.00", ; FontBold = .T., ; - FontName = "Arial Narrow", ; + FontName = "Arial", ; + FontSize = 10, ; Height = 17, ; - Left = 705, ; + Left = 833, ; Name = "lb_total_mod", ; - TabIndex = 30, ; - Top = 532, ; + TabIndex = 58, ; + Top = 749, ; Visible = .F., ; Width = 37 *< END OBJECT: ClassLib="lb.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_total_tva' AS _label WITH ; + Anchor = 12, ; + Caption = "TVA", ; + Left = 689, ; + Name = "lb_total_tva", ; + Top = 726 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_total_tva_ron' AS _label WITH ; + Anchor = 12, ; + Caption = "RON", ; + Left = 792, ; + Name = "lb_total_tva_ron", ; + Top = 744 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lb_total_tva_val' AS _label WITH ; + Anchor = 12, ; + Left = 689, ; + Name = "lb_total_tva_val", ; + Top = 768 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lblCodFiscal' AS _label WITH ; + Caption = "Cod fiscal", ; + FontBold = .F., ; + Left = 508, ; + Name = "lblCodFiscal", ; + Top = 84 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lblSoldLei' AS _label WITH ; + Caption = "Sold lei", ; + FontBold = .F., ; + ForeColor = 0,0,128, ; + Left = 714, ; + Name = "lblSoldLei", ; + Top = 84 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'lblTipDoc' AS _label WITH ; + Caption = "Tip document", ; + FontBold = .F., ; + Left = 12, ; + Name = "lblTipDoc", ; + Top = 34 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="label" /> + + ADD OBJECT 'tx_disc_articole_nat' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 4, ; + ControlSource = "thisform.ndiscron", ; + Format = "!K", ; + InputMask = (get_mask(14,gnPc)), ; + Left = 183, ; + Name = "tx_disc_articole_nat", ; + ReadOnly = .T., ; + TabIndex = 48, ; + TabStop = .F., ; + Top = 745 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'tx_disc_articole_val' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 4, ; + ControlSource = "thisform.ndiscval", ; + Format = "!K", ; + InputMask = (get_mask(14,gnPVal)), ; + Left = 183, ; + Name = "tx_disc_articole_val", ; + ReadOnly = .T., ; + TabIndex = 47, ; + TabStop = .F., ; + Top = 789 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'tx_disc_factura_nat' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 4, ; + ControlSource = "thisform.ndiscfactron", ; + Format = "!K", ; + InputMask = (get_mask(14,gnPc)), ; + Left = 351, ; + Name = "tx_disc_factura_nat", ; + ReadOnly = .T., ; + TabIndex = 50, ; + TabStop = .F., ; + Top = 745 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'tx_disc_factura_procent' AS _textbox WITH ; + Alignment = 3, ; + Anchor = 4, ; + Format = "!K", ; + InputMask = "9 999.99", ; + Left = 542, ; + Name = "tx_disc_factura_procent", ; + TabIndex = 51, ; + Top = 767, ; + Value = 0, ; + Width = 54 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'tx_disc_factura_val' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 4, ; + ControlSource = "thisform.ndiscfactval", ; + Format = "!K", ; + InputMask = (get_mask(14,gnPVal)), ; + Left = 351, ; + Name = "tx_disc_factura_val", ; + ReadOnly = .T., ; + TabIndex = 49, ; + TabStop = .F., ; + Top = 789 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'tx_total_baza_nat' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 4, ; + ControlSource = "thisform.nbazaron", ; + Format = "!K", ; + InputMask = (get_mask(14,gnPc)), ; + Left = 17, ; + Name = "tx_total_baza_nat", ; + ReadOnly = .T., ; + TabIndex = 46, ; + TabStop = .F., ; + Top = 745 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'tx_total_baza_val' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 4, ; + ControlSource = "thisform.nbazaval", ; + Format = "!K", ; + InputMask = (get_mask(14,gnPVal)), ; + Left = 17, ; + Name = "tx_total_baza_val", ; + ReadOnly = .T., ; + TabIndex = 45, ; + TabStop = .F., ; + Top = 789 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'tx_total_factura_nat' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 12, ; + ControlSource = "thisform.ntotalron", ; + FontBold = .T., ; + Format = "!K", ; + InputMask = (get_mask(14,gnPc)), ; + Left = 833, ; + Name = "tx_total_factura_nat", ; + ReadOnly = .T., ; + TabIndex = 57, ; + TabStop = .F., ; + Top = 742 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'tx_total_factura_val' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 12, ; + ControlSource = "thisform.ntotalval", ; + FontBold = .T., ; + Format = "!K", ; + InputMask = (get_mask(14,gnPVal)), ; + Left = 835, ; + Name = "tx_total_factura_val", ; + ReadOnly = .T., ; + TabIndex = 56, ; + TabStop = .F., ; + Top = 792 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'tx_total_tva_nat' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 12, ; + ControlSource = "thisform.ntvaron", ; + Format = "!K", ; + InputMask = (get_mask(14,gnPc)), ; + Left = 689, ; + Name = "tx_total_tva_nat", ; + ReadOnly = .T., ; + TabIndex = 55, ; + TabStop = .F., ; + Top = 742 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'tx_total_tva_val' AS _textbox WITH ; + Alignment = 1, ; + Anchor = 12, ; + ControlSource = "thisform.ntvaval", ; + Format = "!K", ; + InputMask = (get_mask(14,gnPVal)), ; + Left = 689, ; + Name = "tx_total_tva_val", ; + ReadOnly = .T., ; + TabIndex = 54, ; + TabStop = .F., ; + Top = 792 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'txtCodFiscal' AS _textbox WITH ; + ControlSource = "poDate.cod_fiscal", ; + Enabled = .F., ; + Height = 23, ; + Left = 508, ; + Name = "txtCodFiscal", ; + ReadOnly = .T., ; + TabIndex = 9, ; + Top = 102, ; + Width = 150 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + + ADD OBJECT 'txtSoldLei' AS _textbox WITH ; + ControlSource = "thisform.nSoldLei", ; + Enabled = .F., ; + ForeColor = 0,0,128, ; + Height = 23, ; + InputMask = "999 999 999.99", ; + Left = 714, ; + Name = "txtSoldLei", ; + ReadOnly = .T., ; + TabIndex = 11, ; + Top = 102, ; + Width = 124 + *< END OBJECT: ClassLib="_baza.vcx" BaseClass="textbox" /> + PROCEDURE Activate + DoDefault() + If !This.ltotaluri_asezate + This.ltotaluri_asezate = .T. + This.aseaza_totaluri() + Endif + ENDPROC + + PROCEDURE actualizeaza_tipincasare + Local lnMod + If poDate.lEditare + Return + Endif + poDate.tip_saft = 380 + Thisform.ct_document.cboTipFactura.Refresh() + + lnMod = This.nmod_incasare() + Do Case + Case lnMod = 1 + poGeneratorNumere.dezaloca_numar(16) + poGeneratorNumere.dezaloca_numar(3) + poGeneratorNumere.dezaloca_numar(26) + + Thisform.ct_incasare.clb_nrchit.text_simplu1.ReadOnly=.T. + Thisform.nnrbon = 0 + poDate.nr_incasare = 0 + poDate.incasat = 0 + Thisform.ct_incasare.clb_serie_chit.Refresh() + Thisform.ct_incasare.clb_nrchit.Refresh() + Thisform.ct_incasare.clb_incasat.Refresh() + + Thisform.ct_incasare.chkPOS.Value = 0 + Thisform.ct_incasare.chkPOS.Valid() + Thisform.ct_incasare.chkDetaliat.Value = 0 + Case lnMod = 2 + poGeneratorNumere.dezaloca_numar(3) + poGeneratorNumere.dezaloca_numar(16) + poGeneratorNumere.dezaloca_numar(26) + + If Thisform.nRezultatSerii = 0 + Thisform.nRezultatSerii = poGeneratorNumere.creeaza_cursor_serii(16) + Thisform.ct_incasare.clb_serie_chit.do_initializeaza(Thisform.nRezultatSerii) + If !Empty(Nvl(poDate.serie_act,[])) + If Thisform.nRezultatSerii <> 1 + Select (Thisform.ct_incasare.clb_serie_chit._cbbase1.RowSource) + Locate For Alltrim(serie) = Alltrim(poDate.serie_act) + If !Found() + Go Top + Endif + Thisform.ct_incasare.clb_serie_chit._cbbase1.Value = Alltrim(serie) + Endif + Endif + Endif + Thisform.ct_incasare.cb_casa.Visible=.T. + Thisform.ct_incasare.clb_serie_chit.Visible = .T. + Thisform.ct_incasare.clb_nrchit.Visible=.T. + Thisform.ct_incasare.clb_nrchit.lb_simplu1.Caption=[Nr. chitanta] + Thisform.ct_incasare.clb_incasat.Visible=.T. + Thisform.ct_incasare.cmdModificaBon.Visible=.F. + Thisform.ct_incasare.clb_nrchit.text_simplu1.ReadOnly = .F. + Thisform.nnrbon = 0 + poDate.nr_incasare = 0 + poDate.incasat = poDate.totalctva + Thisform.ct_incasare.clb_serie_chit.Refresh() + Thisform.ct_incasare.clb_nrchit.Refresh() + Thisform.ct_incasare.clb_incasat.Refresh() + Thisform.ct_incasare.clb_serie_chit.genereazaNumar() + Thisform.ct_incasare.chkPOS.Value = 0 + Thisform.ct_incasare.chkPOS.Valid() + Thisform.ct_incasare.chkPOS.Visible = .F. + Thisform.ct_incasare.chkDetaliat.Value = 0 + Thisform.ct_incasare.chkDetaliat.Visible = .F. + + Case lnMod = 3 + + poGeneratorNumere.dezaloca_numar(3) + poGeneratorNumere.dezaloca_numar(16) + poGeneratorNumere.dezaloca_numar(26) + + Thisform.ct_incasare.cb_casa.Visible=.T. + Thisform.ct_incasare.clb_serie_chit.Visible = .F. + Thisform.ct_incasare.clb_nrchit.Visible=.T. + Thisform.ct_incasare.clb_nrchit.lb_simplu1.Caption=[Nr. bon] + Thisform.ct_incasare.clb_incasat.Visible=.T. + Thisform.ct_incasare.cmdModificaBon.Visible=.T. + Thisform.ct_incasare.clb_nrchit.text_simplu1.ReadOnly = .T. + Thisform.nnrbon = 0 + poDate.nr_incasare = 0 + Thisform.do_aloca_nr_bon([CLICK]) + poDate.incasat = poDate.totalctva + Thisform.ct_incasare.clb_serie_chit.Refresh() + Thisform.ct_incasare.clb_nrchit.Refresh() + Thisform.ct_incasare.clb_incasat.Refresh() + + Thisform.ct_incasare.chkPOS.Value = 0 + Thisform.ct_incasare.chkPOS.Valid() + Thisform.ct_incasare.chkPOS.Visible = .T. + Thisform.ct_incasare.chkDetaliat.Value = 0 + Thisform.ct_incasare.chkDetaliat.Visible = .T. + + IF TYPE('gnEFactura_tip_saft_bf') = 'N' AND !EMPTY(NVL(m.gnEFactura_tip_saft_bf, 0)) + poDate.tip_saft = m.gnEFactura_tip_saft_bf + Thisform.ct_document.cboTipFactura.Refresh() + ENDIF + + Case lnMod = 4 + + poGeneratorNumere.dezaloca_numar(3) + poGeneratorNumere.dezaloca_numar(16) + poGeneratorNumere.dezaloca_numar(26) + + Thisform.ct_incasare.cb_casa.Visible=.T. + Thisform.ct_incasare.clb_serie_chit.Visible = .F. + Thisform.ct_incasare.clb_nrchit.Visible=.T. + Thisform.ct_incasare.clb_nrchit.lb_simplu1.Caption=[Nr. bon] + Thisform.ct_incasare.clb_incasat.Visible=.T. + Thisform.ct_incasare.cmdModificaBon.Visible=.T. + Thisform.ct_incasare.clb_nrchit.text_simplu1.ReadOnly = .T. + Thisform.nnrbon = 0 + poDate.nr_incasare = 0 + Thisform.do_aloca_nr_pos([CLICK]) + poDate.incasat = poDate.totalctva + Thisform.ct_incasare.clb_serie_chit.Refresh() + Thisform.ct_incasare.clb_nrchit.Refresh() + Thisform.ct_incasare.clb_incasat.Refresh() + + Thisform.ct_incasare.chkPOS.Value = 1 + Thisform.ct_incasare.chkPOS.Valid() + Thisform.ct_incasare.chkPOS.Visible = .F. + Thisform.ct_incasare.chkDetaliat.Value = 0 + Thisform.ct_incasare.chkDetaliat.Visible = .F. + + Endcase + Thisform.aseaza_alte_date() + ENDPROC + PROCEDURE actualizeaza_total_mod Lparameters tnValoare,tnTip Local lnTotal,lnValoare,lnTip @@ -17100,21 +18376,306 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" lnTip = IIF(EMPTY(tnTip),0,tnTip) lnTotal = Iif(lnTip=1,lnValoare,Thisform.nbazaron) + Iif(lnTip=2,lnValoare,Thisform.ntvaron) If lnTotal <> Thisform.ntotalron - Thisform.clb_total_baza.tx_SUMA_NAT.ForeColor = Rgb(255,0,0) - Thisform.clb_total_tva.tx_SUMA_NAT.ForeColor = Rgb(255,0,0) + Thisform.tx_total_baza_nat.ForeColor = Rgb(255,0,0) + Thisform.tx_total_tva_nat.ForeColor = Rgb(255,0,0) Thisform.lb_total_mod.ForeColor = Rgb(255,0,0) Thisform.lb_total_mod.AutoSize = .F. Thisform.lb_total_mod.Caption = Transform(lnTotal,get_mask(14,gnPc)) Thisform.lb_total_mod.AutoSize = .T. Thisform.lb_total_mod.Visible = .T. Else - Thisform.clb_total_baza.tx_SUMA_NAT.ForeColor = Rgb(0,0,0) - Thisform.clb_total_tva.tx_SUMA_NAT.ForeColor = Rgb(0,0,0) + Thisform.tx_total_baza_nat.ForeColor = Rgb(0,0,0) + Thisform.tx_total_tva_nat.ForeColor = Rgb(0,0,0) Thisform.lb_total_mod.Visible = .F. Endif Endif ENDPROC + PROCEDURE aseaza_alte_date + Local lnBanda, lnHLinie, lnHInc, lnHAlte, lnGap, lnTotal, lnBaraTop, lnLinieTop, lnIncTop, lnAlteTop, lnMod, lnLeftCurs, lnDelta, llAlteDate, llIncasare + + If !This.lasezare_memorata + Return + Endif + + llAlteDate = This.chk_alte_date.Value = 1 + llIncasare = This.do_exista_obiect('ct_incasare') And This.chk_incasare.Value = 1 + lnMod = This.nmod_incasare() + + lnBanda = This.Height - 103 && 830 (Height design) - 727 (Top design lb_total_baza, capul benzii de totaluri) + lnHLinie = This.oasezareoffset.Item('h_linie_casete') + lnHInc = Iif(llIncasare, This.oasezareoffset.Item('h_ct_incasare'), 0) + lnHAlte = Iif(llAlteDate, This.oasezareoffset.Item('h_stiva_alte'), 0) + lnGap = Iif(lnHInc > 0 And lnHAlte > 0, 8, 0) + lnTotal = lnHLinie + lnHInc + lnGap + lnHAlte + lnBaraTop = lnBanda - lnTotal - Iif(lnTotal > 0, 4, 0) + lnLinieTop = lnBaraTop + lnIncTop = lnBaraTop + lnHLinie + lnAlteTop = lnIncTop + lnHInc + lnGap + + This.grd_factura.Height = Max(60, lnBaraTop - 4 - This.grd_factura.Top) + This.gridextra3.Top = This.grd_factura.Top + This.grd_factura.Height - 12 + This.Gridsort1.Top = This.grd_factura.Top + This.grd_factura.Height - This.Gridsort1.Height + + * Linia de casete; fara banda de incasare, caseta Alte date preia toata linia + If This.do_exista_obiect('chk_incasare') + This.chk_incasare.Visible = .T. + This.chk_incasare.Top = lnLinieTop + This.lb_antet_incasare.Visible = .T. + This.lb_antet_incasare.Top = lnLinieTop + This.lb_antet_incasare.Left = This.chk_incasare.Left + 108 + This.lb_antet_incasare.Width = 700 + This.lb_antet_incasare.Caption = This.rezumat_incasare() + This.chk_alte_date.Left = 840 + Else + This.chk_alte_date.Left = 12 + Endif + This.chk_alte_date.Visible = .T. + This.chk_alte_date.Top = lnLinieTop + This.lb_antet_alte_date.Visible = .T. + This.lb_antet_alte_date.Top = lnLinieTop + This.lb_antet_alte_date.Left = This.chk_alte_date.Left + 108 + This.lb_antet_alte_date.Width = This.Width - 24 - This.lb_antet_alte_date.Left + This.lb_antet_alte_date.Caption = This.rezumat_alte_date() + + * Stiva Alte date: trei containere, cate un Top fiecare + This.ct_document.Left = 12 + This.ct_document.Top = lnAlteTop + This.ct_contabilitate.Left = 12 + This.ct_contabilitate.Top = This.ct_document.Top + This.ct_document.Height - 1 + This.ct_livrare.Left = 12 + This.ct_livrare.Top = This.ct_contabilitate.Top + This.ct_contabilitate.Height - 1 + This.ct_contabilitate.Visible = llAlteDate + This.ct_livrare.Visible = llAlteDate + && un container ramas fara continut util nu deseneaza un chenar gol + This.ct_document.Visible = llAlteDate And This.ct_document.Objects.Count > 2 + + + * Banda de incasare: raman doar vizibilitatile care depind de modul de incasare + If This.do_exista_obiect('ct_incasare') + This.ct_incasare.Left = 12 + This.ct_incasare.Top = lnIncTop + This.ct_incasare.Visible = llIncasare + This.ct_incasare.clb_serie_chit.Visible = (lnMod = 2) + This.ct_incasare.cmdModificaBon.Visible = Inlist(lnMod, 3, 4) + This.ct_incasare.chkPOS.Visible = (lnMod = 3) + This.ct_incasare.chkDetaliat.Visible = Inlist(lnMod, 3, 4) + Endif + + * butonul de cursuri valutare, ancorat la dreapta si la grupul Document, sub linia de casete + lnLeftCurs = This.Width - 300 + This.but_cursuri.Visible = llAlteDate + This.but_cursuri.Left = lnLeftCurs + This.but_cursuri.Top = Max(lnAlteTop + This.oasezareoffset.Item('but_cursuri'), lnLinieTop + lnHLinie) + ENDPROC + + PROCEDURE aseaza_totaluri + Local lnGap, lnLeft, lnDreapta, lnLatime + + lnGap = 24 + + * Total (baza) + lnLeft = 12 + This.lb_total_baza.Left = lnLeft + If This.do_exista_obiect('tx_total_baza_val') + This.tx_total_baza_val.Left = lnLeft + This.lb_total_baza_val.Left = This.tx_total_baza_val.Left + This.tx_total_baza_val.Width + 3 + This.tx_total_baza_nat.Left = This.lb_total_baza_val.Left + This.lb_total_baza_val.Width + 10 + Else + This.tx_total_baza_nat.Left = lnLeft + Endif + This.lb_total_baza_ron.Left = This.tx_total_baza_nat.Left + This.tx_total_baza_nat.Width + 3 + lnDreapta = Max(This.lb_total_baza.Left + This.lb_total_baza.Width, This.lb_total_baza_ron.Left + This.lb_total_baza_ron.Width) + + * Discount articole + lnLeft = lnDreapta + lnGap + This.lb_disc_articole.Left = lnLeft + If This.do_exista_obiect('tx_disc_articole_val') + This.tx_disc_articole_val.Left = lnLeft + This.lb_disc_articole_val.Left = This.tx_disc_articole_val.Left + This.tx_disc_articole_val.Width + 3 + This.tx_disc_articole_nat.Left = This.lb_disc_articole_val.Left + This.lb_disc_articole_val.Width + 10 + Else + This.tx_disc_articole_nat.Left = lnLeft + Endif + This.lb_disc_articole_ron.Left = This.tx_disc_articole_nat.Left + This.tx_disc_articole_nat.Width + 3 + lnDreapta = Max(This.lb_disc_articole.Left + This.lb_disc_articole.Width, This.lb_disc_articole_ron.Left + This.lb_disc_articole_ron.Width) + + * Discount factura (+ evidentiere discount + motiv) + If This.lb_disc_factura.Visible + lnLeft = lnDreapta + lnGap + This.lb_disc_factura.Left = lnLeft + If This.do_exista_obiect('tx_disc_factura_val') + This.tx_disc_factura_val.Left = lnLeft + This.lb_disc_factura_val.Left = This.tx_disc_factura_val.Left + This.tx_disc_factura_val.Width + 3 + This.tx_disc_factura_nat.Left = This.lb_disc_factura_val.Left + This.lb_disc_factura_val.Width + 10 + Else + This.tx_disc_factura_nat.Left = lnLeft + Endif + This.lb_disc_factura_ron.Left = This.tx_disc_factura_nat.Left + This.tx_disc_factura_nat.Width + 3 + lnDreapta = Max(This.lb_disc_factura.Left + This.lb_disc_factura.Width, This.lb_disc_factura_ron.Left + This.lb_disc_factura_ron.Width) + This.tx_disc_factura_procent.Left = lnDreapta + 12 + This.lb_disc_factura_procent_semn.Left = This.tx_disc_factura_procent.Left + This.tx_disc_factura_procent.Width + 2 + This.ck_discountevidentiat.Left = This.lb_disc_factura_procent_semn.Left + This.lb_disc_factura_procent_semn.Width + 6 + This.clb_motiv_discount.Left = This.ck_discountevidentiat.Left + This.ck_discountevidentiat.Width + lnGap + lnLeft = This.clb_motiv_discount.Left + This.clb_motiv_discount.Width + lnGap + Else + This.ck_discountevidentiat.Left = lnDreapta + lnGap + lnLeft = This.ck_discountevidentiat.Left + This.ck_discountevidentiat.Width + lnGap + Endif + + * TVA + This.lb_total_tva.Left = lnLeft + If This.do_exista_obiect('tx_total_tva_val') + This.tx_total_tva_val.Left = lnLeft + This.lb_total_tva_val.Left = This.tx_total_tva_val.Left + This.tx_total_tva_val.Width + 3 + This.tx_total_tva_nat.Left = This.lb_total_tva_val.Left + This.lb_total_tva_val.Width + 10 + Else + This.tx_total_tva_nat.Left = lnLeft + Endif + This.lb_total_tva_ron.Left = This.tx_total_tva_nat.Left + This.tx_total_tva_nat.Width + 3 + + * Total factura (bold, ancorat la dreapta gridului) + If This.do_exista_obiect('tx_total_factura_val') + lnLatime = This.tx_total_factura_val.Width + 3 + This.lb_total_factura_val.Width + 10 + This.tx_total_factura_nat.Width + 3 + This.lb_total_factura_ron.Width + Else + lnLatime = This.tx_total_factura_nat.Width + 3 + This.lb_total_factura_ron.Width + Endif + lnLatime = Max(This.lb_total_factura.Width, lnLatime) + lnLeft = This.grd_factura.Left + This.grd_factura.Width - lnLatime + This.lb_total_factura.Left = lnLeft + If This.do_exista_obiect('tx_total_factura_val') + This.tx_total_factura_val.Left = lnLeft + This.lb_total_factura_val.Left = This.tx_total_factura_val.Left + This.tx_total_factura_val.Width + 3 + This.tx_total_factura_nat.Left = This.lb_total_factura_val.Left + This.lb_total_factura_val.Width + 10 + Else + This.tx_total_factura_nat.Left = lnLeft + Endif + This.lb_total_factura_ron.Left = This.tx_total_factura_nat.Left + This.tx_total_factura_nat.Width + 3 + + This.lb_total_mod.Left = This.tx_total_factura_nat.Left + ENDPROC + + PROCEDURE blocheaza_antet + If This.do_exista_obiect('Clb_serie_act1') + This.Clb_serie_act1.TEXT_SIMPLU1.ReadOnly = .T. + This.Clb_serie_act1.TEXT_SIMPLU1.TabStop = .F. + This.Clb_serie_act1._CBBASE1.Enabled = .F. + Endif + This.Clb_nract.TEXT_SIMPLU1.ReadOnly = .T. + This.Clb_nract.TEXT_SIMPLU1.TabStop = .F. + This.Clb_dataact.dezactiveaza() + This.Clb_data_scadenta.dezactiveaza() + This.ct_livrare.Ct_clb_delegat.do_blocheaza_real() + This.ct_livrare.Ct_clb_masina.do_blocheaza_real() + This.ct_livrare.Ct_clb_agent.do_blocheaza_real() + This.ct_livrare.clb_adresa_facturare.do_blocheaza_real() + This.ct_livrare.Clb_dataora_exp.Text_simplu1.ReadOnly = .T. + This.ct_livrare.Clb_dataora_exp.Text_simplu1.TabStop = .F. + This.ct_document.Ed_tx_aditional._EDBASE1.ReadOnly = .T. + This.ct_document.ck_listare_detaliata.Enabled = .F. + If This.do_exista_obiect('cboTipFactura', This.ct_document) + This.ct_document.cboTipFactura.Enabled = .F. + Endif + ENDPROC + + PROCEDURE deblocheaza_antet + If This.do_exista_obiect('Clb_serie_act1') + This.Clb_serie_act1.TEXT_SIMPLU1.ReadOnly = .F. + This.Clb_serie_act1.TEXT_SIMPLU1.TabStop = .T. + This.Clb_serie_act1._CBBASE1.Enabled = .T. + Endif + This.Clb_nract.TEXT_SIMPLU1.ReadOnly = .F. + This.Clb_nract.TEXT_SIMPLU1.TabStop = .T. + This.Clb_dataact.reactiveaza() + This.Clb_data_scadenta.reactiveaza() + This.ct_livrare.Ct_clb_delegat.do_reactiveaza_real() + This.ct_livrare.Ct_clb_masina.do_reactiveaza_real() + This.ct_livrare.Ct_clb_agent.do_reactiveaza_real() + This.ct_livrare.clb_adresa_facturare.do_reactiveaza_real() + This.ct_livrare.Clb_dataora_exp.Text_simplu1.ReadOnly = .F. + This.ct_livrare.Clb_dataora_exp.Text_simplu1.TabStop = .T. + This.ct_document.Ed_tx_aditional._EDBASE1.ReadOnly = .F. + This.ct_document.ck_listare_detaliata.Enabled = .T. + If This.do_exista_obiect('cboTipFactura', This.ct_document) + This.ct_document.cboTipFactura.Enabled = .T. + Endif + ENDPROC + + PROCEDURE Destroy + If Used('v_nom_casa') + Use In v_nom_casa + Endif + ENDPROC + + PROCEDURE do_activeaza + Lparameters tcPrefix, tnTip + Local lcNat, lcVal + lcNat = 'Thisform.' + tcPrefix + '_nat' + lcVal = 'Thisform.' + tcPrefix + '_val' + Do Case + Case tnTip = 1 + &lcNat..ReadOnly = .F. + &lcNat..TabStop = .T. + Case tnTip = 2 + If This.do_exista_obiect(tcPrefix + '_val') + &lcVal..ReadOnly = .F. + &lcVal..TabStop = .T. + Endif + Otherwise + &lcNat..ReadOnly = .F. + &lcNat..TabStop = .T. + If This.do_exista_obiect(tcPrefix + '_val') + &lcVal..ReadOnly = .F. + &lcVal..TabStop = .T. + Endif + Endcase + ENDPROC + + PROCEDURE do_actualizeaza_lbval + Lparameters tcPrefix, tcNumeVal + Local lcLbVal, lcTxVal + lcLbVal = 'lb_' + tcPrefix + '_val' + lcTxVal = 'tx_' + tcPrefix + '_val' + If Empty(tcNumeVal) + If This.do_exista_obiect(lcLbVal) + This.RemoveObject(lcLbVal) + Endif + If This.do_exista_obiect(lcTxVal) + This.RemoveObject(lcTxVal) + Endif + Else + This.&lcLbVal..Caption = Alltrim(tcNumeVal) + Endif + ENDPROC + + PROCEDURE do_actualizeaza_vizibilitate_curs + Lparameters tlForteazaVizibil + Local lnLinii, lVizibil, lnAreaAnterioara + + If !Thisform.do_exista_obiect('clb_zi_curs') + Return + Endif + + If tlForteazaVizibil + lVizibil = .T. + Else + If poDate.in_valuta = 1 + lVizibil = .T. + Else + lnLinii = 0 + If Used('crsfactura') + lnAreaAnterioara = Select() + Select Count(*) From crsfactura Where tip_valuta = 1 Into Array laCntCurs + lnLinii = laCntCurs(1) + Select (lnAreaAnterioara) + Endif + lVizibil = lnLinii > 0 + Endif + Endif + + Thisform.clb_zi_curs.Visible = lVizibil + ENDPROC + PROCEDURE do_adauga SELECT crsFactura APPEND BLANK @@ -17142,12 +18703,11 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" pnProcentDiscountMem = Thisform.nproc_disc_mem Endif Local lcCursor, loGrid + loGrid = Thisform.grd_factura If tlContract lcCursor = [crsarticole1] - loGrid = Thisform.grd_contracte Else lcCursor = [crsarticole] - loGrid = Thisform.grd_articole Endif If Used(lcCursor) And Reccount(lcCursor) > 0 @@ -17173,17 +18733,18 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" gnButon = 2 - If Thisform.do_verifica_articol(tlContract, lnCantitate) + If Thisform.do_verifica_articol(poArticol, tlContract, lnCantitate) Do Case Case (poArticol.gestionabil = 0 Or gnScadereStoc = 0 Or poDate.tip = 45) && 45 = ROARESTAURANT + * initializez frm_articol_factura, sa se initializeze toate calculele si daca nu arat formularul (adaugare toate articolele) + ofrmadarticol = Createobject("frm_articol_factura", lnCantitate, tlImplicit) If !tlImplicit - ofrmadarticol = Createobject("frm_articol_factura", lnCantitate, tlImplicit) ofrmadarticol.Show(1) - Release ofrmadarticol Else poArticol = calculeaza_totaluri(poArticol) gnButon = 1 ENDIF + Release ofrmadarticol OTHERWISE lnListaIdOld = poDate.listaid @@ -17254,8 +18815,8 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" pretftva, valftva, valtva, valctva, valdiscountftva, valdiscounttva, valdiscountctva, Pretctva, ; valdiminuatftva, valdiminuattva, valdiminuatctva, ; vvalftva, vvaltva, vvalctva, vvaldiscountftva, vvaldiscounttva, vvaldiscountctva, ; - vvaldiminuatftva, vvaldiminuattva, vvaldiminuatctva, id_c, serie, explicatie, ; - id_valuta, gestionabil, tip_valuta, id_jtva_coloana, id_lucrare_rez, id_part_rez, pretv_orig, pretd, id_valuta_d, id_ctr, opt_facturare, nume_val MEMO + vvaldiminuatftva, vvaldiminuattva, vvaldiminuatctva, id_c, lot, serie, explicatie, ; + id_valuta, gestionabil, tip_valuta, id_jtva_coloana, taxcode, id_lucrare_rez, id_part_rez, pretv_orig, pretd, id_valuta_d, id_ctr, opt_facturare, nume_val MEMO Replace id_temp With Recno(), codmat With Nvl(poArticol.codmat, Space(50)), codmatf With Nvl(poArticol.codmatf, Space(50)), ; um With Nvl(poArticol.um, [ ]), Curs With Nvl(poArticol.Curs, 0), multiplicator With Nvl(poArticol.multiplicator, 1), ; @@ -17283,6 +18844,7 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Scan poArticol.pret_achizitie = Pret poArticol.serie = Nvl(serie, []) + poArticol.lot = Nvl(lot, []) poArticol.id_gestiune = id_gestiune poArticol.Cont = Alltrim(Cont) poArticol.cantitate = cantitate @@ -17298,8 +18860,8 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Gather Name poArticol Fields Like pret_achizitie, denumire, cantitate, id_articol, Id_Pol, ; Cont, id_gestiune, Proc_Tvav, pretftva, Pretctva, ; - id_c, serie, explicatie, ; - id_valuta, gestionabil, tip_valuta, id_jtva_coloana, id_lucrare_rez, id_part_rez, pretv_orig, pretd, id_valuta_d, nume_val, id_ctr, opt_facturare MEMO + id_c, lot, serie, explicatie, ; + id_valuta, gestionabil, tip_valuta, id_jtva_coloana, taxcode, id_lucrare_rez, id_part_rez, pretv_orig, pretd, id_valuta_d, nume_val, id_ctr, opt_facturare MEMO Replace id_temp With Recno(), codmat With Nvl(poArticol.codmat, Space(50)), ; codbare With Nvl(poArticol.codbare, Space(50)), ; @@ -17359,31 +18921,9 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Thisform.do_calculeaza_totaluri() - If poArticol.opt_facturare = 0 - Do Case - Case !Empty(Thisform.txtCodmat.Value) - Thisform.txtCodmat.SetFocus() - Case !Empty(Thisform.txtArticole.Value) - Thisform.txtArticole.SetFocus() - Otherwise - Thisform.grd_articole.SetFocus() - Endcase - Else - Thisform.grd_contracte.SetFocus() - Endif + Thisform.grd_factura.SetFocus() Else - If poArticol.opt_facturare = 0 - Do Case - Case !Empty(Thisform.txtCodmat.Value) - Thisform.txtCodmat.SetFocus() - Case !Empty(Thisform.txtArticole.Value) - Thisform.txtArticole.SetFocus() - Otherwise - Thisform.grd_articole.SetFocus() - Endcase - Else - Thisform.grd_contracte.SetFocus() - Endif + Thisform.grd_factura.SetFocus() Endif Release poArticol @@ -17392,6 +18932,87 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" ENDPROC + PROCEDURE do_adauga_articol_cautat + Lparameters toArticol, tnCantitate + + Thisform.do_initializeaza_articol(@toArticol) + + && retur (8,9) sau tip-41: cautarea in linie deleaga la calea veche do_adauga_articol + If Inlist(poDate.tip, 8, 9, 41) + If Used('crsarticole') + Select crsarticole + Locate For id_articol = toArticol.id_articol + Endif + If Used('crsarticole') And Found('crsarticole') + Return Thisform.do_adauga_articol(.T.) + Endif + && articol nevandut pe documentul returnat: refuz, fara Gather cu id_gestiune sentinela + If Inlist(poDate.tip, 8, 9) + amessagebox("Articolul nu a fost vandut pe documentul returnat si nu poate fi adaugat! Selectati un articol existent pe document.",0+48,"Atentie") + Return .F. + Endif + Endif + + If Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47) And !Thisform.do_verifica_articol(toArticol, .F., tnCantitate) + save_grid_tag(Thisform.grd_factura) + Select crsfactura + Select * From crsfactura Where id_temp <> 0 Order By id_temp Into Cursor crsfactura Readwrite + restore_grid_tag(Thisform.grd_factura) + Return .F. + Endif + + If Type('toArticol.id_c') = 'U' + AddProperty(toArticol, 'id_c', 0) + Endif + If !Isnull(toArticol.proc_tvav) + Select jtva_coloane + Set Filter To cota_tva = toArticol.proc_tvav * 100 - 100 + If Nvl(toArticol.proc_tvav, 0) * 100 - 100 = 0 + Locate For id_jtva_coloana = 8 + If !Found() + Go Top + Endif + Else + Go Top + Endif + toArticol.id_jtva_coloana = id_jtva_coloana + Else + Select jtva_coloane + Set Filter To + lnProcTVAStandard = GetProcTvaStandard() + LOCATE FOR cota_tva = m.lnProcTVAStandard + IF !FOUND() + Go TOP + ENDIF + toArticol.proc_tvav = (cota_tva + 100)/100 + toArticol.id_jtva_coloana = id_jtva_coloana + Endif + If Type('toArticol.taxcode') = 'U' + AddProperty(toArticol, 'taxcode', 0) + Endif + toArticol.taxcode = GetTaxCode(m.gnAn, m.gnLuna, poDate.dataact, toArticol.id_jtva_coloana, .F.) + toArticol = calculeaza_totaluri(toArticol) + + Select crsfactura + Gather Name toArticol Fields Like pret_achizitie, denumire, cantitate, id_articol, Id_Pol, Cont, id_gestiune, Proc_Tvav, ; + pretftva, valftva, valtva, valctva, valdiscountftva, valdiscounttva, valdiscountctva, Pretctva, ; + valdiminuatftva, valdiminuattva, valdiminuatctva, ; + vvalftva, vvaltva, vvalctva, vvaldiscountftva, vvaldiscounttva, vvaldiscountctva, ; + vvaldiminuatftva, vvaldiminuattva, vvaldiminuatctva, id_c, lot, serie, explicatie, ; + id_valuta, gestionabil, tip_valuta, id_jtva_coloana, taxcode, id_lucrare_rez, id_part_rez, pretv_orig, pretd, id_valuta_d, id_ctr, opt_facturare, nume_val MEMO + Replace id_temp With Recno(), codmat With Nvl(toArticol.codmat, Space(50)), codmatf With Nvl(toArticol.codmatf, Space(50)), ; + um With Nvl(toArticol.um, [ ]), Curs With Nvl(toArticol.Curs, 0), multiplicator With Nvl(toArticol.multiplicator, 1), ; + cu_tva With toArticol.preturi_cu_tva, codbare With Nvl(toArticol.codbare, Space(50)), ; + vpretftva With Nvl(toArticol.pretftva_val, 0), vpretctva With Nvl(toArticol.pretctva_val, 0), ; + discountftva With toArticol.discount_unitar, discountctva With toArticol.discount_unitar_ctva, ; + vdiscountftva With Nvl(toArticol.discount_unitar_val, 0), vdiscountctva With Nvl(toArticol.discount_unitar_ctva_val, 0) + If toArticol.Proc_Tvav > Thisform.nproc_tvav + Thisform.nproc_tvav = toArticol.Proc_Tvav + Endif + Thisform.do_calculeaza_totaluri() + Return .T. + ENDPROC + PROCEDURE do_adauga_rata Private poArticol Select crsarticole1 @@ -17413,7 +19034,7 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Append Blank Gather Name poArticol Fields Like pret_achizitie,cantitate,Id_Pol,Cont,id_gestiune,Proc_Tvav,; serie,id_valuta,gestionabil,tip_valuta,id_jtva_coloana,id_lucrare_rez,id_part_rez,pretv_orig,pretd,id_valuta_d,id_rata,; - data_rata,data_scadenta,nr_rata,id_ctr,opt_facturare,nume_val MEMO && modificare ROAFACTURARE v 2.0.77 : nume_val + data_rata,data_scadenta,nr_rata,id_ctr,opt_facturare,nume_val,taxcode MEMO && modificare ROAFACTURARE v 2.0.77 : nume_val Replace id_articol With Nvl(poArticol.id_articol,0),id_temp With Recno(),; codmat With Nvl(poArticol.codmat,Space(50)),codmatf With Nvl(poArticol.codmatf,Space(50)),; @@ -17475,19 +19096,20 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" PROCEDURE do_adauga_tot If Used('crsarticole') And Reccount('crsarticole')>0 - Local lnNrInregistrare,lnRaspuns,lcArticol + Local lnNrInregistrare,lnRaspuns,lcArticol,llGestionabil Select crsarticole Scan lnNrInregistrare = Recno() lnRaspuns = 7 lcArticol = Alltrim(denumire) + llGestionabil = (Type('crsArticole.gestionabil') = 'N' And Nvl(crsarticole.gestionabil, 0) = 1) Do While lnRaspuns = 7 - If cantitate > 0 + If (cantitate > 0 And m.llGestionabil) Or (!m.llGestionabil) && adaug si articolele cu cantitate negativa (ex: articolul de discount) Thisform.do_adauga_articol(.T.) Endif Select crsarticole Go lnNrInregistrare - If cantitate = 0 + If cantitate = 0 Or !m.llGestionabil lnRaspuns = 6 Else lnRaspuns = aMessageBox("Nu ati selectat toata cantitatea pentru articolul "+Alltrim(lcArticol)+". Doriti sa treceti la urmatorul?",4+32,"Confirmare cantitate") @@ -17496,6 +19118,21 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Select crsarticole Go lnNrInregistrare Endscan + Local lcJtvaLipsa, lnRecFactura, lnSelFactura + lcJtvaLipsa = [] + lnSelFactura = Select() + Select crsfactura + lnRecFactura = Recno() + Scan For Empty(Nvl(id_jtva_coloana, 0)) And !Isnull(proc_tvav) + lcJtvaLipsa = m.lcJtvaLipsa + Chr(13) + Alltrim(denumire) + [ - cota ] + Alltrim(Str(proc_tvav * 100 - 100, 6, 2)) + [%] + Endscan + If Between(m.lnRecFactura, 1, Reccount()) + Go m.lnRecFactura + Endif + Select (m.lnSelFactura) + If !Empty(m.lcJtvaLipsa) + amessagebox("Nu exista explicatie de TVA in perioada de lucru pentru " + Alltrim(Str(Occurs(Chr(13), m.lcJtvaLipsa))) + " linii:" + m.lcJtvaLipsa, 48, "Atentie") + Endif Else amessagebox("Nu exista articole de adaugat!",48,"Atentie") Endif @@ -17667,6 +19304,44 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" ENDPROC + PROCEDURE do_aloca_nr_bon + Lparameters tcActiune + Local lnNumarBon + Store -1 To lnNumarBon + + If Empty(Thisform.nnrbon) Or Upper(tcActiune)='UPDATE' + poGeneratorNumere.creeaza_cursor_serii(3) + lnNumarBon = poGeneratorNumere.aloca_numar(3) + If lnNumarBon <> -1 + Thisform.ct_incasare.clb_nrchit.text_simplu1.Value = lnNumarBon + Thisform.nnrbon = lnNumarBon + poDate.nr_incasare = Thisform.nnrbon + Endif + Else + poDate.nr_incasare = Thisform.nnrbon + ENDIF + Thisform.ct_incasare.clb_nrchit.text_simplu1.Refresh() + ENDPROC + + PROCEDURE do_aloca_nr_pos + Lparameters tcActiune + Local lnNumarBon + Store -1 To lnNumarBon + + If Empty(Thisform.nnrbon) Or Upper(tcActiune)='UPDATE' + poGeneratorNumere.creeaza_cursor_serii(26) + lnNumarBon = poGeneratorNumere.aloca_numar(26) + If lnNumarBon <> -1 + Thisform.ct_incasare.clb_nrchit.text_simplu1.Value = lnNumarBon + Thisform.nnrbon = lnNumarBon + poDate.nr_incasare = Thisform.nnrbon + Endif + Else + poDate.nr_incasare = Thisform.nnrbon + ENDIF + Thisform.ct_incasare.clb_nrchit.text_simplu1.Refresh() + ENDPROC + PROCEDURE do_calculeaza_discount Lparameters tnProcent If tnProcent = 0 @@ -17733,9 +19408,9 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Thisform.ntotalron = lnTotal - Round(Thisform.ndiscfactron * Thisform.nproc_tvav, gnPc) *!* modificare v 2.0.46 ^ If !Empty(Thisform.ndiscfactron) - Thisform.clb_discount.procent.Value = Round(Thisform.ndiscfactron * 100 / Thisform.nbazafdiscount,2) + Thisform.tx_disc_factura_procent.Value = Round(Thisform.ndiscfactron * 100 / Thisform.nbazafdiscount,2) Else - Thisform.clb_discount.procent.Value = 0 + Thisform.tx_disc_factura_procent.Value = 0 Endif Else *!* modificare v 2.0.46 @@ -17784,27 +19459,240 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" If !Empty(Thisform.ndiscfactval) Thisform.ndiscfactron = Round(Thisform.ndiscfactval * poDate.Curs/poDate.multiplicator,gnPc) - Thisform.clb_discount.procent.Value = Round(Thisform.ndiscfactval * 100 / Thisform.nbazafdiscountval,2) + Thisform.tx_disc_factura_procent.Value = Round(Thisform.ndiscfactval * 100 / Thisform.nbazafdiscountval,2) Else - Thisform.clb_discount.procent.Value = 0 + Thisform.tx_disc_factura_procent.Value = 0 Endif Endif If tlModificareDiscount - Thisform.clb_discount.procent.Refresh() + Thisform.tx_disc_factura_procent.Refresh() Else - Thisform.clb_discount.Refresh() + Thisform.tx_disc_factura_nat.Refresh() + If Thisform.do_exista_obiect('tx_disc_factura_val') + Thisform.tx_disc_factura_val.Refresh() + Endif + Endif + Thisform.tx_disc_articole_nat.Refresh() + If Thisform.do_exista_obiect('tx_disc_articole_val') + Thisform.tx_disc_articole_val.Refresh() + Endif + Thisform.tx_total_baza_nat.Refresh() + If Thisform.do_exista_obiect('tx_total_baza_val') + Thisform.tx_total_baza_val.Refresh() + Endif + Thisform.tx_total_tva_nat.Refresh() + If Thisform.do_exista_obiect('tx_total_tva_val') + Thisform.tx_total_tva_val.Refresh() + Endif + Thisform.tx_total_factura_nat.Refresh() + If Thisform.do_exista_obiect('tx_total_factura_val') + Thisform.tx_total_factura_val.Refresh() Endif - Thisform.clb_discount_articole.Refresh() - Thisform.clb_total_baza.Refresh() - Thisform.clb_total_tva.Refresh() - Thisform.clb_total_factura.Refresh() If Used('crstotalurifact') Use In crstotalurifact Endif + Thisform.do_actualizeaza_vizibilitate_curs() + + ENDPROC + + PROCEDURE do_cauta_adresa + Local locauta + locauta = caut_adresa(poDate.id_client) + If Isnull(locauta) + Return + Endif + If !Empty(locauta.id_adresa) + poDate.adresa_facturare = Alltrim(locauta.adresa) + poDate.id_facturare = locauta.id_adresa + Thisform.ct_livrare.clb_adresa_facturare.Refresh() + Thisform.ct_livrare.clb_dataora_exp.SetFocus() + Else + poDate.adresa_facturare = [] + poDate.id_facturare = Null + Endif + ENDPROC + + PROCEDURE do_cauta_agent + Local loCauta + loCauta = CautPartenerContabilitate(GetHash([cTitlu=>Agenti??cTipuriParteneri=>]+Alltrim(Str(gnIdTipAgenti))+[??lAdaugCorespondente=>1])) + If !Empty(Nvl(loCauta.id_part,0)) And !Empty(loCauta.denumire) + poDate.id_agent = loCauta.id_part + poDate.nume_agent = Alltrim(loCauta.denumire) + Thisform.ct_livrare.ct_clb_agent.Refresh() + If poDate.eProforma = 0 + Thisform.ct_livrare.ct_clb_delegat.SetFocus() + Else + Thisform.ct_document.ed_tx_aditional.SetFocus() + Endif + Else + poDate.id_agent = Null + poDate.nume_agent = [] + Endif + ENDPROC + + PROCEDURE do_cauta_altele + Return This.oAntet.do_cauta_altele(This) + ENDPROC + + PROCEDURE do_cauta_avize + Return This.oAntet.do_cauta_avize(This) + ENDPROC + + PROCEDURE do_cauta_client + Return This.oAntet.do_cauta_client(This) + ENDPROC + + PROCEDURE do_cauta_comanda + Return This.oAntet.do_cauta_comanda(This) + ENDPROC + + PROCEDURE do_cauta_contract + Return This.oAntet.do_cauta_contract(This) + ENDPROC + + PROCEDURE do_cauta_delegat + Local loCauta + If Inlist(poDate.tip,23,25,27,30,41,-6) + loCauta = caut_delegati() + Else + loCauta = caut_delegati_hash(poDate.id_client,.T.) + Endif + If !Empty(loCauta.id_responsabil) + poDate.id_delegat = loCauta.id_responsabil + poDate.nume_delegat = Alltrim(loCauta.nume) + poDate.BIdelegat = loCauta.bi + poDate.CNPdelegat = loCauta.cnp + Thisform.ct_livrare.ct_clb_delegat.Refresh() + Thisform.ct_livrare.ct_clb_masina.SetFocus() + Else + poDate.id_delegat = Null + poDate.nume_delegat = [] + poDate.BIdelegat = [] + poDate.CNPdelegat = [] + Endif + ENDPROC + + PROCEDURE do_cauta_factura + Return This.oAntet.do_cauta_factura(This) + ENDPROC + + PROCEDURE do_cauta_facturi + Return This.oAntet.do_cauta_facturi(This) + ENDPROC + + PROCEDURE do_cauta_fdoc + Return This.oAntet.do_cauta_fdoc(This) + ENDPROC + + PROCEDURE do_cauta_gestiune_dest + Return This.oAntet.do_cauta_gestiune_dest(This) + ENDPROC + + PROCEDURE do_cauta_gestiune_init + Return This.oAntet.do_cauta_gestiune_init(This) + ENDPROC + + PROCEDURE do_cauta_locatii + Return This.oAntet.do_cauta_locatii(This) + ENDPROC + + PROCEDURE do_cauta_lucrare + Return This.oAntet.do_cauta_lucrare(This) + ENDPROC + + PROCEDURE do_cauta_masina + Local locauta + locauta = caut_masina_gs() + If !Empty(locauta.id_masina) + poDate.nrinmat = Alltrim(locauta.nrinmat) + poDate.id_masina = locauta.id_masina + Thisform.ct_livrare.ct_clb_masina.Refresh() + Thisform.ct_document.ed_tx_aditional.SetFocus() + Else + poDate.nrinmat = [] + poDate.id_masina = Null + Endif + ENDPROC + + PROCEDURE do_cauta_politica + Return This.oAntet.do_cauta_politica(This) + ENDPROC + + PROCEDURE do_cauta_responsabil + Return This.oAntet.do_cauta_responsabil(This) + ENDPROC + + PROCEDURE do_cauta_sectie + Return This.oAntet.do_cauta_sectie(This) + ENDPROC + + PROCEDURE do_cauta_valuta + Return This.oAntet.do_cauta_valuta(This) + ENDPROC + + PROCEDURE do_cauta_venchelt + Return This.oAntet.do_cauta_venchelt(This) + ENDPROC + + PROCEDURE do_comuta_alte_date + Local lnHGridAmbele + This.lalte_date_deschis = (This.chk_alte_date.Value = 1) + If This.lalte_date_deschis And This.do_exista_obiect('chk_incasare') And This.chk_incasare.Value = 1 + lnHGridAmbele = This.Height - 103 - This.oasezareoffset.Item('h_linie_casete') - This.oasezareoffset.Item('h_ct_incasare') - This.oasezareoffset.Item('h_stiva_alte') - 16 - This.grd_factura.Top + * sub pragul la care ambele deschise clampeaza gridul, acordeoanele devin mutual exclusive + If lnHGridAmbele < 60 + This.chk_incasare.Value = 0 + This.lincasare_deschis = .F. + Endif + Endif + This.aseaza_alte_date() + ENDPROC + + PROCEDURE do_comuta_antet + If !This.lantet_deblocat + This.deblocheaza_antet() + This.lantet_deblocat = .T. + With This.but_modifica_antet + .cpicturedown = "save_jos.bmp" + .cpictureup = "save_sus.bmp" + .Picture = "save_sus.bmp" + .ToolTipText = "Salvare antet" + .Refresh() + Endwith + Else + If ScrieAntetEditare(poDate, poSnapshotEditare) + This.blocheaza_antet() + This.lantet_deblocat = .F. + poSnapshotEditare = CreeazaSnapshotEditare(poDate, This.ndiscfactron, This.ndiscfactval, ; + poSnapshotEditare.id_vanzare, poSnapshotEditare.id_fact, poSnapshotEditare.cod, poSnapshotEditare.an, poSnapshotEditare.luna) + With This.but_modifica_antet + .cpicturedown = "modific_jos.bmp" + .cpictureup = "modific_sus.bmp" + .Picture = "modific_sus.bmp" + .ToolTipText = "Modificare antet" + .Refresh() + Endwith + Endif + Endif + ENDPROC + + PROCEDURE do_comuta_incasare + Local lnHGridAmbele + This.lincasare_deschis = (This.chk_incasare.Value = 1) + If This.lincasare_deschis And This.chk_alte_date.Value = 1 + lnHGridAmbele = This.Height - 103 - This.oasezareoffset.Item('h_linie_casete') - This.oasezareoffset.Item('h_ct_incasare') - This.oasezareoffset.Item('h_stiva_alte') - 16 - This.grd_factura.Top + * sub pragul la care ambele deschise clampeaza gridul, acordeoanele devin mutual exclusive + If lnHGridAmbele < 60 + This.chk_alte_date.Value = 0 + This.lalte_date_deschis = .F. + This.aseaza_alte_date() + Endif + Endif + This.actualizeaza_tipincasare() ENDPROC PROCEDURE do_creeaza_filtru @@ -17830,6 +19718,78 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Return lcFiltru ENDPROC + PROCEDURE do_deschide_cursuri + Local loCursuri + loCursuri = Createobject('frm_cursuri_valutare', 'crscursuri', poDate.zi_curs, poDate.tip) + If Vartype(loCursuri) = 'O' + loCursuri.Show(1) + Endif + ENDPROC + + PROCEDURE do_dezactiveaza + Lparameters tcPrefix, tnTip + Local lcNat, lcVal + lcNat = 'Thisform.' + tcPrefix + '_nat' + lcVal = 'Thisform.' + tcPrefix + '_val' + Do Case + Case tnTip = 1 + &lcNat..ReadOnly = .T. + &lcNat..TabStop = .F. + Case tnTip = 2 + If This.do_exista_obiect(tcPrefix + '_val') + &lcVal..ReadOnly = .T. + &lcVal..TabStop = .F. + Endif + Otherwise + &lcNat..ReadOnly = .T. + &lcNat..TabStop = .F. + If This.do_exista_obiect(tcPrefix + '_val') + &lcVal..ReadOnly = .T. + &lcVal..TabStop = .F. + Endif + Endcase + ENDPROC + + PROCEDURE do_exista_obiect + Lparameters tcNume, toContainer + Local i, loParinte + loParinte = Iif(Vartype(m.toContainer) = 'O', m.toContainer, This) + For i = 1 To loParinte.Objects.Count + If Upper(loParinte.Objects(i).Name) == Upper(m.tcNume) + Return .T. + Endif + Endfor + Return .F. + ENDPROC + + PROCEDURE do_incarca_articole + Local loRezultat, llCautareInLinie + If !This.oAntet.valideaza_antet(This) + Return .F. + Endif + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + llCautareInLinie = Inlist(poDate.tip, 1, 22, 5, 29, 7, 10, 45, 41) && lista de preturi: fara incarcare in masa + If !llCautareInLinie + loRezultat = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere) + If loRezultat.lForteazaCursVizibil + Thisform.do_actualizeaza_vizibilitate_curs(.T.) + Endif + If loRezultat.nSucces < 0 Or !loRezultat.lArticole + Return .F. + Endif + Endif + This.grd_factura.RecordSource = '' + This.grd_factura.RecordSource = 'crsfactura' + If Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47, 8, 9) && surse cu cantitati fixate de documentul sursa + Thisform.do_adauga_tot() + Endif + This.lArticoleIncarcate = .T. + This.but_incarca_articole.Visible = .F. + This.but_cursuri.Enabled = Used('crscursuri') And Reccount('crscursuri') > 0 + This.Refresh() + Return .T. + ENDPROC + PROCEDURE do_initializeaza_articol Lparameters toArticol toArticol.um = Nvl(toArticol.um,'') @@ -17896,6 +19856,26 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" If Type('toArticol.id_jtva_coloana') = 'U' AddProperty(toArticol,'id_jtva_coloana',0) Endif + If Empty(Nvl(toArticol.id_jtva_coloana,0)) And !Isnull(toArticol.proc_tvav) + Local lnSelJtva, lnCotaJtva, lnRecJtva + lnSelJtva = Select() + lnCotaJtva = toArticol.proc_tvav * 100 - 100 + Select jtva_coloane + lnRecJtva = Recno() + * filtrul lasat de frm_articol_factura trimite la un poArticol care nu mai exista + Set Filter To + Locate For cota_tva = m.lnCotaJtva + If Found() + toArticol.id_jtva_coloana = jtva_coloane.id_jtva_coloana + Endif + If Between(m.lnRecJtva, 1, Reccount()) + Go m.lnRecJtva + Endif + Select (lnSelJtva) + Endif + If Type('toArticol.taxcode') = 'U' + AddProperty(toArticol,'taxcode',0) + Endif *!* modificare v 2.0.67 *!* AddProperty(toArticol,'explicatie',Iif(poDate.tip=7,[INVOICE ] + poDate.descriere,'')) If Type('toArticol.explicatie') = 'U' @@ -17906,6 +19886,11 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Else toArticol.serie = Nvl(toArticol.serie,[]) Endif + If Type('toArticol.lot') = 'U' + AddProperty(toArticol,'lot','') + Else + toArticol.lot = Nvl(toArticol.lot,[]) + Endif If Type('toArticol.opt_facturare') = 'U' AddProperty(toArticol,'opt_facturare',0) Endif @@ -17949,6 +19934,38 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" *!* modificare v 2.0.67 ^ ENDPROC + PROCEDURE do_modifica + If !Empty(Nvl(poDate.id_delegat,0)) + loRec = nom_parteneri_modifica(poDate.id_delegat) + If !Isnull(loRec) + poDate.nume_delegat = Alltrim(loRec.denumire) + poDate.BIdelegat = loRec.reg_comert + poDate.CNPdelegat = loRec.cod_fiscal + Thisform.Refresh() + Endif + Endif + ENDPROC + + PROCEDURE do_modifica_bon + Private pniesire + pniesire=0 + DO viz_config_serii_complet WITH 3 IN oserii_numere.prg + If pniesire=1 + poGeneratorNumere.dezaloca_numar(3) + Thisform.do_aloca_nr_bon([UPDATE]) + Endif + ENDPROC + + PROCEDURE do_modifica_pos + Private pniesire + pniesire=0 + DO viz_config_serii_complet WITH 26 IN oserii_numere.prg + If pniesire=1 + poGeneratorNumere.dezaloca_numar(26) + Thisform.do_aloca_nr_pos([UPDATE]) + Endif + ENDPROC + PROCEDURE do_renunt *!* modificare 19.01.2007 DODEFAULT() @@ -18000,8 +20017,35 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Thisform.do_adauga_articol(.F., .F., .T.) ENDPROC + PROCEDURE do_schimba_tipdoc + LOCAL lnIdTipDoc + + && liniile de proforma s-au adaugat fara verificare de stoc; nu pot deveni document real + If poDate.eProforma = 1 And Upper(This.clb_fdoc.cboFdoc.Value) <> [PROFORMA] And Reccount('crsfactura') > 0 + amessagebox([Nu puteti schimba tipul documentului dupa ce ati adaugat articole pe proforma. ] + ; + [Stergeti articolele si reluati.], 48, [Atentie]) + This.clb_fdoc.cboFdoc.Value = [PROFORMA] + Return + Endif + + lnIdTipDoc = This.oAntet.alege_tipdoc(this.clb_fdoc.cboFdoc.Value) + + IF !This.oAntet.schimba_tipdoc(m.lnIdTipDoc) + RETURN + ENDIF + + *If Inlist(poDate.rezultat_serii,1,3) + THISFORM.clb_serie_act1.nid_tipdoc = m.lnIdTipDoc + Thisform.clb_serie_act1.do_initializeaza(poDate.rezultat_serii) + *Endif + + thisform.clb_nract.text_simplu1.Refresh() + thisform.clb_serie_act1.Refresh() + This.clb_serie_act1._cbbase1.LostFocus() + ENDPROC + PROCEDURE do_scrie_articole - Local llReturn,lcSql,lnSucces + Local llReturn,lcSql,lnSucces,lnIdSetVechi,lnIdFdocVechi,ldDataIregVechi llReturn = .T. *!* pentru lnNrInregistrari > 1 trebuie am mai multe variabile : poArt1,poArt2,poArt3 ca sa pot concatena lcSql *!* lnNrInregistrari = 1 && trimite sirul catre server o data pentru lnNrInregistrari @@ -18009,6 +20053,46 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" If Thisform.do_deschide_tranzactie() + * Regenerare: documentul vechi se sterge in tranzactia deschisa mai sus + If Type('plRegenerareEditare') = 'L' And plRegenerareEditare + lnIdSetVechi = 0 + lnIdFdocVechi = 0 + ldDataIregVechi = {} + If !StergeDocumentFacturare(poSnapshotEditare.id_vanzare, poSnapshotEditare.cod, ; + poSnapshotEditare.an, poSnapshotEditare.luna, gnIdUtil, @lnIdSetVechi, ; + @lnIdFdocVechi, @ldDataIregVechi) + amessagebox('Documentul vechi nu a putut fi sters. Nimic nu a fost scris.',0+16,'Eroare') + Thisform.do_inchide_tranzactie(2) + Return .F. + Endif + * atasamentele documentului vechi nu se remigreaza: reemiterea porneste curat + lcSql = [update ] + gcS + [.atasamente_vanzari set sters = 1, id_utils = ] + Alltrim(Str(gnIdUtil,14,0)) + ; + [, dataoras = sysdate where sters = 0 and id_vanzare = ] + Alltrim(Str(poSnapshotEditare.id_vanzare,14,0)) + lnSucces = goExecutor.oExecute(lcSql) + If lnSucces < 0 + amessagebox('Atasamentele documentului vechi nu au putut fi sterse. Nimic nu a fost scris.',0+16,'Eroare') + Thisform.do_inchide_tranzactie(2) + Return .F. + Endif + If !Empty(m.lnIdSetVechi) + poDate.id_set = m.lnIdSetVechi + Endif + If !Empty(m.lnIdFdocVechi) + poDate.id_fdoc = m.lnIdFdocVechi + Endif + * dataireg da perioada contabila a documentului nou: se pastreaza cea a notei vechi + poDate.dataireg = Iif(Empty(m.ldDataIregVechi), poDate.dataact, m.ldDataIregVechi) + poDate.listaid = CalculeazaListaidReemitere(poDate) + * documentul reemis isi pastreaza ID_FACT-ul; fara id_fact vechi nu exista rand in DOCUMENTE + If !Empty(Nvl(poSnapshotEditare.id_fact,0)) + If !ForteazaIdFactReemitere(poSnapshotEditare.id_fact, poDate.nract, poDate.serie_act) + amessagebox('Identitatea documentului vechi nu a putut fi impusa. Nimic nu a fost scris.',0+16,'Eroare') + Thisform.do_inchide_tranzactie(2) + Return .F. + Endif + Endif + Endif + * Factura de vanzare pe care am adaugat articole retur IF !EMPTY(thisform.cListaIdArticoleRetur) poDate.listaid = thisform.cListaIdArticoleRetur @@ -18016,7 +20100,7 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" lcSql = [pack_facturare.initializeaza_date_factura(] + ; [to_date('] + ALLTRIM(NVL(Dtoc(poDate.dataireg,2),[])) + [','YYYYMMDD'),] + ; - Nvl(Alltrim(Str(poDate.id_fdoc)),[NULL]) + [,to_date('] + ALLTRIM(NVL(Dtoc(poDate.dataact,2),[])) + [','YYYYMMDD'),] + ; + Iif(Isnull(poDate.id_fdoc),[NULL],Alltrim(Str(poDate.id_fdoc))) + [,to_date('] + ALLTRIM(NVL(Dtoc(poDate.dataact,2),[])) + [','YYYYMMDD'),] + ; [to_date('] + ALLTRIM(NVL(Dtoc(poDate.datascad,2),[])) + [','YYYYMMDD'),'] + ALLTRIM(Nvl(poDate.serie_act,[])) + [',] + ; Alltrim(Str(poDate.nract,14,0)) + [,] + ; Iif(Isnull(poDate.id_client),[NULL],Alltrim(Str(poDate.id_client))) + [,] + ; @@ -18034,6 +20118,7 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Iif(Isnull(gnIdSucursala),[NULL],Alltrim(Str(gnIdSucursala))) + [,] + ; Alltrim(Str(gnIdUtil)) + [);] + lcSql = lcSql + [ pack_facturare.nregenerare_editare := ] + Iif(Type('plRegenerareEditare') = 'L' And plRegenerareEditare, [1], [0]) + [;] If Inlist(poDate.Tip,23,25,30,41) && transfer intre subunitati pe baza de lista de preturi/comanda lcSql = lcSql + [ pack_facturare.initializeaza_date_gestiune(] + Alltrim(Str(poDateGestiuneDest.id_gestiune)) + [,] + ; Alltrim(Str(poDateGestiuneDest.id_tipgest)) + [,'] + Alltrim(poDateGestiuneDest.Cont) +[',] + ; @@ -18067,6 +20152,13 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" amessagebox(goExecutor.oPrelucrareEroare(),16,"Eroare") llReturn = .F. Else + If Type('plRegenerareEditare') = 'L' And plRegenerareEditare And !Empty(Nvl(poSnapshotEditare.id_util,0)) + If !ForteazaAuditCreareReemitere(poSnapshotEditare.id_util, poSnapshotEditare.dataora) + amessagebox('Auditul de creare al documentului vechi nu a putut fi impus. Nimic nu a fost scris.',0+16,'Eroare') + Thisform.do_inchide_tranzactie(2) + Return .F. + Endif + Endif Private poArt lcSql = [] Select crsfactura @@ -18082,7 +20174,8 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Alltrim(Str(poArt.Curs,18,4)) + [,] + ALLTRIM(STR(poArt.multiplicator,10)) + [,] + ; Alltrim(Str(poArt.id_jtva_coloana)) + [,] + ; ['] + OracleSpecialCharacters(Alltrim(poArt.denumire)) + [',] + ; - alltrim(Str(gnIdUtil)) + [);] + alltrim(Str(gnIdUtil)) + [,] + ; + NVL(ALLTRIM(STR(poArt.taxcode)),[NULL])+ [);] Else *!* modificare v 2.0.67 ^ *!* v 2.0.13 @@ -18102,11 +20195,11 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" *!* modificare v 2.2.14 : am pus gnPPretval in loc de gnPVal la poArt.pretd lcSql = lcSql + [pack_facturare.adauga_articol_factura(] + Alltrim(Str(poArt.id_temp)) + [,] + ; - Alltrim(Str(poArt.id_articol)) + [,] + ; + Nvl(Alltrim(Str(poArt.id_articol)),[NULL]) + [,] + ; ['] + OracleSpecialCharacters(Alltrim(Nvl(poArt.serie,[]))) + [',] + ; ['] + OracleSpecialCharacters(Alltrim(Nvl(poArt.explicatie,''))) + [',] + Nvl(Alltrim(Str(poArt.id_pol)),[NULL]) + [,] + ; Nvl(Alltrim(Str(poArt.id_gestiune)),[NULL]) + [,] + Alltrim(Str(poArt.pret_achizitie,18,Max(gnPPret,4))) + [,] + ; - Alltrim(Str(poArt.pretd,18,Max(gnPPretval,4))) + [,] + ; + Iif(Isnull(poArt.pretd),[NULL],Alltrim(Str(poArt.pretd,18,Max(gnPPretval,4)))) + [,] + ; Iif(Isnull(poArt.id_valuta_d),[NULL],Alltrim(Str(poArt.id_valuta_d))) + [,] + ; IIF(poArt.cu_tva=0,; IIF(poArt.tip_valuta = 0,Alltrim(Str(poArt.pretftva,18,gnPPretV)),Alltrim(Str(poArt.vpretftva,18,gnPVal))),; @@ -18117,10 +20210,15 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Iif(poArt.tip_valuta = 0,Alltrim(Str(poArt.discountftva,18,gnPPretV)),Alltrim(Str(poArt.vdiscountftva,18,gnPVal))), ; IIF(poArt.tip_valuta = 0,Alltrim(Str(poArt.discountctva,18,gnPPretV)),Alltrim(Str(poArt.vdiscountctva,18,gnPVal)))) + [,] + ; ['] + Alltrim(Nvl(poArt.Cont,'')) + [',] + Alltrim(Str(poArt.Curs,18,6)) + [,] + ; - ALLTRIM(STR(poArt.multiplicator,10)) + [,] + Alltrim(Str(poArt.id_jtva_coloana)) + [,] + ; + ALLTRIM(STR(poArt.multiplicator,10)) + [,] + Nvl(Alltrim(Str(poArt.id_jtva_coloana)),[NULL]) + [,] + ; Nvl(Alltrim(Str(poArt.id_part_rez)),[NULL]) + [,] + Nvl(Alltrim(Str(poArt.id_lucrare_rez)),[NULL]) + [,] + ; Alltrim(Str(poArt.pretv_orig,18,Max(gnPPretV,4))) + [,] + ; - Nvl(Alltrim(Str(poArt.id_set_fact)),[NULL]) + [,] + NVL(ALLTRIM(STR(poArt.id_ctr)),[NULL]) + [,] + Alltrim(Str(gnIdUtil)) + [);] + Nvl(Alltrim(Str(poArt.id_set_fact)),[NULL]) + [,] + NVL(ALLTRIM(STR(poArt.id_ctr)),[NULL]) + [,] + Alltrim(Str(gnIdUtil)) + [,] + ; + NVL(ALLTRIM(STR(poArt.taxcode)),[NULL]) + ; + [,'] + OracleSpecialCharacters(Alltrim(Nvl(poArt.lot,[]))) + ['] + ; + [,] + Iif(Isnull(poArt.proc_tvav),[NULL],Alltrim(Str(poArt.proc_tvav,18,4))) + ; + Iif(Empty(Nvl(poArt.id_pol,0)),[,'] + OracleSpecialCharacters(deriva_cont_venit_fara_pol(poArt.id_articol,poArt.Cont)) + ['],[,NULL]) + ; + [);] *!* v 2.0.13 ^ *!* modificare v 2.0.67 Endif @@ -18230,8 +20328,27 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" *!* scrie_factura_avize - lipseau 2 parametri din apel: v_id_facturare (adresa de facturare), v_listare_detaliata *!* emitere avize / facturi + *!* S8b: rutarea, INAINTE de orice scriere - do_scrie_articole() (mai jos) deschide + *!* tranzactia si scrie; pe editare, ruta decide daca se mai ajunge acolo + Private plRegenerareEditare + plRegenerareEditare = .F. + If poDate.lEditare + Local lnRutaEditare + lnRutaEditare = AlegeRutaScriereEditare(poSnapshotEditare, poDate, Thisform.ndiscfactron, Thisform.ndiscfactval, 'crsfactura') + Do Case + Case lnRutaEditare = 0 + Return .T. && nimic schimbat - nicio scriere + Case lnRutaEditare = 2 + Return ScrieAntetEditare(poDate, poSnapshotEditare) + Case lnRutaEditare = 3 + Return ScrieExplicatieEditare('crsfactura') + Otherwise && 1 = regenerare + plRegenerareEditare = .T. + Endcase + Endif + Private pnDiscount, pnFacturaRetur, pnParametruAditional, pcSirDifAcont, pcSirDifPart, pnTotalFtva, pnTotalTva - Local llReturn,lnSucces,lnCantitateRamasa,lcSql, lcListaIncasare, lnTipOriginal + Local llReturn,lnSucces,lnCantitateRamasa,lnCantitateNeadaugata,lcSql, lcListaIncasare, lnTipOriginal Store 0 To pnTotalFtva, pnTotalTva && modificare v 2.0.46 pcSirDifAcont = [] pcSirDifPart = [] @@ -18265,6 +20382,9 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" lcListaIncasare = lcListaIncasare + ['5|] + Alltrim(Str(poDate.incasatTichete,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;'] Endif Endcase + If Empty(m.lcListaIncasare) + lcListaIncasare = [NULL] + Endif Else lcListaIncasare = [NULL] @@ -18279,6 +20399,7 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" *************************************************************** *!* modificare v 2.0.46 + Try If Thisform.do_scrie_articole() IF (poDate.eBonFiscal = 1) poDate.Tip = m.lnTipOriginal @@ -18296,10 +20417,42 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" *!* modificare v 2.0.46 ^ poDate.text_aditional = Strtran(poDate.text_aditional,Chr(13)+Chr(10),Chr(170),1,100,1) Do Case + Case poDate.eProforma = 1 + *!* scrie_proforma are aceiasi parametri ca scrie_factura2; salveaza doar in vanzari, nu si in contabilitate + Thisform.marcheaza_linii_proforma() + lcSql = [{call pack_facturare.scrie_proforma(] + ; + Alltrim(Str(pnTotalFtva,18,gnPc)) + [,] + Alltrim(Str(pnTotalTva,18,gnPc)) + [,] + ; + Alltrim(Str(pnDiscount,18,gnPc)) + [,] + ; + ['] + Alltrim(Nvl(poDate.serie_chit,[])) + [',] + ; + Alltrim(Str(poDate.nr_incasare)) + [,] + ; + m.lcListaIncasare + [,] + ; + IIF(Isnull(poDate.id_delegat),[NULL],Alltrim(Str(poDate.id_delegat))) + [,] + ; + IIF(Isnull(poDate.id_masina),[NULL],Alltrim(Str(poDate.id_masina))) + [,] + ; + IIF(Isnull(poDate.id_facturare),[NULL],Alltrim(Str(poDate.id_facturare))) + [,] + ; + IIF(Isnull(poDate.nListareDetaliata),[0],Alltrim(Str(poDate.nListareDetaliata))) + [,] + ; + [to_date('] + Ttoc(poDate.dataora_exp,1) + [','YYYYMMDDHH24MISS'),] + ; + IIF(Isnull(poDate.id_agent),[NULL],Alltrim(Str(poDate.id_agent))) + [,] + ; + ['] + OracleSpecialCharacters(Alltrim(Left(Nvl(poDate.text_aditional,[]),100))) + [',] + ; + Alltrim(Str(poDate.discount_evidentiat)) + [,] + ; + Alltrim(Str(pnParametruAditional)) + [,?@poDate.nid_vanzare)}] Case poDate.Tip = 4 *!* facturare din aviz - Select crsarticole - Calculate Sum(cantitate) To lnCantitateRamasa + lcSql = [SELECT pack_facturare.exista_ramas_avize_lista('] + Alltrim(poDate.listaid) + [') AS ramas FROM dual] + If goExecutor.oExecute(lcSql,'crsramasavize') < 0 + amessagebox(goExecutor.oPrelucrareEroare(),16,"Eroare") + Thisform.do_inchide_tranzactie(2) + CurataIdFactFortat() + CurataAuditCreareFortat() + Return .F. + Endif + lnCantitateRamasa = crsramasavize.ramas + Use In (Select('crsramasavize')) + * crsarticole tine ce a ramas neadaugat, deci ce ramane neconsumat dupa scrierea acestei facturi + If Used('crsarticole') + Select crsarticole + Calculate Sum(cantitate) To lnCantitateNeadaugata + lnCantitateRamasa = Min(lnCantitateRamasa, lnCantitateNeadaugata) + Endif If lnCantitateRamasa > 0 pnFacturaRetur = 7 - amessagebox("Doriti sa se inregistreze si avizul de retur?",4+32,"Confirmare") pnParametruAditional = 1 @@ -18329,8 +20482,16 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" *!* v 2.0.13 ^ Case Inlist(poDate.Tip,3,21,25,28,42,47) && modificare v 2.0.93 : am adaugat 47 *!* facturare pe baza de comanda / avize pe baza de comanda - Select crsarticole - Calculate Sum(cantitate) To lnCantitateRamasa + lcSql = [SELECT pack_facturare.cantitate_ramasa_comanda(] + Alltrim(Str(Val(poDate.listaid))) + [) AS ramas FROM dual] + If goExecutor.oExecute(lcSql,'crsramascomanda') < 0 + amessagebox(goExecutor.oPrelucrareEroare(),16,"Eroare") + Thisform.do_inchide_tranzactie(2) + CurataIdFactFortat() + CurataAuditCreareFortat() + Return .F. + Endif + lnCantitateRamasa = crsramascomanda.ramas + Use In (Select('crsramascomanda')) If lnCantitateRamasa <> 0 pnParametruAditional = 7 - amessagebox("Doriti sa se inchida comanda?",4+32,"Confirmare") Endif @@ -18413,6 +20574,9 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" If (Like([41*],scd) And Nvl(id_partd,0) <> Nvl(id_partd1,0)) ; Or (Like([41*],scc) And Nvl(id_partc,0) <> Nvl(id_partc1,0)) amessagebox("Nu puteti modifica clientul!",48,"Atentie") + Thisform.do_inchide_tranzactie(2) + CurataIdFactFortat() + CurataAuditCreareFortat() Return .F. Else pcSirDifPart = pcSirDifPart + Alltrim(Str(id_act)) + [|] + Alltrim(Str(Nvl(id_partd,0))) + [|] + Alltrim(Str(Nvl(id_partc,0))) + [;] @@ -18538,14 +20702,38 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" llReturn = .F. Endif Endif + If llReturn + llReturn = scrie_legatura_proforma() && ofacturare_comun.prg + Endif + If llReturn And plRegenerareEditare + * borderoul eFactura tine documentul pe id_vanzare, iar view-ul nu filtreaza sters + llReturn = MutaBorderouReemitere(poSnapshotEditare.id_vanzare, poDate.nid_vanzare) + If !llReturn + amessagebox('Borderoul documentului vechi nu a putut fi mutat. Nimic nu a fost scris.',0+16,'Eroare') + Endif + Endif If llReturn llReturn = Thisform.do_inchide_tranzactie(1) + * identitatea veche s-a consumat: o a doua salvare in acelasi formular ar sterge un document + * deja sters si ar emite al treilea. Fara instantaneu, rutarea da 0 = nimic de scris. + If llReturn And plRegenerareEditare + poSnapshotEditare = .Null. + Endif Else Thisform.do_inchide_tranzactie(2) Endif Else llReturn = .F. Endif + CurataIdFactFortat() + CurataAuditCreareFortat() + Catch To loEx + Thisform.do_inchide_tranzactie(2) + CurataIdFactFortat() + CurataAuditCreareFortat() + amessagebox("Eroare la scrierea facturii: " + loEx.Message + " (linia " + Transform(loEx.Lineno) + ", " + loEx.Procedure + ")",16,"Eroare") + llReturn = .F. + Endtry Return llReturn ENDPROC @@ -18648,6 +20836,7 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" INTO Cursor crsfactura Readwrite restore_grid_tag(Thisform.grd_factura) + If Used(lcCursor) Select (lcCursor) lnRecNo = Recno() Do Case @@ -18683,21 +20872,11 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Else Go lnRecNo Endif + Endif Thisform.do_calculeaza_totaluri() Endif - If Reccount('crsfactura')>0 - Thisform.txtArticoleLista.SetFocus() - Else - *!* modificare v 2.0.67 - *!* Thisform.txtArticole.SetFocus() - If poArticol.opt_facturare = 0 - Thisform.txtArticole.SetFocus() - Else - Thisform.grd_contracte.SetFocus() - Endif - *!* modificare v 2.0.67 ^ - Endif + Thisform.grd_factura.SetFocus() Release poArticol,lcCursor Endif @@ -18739,9 +20918,13 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" ENDPROC + PROCEDURE do_verifica + Return This.oAntet.do_verifica(This) + ENDPROC + PROCEDURE do_verifica_articol *!* modificare v 2.0.67 - Lparameters tlContract,tnCantitate + Lparameters toArticol,tlContract,tnCantitate Local llReturn, lcFiltru, llFacturareFaraStoc llReturn = .T. @@ -18751,7 +20934,7 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" llFacturareFaraStoc = (Type('gnRF_FACTURARE_FARA_STOC') = 'N' And m.gnRF_FACTURARE_FARA_STOC = 1) If (tnCantitate >= 0 And Inlist(poDate.tip,8,9)) Or ; - (tnCantitate <= 0 And Not (poDate.tip = 2 And poArticol.opt_facturare = 3) And !Inlist(poDate.tip,8,9) And poArticol.gestionabil = 1 And gnScadereStoc = 1 AND !m.llFacturareFaraStoc) + (tnCantitate <= 0 And Not (poDate.tip = 2 And toArticol.opt_facturare = 3) And !Inlist(poDate.tip,8,9) And toArticol.gestionabil = 1 And gnScadereStoc = 1 AND !m.llFacturareFaraStoc) lcMesaj = Alltrim(Thisform.cmesaj_cantitate) amessagebox(lcMesaj,0+48,"Atentie") llReturn = .F. @@ -18761,12 +20944,12 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Use In crsverifart Endif Select id_ctr From crsCtrTemp Where id_ctr Not In ; - (Select Distinct id_ctr From crsarticole1 Where id_articol = poArticol.id_articol And id_rata Is Null) ; + (Select Distinct id_ctr From crsarticole1 Where id_articol = toArticol.id_articol And id_rata Is Null) ; INTO Cursor crsverifart Select crsverifart Do Case Case Reccount('crsverifart') = 0 - amessagebox("Articolul "+Alltrim(poArticol.denumire)+" din politica "+Alltrim(poArticol.nume_lista_preturi)+" are pretul fixat prin contract!",0+48,"Atentie") + amessagebox("Articolul "+Alltrim(toArticol.denumire)+" din politica "+Alltrim(toArticol.nume_lista_preturi)+" are pretul fixat prin contract!",0+48,"Atentie") llReturn = .F. Case Reccount('crsverifart') <> Reccount('crsCtrTemp') lcFiltru = [] @@ -18788,21 +20971,22 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" ENDPROC - PROCEDURE Error - LPARAMETERS nError, cMethod, nLine - SET STEP ON - ENDPROC - PROCEDURE inainte_de_do_renunt - *!* modificare 19.01.2007 - *!* Sqlrollback(gnHandle) - *!* SQLSetprop(gnHandle,"Transactions",1) - *!* *!* If poDate.tip<21 - *!* *!* Do dezaloca_numar_fact In oserii_numere.prg - *!* *!* Else - *!* *!* Do dezaloca_numar_aviz In oserii_numere.prg - *!* *!* Endif - *!* modificare 19.01.2007 ^ + If This.do_exista_obiect('ct_incasare') + If Type('poGeneratorNumere') = 'O' + poGeneratorNumere.dezaloca_numar(16) + poGeneratorNumere.dezaloca_numar(3) + poGeneratorNumere.dezaloca_numar(26) + + This.nnrbon = 0 + poDate.nr_incasare = 0 + poDate.incasat = 0 + ENDIF + + If Type('poGeneratorNumere') = 'O' And This.nmod_incasare() = 2 And This.nRezultatSerii <> 0 + poGeneratorNumere.dezaloca_numar(16) + Endif + Endif Return .T. ENDPROC @@ -18829,6 +21013,10 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Endif Endif + If !This.oAntet.valideaza_antet(This) + Return .F. + Endif + creeaza_backup_cursoare_facturare() If poDate.in_valuta = 1 @@ -18919,27 +21107,53 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" *!* plReturn = Thisform.do_scrie_proforma() *!* Else *!* modificare v 2.0.67 ^ - If gnButon = 1 && modificare v 2.0.93 - Private ofrmdatesupl - poDate.dataora_exp = Get_Ora() && modificare ROAFACTURARE v 2.0.80 + If gnButon = 1 + poDate.dataora_exp = Get_Ora() If poDate.tip<>30 - ofrmdatesupl = Createobject("frm_alte_date") - ofrmdatesupl.nnrbon = poDate.nract && in caz ca s-a suprascris schimbat de catre utilizator - IF (poDate.eBonFiscal = 1) - WITH ofrmdatesupl - .opt_incasat.value = 3 && INCASARE CU BON FISCAL - .actualizeaza_tipincasare() - .opt_incasat.option1.tabstop = .F. && sa nu schimb din greseala cu ENTER, se poate schimba cu mouse-ul - .opt_incasat.option2.tabstop = .F. - .opt_incasat.option3.tabstop = .F. - ENDWITH - poDate.nBonDetaliat = 1 && ar trebui in functie de o optiune - ENDIF - ofrmdatesupl.Show(1) + Do Case + Case Empty(Nvl(poDate.id_delegat,0)) And gcNumeProgram = [ROAFACTURARE] And !(poDate.eProforma = 1 Or poDate.eBonFiscal = 1) + amessagebox('Nu ati ales delegatul!',0+48,"Atentie") + Thisform.ct_livrare.ct_clb_delegat.SetFocus() + gnButon = 2 + Case Empty(Nvl(poDate.dataora_exp,{})) And poDate.eProforma = 0 And gcNumeProgram = [ROAFACTURARE] + amessagebox("Nu ati scris data si ora expedierii!",0+48,"Atentie") + Thisform.ct_livrare.clb_dataora_exp.SetFocus() + gnButon = 2 + Case Ttod(poDate.dataora_exp) < poDate.dataact + amessagebox('Data expedierii nu poate fi mai mica decat data documentului!',0+48,"Atentie") + Thisform.ct_livrare.clb_dataora_exp.SetFocus() + gnButon = 2 + Otherwise + gnButon = 1 + Endcase + If gnButon <> 2 And Thisform.do_exista_obiect('ct_incasare') + Thisform.nnrbon = poDate.nract + IF poDate.eBonFiscal = 1 + WITH Thisform + .seteaza_mod_incasare(3) + .actualizeaza_tipincasare() + .ct_incasare.opt_incasat.Option1.TabStop = .F. + .ct_incasare.opt_incasat.Option2.TabStop = .F. + .chk_incasare.Enabled = .F. + ENDWITH + poDate.nBonDetaliat = 1 + ENDIF + poDate.ntip_incasare = Iif(Thisform.nmod_incasare()=2, 11, IIF(Thisform.nmod_incasare() = 3, 2, IIF(Thisform.nmod_incasare() = 4, 3, 0))) + Do Case + Case Thisform.nmod_incasare() = 2 And poDate.incasat > poDate.totalctva + amessagebox('Suma incasata nu poate fi mai mare decat valoarea facturii!',0+48,"Atentie") + Thisform.ct_incasare.clb_incasat.SetFocus() + gnButon = 2 + Endcase + If gnButon <> 2 And poDate.nIncasatPos = 1 + poDate.incasatCARD = poDate.incasat + poDate.incasat = 0 + Endif + Endif Else gnButon = 1 Endif - Endif && modificare v 2.0.93 + Endif If gnButon = 2 plReturn = .F. @@ -18955,13 +21169,7 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" *!* modificare v 2.0.46 ^ Else *!* recalculeaza_pret_vanzare_compus() - *!* modificare v 2.0.67 - If poDate.eProforma = 1 - plReturn = Thisform.do_scrie_proforma() - Else - *!* modificare v 2.0.67 ^ - plReturn = Thisform.do_scrie_factura() - Endif + plReturn = Thisform.do_scrie_factura() Endif Endif Endcase @@ -18986,7 +21194,10 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" ENDPROC PROCEDURE Init - Local lcTipDoc + Lparameters toFactura + * toFactura (optional): factura/avizul sursa care se copie + Local lcTipDoc, llAviz, llCopiere, loSoldClient, loCfgTip, lcSelect + This.memoreaza_asezare() *:Global gcAcces gcAcces = [1;2;3;4;] DoDefault() @@ -18997,19 +21208,27 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" This.nNrInregVizibile = Floor((.Height - .HeaderHeight) / .RowHeight) Endwith - If !Used('crscursuri') Or Reccount('crscursuri') = 0 - Thisform.RemoveObject('lb_cursuri') - Thisform.RemoveObject('grd_cursuri') - Else - If !Empty(Nvl(poDate.zi_curs, {})) - Thisform.lb_cursuri.Caption = "Curs valutar " + Iif(!Inlist(poDate.tip, 8, 9), "(" + Dtoc(poDate.zi_curs) + ")", "") + lcSelect = SELECT() + If Inlist(poDate.tip, 1, 22, 5, 29, 7, 10, 45) && tipurile cu cautare in linie: cursul nu vine din cursorul de articole + citeste_cursuri_zi(poDate.zi_curs) + If Used('crscursuri') And Reccount('crscursuri') > 0 + If poDate.in_valuta = 1 + Select crscursuri + Locate For id_valuta = poDate.id_valuta + If Found() + poDate.Curs = Curs + poDate.multiplicator = multiplicator + Endif + Endif Else - Thisform.lb_cursuri.Caption = "Curs valutar" - Endif - If Reccount('crscursuri') <= 3 - Thisform.grd_cursuri.ScrollBars = 0 + If Used('crscursuri') + Use In crscursuri + Endif Endif Endif + SELECT (m.lcSelect) + + This.but_cursuri.Enabled = Used('crscursuri') And Reccount('crscursuri') > 0 This.cmesaj_cantitate = [Acest articol nu este pe stoc!] Do Case @@ -19043,23 +21262,54 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" && retur Endcase - Thisform.clb_total_factura.lb_explicatie.Caption = [TOTAL ] + Upper(lcTipDoc) - Thisform.ck_discountevidentiat.Caption = [Se pune în evidenta discount-ul pe articole ] + ; - [în notele contabile și pe ] + Alltrim(lcTipDoc) + Thisform.lb_total_factura.Caption = [TOTAL ] + Upper(lcTipDoc) + Thisform.ck_discountevidentiat.ToolTipText = [Se pune in evidenta discount-ul pe articole ] + ; + [in notele contabile si pe ] + Alltrim(lcTipDoc) - Thisform.clb_total_baza.do_actualizeaza_lbval(poDate.nume_valuta) - Thisform.clb_discount.do_actualizeaza_lbval(poDate.nume_valuta) - Thisform.clb_discount_articole.do_actualizeaza_lbval(poDate.nume_valuta) - Thisform.clb_total_factura.do_actualizeaza_lbval(poDate.nume_valuta) - Thisform.clb_total_tva.do_actualizeaza_lbval(poDate.nume_valuta) - Thisform.clb_discount.do_activeaza(1 + poDate.in_valuta) + Thisform.do_actualizeaza_lbval('total_baza', poDate.nume_valuta) + Thisform.do_actualizeaza_lbval('disc_factura', poDate.nume_valuta) + Thisform.do_actualizeaza_lbval('disc_articole', poDate.nume_valuta) + Thisform.do_actualizeaza_lbval('total_factura', poDate.nume_valuta) + Thisform.do_actualizeaza_lbval('total_tva', poDate.nume_valuta) + Thisform.do_activeaza('tx_disc_factura', 1 + poDate.in_valuta) If Nvl(gnModTotFact, 0) = 1 And !Inlist(poDate.tip, 5, 6, 7, 9, 10) && in afara de facturile in valuta - Thisform.clb_total_baza.do_activeaza(1) - Thisform.clb_total_tva.do_activeaza(1) + Thisform.do_activeaza('tx_total_baza', 1) + Thisform.do_activeaza('tx_total_tva', 1) Bindevent(Thisform, 'do_calculeaza_totaluri', Thisform, 'actualizeaza_total_mod', 1) Endif + This.lCopiere = (Type('toFactura') = 'O') && copiere factura/aviz + llCopiere = This.lCopiere + loCfgTip = configurare_tip_document(poDate.tip, poDate.eProforma = 1, m.llCopiere) + If !Isnull(m.loCfgTip) + If !Empty(m.loCfgTip.titlu) + This.Lb_titlu_alb_b121.Caption = Alltrim(m.loCfgTip.titlu) + Iif(m.loCfgTip.sufix_titlu = [descriere], [ ] + Alltrim(poDate.descriere), []) + Endif + If !Empty(m.loCfgTip.cap_cantitate) + This.grd_factura.cCantitate.header1.Caption = Alltrim(m.loCfgTip.cap_cantitate) + Endif + If !Empty(m.loCfgTip.mesaj_stoc) + This.cmesaj_cantitate = Alltrim(m.loCfgTip.mesaj_stoc) + Endif + If m.loCfgTip.ascunde_discount + This.lb_disc_factura.Visible = .F. + This.tx_disc_factura_nat.Visible = .F. + This.lb_disc_factura_ron.Visible = .F. + This.tx_disc_factura_procent.Visible = .F. + This.lb_disc_factura_procent_semn.Visible = .F. + This.clb_motiv_discount.Visible = .F. + && controalele de valuta pot fi deja sterse de do_actualizeaza_lbval + If This.do_exista_obiect('tx_disc_factura_val') + This.tx_disc_factura_val.Visible = .F. + This.lb_disc_factura_val.Visible = .F. + Endif + Endif + If m.loCfgTip.sterge_serie + This.grd_factura.RemoveObject([cSerie]) + Endif + Endif + If poDate.in_valuta = 0 Thisform.grd_factura.RemoveObject([cVpretFtva]) Thisform.grd_factura.RemoveObject([cVdiscountftva]) @@ -19071,11 +21321,324 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Thisform.grd_factura.RemoveObject([cValdiminuatctva]) Endif + Thisform.aseaza_totaluri() + + Try + Thisform.oLatimiGrid = Createobject('oGridLatimi') + Thisform.oLatimiGrid.distribuie(Thisform.grd_factura) + Catch + Endtry + Try Thisform.gridextra3.Setup() Catch Endtry + + * antet: aceleasi decizii ca pe frm_date_factura / frm_date_aviz (controale eliminate, etichete, serie/numar) + This.oAntet = Createobject('oAntetFacturare') + llAviz = (poDate.nIdTipDoc = poDate.nIdTipDocAvizExpeditie) + With This + .nid_tip = poDate.tip + If m.llAviz + * aviz: felul documentului e fix (AVIZ), soldul e doar de factura + .clb_fdoc.cboFdoc.Enabled = .F. + .RemoveObject('txtSoldLei') + .RemoveObject('lblSoldLei') + Do Case + Case gnScadereStoc = 0 And poDate.tip = 22 + .ct_contabilitate.RemoveObject('ct_clb_responsabil') + .ct_contabilitate.RemoveObject('ct_clb_gestiune_init') + .RemoveObject('ct_clb_politici_preturi') + If m.llCopiere + .ct_clb_altele.do_schimba_explicatia([Nr. factura]) + .but_incarca_articole.Caption = [Incarca din factura] + Else + .RemoveObject('ct_clb_altele') + Endif + Case gnScadereStoc = 0 And Inlist(poDate.tip, 21, 23, 25, 26, 28, 41, 42, 47, 24) + With .ct_clb_altele + Do Case + Case Inlist(poDate.tip, 21, 28, 42, 47) + .do_schimba_explicatia([Nr. comanda]) + Thisform.but_incarca_articole.Caption = [Incarca din comanda] + Thisform.RemoveObject('ct_clb_politici_preturi') + Case poDate.tip = 23 + Thisform.ct_clb_nume_client.do_schimba_explicatia([Gestiune sursa]) + .do_schimba_explicatia([Gestiune destinatie]) + Thisform.ct_contabilitate.RemoveObject('ct_clb_venchelt') + Case poDate.tip = 41 + Thisform.ct_clb_nume_client.do_schimba_explicatia([Retur de la]) + .do_schimba_explicatia([Retur la]) + Thisform.ct_contabilitate.RemoveObject('ct_clb_venchelt') + Case poDate.tip = 25 + .do_schimba_explicatia([Nr. comanda]) + Thisform.but_incarca_articole.Caption = [Incarca din comanda] + Thisform.ct_clb_nume_client.do_schimba_explicatia([Gestiune destinatie]) + Thisform.RemoveObject('ct_clb_politici_preturi') + Thisform.ct_contabilitate.RemoveObject('ct_clb_venchelt') + Case poDate.tip = 26 + .do_schimba_explicatia([Nr. contract]) + Thisform.but_incarca_articole.Caption = [Incarca din contract] + Thisform.RemoveObject('ct_clb_politici_preturi') + Case poDate.tip = 24 + .do_schimba_explicatia([Nr. avize]) + Thisform.but_incarca_articole.Caption = [Incarca din aviz] + Thisform.RemoveObject('ct_clb_politici_preturi') + Endcase + Endwith + .ct_contabilitate.RemoveObject('ct_clb_responsabil') + .ct_contabilitate.RemoveObject('ct_clb_gestiune_init') + Case gnScadereStoc = 1 And Inlist(poDate.tip, 21, 23, 25, 26, 28, 41, 42, 47, 24) + With .ct_clb_altele + Do Case + Case Inlist(poDate.tip, 21, 28, 42, 47) + .do_schimba_explicatia([Nr. comanda]) + Thisform.but_incarca_articole.Caption = [Incarca din comanda] + Thisform.RemoveObject('ct_clb_politici_preturi') + Case poDate.tip = 23 + Thisform.ct_clb_nume_client.do_schimba_explicatia([Gestiune sursa]) + .do_schimba_explicatia([Gestiune destinatie]) + Thisform.ct_contabilitate.RemoveObject('ct_clb_venchelt') + Case poDate.tip = 41 + Thisform.ct_clb_nume_client.do_schimba_explicatia([Retur de la]) + .do_schimba_explicatia([Retur la]) + Thisform.ct_contabilitate.RemoveObject('ct_clb_venchelt') + Case poDate.tip = 25 + .do_schimba_explicatia([Nr. comanda]) + Thisform.but_incarca_articole.Caption = [Incarca din comanda] + Thisform.ct_clb_nume_client.do_schimba_explicatia([Gestiune destinatie]) + Thisform.RemoveObject('ct_clb_politici_preturi') + Thisform.ct_contabilitate.RemoveObject('ct_clb_venchelt') + Case poDate.tip = 26 + .do_schimba_explicatia([Nr. contract]) + Thisform.but_incarca_articole.Caption = [Incarca din contract] + Thisform.RemoveObject('ct_clb_politici_preturi') + Case poDate.tip = 24 && aviz retur + .do_schimba_explicatia([Nr. avize]) + Thisform.but_incarca_articole.Caption = [Incarca din aviz] + Thisform.RemoveObject('ct_clb_politici_preturi') + Endcase + Endwith + * la restul pot sa aleg deja gestiunea sursa + If !Inlist(poDate.tip, 21, 25, 26, 28, 42, 47) + .ct_contabilitate.RemoveObject('ct_clb_gestiune_init') + Endif + Otherwise + * la restul pot sa aleg deja gestiunea sursa + If !Inlist(poDate.tip, 22, 29) + .ct_contabilitate.RemoveObject('ct_clb_gestiune_init') + Endif + .RemoveObject('ct_clb_politici_preturi') + If m.llCopiere + .ct_clb_altele.do_schimba_explicatia([Nr. aviz]) + .but_incarca_articole.Caption = [Incarca din aviz] + Else + .RemoveObject('ct_clb_altele') + Endif + Endcase + If Inlist(poDate.rezultat_serii, 1, 3) + .clb_serie_act1.nid_tipdoc = poDate.nIdTipDoc + .clb_serie_act1.do_initializeaza(poDate.rezultat_serii) + If !Empty(poDate.nract) + .clb_nract.SetFocus() + Else + .clb_serie_act1.SetFocus() + Endif + Else + .RemoveObject('clb_serie_act1') + .clb_nract.SetFocus() + Endif + If poDate.tip = 41 + .Lb_titlu_alb_b121.Caption = [RETUR TRANSFER] + Endif + Else + * factura: politica de preturi e doar de aviz + .RemoveObject('ct_clb_politici_preturi') + Do Case + Case gnScadereStoc = 0 And Inlist(poDate.tip, 1, 5, 10, 48, 49) + .ct_contabilitate.RemoveObject('ct_clb_gestiune_init') + .ct_contabilitate.RemoveObject('ct_clb_responsabil') + If m.llCopiere + .ct_clb_altele.do_schimba_explicatia([Nr. factura]) + .but_incarca_articole.Caption = [Incarca din factura] + Else + .RemoveObject('ct_clb_altele') + Endif + Case gnScadereStoc = 0 + With .ct_clb_altele + Do Case + Case Inlist(poDate.tip, 2, 6, 52) && contract factura lei, invoice, fiscala valuta + .do_schimba_explicatia([Nr. contract]) + Thisform.but_incarca_articole.Caption = [Incarca din contract] + Case poDate.tip = 3 + .do_schimba_explicatia([Nr. comanda]) + Thisform.but_incarca_articole.Caption = [Incarca din comanda] + Case poDate.tip = 4 + .do_schimba_explicatia([Nr. aviz / avize]) + Thisform.but_incarca_articole.Caption = [Incarca din aviz] + Case poDate.tip = 7 && credit note + .do_schimba_explicatia([Nr. factura]) + Thisform.but_incarca_articole.Caption = [Incarca din factura] + Case Inlist(poDate.tip, 8, 9) && retur factura + .do_schimba_explicatia([Nr. facturi]) + Thisform.but_incarca_articole.Caption = [Incarca din factura] + Case poDate.tip = 45 + .do_schimba_explicatia([Locatie]) + Endcase + Endwith + .ct_contabilitate.RemoveObject('ct_clb_responsabil') + .ct_contabilitate.RemoveObject('ct_clb_gestiune_init') + Case gnScadereStoc = 1 And Inlist(poDate.tip, 1, 5, 10) + If m.llCopiere + .ct_clb_altele.do_schimba_explicatia([Nr. factura]) + .but_incarca_articole.Caption = [Incarca din factura] + Else + .RemoveObject('ct_clb_altele') + Endif + Otherwise + With .ct_clb_altele + Do Case + Case poDate.tip = 45 + .do_schimba_explicatia([Locatie]) + Thisform.ct_contabilitate.RemoveObject('ct_clb_gestiune_init') + Case Inlist(poDate.tip, 2, 6, 52) && contract + .do_schimba_explicatia([Nr. contract]) + Thisform.but_incarca_articole.Caption = [Incarca din contract] + Case poDate.tip = 3 + .do_schimba_explicatia([Nr. comanda]) + Thisform.but_incarca_articole.Caption = [Incarca din comanda] + Case poDate.tip = 4 + .do_schimba_explicatia([Nr. aviz / avize]) + Thisform.but_incarca_articole.Caption = [Incarca din aviz] + Thisform.ct_contabilitate.RemoveObject('ct_clb_responsabil') + Thisform.ct_contabilitate.RemoveObject('ct_clb_gestiune_init') + Case Inlist(poDate.tip, 7) && 7 = credit note + .do_schimba_explicatia([Nr. factura]) + Thisform.but_incarca_articole.Caption = [Incarca din factura] + Thisform.ct_contabilitate.RemoveObject('ct_clb_responsabil') + Thisform.ct_contabilitate.RemoveObject('ct_clb_gestiune_init') + Case Inlist(poDate.tip, 8, 9) + .do_schimba_explicatia([Nr. facturi]) + Thisform.but_incarca_articole.Caption = [Incarca din factura] + Thisform.ct_contabilitate.RemoveObject('ct_clb_gestiune_init') + Case Inlist(poDate.tip, 48, 49) + Thisform.ct_contabilitate.RemoveObject('ct_clb_gestiune_init') + Thisform.ct_contabilitate.RemoveObject('ct_clb_responsabil') + Thisform.RemoveObject('ct_clb_altele') + Endcase + Endwith + Endcase + If gnScadentaAutomata = 1 + .clb_data_scadenta.dezactiveaza() + Endif + If Inlist(poDate.tip, 8, 9) + .RemoveObject('clb_zi_curs') + Else + .do_actualizeaza_vizibilitate_curs() + Endif + If poDate.in_valuta = 0 + .RemoveObject('ct_clb_valuta') + Endif + If Inlist(poDate.rezultat_serii, 1, 2, 3) && si rezultat_serii = 2 FARA SERIE CU PLAJE, ca sa genereze numarul urmator pentru BON FISCAL + .clb_serie_act1.nid_tipdoc = poDate.nIdTipDoc + .clb_serie_act1.do_initializeaza(poDate.rezultat_serii) + Else + .RemoveObject('clb_serie_act1') + Endif + * Soldul curent (daca este o factura pe baza de comanda/contract, se intra deja cu clientul selectat) + If Type('poDate.id_client') = 'N' And Nvl(poDate.id_client, 0) <> 0 + loSoldClient = GetSoldClient(poDate.id_client) + .nSoldLei = loSoldClient.sold_lei + .nSoldValuta = loSoldClient.sold_valuta + .txtSoldLei.Refresh() + .ct_clb_nume_client.clb_tx_cautare.text_simplu1.ToolTipText = 'Id client: ' + Transform(poDate.id_client) + Endif + Do Case + Case poDate.in_valuta = 1 And .ct_clb_valuta.Top < .clb_fdoc.Top And Empty(Nvl(poDate.nume_valuta, '')) + .ct_clb_valuta.SetFocus() + Otherwise + .clb_fdoc.SetFocus() + Endcase + Endif + Endwith + If poDate.eProforma <> 0 Or !Between(poDate.tip,1,4) Or gcNumeProgram = [ROAGEST] + This.RemoveObject('ct_incasare') + This.RemoveObject('chk_incasare') + This.RemoveObject('lb_antet_incasare') + This.ct_document.RemoveObject('cboTipFactura') + This.ct_document.RemoveObject('lblTipFactura') + Else + If Used('v_nom_casa') + Use In v_nom_casa + Endif + lcSqlCasa = [select id_part,nume from ] + gcS + [.vcoresp_tip_part where tip_partener='CASA LEI'] + lnSuccesCasa = goExecutor.oExecute(lcSqlCasa,[v_nom_casa]) + If lnSuccesCasa < 0 + amessagebox(goExecutor.cEroare,0+16,'Eroare') + Else + This.ct_incasare.cb_casa._cBBASE1.RowSource = [v_nom_casa.nume,id_part] + This.ct_incasare.cb_casa._cBBASE1.RowSourceType = 6 + If !Empty(gnid_part_casa) + Select v_nom_casa + Locate For id_part = gnid_part_casa + If Found() + poDate.id_casa = gnid_part_casa + This.ct_incasare.cb_casa._cBBASE1.Value = Alltrim(nume) + Endif + Endif + Endif + If poDate.incasat <> 0 + Do Case + Case poDate.ntip_incasare = 2 + This.seteaza_mod_incasare(3) + Case poDate.ntip_incasare = 3 + This.seteaza_mod_incasare(4) + Otherwise + This.seteaza_mod_incasare(2) + Endcase + Endif + Endif + This.aseaza_alte_date() + && grupurile B si C (decizia 25, S8 pct 1.1.5): needitabile la editarea unui document existent + If poDate.lEditare + This.clb_fdoc.cboFdoc.Enabled = .F. + If This.do_exista_obiect('Ct_clb_altele') + This.ct_clb_altele.do_dezactiveaza() + Endif + If This.do_exista_obiect('Ct_clb_nume_client') + This.ct_clb_nume_client.do_dezactiveaza() + Endif + If This.do_exista_obiect('Ct_clb_valuta') + This.ct_clb_valuta.do_dezactiveaza() + Endif + If This.do_exista_obiect('Clb_zi_curs') + This.clb_zi_curs.dezactiveaza() + Endif + If This.do_exista_obiect('Ct_clb_gestiune_init', This.ct_contabilitate) + This.ct_contabilitate.ct_clb_gestiune_init.do_dezactiveaza() + Endif + If This.do_exista_obiect('Ct_clb_politici_preturi') + This.ct_clb_politici_preturi.do_dezactiveaza() + Endif + This.but_incarca_articole.Enabled = .F. + This.but_cursuri.Enabled = .F. + If This.do_exista_obiect('ct_incasare') + This.ct_incasare.Enabled = .F. + This.chk_incasare.Enabled = .F. + Endif + This.blocheaza_antet() + This.lantet_deblocat = .F. + With This.but_modifica_antet + .Visible = .T. + .cpicturedown = "modific_jos.bmp" + .cpictureup = "modific_sus.bmp" + .Picture = "modific_sus.bmp" + .ToolTipText = "Modificare antet" + Endwith + Else + This.but_modifica_antet.Visible = .F. + Endif this.Refresh() ENDPROC @@ -19105,6 +21668,44 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" ENDPROC + PROCEDURE Load + IF !USED('saft_tip_facturi') + update_saft_tip_facturi() + ENDIF + ENDPROC + + PROCEDURE marcheaza_linii_proforma + Local lnRecno + lnRecno = Recno('crsfactura') + && proforma se emite si fara stoc: liniile pleaca negestionabile, cu sentinela -1000 + Update crsfactura Set gestionabil = 0, id_gestiune = -1000 + If Between(m.lnRecno, 1, Reccount('crsfactura')) + Go m.lnRecno In crsfactura + Endif + ENDPROC + + PROCEDURE memoreaza_asezare + Local lnOrigineAlte + + If This.lasezare_memorata + Return + Endif + + && apelata din Init inainte de DoDefault()/RemoveObject, cat toate controalele inca exista + This.oasezareoffset = Createobject('Collection') + lnOrigineAlte = This.ct_document.Top + + && inaltimile stivei, derivate din geometria design-time a containerelor + This.oasezareoffset.Add(This.chk_alte_date.Height, 'h_linie_casete') + This.oasezareoffset.Add(This.ct_incasare.Height, 'h_ct_incasare') + This.oasezareoffset.Add(This.ct_livrare.Top + This.ct_livrare.Height - lnOrigineAlte, 'h_stiva_alte') + + && butonul de cursuri valutare, ancorat la grupul Document + This.oasezareoffset.Add(This.but_cursuri.Top - lnOrigineAlte, 'but_cursuri') + + This.lasezare_memorata = .T. + ENDPROC + PROCEDURE modifica_lista_preturi Lparameters tnIdPol, tnIdArticol, tnPretftvaLista, tnPretvtvaLista, tnPretLista, tnProcTvav,tnPretListaVechi *!* modificare v 2.0.90 : am adaugat llModificat @@ -19209,7 +21810,113 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" RETURN llModificat ENDPROC + PROCEDURE nmod_incasare + && 1 = fara incasare, 2 = chitanta, 3 = bon fiscal, 4 = POS card + If !This.do_exista_obiect('ct_incasare') Or This.chk_incasare.Value = 0 + Return 1 + Endif + Return This.ct_incasare.opt_incasat.Value + 1 + ENDPROC + + PROCEDURE Resize + DoDefault() + This.aseaza_alte_date() + This.aseaza_totaluri() + If Vartype(This.oLatimiGrid) = 'O' + This.oLatimiGrid.distribuie(This.grd_factura) + Endif + ENDPROC + + PROCEDURE rezumat_alte_date + Local lcText + If This.chk_alte_date.Value = 1 + Return "" + Endif + lcText = "" + If Nvl(poDate.tip_saft, 380) <> 380 + lcText = lcText + ", tip factura " + Alltrim(Transform(Nvl(poDate.tip_saft, 0))) + Endif + If !Empty(Nvl(poDate.text_aditional, "")) + lcText = lcText + ", text aditional" + Endif + If !Empty(Nvl(poDate.nListareDetaliata, 0)) + lcText = lcText + ", listare detaliata" + Endif + If !Empty(Nvl(poDate.explicatia4, "")) + lcText = lcText + ", explicatie jurnal" + Endif + If !Empty(Nvl(poDate.venchelt, "")) + lcText = lcText + ", venit/cheltuiala " + Alltrim(Transform(Nvl(poDate.venchelt, ""))) + Endif + If !Empty(Nvl(poDate.sectie, "")) + lcText = lcText + ", sectie " + Alltrim(Transform(Nvl(poDate.sectie, ""))) + Endif + If !Empty(Nvl(poDate.nrord, "")) + lcText = lcText + ", lucrare " + Alltrim(Transform(Nvl(poDate.nrord, ""))) + Endif + If !Empty(Nvl(poDate.responsabil, "")) + lcText = lcText + ", responsabil " + Alltrim(Transform(Nvl(poDate.responsabil, ""))) + Endif + If !Empty(Nvl(This.cgestiune_init, "")) + lcText = lcText + ", gestiune " + Alltrim(Transform(Nvl(This.cgestiune_init, ""))) + Endif + If !Empty(Nvl(poDate.nume_agent, "")) + lcText = lcText + ", agent " + Alltrim(Transform(Nvl(poDate.nume_agent, ""))) + Endif + If !Empty(Nvl(poDate.nume_delegat, "")) + lcText = lcText + ", delegat " + Alltrim(Transform(Nvl(poDate.nume_delegat, ""))) + Endif + If !Empty(Nvl(poDate.nrinmat, "")) + lcText = lcText + ", masina " + Alltrim(Transform(Nvl(poDate.nrinmat, ""))) + Endif + If !Empty(Nvl(poDate.dataora_exp, "")) + lcText = lcText + ", expediere " + Alltrim(Transform(Nvl(poDate.dataora_exp, ""))) + Endif + If !Empty(Nvl(poDate.adresa_facturare, "")) + lcText = lcText + ", adresa facturare" + Endif + Return Iif(Empty(lcText), "", "- " + Substr(lcText, 3)) + ENDPROC + + PROCEDURE rezumat_incasare + Local lnMod + lnMod = This.nmod_incasare() + If lnMod = 1 + Return "" + Endif + Return "- " + Iif(lnMod = 2, "chitanta", Iif(lnMod = 3, "bon fiscal", "POS card")) + " " + ; + Alltrim(Transform(Nvl(poDate.nr_incasare, 0))) + " / " + ; + Alltrim(Transform(Nvl(poDate.incasat, 0), "@Z 999,999,999.99")) + ENDPROC + + PROCEDURE seteaza_mod_incasare + Lparameters tnMod + If !This.do_exista_obiect('ct_incasare') + Return + Endif + This.chk_incasare.Value = Iif(m.tnMod = 1, 0, 1) + If m.tnMod > 1 + This.ct_incasare.opt_incasat.Value = m.tnMod - 1 + Else + This.actualizeaza_tipincasare() + Endif + This.lincasare_deschis = (This.chk_incasare.Value = 1) + ENDPROC + + PROCEDURE chk_alte_date.Click + Thisform.do_comuta_alte_date() + ENDPROC + + PROCEDURE chk_incasare.Click + Thisform.do_comuta_incasare() + ENDPROC + PROCEDURE Clb_dataact.TEXT_SIMPLU1.LostFocus + If Thisform.oAntet.EsteAviz() + poDate.zi_curs = poDate.dataact + Thisform.clb_zi_curs.Refresh() + Return + Endif *!* modificare v 2.2.4 : daca scadenta nu e automata, atunci poate modifica data scadenta propusa *!* poDate.datascad = Iif(gnScadentaAutomata=0,Gomonth(poDate.dataact,1),poDate.dataact+gnZileScadentaFact) poDate.datascad = Iif(gnZileScadentaFact=-1,Gomonth(poDate.dataact,1),poDate.dataact+gnZileScadentaFact) @@ -19226,21 +21933,29 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" ENDPROC - PROCEDURE Clb_discount.Procent.LostFocus - Thisform.do_calculeaza_discount(This.Value) - - ENDPROC - - PROCEDURE Clb_discount.TX_SUMA_NAT.InteractiveChange - lcval=This.ControlSource - &lcval=This.Value - Thisform.do_calculeaza_totaluri(.T.) - ENDPROC - - PROCEDURE Clb_discount.TX_SUMA_VAL.InteractiveChange - lcval=This.ControlSource - &lcval=This.Value - Thisform.do_calculeaza_totaluri(.T.) + PROCEDURE Clb_dataireg.Text_simplu1.LostFocus + If Thisform.oAntet.EsteAviz() + poDate.dataact = poDate.dataireg + Thisform.clb_dataact.Refresh() + poDate.zi_curs = poDate.dataact + Thisform.clb_zi_curs.Refresh() + Return + Endif + poDate.dataact = poDate.dataireg + Thisform.clb_dataact.Refresh() + *!* modificare v 2.2.4 : daca scadenta nu e automata, atunci poate modifica data scadenta propusa + *!* poDate.datascad = Iif(gnScadentaAutomata=0,Gomonth(poDate.dataact,1),poDate.dataact+gnZileScadentaFact) + poDate.datascad = Iif(gnZileScadentaFact=-1,Gomonth(poDate.dataact,1),poDate.dataact+gnZileScadentaFact) + *!* modificare v 2.2.4 ^ + Thisform.clb_data_scadenta.Refresh() + *!* modificare v 2.0.56 + If Type('thisform.clb_zi_curs.visible')<>'U' + *!* modificare v 2.0.56 ^ + poDate.zi_curs = poDate.dataact + Thisform.clb_zi_curs.Refresh() + *!* modificare v 2.0.56 + Endif + *!* modificare v 2.0.56 ^ ENDPROC PROCEDURE clb_fdoc.cboFdoc.Init @@ -19248,11 +21963,11 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" lcTipDoc = IIF(poDate.nIdTipDoc = poDate.nIdTipDocFactura, 'FACTURA', ; IIF(poDate.nIdTipDoc = poDate.nIdTipDocProforma, 'PROFORMA', ; IIF(poDate.nIdTipDoc = poDate.nIdTipDocBonFiscal, 'BON FISCAL', ; - IIF(poDate.nIdTipDoc = poDate.nIdTipDocAviz, 'AVIZ', 'FACTURA')))) + IIF(poDate.nIdTipDoc = poDate.nIdTipDocAvizExpeditie, 'AVIZ', 'FACTURA')))) THIS.Value = m.lcTipDoc ENDPROC - PROCEDURE clb_fdoc.cboFdoc.Valid + PROCEDURE clb_fdoc.cboFdoc.LostFocus thisform.do_schimba_tipdoc() ENDPROC @@ -19269,15 +21984,7 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" ENDIF ENDPROC - PROCEDURE Clb_total_baza.tx_suma_nat.InteractiveChange - Thisform.actualizeaza_total_mod(This.Value,1) - ENDPROC - - PROCEDURE Clb_total_tva.tx_suma_nat.InteractiveChange - Thisform.actualizeaza_total_mod(This.Value,2) - ENDPROC - - PROCEDURE Ed_tx_simplu1._EDBASE1.KeyPress + PROCEDURE ct_contabilitate.Ed_tx_simplu1._EDBASE1.KeyPress LPARAMETERS nKeyCode, nShiftAltCtrl IF nKeyCode = 13 && ENTER NODEFAULT @@ -19285,12 +21992,82 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" ENDIF ENDPROC + PROCEDURE ct_incasare.Cb_casa._CBBASE1.InteractiveChange + poDate.id_casa = v_nom_casa.id_part + ENDPROC + + PROCEDURE ct_incasare.chkPOS.Valid + IF this.Value = 0 + thisform.ct_incasare.cb_casa._lbbase1.Caption = 'Casa' + ELSE + thisform.ct_incasare.cb_casa._lbbase1.Caption = 'Banca POS' + ENDIF + thisform.ct_incasare.cb_casa._lbbase1.Refresh() + ENDPROC + + PROCEDURE ct_incasare.Clb_nrchit.Text_simplu1.GotFocus + If Thisform.nmod_incasare() = 2 + Thisform.ct_incasare.clb_serie_chit.genereazaNumar() + ENDIF + ENDPROC + + PROCEDURE ct_incasare.Clb_serie_chit._cbbase1.InteractiveChange + This.Parent.genereazaNumar() + ENDPROC + + PROCEDURE ct_incasare.cmdModificaBon.Click + Do Case + Case Thisform.nmod_incasare() = 3 + Thisform.do_modifica_bon + Case Thisform.nmod_incasare() = 4 + Thisform.do_modifica_pos + Endcase + ENDPROC + + PROCEDURE ct_incasare.opt_incasat.Click + Thisform.actualizeaza_tipincasare() + ENDPROC + + PROCEDURE ct_incasare.opt_incasat.ProgrammaticChange + Thisform.actualizeaza_tipincasare() + ENDPROC + + PROCEDURE grd_factura.cCantitate.Text1.Valid + LOCAL lcSql, lnPlafon, lnTotalDupa, lnRecnoCrt, lnIdArt + IF This.Value <> crsfactura.cantitate AND Inlist(poDate.tip,1,22,29,23) AND gnScadereStoc = 1 AND crsfactura.gestionabil = 1 + lnRecnoCrt = Recno('crsfactura') + lnIdArt = crsfactura.id_articol + lcSql = [SELECT pack_facturare.plafon_disponibil_articol(] + ; + Alltrim(Str(m.lnIdArt)) + [,] + Alltrim(Str(gnLuna)) + [,] + ; + Alltrim(Str(gnAn)) + [,] + Alltrim(Str(gnIdUtil)) + [,] + Alltrim(Str(gnIdSucursala)) + ; + [,] + Iif(Isnull(poDate.id_gestiune_init),[NULL],Alltrim(Str(poDate.id_gestiune_init))) + ; + [,NULL) AS plafon FROM dual] + IF goExecutor.oExecute(lcSql,'crsplafon') < 0 + amessagebox(goExecutor.oPrelucrareEroare(),16,"Eroare") + ELSE + lnPlafon = crsplafon.plafon + Use In (Select('crsplafon')) + SELECT crsfactura + CALCULATE Sum(cantitate) TO lnTotalDupa FOR id_articol = m.lnIdArt AND Recno() <> m.lnRecnoCrt + GO m.lnRecnoCrt IN crsfactura + IF lnTotalDupa + This.Value > lnPlafon + amessagebox(Alltrim(Thisform.cmesaj_cantitate),0+48,"Atentie") + RETURN .F. + ENDIF + ENDIF + ENDIF + Thisform.do_calculeaza_totaluri() + ENDPROC + PROCEDURE grd_factura.cCodMat.cboCodmat.LostFocus DODEFAULT() IF this.Value <> thisform.cOldValue thisform.cOldvalue = this.Value - REPLACE codmat WITH crsCodMat.codmat, denumire WITH crsCodmat.denumire, id_articol WITH crsCodmat.id_articol IN crsFactura + Local loArticol + Select crsCodmat + Scatter Name loArticol MEMO + Thisform.do_adauga_articol_cautat(loArticol, loArticol.cantitate) * Actualizez cursorul pentru coloana Denumire lcRowSource = thisform.grd_factura.cDenumire.cCboDenumire.RowSource @@ -19314,11 +22091,14 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" IF this.Value <> thisform.cOldValue thisform.cOldvalue = this.Value - REPLACE codmat WITH crsDenumire.codmat, denumire WITH crsDenumire.denumire, id_articol WITH crsDenumire.id_articol IN crsFactura + Local loArticol + Select crsDenumire + Scatter Name loArticol MEMO + Thisform.do_adauga_articol_cautat(loArticol, loArticol.cantitate) * Actualizez cursorul pentru coloana Codmat lcRowSource = thisform.grd_factura.cCodMat.cboCodmat.RowSource - WITH thisform.grd_factura.cCodMat.cCboDenumire + WITH thisform.grd_factura.cCodMat.cboCodmat .cSearchString = ALLTRIM(crsDenumire.codmat) .RefreshData(1) .RowSource = "" @@ -19333,6 +22113,18 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" Thisform.cOldvalue = this.Value ENDPROC + PROCEDURE grd_factura.cDiscountCTva.Text1.LostFocus + LOCAL loArt + IF This.Value <> This.OldValue + SELECT crsfactura + SCATTER NAME loArt MEMO + loArt = recalc_discount_linie(loArt, This.Value, 2) + loArt = calculeaza_totaluri(loArt) + GATHER NAME loArt MEMO + Thisform.do_calculeaza_totaluri() + ENDIF + ENDPROC + PROCEDURE grd_factura.cGestiune.cCboGestiune.LostFocus DODEFAULT() @@ -19346,12 +22138,59 @@ DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx" thisform.cOldvalue = this.Value ENDPROC + PROCEDURE grd_factura.cVdiscountftva.Text1.LostFocus + LOCAL loArt + IF This.Value <> This.OldValue + SELECT crsfactura + SCATTER NAME loArt MEMO + loArt = recalc_discount_linie(loArt, This.Value, 3) + loArt = calculeaza_totaluri(loArt) + GATHER NAME loArt MEMO + Thisform.do_calculeaza_totaluri() + ENDIF + ENDPROC + PROCEDURE grd_factura.Init DODEFAULT() THIS.FontName= "Arial" ENDPROC + PROCEDURE lb_antet_alte_date.Click + Thisform.chk_alte_date.Value = Iif(Thisform.chk_alte_date.Value = 1, 0, 1) + Thisform.do_comuta_alte_date() + ENDPROC + + PROCEDURE lb_antet_incasare.Click + Thisform.chk_incasare.Value = Iif(Thisform.chk_incasare.Value = 1, 0, 1) + Thisform.do_comuta_incasare() + ENDPROC + + PROCEDURE tx_disc_factura_nat.InteractiveChange + lcval=This.ControlSource + &lcval=This.Value + Thisform.do_calculeaza_totaluri(.T.) + ENDPROC + + PROCEDURE tx_disc_factura_procent.LostFocus + Thisform.do_calculeaza_discount(This.Value) + + ENDPROC + + PROCEDURE tx_disc_factura_val.InteractiveChange + lcval=This.ControlSource + &lcval=This.Value + Thisform.do_calculeaza_totaluri(.T.) + ENDPROC + + PROCEDURE tx_total_baza_nat.InteractiveChange + Thisform.actualizeaza_total_mod(This.Value,1) + ENDPROC + + PROCEDURE tx_total_tva_nat.InteractiveChange + Thisform.actualizeaza_total_mod(This.Value,2) + ENDPROC + ENDDEFINE DEFINE CLASS frm_nomrute AS frm_termin OF "_frm_child.vcx" diff --git a/clase/ofacturare_comun.vc2 b/clase/ofacturare_comun.vc2 index c0bea79..4dccbd1 100644 --- a/clase/ofacturare_comun.vc2 +++ b/clase/ofacturare_comun.vc2 @@ -1262,6 +1262,10 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" *< OBJECTDATA: ObjPath="grid_facturi.cInstitutiePublica._checkbox1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="grid_facturi.cCodFiscal.Header1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="grid_facturi.cCodFiscal.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="grid_facturi.cUtilm.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="grid_facturi.cUtilm.Text1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="grid_facturi.cDataoram.Header1" UniqueID="" Timestamp="" /> + *< OBJECTDATA: ObjPath="grid_facturi.cDataoram.Text1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="grid_detalii" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="grid_detalii.cNume_lista_preturi.Header1" UniqueID="" Timestamp="" /> *< OBJECTDATA: ObjPath="grid_detalii.cNume_lista_preturi.Text1" UniqueID="" Timestamp="" /> @@ -1337,6 +1341,7 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" * *m: do_editare_factura + *m: do_editare_unificata *m: do_listare_cc *m: do_listare_centr *m: do_listare_document @@ -2225,7 +2230,7 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" ADD OBJECT 'grid_facturi' AS _grdrow WITH ; Anchor = 15, ; - ColumnCount = 44, ; + ColumnCount = 46, ; DeleteMark = .F., ; FontSize = 10, ; HeaderHeight = 36, ; @@ -2543,7 +2548,21 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" Column44.FontSize = 10, ; Column44.Name = "cCodFiscal", ; Column44.ReadOnly = .T., ; - Column44.Width = 103 + Column44.Width = 103, ; + Column45.ColumnOrder = 45, ; + Column45.ControlSource = "utilm", ; + Column45.FontName = "Arial", ; + Column45.FontSize = 10, ; + Column45.Name = "cUtilm", ; + Column45.ReadOnly = .T., ; + Column45.Width = 107, ; + Column46.ColumnOrder = 46, ; + Column46.ControlSource = "dataoram", ; + Column46.FontName = "Arial", ; + Column46.FontSize = 10, ; + Column46.Name = "cDataoram", ; + Column46.ReadOnly = .T., ; + Column46.Width = 99 *< END OBJECT: ClassLib="_grd_base.vcx" BaseClass="grid" /> ADD OBJECT 'grid_facturi.cAdresaFacturare.Header1' AS header WITH ; @@ -2759,6 +2778,26 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" SelectedBackColor = 0,0,255 *< END OBJECT: BaseClass="textbox" /> + ADD OBJECT 'grid_facturi.cDataoram.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Dataora modificarii", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'grid_facturi.cDataoram.Text1' AS textbox WITH ; + BackColor = 255,255,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1", ; + ReadOnly = .T., ; + SelectedBackColor = 0,0,255 + *< END OBJECT: BaseClass="textbox" /> + ADD OBJECT 'grid_facturi.cDataoras.Header1' AS header WITH ; Alignment = 2, ; Caption = "Dataora stergerii", ; @@ -3381,6 +3420,26 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" SelectedBackColor = 0,0,255 *< END OBJECT: BaseClass="textbox" /> + ADD OBJECT 'grid_facturi.cUtilm.Header1' AS header WITH ; + Alignment = 2, ; + Caption = "Operator modificare", ; + FontName = "Arial", ; + FontSize = 10, ; + Name = "Header1" + *< END OBJECT: BaseClass="header" /> + + ADD OBJECT 'grid_facturi.cUtilm.Text1' AS textbox WITH ; + BackColor = 255,255,255, ; + BorderStyle = 0, ; + FontName = "Arial", ; + FontSize = 10, ; + ForeColor = 0,0,0, ; + Margin = 0, ; + Name = "Text1", ; + ReadOnly = .T., ; + SelectedBackColor = 0,0,255 + *< END OBJECT: BaseClass="textbox" /> + ADD OBJECT 'grid_facturi.cUtils.Header1' AS header WITH ; Alignment = 2, ; Caption = "Operator stergere", ; @@ -3679,11 +3738,26 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" #DEFINE T41 41 && 'RETUR TRANSFER' #DEFINE T_6 -6 && 'RETUR TRANSFER DIN GESTIUNE VALORICA' - LOCAL loFactura + LOCAL loFactura, lcSql, lnFacturi IF !This.IsCopy(crsFacturi.tip) RETURN ENDIF + * proforma deja facturata: se avertizeaza, nu se blocheaza + IF Nvl(crsFacturi.eproforma,0) = 1 + lcSql = [SELECT COUNT(*) AS nr FROM vanzari_coresp WHERE sters = 0 AND tip = 4 ] + ; + [AND id_vanzare_aviz = ] + Alltrim(Str(crsFacturi.id_vanzare,20,0)) + IF goExecutor.oExecute(lcSql,[crsprofact]) >= 0 AND Used('crsprofact') + lnFacturi = crsprofact.nr + Use In (Select('crsprofact')) + IF lnFacturi > 0 + IF amessagebox("Din aceasta proforma s-au emis deja " + Alltrim(Str(lnFacturi)) + ; + " facturi. Doriti sa continuati?",4+32,"Confirmare") <> 6 + RETURN + ENDIF + ENDIF + ENDIF + ENDIF * Copiez orice document, dar il tratez ca pe un caz simplu (factura din lista de preturi, aviz din lista de preturi, transfer simplu) * De exemplu, factura din contract sau din comanda, nu are sens sa fie copiata, dar o tratez ca pe o factura din lista de preturi @@ -3871,6 +3945,96 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" ENDPROC + PROCEDURE do_editare_unificata + If !This.lactiv3 + Return + Endif + + If Reccount('crsfacturi') = 0 + amessagebox("Nu exista inregistrari pentru editare!",0+48,"Atentie") + Return + Endif + + If glLunaInchisa + Return + Endif + + Local lnSters, llEProforma, lnTipDoc, loForm, pnDiscountRon, pnDiscountValuta + Private pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzare, poDate, poSnapshotEditare + Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzare + Select crsfacturi + lnIdVanzare = id_vanzare + lnCod = cod + pnAn = Year(data_act) + pnLuna = Month(data_act) + lnSters = sters + lnIdFact = id_fact + llEProforma = (eproforma = 1) + lnTipDoc = tip + + If lnSters = 1 + amessagebox("Acest document este deja sters!",0+48,"Atentie") + Return + Endif + + If llEProforma + amessagebox("Proformele nu pot fi editate pe aceasta cale!",0+48,"Atentie") + Return + Endif + + If Inlist(lnTipDoc, 44, 45, 46, 51) + amessagebox("Documentele acestui modul nu pot fi editate pe aceasta cale!",0+48,"Atentie") + Return + Endif + + If (pnAn * 12) + pnLuna <> (gnAn * 12) + gnLuna + amessagebox('Nu puteti edita decat inregistrari din luna curenta!',0,'Atentie!') + Return + Endif + + If ReferinteDocumenteNota(pnAn, pnLuna, lnCod) && odocumente.prg + amessagebox("Documentul are referinte (incasari/plati). Nu poate fi editat.", 0+48,"Editare") + Return + Endif + + If EsteInEFactura(lnIdFact) && ofacturare_editare.prg + amessagebox("Documentul a fost trimis in eFactura. Nu poate fi editat.", 0+48,"Editare") + Return + Endif + + If DocumentAreUrmasi(lnIdVanzare) && ofacturare_editare.prg + amessagebox("Documentul are facturi sau avize emise pe lantul lui. Nu poate fi editat.", 0+48,"Editare") + Return + Endif + + poDate = IncarcaAntetFacturaEditare(lnIdVanzare, @pnDiscountRon, @pnDiscountValuta) && ofacturare_editare.prg + If Vartype(poDate) <> 'O' + Return + Endif + + IncarcaLiniiFacturaEditare(poDate, lnIdVanzare) && ofacturare_editare.prg + + update_jtva_coloane([JV], [jtva_coloane_temp]) && updateserver.prg + update_saft_taxtable() && updateserver.prg + If Used('jtva_coloane') + Use In jtva_coloane + Endif + If poDate.tva_incasare = 0 + Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + Else + Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + Endif + + loForm = Createobject('frm_facturare_articole2') + loForm.ndiscfactron = pnDiscountRon + loForm.ndiscfactval = pnDiscountValuta + loForm.do_calculeaza_totaluri() + *!* S8b: instantaneul se ia AICI - primul punct unde discountul e deja corect si formularul + *!* inca nu a fost aratat; ramane in viata cat formularul e deschis (Show() e modal) + poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, lnIdVanzare, lnIdFact, lnCod, pnAn, pnLuna) + loForm.Show() + ENDPROC + PROCEDURE do_listare *!* 26.11.2019 *!* marius.mutu @@ -4929,12 +5093,14 @@ DEFINE CLASS frm_facturi AS _frmbase OF "_frm_base.vcx" PROCEDURE inainte_de_do_modifica Local lnOptiune - lnOptiune = xmenu('Modificare \ succes raportat in VFP. + +## De ce nu potriveste predicatul (cauza uzuala) + +Santinela pusa doar pe coloana, nu si pe parametru: + + AND NVL(A.CONT, 'XXXX') = V_CONT + +VFP trimite sir gol pentru campul necompletat, iar in Oracle sirul gol **este NULL**; `'XXXX' = NULL` +da UNKNOWN, deci zero randuri. Corect e pe amandoua: + + AND NVL(A.CONT, 'XXXX') = NVL(V_CONT, 'XXXX') + +Pe `ID_GESTIUNE` acelasi tipar merge, fiindca acolo VFP chiar trimite santinela `-1000`. + +Cauza inrudita, acelasi simptom: un camp lipsa din lista de insert a cursorului, pe o coloana +numerica **fara `NULL`** - ramane `0` tacit, nu NULL si nu eroare, si predicatul cade pe `0`. + +## Ce se face, in ordinea asta + +1. **Intai garda, apoi cauza.** Infasoara `SELECT ... INTO` in + `BEGIN ... EXCEPTION WHEN NO_DATA_FOUND THEN RAISE_APPLICATION_ERROR(-20000, '... (FACT-0xx : ' || || ')')`. + Fara ea, orice reparatie de cauza ramane neverificabila: mecanismul care ascunde defectul e inca + acolo. Codul `FACT-0xx` **se cauta liber in `USER_SOURCE`**, nu se presupune ca e liber. +2. Abia apoi simetrizeaza predicatul. +3. **Asertiune pe NUMARUL DE LINII** in testul de flux. Exact piesa care lipsea: identitatea + documentului si legaturile lui se pastrau corect, deci toate asertiunile existente treceau. + +## Cum se cauta preventiv + +In `USER_SOURCE`: fiecare `SELECT ... INTO` fara `EXCEPTION` in ramura lui, si fiecare predicat de +forma `NVL(, ) = `. + +Precedent: `PACK_FACTURARE.adauga_articol_factura`, ramura `ntip = 4` (facturare din avize) - un +document reemis cu 2 linii din 4, nedetectat de doua sweep-uri la rand. Reparat 04.09.2026 cu +`FACT-030`. diff --git a/docs/conventie_encoding_cp1252.md b/docs/conventie_encoding_cp1252.md index a9982d0..8f5f01f 100644 --- a/docs/conventie_encoding_cp1252.md +++ b/docs/conventie_encoding_cp1252.md @@ -40,7 +40,13 @@ od -An -tx1 | tr ' ' '\n' | grep -v '^$' | awk '$1>"7f"' | sort | uniq La stricare censul CRESTE (un octet devine trei) - nu urmari doar scaderile. Cauta explicit secventa `EF BF BD`, nu tiparul generic `C3`/`C4`/`C5`/`C8` (acela apare si in UTF-8 legitim -din cod). +din cod). Decodat cp1250, `EF BF BD` apare ca "ĂŻÂżÂœ" in caption. + +Varianta veche, utila cand cauti pozitia exacta (linia) a unui octet suspect: + +```bash +perl -ne 'print "$.\n" if /[\x80-\xFF]/' +``` ## Reparare @@ -50,7 +56,12 @@ oarba cu 0xBA strica alte litere din alte pozitii. Ia octetul corect per pozitie PowerShell 5.1 (adauga BOM si re-encodeaza). Scrie inapoi ca bytes cp1250 explicit, apoi `txt2vcx.ps1` + fidelity check. -Cazul simplu (s-a pierdut doar 0xBA), inlocuire punctuala pe octet: +Coruperea se repeta la FIECARE scriere, nu doar la prima: editeaza tot ce ai de editat, verifica +byte-level, si repara o singura data DUPA ultima scriere - nu intre editari. + +Cazul simplu (s-a pierdut doar un octet, cel original cunoscut, ex. 0xBA pentru s-cu-virgula), +inlocuire punctuala pe secventa corupta - acelasi risc de coliziune poate afecta si alte fisiere +cu acelasi octet, nu doar pozitia curenta: ```bash perl -e 'binmode(STDIN);binmode(STDOUT);local $/;$_=;s/\xEF\xBF\xBD/\xBA/g;print' < f > f.tmp diff --git a/docs/depanare_testare_vfp.md b/docs/depanare_testare_vfp.md index 6736083..8e9d16f 100644 --- a/docs/depanare_testare_vfp.md +++ b/docs/depanare_testare_vfp.md @@ -158,3 +158,11 @@ Cand un bug apare "de azi", compara cu clasa veche fara sa atingi SVN: Platit pe testarea VIES (23.08.2026): doua blocaje de 90s+; dupa stergerea celor doua fisiere, exact acelasi script a rulat in 1.19s. Completeaza punctul (1) din capcana precedenta: nu doar "exista `.ERR`?", ci si "e `.ERR`-ul de la rularea asta sau de la una anterioara?". +- **`TYPE()` pe un obiect nu intoarce `'O'` pentru orice membru.** `.Objects` la un container + (`Form`, `Container`, `Grid`) e *Objects Array*: `TYPE('loO.Objects')` da `'A'`, nu `'O'`. O + garda `IF TYPE('loO.Objects') = 'O'` e deci mereu falsa, iar `AND`-ul scurtcircuiteaza testul + corect de dupa ea - recursia pe arborele de controale nu porneste niciodata, **fara eroare si + fara nimic in log**; singurul simptom e un dump care contine doar nivelul 1. Testeaza pe ce + folosesti efectiv: `TYPE('loO.Objects.Count') = 'N'` e `'U'` daca lantul punctat nu exista, + deci e si suficient, si independent de litera de tip. Aceeasi prudenta la `TYPE('loO.Value')` + (tipul variaza cu continutul) si `TYPE('loO.Visible')`. diff --git a/docs/instalare-ponytail.md b/docs/instalare-ponytail.md new file mode 100644 index 0000000..36f3214 --- /dev/null +++ b/docs/instalare-ponytail.md @@ -0,0 +1,50 @@ +# Instalare plugin Ponytail (Claude Code) + +Plugin de nivel user (nu de proiect) care activeaza modul "lazy senior developer" descris in +`~/.claude/CLAUDE.md`. Se instaleaza o singura data per calculator, in contul Windows al +utilizatorului. + +## Pasi + +Din orice sesiune `claude` (sau `claude -p` cu `--dangerously-skip-permissions` daca ruleaza +neatended): + +``` +claude plugin marketplace add DietrichGebert/ponytail +claude plugin install ponytail@ponytail +``` + +Reporneste sesiunea Claude Code dupa instalare (plugin-urile se incarca la pornire). + +## Verificare + +``` +claude plugin list +``` + +Trebuie sa apara `ponytail@ponytail` ca instalat si activ. Sau verifica direct in +`~/.claude/settings.json`: + +```json +"enabledPlugins": { + "ponytail@ponytail": true +}, +"extraKnownMarketplaces": { + "ponytail": { + "source": { "source": "github", "repo": "DietrichGebert/ponytail" } + } +} +``` + +## Nivel implicit + +Nivelul (`lite|full|ultra`) e setat per sesiune cu `/ponytail ` sau ramane pe default-ul +plugin-ului. Regulile de scara YAGNI/reuse-first pentru proiectele ROA sunt in +`reguli_lucru.md`, punctul 3 ("Scara ponytail") — se aplica dupa instalare, nu fac parte din +instalarea in sine. + +## Dezinstalare + +``` +claude plugin uninstall ponytail@ponytail +``` diff --git a/docs/prompt_recreare_statusline.md b/docs/prompt_recreare_statusline.md new file mode 100644 index 0000000..450503f --- /dev/null +++ b/docs/prompt_recreare_statusline.md @@ -0,0 +1,246 @@ +# Prompt pentru alta sesiune: recreeaza statusline-ul Claude Code + +Copiaza tot ce urmeaza si trimite-l ca prompt intr-o sesiune Claude Code noua +(pe alta masina/user), ca sa recreeze exact statusline-ul curent (Windows / Git Bash). + +--- + +Vreau sa configurezi un statusline custom pentru Claude Code, pe Windows cu Git Bash. + +1. Verifica ca exista `jq.exe` in `~/.claude/bin/jq.exe`. Daca nu exista, descarca + binarul oficial jq pentru Windows (jq-win64.exe de pe github.com/jqlang/jq/releases) + si salveaza-l acolo ca `jq.exe`. + +2. Creeaza fisierul `~/.claude/statusline.sh` (bash, LF, executabil) cu continutul de mai jos. + +3. In `~/.claude/settings.json`, adauga/actualizeaza cheia de nivel radacina: + ```json + "statusLine": { + "type": "command", + "command": "C:/Users//.claude/statusline.sh" + } + ``` + (inlocuieste `` cu userul curent; foloseste slash-uri, nu backslash). + +Ce face scriptul: +- Linia 1: model | ctx folosit/total si % din fereastra | proiect (branch git, cu `*` daca e dirty) +- Linia 2: trei bare de puncte (10 puncte fiecare) pentru consum curent (5h), saptamanal (7 zile) + si sonnet (7 zile) — procent + timp pana la reset, in format `●●●○○○○○○○ 30% â†ș 2hr 15min` +- Cele trei procente vin din `/api/oauth/usage` (acelasi endpoint ca ecranul `/usage`), + cu cache de 10 minute in `~/.claude/.statusline-usage.json` si backoff la 429/eroare + (20 min, respectiv 5 min), ca sa nu loveasca rate-limit-ul la fiecare prompt. +- Pana la primul fetch reusit, current/weekly cad back pe `rate_limits` din JSON-ul primit pe stdin. +- Token-ul OAuth se ia din `~/.claude/.credentials.json` (`claudeAiOauth.accessToken`). +- La inceput reface PATH-ul (`$HOME/.claude/bin:/usr/bin:/bin:$PATH`), pentru ca Claude Code + lanseaza scriptul ca shell non-login/non-interactiv, deci profilul Git Bash nu se incarca + si PATH-ul nu are coreutils. + +Continutul complet al `~/.claude/statusline.sh`: + +```bash +#!/bin/bash +# Claude Code Statusline (Windows / Git Bash) +# Line 1: Model | ctx 33K/1M 3% | project (branch*) +# Line 2: current 24% â†ș 3hr │ weekly 4% â†ș Thu 7pm │ sonnet 2% â†ș Thu 7pm +# +# All three usage figures come from /api/oauth/usage -- the same source as the +# `/usage` screen -- so the numbers match it exactly. That endpoint is rate- +# limited, so the result is cached for 10 min; on failure the last good values +# are kept. Until the first successful fetch, current/weekly fall back to the +# `rate_limits` object on stdin (slightly different snapshot, but never blank). + +set -o pipefail + +# Claude Code spawns this as a non-login, non-interactive shell, so Git Bash's +# profile is never sourced and PATH has no coreutils. Restore them explicitly, +# plus the bundled jq.exe in ~/.claude/bin. +export PATH="$HOME/.claude/bin:/usr/bin:/bin:$PATH" + +input=$(cat) + +# Validate JSON +if ! echo "$input" | jq -e . >/dev/null 2>&1; then + printf '\033[90mLoading...\033[0m' + exit 0 +fi + +# --- Context / project (line 1) --- +model=$(echo "$input" | jq -r '.model.display_name // "?"') +workdir=$(echo "$input" | jq -r '.workspace.current_dir // ""') +project=$(basename "$workdir" 2>/dev/null) || project="?" + +ctx_pct=$(echo "$input" | jq -r '(.context_window.used_percentage // 0) | floor') +[[ "$ctx_pct" =~ ^[0-9]+$ ]] || ctx_pct=0 + +ctx_size=$(echo "$input" | jq -r '.context_window.context_window_size // 0') +ctx_input=$(echo "$input" | jq -r '.context_window.current_usage.input_tokens // 0') +ctx_output=$(echo "$input" | jq -r '.context_window.current_usage.output_tokens // 0') +ctx_cache_create=$(echo "$input" | jq -r '.context_window.current_usage.cache_creation_input_tokens // 0') +ctx_cache_read=$(echo "$input" | jq -r '.context_window.current_usage.cache_read_input_tokens // 0') +ctx_used=$(( ctx_input + ctx_output + ctx_cache_create + ctx_cache_read )) + +fmt_tokens() { + local n=$1 + if [ "$n" -ge 1000000 ]; then printf "%dM" $(( n / 1000000 )) + elif [ "$n" -ge 1000 ]; then printf "%dK" $(( n / 1000 )) + else printf "%d" "$n"; fi +} +ctx_used_fmt=$(fmt_tokens "$ctx_used") +ctx_size_fmt=$(fmt_tokens "$ctx_size") + +# Git branch with dirty marker +git_branch="" +if [ -n "$workdir" ] && [ -d "$workdir" ]; then + git_branch=$(cd "$workdir" 2>/dev/null && git -c gc.auto=0 rev-parse --abbrev-ref HEAD 2>/dev/null) || git_branch="" + if [ -n "$git_branch" ]; then + git_dirty=$(cd "$workdir" 2>/dev/null && git -c gc.auto=0 status --porcelain 2>/dev/null | head -1) + [ -n "$git_dirty" ] && git_branch="${git_branch}*" + fi +fi + +# --- Usage: all three figures from /api/oauth/usage, cached --- +USAGE_CACHE="$HOME/.claude/.statusline-usage.json" +USAGE_REFRESH=600 # refresh at most every 10 min +USAGE_BACKOFF_429=1200 # after a rate-limit, wait 20 min before retrying +USAGE_BACKOFF_ERR=300 # after any other error, wait 5 min + +now=$(date +%s) +c5p=""; c5r=""; c7p=""; c7r=""; csp=""; csr=""; fetched=0; retry=0 + +read_usage_cache() { + [ -f "$USAGE_CACHE" ] || return + c5p=$(jq -r '.five_hour_pct // ""' "$USAGE_CACHE" 2>/dev/null) + c5r=$(jq -r '.five_hour_reset // ""' "$USAGE_CACHE" 2>/dev/null) + c7p=$(jq -r '.seven_day_pct // ""' "$USAGE_CACHE" 2>/dev/null) + c7r=$(jq -r '.seven_day_reset // ""' "$USAGE_CACHE" 2>/dev/null) + csp=$(jq -r '.sonnet_pct // ""' "$USAGE_CACHE" 2>/dev/null) + csr=$(jq -r '.sonnet_reset // ""' "$USAGE_CACHE" 2>/dev/null) + fetched=$(jq -r '(.fetched_at // 0) | floor' "$USAGE_CACHE" 2>/dev/null || echo 0) + retry=$(jq -r '(.retry_until // 0) | floor' "$USAGE_CACHE" 2>/dev/null || echo 0) +} +read_usage_cache +[[ "$fetched" =~ ^[0-9]+$ ]] || fetched=0 +[[ "$retry" =~ ^[0-9]+$ ]] || retry=0 + +write_usage_cache() { # 5p 5r 7p 7r sp sr fetched_at retry_until + printf '{"five_hour_pct":"%s","five_hour_reset":"%s","seven_day_pct":"%s","seven_day_reset":"%s","sonnet_pct":"%s","sonnet_reset":"%s","fetched_at":%s,"retry_until":%s}\n' \ + "$1" "$2" "$3" "$4" "$5" "$6" "$7" "$8" > "$USAGE_CACHE" +} + +refresh_usage() { + local creds="$HOME/.claude/.credentials.json" token tmp http + [ -f "$creds" ] || return + token=$(jq -r '.claudeAiOauth.accessToken // empty' "$creds" 2>/dev/null) + [ -n "$token" ] || return + tmp="$HOME/.claude/.statusline-usage.tmp.$$" + http=$(curl -s -o "$tmp" -w '%{http_code}' --max-time 3 \ + -H "Authorization: Bearer $token" \ + -H "anthropic-beta: oauth-2025-04-20" \ + -H "Content-Type: application/json" \ + "https://api.anthropic.com/api/oauth/usage" 2>/dev/null) + if [ "$http" = "200" ]; then + local p5 r5 p7 r7 ps rs + p5=$(jq -r 'if .five_hour.utilization!=null then (.five_hour.utilization|floor) else "" end' "$tmp" 2>/dev/null) + r5=$(jq -r '.five_hour.resets_at // ""' "$tmp" 2>/dev/null) + p7=$(jq -r 'if .seven_day.utilization!=null then (.seven_day.utilization|floor) else "" end' "$tmp" 2>/dev/null) + r7=$(jq -r '.seven_day.resets_at // ""' "$tmp" 2>/dev/null) + ps=$(jq -r 'if .seven_day_sonnet.utilization!=null then (.seven_day_sonnet.utilization|floor) else "" end' "$tmp" 2>/dev/null) + rs=$(jq -r '.seven_day_sonnet.resets_at // ""' "$tmp" 2>/dev/null) + write_usage_cache "$p5" "$r5" "$p7" "$r7" "$ps" "$rs" "$now" 0 + elif [ "$http" = "429" ]; then + write_usage_cache "$c5p" "$c5r" "$c7p" "$c7r" "$csp" "$csr" "$fetched" "$(( now + USAGE_BACKOFF_429 ))" + else + write_usage_cache "$c5p" "$c5r" "$c7p" "$c7r" "$csp" "$csr" "$fetched" "$(( now + USAGE_BACKOFF_ERR ))" + fi + rm -f "$tmp" +} + +if [ "$(( now - fetched ))" -gt "$USAGE_REFRESH" ] && [ "$now" -gt "$retry" ]; then + refresh_usage + read_usage_cache +fi + +# current / weekly: use API cache; fall back to stdin rate_limits if not yet fetched +if [ -n "$c5p" ]; then + five_hr_pct=$c5p; five_hr_reset=$c5r +else + five_hr_pct=$(echo "$input" | jq -r '(.rate_limits.five_hour.used_percentage // 0) | floor') + five_hr_reset=$(echo "$input" | jq -r '.rate_limits.five_hour.resets_at // ""') +fi +if [ -n "$c7p" ]; then + weekly_pct=$c7p; weekly_reset=$c7r +else + weekly_pct=$(echo "$input" | jq -r '(.rate_limits.seven_day.used_percentage // 0) | floor') + weekly_reset=$(echo "$input" | jq -r '.rate_limits.seven_day.resets_at // ""') +fi +# sonnet: only available from the API +sonnet_pct=${csp:-0}; sonnet_reset=$csr + +[[ "$five_hr_pct" =~ ^[0-9]+$ ]] || five_hr_pct=0 +[[ "$weekly_pct" =~ ^[0-9]+$ ]] || weekly_pct=0 +[[ "$sonnet_pct" =~ ^[0-9]+$ ]] || sonnet_pct=0 + +# --- reset-time formatting (accepts epoch seconds or ISO string) --- +to_epoch() { + local v="${1%%.*}" + if [ -z "$v" ] || [ "$v" = "null" ]; then return 1; fi + if [[ "$v" =~ ^[0-9]+$ ]]; then printf '%s' "$v" + else date -d "$1" +%s 2>/dev/null || return 1; fi +} + +fmt_reset() { + # No TZ= : Git Bash's date has no zoneinfo DB, but with TZ unset it uses the + # Windows system timezone correctly. Setting TZ=Europe/... falls back to UTC. + local e + e=$(to_epoch "$1") || { printf '%s' "--"; return; } + date -d "@$e" "+%a %-I:%M%P" 2>/dev/null || printf '%s' "--" +} + +fmt_remaining() { + local e now_ts rem rh rm rd + e=$(to_epoch "$1") || { printf '%s' "--"; return; } + now_ts=$(date +%s) + if [ "$e" -gt "$now_ts" ]; then + rem=$(( e - now_ts )); rh=$(( rem / 3600 )); rm=$(( (rem % 3600) / 60 )) + if [ "$rh" -gt 24 ]; then + rd=$(( rh / 24 )); rh=$(( rh % 24 )); printf "%dd %dh" "$rd" "$rh" + elif [ "$rh" -gt 0 ]; then printf "%dhr %dmin" "$rh" "$rm" + else printf "%dmin" "$rm"; fi + else printf "resetting"; fi +} + +five_hr_remain=$(fmt_remaining "$five_hr_reset") +weekly_reset_str=$(fmt_reset "$weekly_reset") +sonnet_reset_str=$(fmt_reset "$sonnet_reset") + +# --- dot bar --- +DOT_TOTAL=10 +make_dots() { + local pct=$1 filled i dots="" + filled=$(( pct * DOT_TOTAL / 100 )) + [ "$filled" -gt "$DOT_TOTAL" ] && filled=$DOT_TOTAL + [ "$filled" -lt 0 ] && filled=0 + for (( i=0; i refolosesti; 3) o + functie VFP nativa o face; 4) se rezolva pe Oracle (view, constrangere, pachet) in loc de cod + client; 5) o linie; 6) abia apoi minimul care merge. Scurteaza SOLUTIA, nu cititul - intai + urmaresti fluxul real atins. Nu se simplifica niciodata: garzile pe NULL, validarile, tratarea + erorilor, drepturile de acces, ce s-a cerut explicit. + Abateri obligatorii fata de plugin: (a) **fara comentarii `ponytail:`** in cod (regula 2) - + scurtatura deliberata si limita ei se noteaza in `docs\progres.md`, deci `/ponytail-debt` nu + are ce culege aici; (b) proba unei logici noi e un script headless (regulile 4 si 8), nu + `test_*.py`; (c) handoff-urile, rapoartele din `docs\` si patch-urile sunt output cerut + explicit - regula "cod intai, maxim trei randuri" nu li se aplica; (d) `/ponytail-review` pe + diff-ul rundei inainte de commit e util, dar `delete:`/`yagni:` sunt IPOTEZE, nu constatari: in + `COMUN` apelantii sunt in toate produsele, deci cauti in tot `D:\ROA` inainte sa stergi, iar o + garda fara caz in datele de test nu e garda moarta (regula 6); `/ponytail-audit` pe tot + arborele nu se ruleaza aici. 4. Testare headless (fara IDE): `vfp9.exe -A -T "" ` din PowerShell. Mediu, sabloane, capcane, depanare: `depanare_testare_vfp.md`. + Rularile intermediare acopera doar familiile de teste atinse de modificarea curenta; suita + completa, inclusiv testele de garda pe zonele vecine, se ruleaza doar la rularea finala — + garzile exista fiindca schimbarile cad de regula in cod partajat (`COMUN`), vizibil in toate + produsele, dar costul lor nu se plateste la fiecare rulare intermediara. Ideal, doar testele + atinse direct (de regula 3-10), nu toata familia. + Un test normal dureaza 1-5s — ce umfla o rulare nu e testarea, ci asteptarea unui test atarnat. + La rulari intermediare: timeout **90s**/test (ce trece de atat e atarnat, nu lent) si pauza + **0,5s** intre teste, nu implicitul de 12 minute / 3s, rezervat rularii finale unde chiar + conteaza sa distingi "atarnat" de "lent". Tinta: o rulare intermediara sta in secunde-minute, + nu ore — daca depaseste, lista e prea larga sau timeout-ul prea mare. 5. Editare .vcx/.scx pe text (cache, cp1250 byte-safe, fidelity-check): `flux-editare-vfp-text.md`. Cautare in binare: `cautare_vcx_vct.md`. Versiunile `.??2` sunt instantanee, pot fi mai vechi decat binarul — verifica mtime inainte de concluzii; continutul real e in `.PJX`. @@ -61,12 +87,14 @@ tokens/subagent), nu unul singur cu context acumulat; handoff compact pe disc. Verificarea a ce se intoarce si modelul de lucru (backlog de story-uri mici): `orchestrare-subagenti.md`. 7. Conventii obligatorii, de citit cand atingi zona respectiva: - - editezi `.vc2`/`.sc2` sau `.prg` cu diacritice (ex. `programe\ocautare.prg`) -> fisierele - sunt **cp1250** desi antetul FoxBin2Prg declara `CPID="1252"`; Edit/Write corup TOT fisierul - (nu doar linia atinsa) la fiecare scriere - scrie continut nou strict ASCII. Cens obligatoriu + - editezi `.vc2`/`.sc2` sau `.prg` cu diacritice (ex. `programe\ocautare.prg`, unde `s`-urile cu + virgula din `masina`/`si contul`/`transa` sunt octetul `0xBA`) -> fisierele sunt **cp1250** + desi antetul FoxBin2Prg declara `CPID="1252"`; Edit/Write corup TOT fisierul (nu doar linia + atinsa), ireversibil, la fiecare scriere - scrie continut nou strict ASCII. Cens obligatoriu **inainte SI dupa** fiecare editare (la stricare CRESTE, nu scade): - `od -An -tx1 | tr ' ' '\n' | grep -v '^$' | awk '$1>"7f"' | sort | uniq -c`. Tabel - de octeti si reparare -> `conventie_encoding_cp1252.md`; + `od -An -tx1 | tr ' ' '\n' | grep -v '^$' | awk '$1>"7f"' | sort | uniq -c`. Tabelul + complet de octeti, sensul censului la stricare si procedura de recuperare din git/svn -> + `conventie_encoding_cp1252.md`; - adaugi o PROPRIETATE sau o METODA noua intr-o clasa `.vc2`/`.sc2` -> `flux-editare-vfp-text.md`, sectiunea "Membri noi de clasa": fara intrarea `*p:`/`*m:` in `*` membrul trece fidelity-check-ul, dar VFP nu-l vede si prima salvare din IDE il sterge tacut; @@ -80,6 +108,8 @@ - te conectezi la Oracle pe dev/test, alegi schema sau rulezi un script de pachet -> `conventie_mediu_oracle.md`; - garzi pe valori NULL din Oracle -> `conventie_null_vfp.md`; + - procedura PL/SQL cu `SELECT ... INTO` chemata din VFP (linii pierdute tacut) -> + `capcana_sqlexec_no_data_found.md`; - export date din Oracle -> `oracle_export.md`; - actualizarea ROA nu se finalizeaza (job update, PACK_UPDATE) -> `depanare-pack-update.md`; - modifici schema Oracle (tabele/view-uri/pachete) -> `scripturi-migrare-db.md`. diff --git a/docs/tipuri_documente_facturare.md b/docs/tipuri_documente_facturare.md index d25ffb8..fad114d 100644 --- a/docs/tipuri_documente_facturare.md +++ b/docs/tipuri_documente_facturare.md @@ -112,6 +112,28 @@ fluxuri valorice. in urma. Inainte de a te baza pe o linie din el pentru o modificare, confirm-o pe cod (`initializeaza_date_factura`, `CASE`-urile din view-uri) sau pe `XSETS`. +## Domeniul regenerabil (planul #13) + +Planul #13 introduce editarea articolelor unui document deja emis prin stergere + reemitere +(acelasi numar de document, rand nou in `VANZARI`). Domeniul acestui mecanism nu acopera tot +`VANZARI.TIP`: + +- **In afara domeniului, prin decizie explicita a lui Marius** (confirmat de inventarul de FK din + S11): documentele legate de `REST_NOTE_PLATA` (modul restaurant, `TIP` 46) si de + `IPS_VOYAGES_VANZARI` (facturarea voiajelor din ROAACNPRO, `TIP` 51). Pentru ele ramane calea + veche de editare pe loc (#6); intrarea in formularul nou le refuza explicit, nu doar le ignora. +- **Declarate explicit neacoperite** (recomandare "nu acum"): tipurile **48/49** (custodie) - + incarcarea unui document existent in formularul nou nu e implementata pentru ele. Tinta unica + pentru editare ramane `frm_facturare_articole2` (formularul nou) - `frm_facturare_articole` + (formularul vechi) nu mai primeste cod nou. +- **Datorie deschisa, nu excludere**: documentele CONTRACT cu linii de rata + (`VANZARI_DETALII.ID_RATA <> 0`) esueaza la reemitere cu eroarea Oracle `Too many columns.` - + 19 din cele 21 de documente CONTRACT vii sunt in acest perimetru. Cauza-radacina **nu e + dovedita**; nu exista azi o reparatie. + +Restul tipurilor din tabelele de mai sus sunt in domeniul regenerabil, verificat pe cele patru +familii de scriere (AVIZ, COMANDA, CONTRACT, ELSE). + ## Legaturi - `scripturi-migrare-db.md` — sursa de referinta pentru DDL e `MARIUSM_AUTO`, nu o schema de client. diff --git a/docs/todos.txt b/docs/todos.txt index 1f21fee..e0e0772 100644 --- a/docs/todos.txt +++ b/docs/todos.txt @@ -24,7 +24,7 @@ DONE 9. ROAGEST - MODIFICARE REGISTRU JURNAL - SA SE POATA MODIFICA SI "NNIR" in 10. ROAFACTURARE - Integrare pagina contracte si rapoarte contracte in ROAFACTURARE, similar COMENZI in ROAFACTURARE - facturare pe baza de comenzi/contracte. trebuie comasate si drepturile pe obiectele din roacontracte cu obiectele noi din ROAFACTURARE. -11. ROAFACTURARE - Integrare politici de preturi in ROAFACTURARE - sunt numai editari de liste de preturi, note contabile, nomenclator articole, drepturi pe liste de preturi, care toate se folosesc numai in programul ROAFACTURARE +11. ROAFACTURARE - Integrare politici de preturi in ROAFACTURARE - sunt numai editari de liste de preturi, note contabile, nomenclator articole, drepturi pe liste de preturi, care toate se folosesc numai in programul ROAFACTURARE. 12. ROAFACTURARE - sa pot sa folosesc direct nomenclatorul de articole pe post de lista de preturi, sa nu mai definesc liste de preturi, note contabile asociate. Acum am un echivalent (lista de articole din stoc ca o lista de preturi virtuala) @@ -90,3 +90,14 @@ DONE 21. ROACONT - in formularul de verificare coduri fiscale, ar trebui sa fie 39. ROA - asistent de suport pe documentatia proprie; butonul de chat exista deja in mesajele de eroare, ii lipseste continutul (manual, versiuni, dictionar de erori). (rec_directie_roacont_2026_09.md, 3.6) 40. ROACONT - e-Transport: azi nu exista nimic, concurenta are modul dedicat. (rec_directie_roacont_2026_09.md, 3.7) + +41. ROACONT - daca se permite modificarea manuala a sumelor de la TVA, nu se poate si o atentionare daca TVA este altul decat procentul din explicatia de TVA selectata? + +42. ROAFACTURARE - configurarea initiala pentru a putea factura un articol - este foarte complexa si vreau mai fluid, poate si cu un wizzard +- definire grup TOTAL in ROADEF si asociere utilizatori in grupul TOTAL +- creare articol in ROAPRETURI +- creare nota contabila vanzare +- creare politica preturi si introducere articol +- definire serii numere facturi +- completare optiuni document factura, aviz, documente incasare, bon fiscal, bon pos +Poate un wizzard diff --git a/programe/ofacturare.prg b/programe/ofacturare.prg index 69b4132..86ce2ea 100644 --- a/programe/ofacturare.prg +++ b/programe/ofacturare.prg @@ -70,35 +70,48 @@ *!* listeaza_ofacturare *!* efactura. se listeaza valori in valuta pentru factura in valuta +*!* 20.08.2026 +*!* marius.mutu +*!* factureaza - unificat cu factureaza2 (S2); intrarea separata din meniu (decizia 67) seteaza variabila privata a apelantului, care alege formularul de articole (frm_facturare_articole/2), nu mai duplica procedura + +*!* 21.08.2026 +*!* marius.mutu +*!* incarca_cursor_articole - functie noua, extrasa din bucla lui factureaza: construieste interogarea Oracle dupa +*!* tipul documentului si cursoarele derivate (crsfactura, crscursuri, crspolitici, crscontracte, crsgestiunidest), +*!* ca sa poata fi apelata si din formularul unificat, nu doar din factureaza; foloseste poDate-ul Private al +*!* apelantului (nu il primeste ca parametru), la fel ca parametrii SQL ?poDate.* rezolvati de oExecute + +*!* 31.08.2026 +*!* marius.mutu +*!* incarca_cursor_articole - proprietate noua loRezultat.lForteazaCursVizibil, .T. la eroarea Oracle -20005; +*!* apelantul cu Thisform (frm_facturare_articole2.do_incarca_articole) o citeste ca sa reafiseze campul cursului + +*!* 31.08.2026 +*!* marius.mutu +*!* configurare_tip_document, creeaza_configuratie_tip_document - cursor de configurare per tip de document +*!* (titlu, mesaj de stoc, coloana serie, butoane, tip_doc), creat lenes la prima cerere + *************************************************************************************************************** **** Proceduri: **** factureaza +**** incarca_cursor_articole **** completeaza_date_aviz_retur **** listeaza_ofacturare **** listeaza_oconformitate *************************************************************************************************************** ******************************************** INCEPUT: factureaza ********************************************** Procedure factureaza - Lparameters tnTip, toFactura + Lparameters tnTip, toFactura, toSursa * toFactura - daca se doreste copierea unei facturi anterioare - *** 08.06.2017 - *** Daca exista optiunea gnFacturareNou = 1 atunci lansez formularul frm_facturare_articole2 in loc de frm_facturare_articole - If Type('gnFacturareNou') = 'N' And m.gnFacturareNou = 1 - If AMESSAGEBOX('Facturare noua (DA) sau standard (NU)?', 4 + 32, _Screen.Caption) = 6 - factureaza2(m.tnTip) - Return - Endif - Endif - Private pnButon, poDate, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil, poGeneratorNumere *!* modificare v 2.0.67 *!* PRIVATE pnTipFacturare *!* pnTipFacturare = 0 *!* modificare v 2.0.67 ^ - Local lcCursor, lcObiect, lcObject, lcSqlCursor, lnSucces, lnTipTemp, loArticole, ltDataOra + Local lcCursor, lcObiect, lcObject, lcSqlCursor, lnSucces, lnTipTemp, ltDataOra, loRezArticole Local llCopiere *:Global ofrmceredate, ofrmdetaliifactura If glLunaInchisa @@ -181,7 +194,7 @@ Procedure factureaza Endif If Type('poDate') <> 'O' - poDate = Createobject("oDateFactura", lnIdSet, tnTip) + poDate = Createobject("oDateFactura", lnIdSet, tnTip, toSursa) poGeneratorNumere = Createobject("oGeneratorNumere") Endif Do Case @@ -214,25 +227,6 @@ Procedure factureaza poDateGestiuneDest = Createobject("oDateGestiune") Endif - Do Case - Case tnTip = 27 - lcObiect = [frm_date_aviz_lucrare] - Case tnTip = 30 - lcObiect = [frm_date_aviz_lucrare] - Case tnTip < 21 Or Inlist(tnTip, 45, 48, 49, 51, 52) && modificare : 45 (v2.0.87), 48 (v2.0.93), 49 (v2.0.95) - lcObiect = [frm_date_factura] - Otherwise - lcObiect = [frm_date_aviz] - Endcase - - pnButon = 1 - If Inlist(lcObiect, [frm_date_factura], [frm_date_aviz]) - ofrmceredate = Createobject(m.lcObiect, toFactura) - Else - ofrmceredate = Createobject(m.lcObiect) - Endif - ofrmceredate.ntip = tnTip - ofrmceredate.Show() *!* modificare v 2.2.0 Use In (Select('jtva_coloane')) @@ -245,241 +239,120 @@ Procedure factureaza Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) AND !'RORTC'$UPPER(coloana_jv) Into Cursor jtva_coloane Endif *!* modificare v 2.2.0 ^ - Release ofrmceredate - If pnButon = 2 - poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) - - *!* modificare v 2.0.67 - If Used('crsCtrTemp') - Use In ('crsCtrTemp') + + Local llFacturareNoua + llFacturareNoua = (Type('plFacturareNoua') = 'L' And m.plFacturareNoua And !Inlist(tnTip, 27, 30)) + If llFacturareNoua + pnButon = 1 + creeaza_facturacrs([crsfactura]) + ofrmdetaliifactura = Createobject('frm_facturare_articole2') + ofrmdetaliifactura.Show() + If pnButon <> 1 + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + If Used('crsCtrTemp') + Use In ('crsCtrTemp') + Endif + Release poDate, poGeneratorNumere + Return Endif - *!* modificare v 2.0.67 ^ - Release poDate, poGeneratorNumere - Return + lnSucces = 0 + loRezArticole = Createobject('Empty') + AddProperty(loRezArticole, 'lArticole', .T.) Else - poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) - Endif + Do Case + Case tnTip = 27 + lcObiect = [frm_date_aviz_lucrare] + Case tnTip = 30 + lcObiect = [frm_date_aviz_lucrare] + Case tnTip < 21 Or Inlist(tnTip, 45, 48, 49, 51, 52) && modificare : 45 (v2.0.87), 48 (v2.0.93), 49 (v2.0.95) + lcObiect = [frm_date_factura] + Otherwise + lcObiect = [frm_date_aviz] + Endcase - *!* modificare v 2.0.67 - *!* pnTipFacturare = 0 - *!* modificare v 2.0.67 ^ - Do Case - Case m.llCopiere - lcSqlCursor = [{call pack_facturare.cursor_retur_document(?poDate.in_valuta,?poDate.listaid,1,?poDate.eProforma,?gnIdUtil)}] - - *!* modificare v 2.0.93 ; modificare v 2.0.95 : am adaugat 49 - Case Inlist(tnTip, 48, 49) - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_articole_k(?poDate.zi_curs,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] - *!* modificare v 2.0.93 ^ - *!* modificare v 2.0.87 - Case tnTip = 45 - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; - [?poDate.listaid,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] - *!* modificare v 2.0.87 ^ - Case Inlist(tnTip, 1, 22, 5, 29, 7, 10, 23) && lista de preturi - && modificare v 2.0.56 : am adaugat 10 - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; - [?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] - Case Inlist(tnTip, 2, 26, 6, 52) && contract - poDate.id_agent = 0 - *!* modificare v 2.0.67 - *!* lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_contract(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; - *!* [?poDate.listaid,?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?@pnTipFacturare,] + ; - *!* [?@poDate.id_agent,?@poDate.nume_agent)}] - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_contract(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; - [?poDate.listaid,?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?@poDate.id_agent,?@poDate.nume_agent)}] - *!* modificare v 2.0.67 ^ - Case Inlist(tnTip, 3, 21, 25, 28, 42, 47) && comenzi - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_comanda(?poDate.zi_curs,?poDate.tip,?poDate.listaid,?gnIdUtil)}] - Case tnTip = 4 && din avize - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}] - Case Inlist(tnTip, 41) && transfer intre subunitati pe baza de lista de preturi + retur transfer - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_gestiune(?poDate.zi_curs,?poDate.id_pol,] + ; - [?poDate.id_client,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] - Case tnTip = 30 && transfer intre subunitati pe baza de NIR - lcSqlCursor = [{call pack_facturare.cursor_aviz_nir(?poDate.id_client,?poDate.id_furnizor,?poDate.nrfactachi,?gnIdSucursala)}] - *!* modificare v 2.0.90 ^ - Case tnTip = 27 - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_lucrare(?poDate.zi_curs,?poDate.id_client,] + ; - [?poDate.id_lucrare,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] - *!* modificare v 2.0.56 - Case Inlist(tnTip, 8, 9, 24) && 8,9 = facturi de retur, 24 = aviz retur - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_retur(?poDate.in_valuta,?poDate.listaid,?gnIdUtil)}] - Endcase - - lcCursor = [crsarticole] - lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor) - - If lnSucces < 0 - AMESSAGEBOX(goExecutor.oPrelucrareEroare(), 16, "Eroare") - If goExecutor.nEroare = 20005 - vizualizeaza_curs(poDate.zi_curs) - ENDIF - *!* nu inchid crsCtrTemp - *!* modificare v 2.0.56 - *!* poGeneratorNumere.dezaloca_numar(pnIdTipDoc) - *!* modificare v 2.0.56 ^ - poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) && 29.03.2021 deblochez numarul ca sa il pot reda pe acelasi cand se reincarca formularul - Else - If Reccount(lcCursor) = 0 And (!Used(lcCursor + '1') Or (Used(lcCursor + '1') And Reccount(lcCursor + '1') = 0)) - AMESSAGEBOX("Nu exista articole pentru optiunile alese!", 48, "Atentie") + pnButon = 1 + If Inlist(lcObiect, [frm_date_factura], [frm_date_aviz]) + ofrmceredate = Createobject(m.lcObiect, toFactura) + Else + ofrmceredate = Createobject(m.lcObiect) + Endif + ofrmceredate.ntip = tnTip + ofrmceredate.Show() + Release ofrmceredate + If pnButon = 2 poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) - Use In (SELECT('crsCtrTemp')) - ELSE - - * Daca este o proforma, consider toate articolele negestionabile, pentru a nu mai alege din stoc - * 12.03.2021 - IF poDate.eProforma = 1 - UPDATE (m.lcCursor) SET gestionabil = 0 - GO TOP IN (m.lcCursor) - ENDIF - - creeaza_facturacrs([crsfactura]) - - If tnTip = 30 && Aviz din NIR - * populez factura cu articolele din NIR - Local lcIdJtva - Select (lcCursor) - Scan - Scatter Name loArticole Memo - Select crsfactura - update_jtva_coloane([JV], 'CrsCotaTva', 0) - Select CrsCotaTva - Locate For cota_tva = (loArticole.proc_tvav * 100 - 100) - If Found() - lcIdJtva = id_jtva_coloana - Else - lcIdJtva = Null - Endif - Use In CrsCotaTva - - Insert Into crsfactura ; - (id_c, id_temp, id_articol, id_gestiune, Cont, um, ; - id_valuta, gestionabil, tip_valuta, Curs, multiplicator, id_jtva_coloana, codmat, ; - pret_achizitie, pretd, id_valuta_d, denumire, pretftva, pretctva, valftva, valtva, valctva, ; - cantitate, discountftva, discountctva, valdiscountftva, valdiscounttva, ; - valdiscountctva, valdiminuatftva, valdiminuattva, valdiminuatctva, proc_tvav, cu_tva, serie, ; - id_set_fact, explicatie, id_pol, id_ctr ) ; - Values (; - loArticole.id_c, loArticole.id_c, loArticole.id_articol, loArticole.id_gestiune, loArticole.Cont, loArticole.um, ; - loArticole.id_valuta, loArticole.gestionabil, loArticole.tip_valuta, loArticole.Curs, ; - loArticole.multiplicator, lcIdJtva, Nvl(loArticole.codmat, ' '), ; - loArticole.preta, loArticole.pretd, loArticole.id_valuta_d, loArticole.denumire, ; - loArticole.pretftva, loArticole.pretctva, ; - Round(loArticole.cantitate * loArticole.pretftva, gnpc), ; - Round(loArticole.cantitate * loArticole.tvav, gnpc), ; - Round(loArticole.cantitate * loArticole.pretctva, gnpc), ; - loArticole.cantitate, 0, 0, 0, 0, ; - 0, Round(loArticole.cantitate * loArticole.pretftva, gnpc), Round(loArticole.cantitate * loArticole.tvav, gnpc), ; - Round(loArticole.cantitate * loArticole.pretctva, gnpc), loArticole.proc_tvav, loArticole.preturi_cu_tva, '', ; - Null, '', Null, Null) - - Select (lcCursor) - Endscan - Release lcIdJtva - Select crsfactura - Release loArticole - - ENDIF && tnTip = 30 - - If tnTip = 27 - lcObject = [frm_avizare_lucrare] - Create Cursor crsgestiunidest(id_gestiune N(20), nume_gestiune c(100)) - Select crsgestiunidest - Append Blank - Replace id_gestiune With - 9999, nume_gestiune With '' - Insert Into crsgestiunidest(id_gestiune, nume_gestiune) ; - Select Distinct id_gestiune, nume_gestiune From (lcCursor) Order By nume_gestiune - Else - lcObject = [frm_facturare_articole] - Endif - *!* modificare v 2.0.67 - *!* Endif - *!* modificare v 2.0.67 ^ - *!* modificare v 2.0.56 - *!* If Type('crsarticole.curs')<>'U' - *!* Select Distinct Curs,nume_val From crsArticole With (Buffering = .T.) Where tip_valuta = 1 Into Cursor crscursuri - *!* If poDate.in_valuta = 1 - *!* Select crscursuri - *!* poDate.Curs = Curs - *!* Endif - If poDate.in_valuta = 1 - Select Distinct Curs, nume_val, id_valuta, multiplicator From (lcCursor) With (Buffering = .T.) Where tip_valuta = 1 Order By nume_val Into Cursor crscursuri - Select crscursuri - poDate.Curs = Curs - poDate.multiplicator = multiplicator - Else - citeste_cursuri_zi(poDate.zi_curs) - If Reccount('crscursuri') = 0 - Use In crscursuri - Endif - *!* modificare v 2.0.56 ^ + *!* modificare v 2.0.67 + If Used('crsCtrTemp') + Use In ('crsCtrTemp') Endif + *!* modificare v 2.0.67 ^ + Release poDate, poGeneratorNumere + Return + Else + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + Endif - If Type(lcCursor + '.nume_lista_preturi') <> 'U' - Create Cursor crspolitici (id_pol N(20), nume_lista_preturi c(100)) - Select crspolitici - *!* modificare v 2.0.77 - *!* Append Blank - *!* Replace id_pol With -9999,nume_lista_preturi With '' - Insert Into crspolitici(id_pol, nume_lista_preturi) Values (-9999, '') - *!* modificare v 2.0.77 ^ - Insert Into crspolitici(id_pol, nume_lista_preturi) ; - Select Distinct id_pol, nume_lista_preturi From (lcCursor) Order By nume_lista_preturi - Endif + *!* modificare v 2.0.67 + *!* pnTipFacturare = 0 + *!* modificare v 2.0.67 ^ + loRezArticole = incarca_cursor_articole(tnTip, m.llCopiere, poGeneratorNumere) + lnSucces = loRezArticole.nSucces + lcCursor = loRezArticole.cCursor + Endif - *!* modificare v 2.0.67 - If Inlist(tnTip, 2, 6, 26) - Create Cursor crscontracte(id_ctr N(20), numar_contract c(100), Data d Null, numar c(50) Null) - Select crscontracte - Append Blank - Replace id_ctr With - 9999, numar_contract With '' - Insert Into crscontracte(id_ctr, numar_contract, Data, numar) ; - Select Distinct id_ctr, numar_contract, Data, numar From (lcCursor + [1]) Order By Data, numar - Endif - *!* modificare v 2.0.67 ^ - ofrmdetaliifactura = Createobject(lcObject) - - IF tnTip = 30 && AVIZ DIN NIR - * CALCULEZ TOTALURILE SI FINALIZEZ FORMULARUL FARA SA IL ARAT - Private plreturn - Store .T. To plreturn - ofrmdetaliifactura.do_calculeaza_totaluri() - ofrmdetaliifactura.but_termin1.Click() - plVizibil = .F. - If !plreturn - Return - ENDIF - ELSE - IF m.llCopiere - * Modificare sau copiere factura - * Nu adaug automat articolele din factura originala, ca sa dau posibilitate de modificare a cantitatilor, pretului, explicatiei - * ofrmdetaliifactura.do_adauga_tot() - - * Sterg din cursorul cu articole inregistrarile adaugate in factura - *DELETE FROM crsArticole - - * Adaug in lista articolelor cursorul cu lista de preturi ca sa pot adauga si alte articole in factura copiata/modificata - lcSqlCursor = [{call pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; - [?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] - - lcCursorTemp = [crsArticoleTemp] - llSucces = goExecutor.oExecuta(lcSqlCursor, lcCursorTemp) - IF m.llSucces - SELECT crsArticole - APPEND FROM DBF(m.lcCursorTemp) - ENDIF - USE IN (SELECT(m.lcCursorTemp)) - ENDIF && m.llCopiere - - If plVizibil - ofrmdetaliifactura.Show() + If lnSucces >= 0 + If loRezArticole.lArticole + If !llFacturareNoua + If tnTip = 27 + lcObject = [frm_avizare_lucrare] Else - ofrmdetaliifactura.Release() - pnButon = 2 + Local llFacturareNoua + llFacturareNoua = (Type('plFacturareNoua') = 'L' And m.plFacturareNoua) + lcObject = IIF(m.llFacturareNoua, [frm_facturare_articole2], [frm_facturare_articole]) Endif - ENDIF && tnTip = 30 + ofrmdetaliifactura = Createobject(lcObject) + + IF tnTip = 30 && AVIZ DIN NIR + * CALCULEZ TOTALURILE SI FINALIZEZ FORMULARUL FARA SA IL ARAT + Private plreturn + Store .T. To plreturn + ofrmdetaliifactura.do_calculeaza_totaluri() + ofrmdetaliifactura.but_termin1.Click() + plVizibil = .F. + If !plreturn + Return + ENDIF + ELSE + IF m.llCopiere + * Modificare sau copiere factura + * Nu adaug automat articolele din factura originala, ca sa dau posibilitate de modificare a cantitatilor, pretului, explicatiei + * ofrmdetaliifactura.do_adauga_tot() + + * Sterg din cursorul cu articole inregistrarile adaugate in factura + *DELETE FROM crsArticole + + * Adaug in lista articolelor cursorul cu lista de preturi ca sa pot adauga si alte articole in factura copiata/modificata + lcSqlCursor = [{call pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + [?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + + lcCursorTemp = [crsArticoleTemp] + llSucces = goExecutor.oExecuta(lcSqlCursor, lcCursorTemp) + IF m.llSucces + SELECT crsArticole + APPEND FROM DBF(m.lcCursorTemp) + ENDIF + USE IN (SELECT(m.lcCursorTemp)) + ENDIF && m.llCopiere + + If plVizibil + ofrmdetaliifactura.Show() + Else + ofrmdetaliifactura.Release() + pnButon = 2 + Endif + ENDIF && tnTip = 30 + Endif If Used('crspolitici') Use In crspolitici @@ -577,509 +450,307 @@ Procedure factureaza Endproc ******************************************** SFARSIT: factureaza ********************************************** +************************************** INCEPUT: incarca_cursor_articole ************************************** +Function incarca_cursor_articole + Lparameters tnTip, tlCopiere, poGeneratorNumere + && poDate: Private-ul apelantului - acelasi obiect pe care il vede oExecute la ?poDate.* + Local lcCursor, lcSqlCursor, lnSucces, loArticole, loRezultat -*** -******************************************** INCEPUT: factureaza2 ********************************************** -Procedure factureaza2 - Lparameters tnTip - Private pnButon, poDate, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil, poGeneratorNumere + loRezultat = Createobject("empty") + AddProperty(loRezultat, "lArticole", .F.) + AddProperty(loRezultat, "nSucces", 0) + AddProperty(loRezultat, "cCursor", '') + AddProperty(loRezultat, "cSql", '') + AddProperty(loRezultat, "lForteazaCursVizibil", .F.) - *!* modificare v 2.0.67 - *!* PRIVATE pnTipFacturare - *!* pnTipFacturare = 0 - *!* modificare v 2.0.67 ^ - Local lcCursor, lcObiect, lcObject, lcSqlCursor, lnSucces, lnTipTemp, loArticole, ltDataOra - *:Global ofrmceredate, ofrmdetaliifactura - If glLunaInchisa - AMESSAGEBOX("Nu pute_i emite documente, deoarece aceasta luna este închisa!", 0 + 48, "Luna închisa") - Return - Endif + Do Case + Case m.tlCopiere + lcSqlCursor = [{call pack_facturare.cursor_retur_document(?poDate.in_valuta,?poDate.listaid,1,?poDate.eProforma,?gnIdUtil)}] - Local lnIdSet, lnRaspuns, loDateAnterior - loDateAnterior = Null + *!* modificare v 2.0.93 ; modificare v 2.0.95 : am adaugat 49 + Case Inlist(tnTip, 48, 49) + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_articole_k(?poDate.zi_curs,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + *!* modificare v 2.0.93 ^ + *!* modificare v 2.0.87 + Case tnTip = 45 + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + [?poDate.listaid,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + *!* modificare v 2.0.87 ^ + Case Inlist(tnTip, 1, 22, 5, 29, 7, 10, 23) && lista de preturi + && modificare v 2.0.56 : am adaugat 10 + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + [?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + Case Inlist(tnTip, 2, 26, 6, 52) && contract + poDate.id_agent = 0 + *!* modificare v 2.0.67 + *!* lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_contract(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + *!* [?poDate.listaid,?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?@pnTipFacturare,] + ; + *!* [?@poDate.id_agent,?@poDate.nume_agent)}] + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_contract(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + [?poDate.listaid,?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?@poDate.id_agent,?@poDate.nume_agent)}] + *!* modificare v 2.0.67 ^ + Case Inlist(tnTip, 3, 21, 25, 28, 42, 47) && comenzi + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_comanda(?poDate.zi_curs,?poDate.tip,?poDate.listaid,?gnIdUtil)}] + Case tnTip = 4 && din avize + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}] + Case Inlist(tnTip, 41) && transfer intre subunitati pe baza de lista de preturi + retur transfer + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_gestiune(?poDate.zi_curs,?poDate.id_pol,] + ; + [?poDate.id_client,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + Case tnTip = 30 && transfer intre subunitati pe baza de NIR + lcSqlCursor = [{call pack_facturare.cursor_aviz_nir(?poDate.id_client,?poDate.id_furnizor,?poDate.nrfactachi,?gnIdSucursala)}] + *!* modificare v 2.0.90 ^ + Case tnTip = 27 + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_lucrare(?poDate.zi_curs,?poDate.id_client,] + ; + [?poDate.id_lucrare,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + *!* modificare v 2.0.56 + Case Inlist(tnTip, 8, 9, 24) && 8,9 = facturi de retur, 24 = aviz retur + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_retur(?poDate.in_valuta,?poDate.listaid,?gnIdUtil)}] + Endcase - pnTotalDiscountAvize = 0 + && parametrii ?poDate.* si ?@pnTotalDiscountAvize se rezolva in scope-ul lui oExecute, din stiva apelantului + lcCursor = [crsarticole] + lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor) + loRezultat.nSucces = m.lnSucces + loRezultat.cCursor = m.lcCursor + loRezultat.cSql = m.lcSqlCursor - **************************************************** - ** Valori pentru pnTipFacturare - ** 0 - facturare pe baza de lista de preturi,pe baza de comanda - ** 1 - facturare contracte in rate - ** 2 - facturare contracte in rate - ** 3 - facturare contracte (articole din contract) - ** 4 - facturare contracte (articole din lista de preturi) - **************************************************** - lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10 - **************************************************** - ** Valori pentru (lnIdSet,tnTip) - ** Facturare - ** (25000,1) - pe baza de lista de preturi ( 25010 - daca e cu scadere din gestiune ) - ** (25001,2) - pe baza de contracte ( 25011 - daca e cu scadere din gestiune ) - ** (25002,3) - pe baza de comenzi ( 25012 - daca e cu scadere din gestiune ) - ** (25003,4) - pe baza de avize ( 25013 - daca e cu scadere din gestiune ) - ** (25004,5) - pe baza de lista de preturi in valuta ( 25014 - daca e cu scadere din gestiune ) - ** (25005,6) - pe baza de contract in valuta ( 25015 - daca e cu scadere din gestiune ) - ** (25006,7) - credit note - ** (25007,8) - retur factura in lei ( 25017 ) - ** (25008,9) - retur factura in valuta ( 25018 ) - ** (25009,10) - factura fiscala in valuta ( 25019 ) - ** (25043,44) - factura hotel - ** (25044,45) - factura restaurant ( 25054 ) - ** (25045,46) - nota de plata restaurant ( 25055 ) - ** (25047,48) - factura marfa custodie cu desc. k ( 25057 ) - ** (25048,49) - factura marfa custodie fara desc. k ( 25058 ) - ** Avize de expeditie - ** (25020,21) - catre clienti din comanda ( 25030 - daca e cu scadere din gestiune ) - ** (25021,22) - catre clienti din lista ( 25031 - daca e cu scadere din gestiune ) - ** (25022,23) - transfer catre subunitati din lista ( 25032 - daca e cu scadere din gestiune ) - ** (25023,24) - aviz de retur ( 25033 - daca e cu scadere din gestiune ) - ** (25024,25) - transfer catre subunitati din comanda ( 25034 - daca e cu scadere din gestiune ) - ** (25025,26) - catre clienti din contract ( 25035 - daca e cu scadere din gestiune ) - ** (25026,27) - transfer catre subunitati pe baza de lucrare( 25036 - daca e cu scadere din gestiune ) - ** (25027,28) - catre clienti debitori din comanda ( 25037 - daca e cu scadere din gestiune ) - ** (25028,29) - catre clienti debitori din lista ( 25038 - daca e cu scadere din gestiune ) - ** (25029,30) - transfer catre subunitati pe baza de NIR ( 25039 - daca e cu scadere din gestiune ) - ** (25040,41) - retur transfer catre subunitati lista pret ( 25050 - daca e cu scadere din gestiune ) - ** (25041,42) - catre clienti custodie pe baza de comanda ( 25051 - daca e cu scadere din gestiune ) - ** (25046,47) - catre clienti custodie pe baza de comanda ptr. descarcare cu K ( 25056 - daca e cu scadere din gestiune ) - ** in lucru (25049,50) - retur de la clienti custodie ( 25059 - daca e cu scadere din gestiune ) - ** - ** ROAGEST - ** (236/240/241/242,-6) - retur de la gestiune valorica - ** - ** ROARETAIL - ** (25042,43) - bonuri fiscale colectate de la magazine ( 25052 - daca e cu scadere din gestiune ) - **************************************************** - *!* modificare v 2.2.0 - *!* update_jtva_coloane([JV]) - update_jtva_coloane([JV], [jtva_coloane_temp]) - *!* modificare v 2.2.0 ^ - lnRaspuns = 6 - Do While lnRaspuns = 6 - plVizibil = .T. - - If !actualizeaza_optiuni_program() - Release poDate, poGeneratorNumere - Return - Endif - - If Type('poDate') <> 'O' - poDate = Createobject("oDateFactura", lnIdSet, tnTip) - poGeneratorNumere = Createobject("oGeneratorNumere") - Endif - Do Case - Case tnTip = 27 - poDate.nIdTipDoc = 6 && AVIZ - Case tnTip = 30 - poDate.nIdTipDoc = 6 && AVIZ - Case tnTip < 21 Or Inlist(tnTip, 45, 48, 49) && modificare : 45 (v2.0.87), 48 (v2.0.93), 49 (v2.0.95) - poDate.nIdTipDoc = 5 && FACTURA - Otherwise - poDate.nIdTipDoc = 6 && AVIZ - Endcase - - - * Completare date - If Type('loDateAnterior') = 'O' - poDate.completeaza_setari_document(m.loDateAnterior) - Endif - - poGeneratorNumere.ResetNumere() - - - poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) - - If Type('poDateGestiuneDest') <> 'O' - poDateGestiuneDest = Createobject("oDateGestiune") - Endif - - Do Case - Case tnTip = 27 - lcObiect = [frm_date_aviz_lucrare] - Case tnTip = 30 - lcObiect = [frm_date_aviz_lucrare] - Case tnTip < 21 Or Inlist(tnTip, 45, 48, 49) && modificare : 45 (v2.0.87), 48 (v2.0.93), 49 (v2.0.95) - lcObiect = [frm_date_factura] - Otherwise - lcObiect = [frm_date_aviz] - Endcase - - pnButon = 1 - If .F. - ofrmceredate = Createobject(m.lcObiect) - ofrmceredate.ntip = tnTip - ofrmceredate.Show() - Endif && .F. - *!* modificare v 2.2.0 - Use In (Select('jtva_coloane')) - If poDate.tva_incasare = 0 - Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) Into Cursor jtva_coloane - Else - Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) Into Cursor jtva_coloane - Endif - *!* modificare v 2.2.0 ^ - Release ofrmceredate - If pnButon = 2 + If lnSucces < 0 + AMESSAGEBOX(goExecutor.oPrelucrareEroare(), 16, "Eroare") + If goExecutor.nEroare = 20005 + loRezultat.lForteazaCursVizibil = .T. + vizualizeaza_curs(poDate.zi_curs) + ENDIF + *!* nu inchid crsCtrTemp + *!* modificare v 2.0.56 + *!* poGeneratorNumere.dezaloca_numar(pnIdTipDoc) + *!* modificare v 2.0.56 ^ + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) && 29.03.2021 deblochez numarul ca sa il pot reda pe acelasi cand se reincarca formularul + Else + If Reccount(lcCursor) = 0 And (!Used(lcCursor + '1') Or (Used(lcCursor + '1') And Reccount(lcCursor + '1') = 0)) + AMESSAGEBOX("Nu exista articole pentru optiunile alese!", 48, "Atentie") poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) - - poGeneratorNumere.dezaloca_numar(16) && dezaloca numar chitanta - poGeneratorNumere.dezaloca_numar(3) && dezaloca numar bon fiscal - - IF TYPE('poDate.nr_incasare') = 'N' - poDate.nr_incasare = 0 - ENDIF - IF TYPE('poDate.incasat') = 'N' - poDate.incasat = 0 + + Use In (SELECT('crsCtrTemp')) + ELSE + loRezultat.lArticole = .T. + + * Daca este o proforma, consider toate articolele negestionabile, pentru a nu mai alege din stoc + * 12.03.2021 + IF poDate.eProforma = 1 + UPDATE (m.lcCursor) SET gestionabil = 0 + GO TOP IN (m.lcCursor) ENDIF - - *!* modificare v 2.0.67 - If Used('crsCtrTemp') - Use In ('crsCtrTemp') - Endif - *!* modificare v 2.0.67 ^ - Release poDate, poGeneratorNumere - Return - Else - poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) - Endif + + creeaza_facturacrs([crsfactura]) - *!* modificare v 2.0.67 - *!* pnTipFacturare = 0 - *!* modificare v 2.0.67 ^ - Do Case - *!* modificare v 2.0.93 ; modificare v 2.0.95 : am adaugat 49 - Case Inlist(tnTip, 48, 49) - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_articole_k(?poDate.zi_curs,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] - *!* modificare v 2.0.93 ^ - *!* modificare v 2.0.87 - Case tnTip = 45 - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; - [?poDate.listaid,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] - *!* modificare v 2.0.87 ^ - Case Inlist(tnTip, 1, 22, 5, 29, 7, 10) && lista de preturi - && modificare v 2.0.56 : am adaugat 10 - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; - [?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] - Case Inlist(tnTip, 2, 26, 6) && contract - poDate.id_agent = 0 - *!* modificare v 2.0.67 - *!* lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_contract(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; - *!* [?poDate.listaid,?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?@pnTipFacturare,] + ; - *!* [?@poDate.id_agent,?@poDate.nume_agent)}] - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_contract(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; - [?poDate.listaid,?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?@poDate.id_agent,?@poDate.nume_agent)}] - *!* modificare v 2.0.67 ^ - Case Inlist(tnTip, 3, 21, 25, 28, 42, 47) && comenzi - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_comanda(?poDate.zi_curs,?poDate.tip,?poDate.listaid,] + ; - [?gnIdUtil)}] - Case tnTip = 4 && din avize - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}] - Case Inlist(tnTip, 23, 41) && transfer intre subunitati pe baza de lista de preturi + retur transfer - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_gestiune(?poDate.zi_curs,?poDate.id_pol,] + ; - [?poDate.id_client,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] - Case tnTip = 30 && transfer intre subunitati pe baza de NIR - *!* modificare v 2.0.61 - *!* modificare v 2.0.56 - *!* lcSqlCursor = [select rownum as id_c, a.ID_ARTICOL,a.SERIE,a.ID_GESTIUNE,a.ID_VALUTA,]+; - *!* [ 0 as discount_unitar,a.CODMAT,a.DENUMIRE, Nvl(a.UM,Chr(32)) as um, 1 as gestionabil,]+; - *!* [ a.CANT as cantitate, a.PROC_TVAV,0 as preturi_cu_tva, a.CURS, a.PRET as preta, a.PRETv as pret,a.tvav as tvav, 0 as pret_val,a.nume_val,]+; - *!* [ 0 as discount_unitar_val, 0 as tip_valuta,cont ]+; - *!* [ from vrul A where a.cod in (select max(b.cod) ]+; - *!* [ from act b where b.id_partc = ?poDate.id_furnizor and b.scc = '401' and b.nract = ?poDate.nrfactachi)] - *!* lcSqlCursor = [select rownum as id_c,rownum as id_temp, a.ID_ARTICOL,a.SERIE,a.ID_GESTIUNE,b.ID_VALUTA,]+; - *!* [ 0 as discount_unitar,a.CODMAT,a.DENUMIRE, Nvl(a.UM,Chr(32)) as um, 1 as gestionabil,]+; - *!* [ a.CANT as cantitate, a.PROC_TVAV,0 as preturi_cu_tva, 1 as CURS, a.PRET as preta, a.PRETv as pret,a.tvav as tvav, 0 as pret_val,b.nume_val,]+; - *!* [ 0 as discount_unitar_val, 0 as tip_valuta,a.cont,a.pretd,a.id_valuta as id_valuta_d ]+; - *!* [ from vrul A left join ] + ; - *!* [ (select id_valuta, nume_val from vnom_valute where moneda_nationala = 1 and rownum = 1) b on 1 = 1 ] + ; - *!* [ where a.cod in (select max(b.cod) ]+; - *!* [ from act a1 where a1.sters = 0 and a1.id_partc = ?poDate.id_furnizor and a1.scc = '401' and a1.nract = ?poDate.nrfactachi)] - *!* *!* modificare v 2.0.56 ^ - *!* modificare v 2.0.90 - *!* modificare v 2.0.71 : 0 as curs; conditii gcCondSucursala si a.id_gestiune = ?poDate.id_client - *!* lcSqlCursor = [select rownum as id_c,rownum as id_temp, a.ID_ARTICOL,a.SERIE,a.ID_GESTIUNE,b.ID_VALUTA,]+; - *!* [ 0 as discount_unitar,c.CODMAT,c.DENUMIRE, Nvl(c.UM,Chr(32)) as um, 1 as gestionabil,]+; - *!* [ a.CANT as cantitate, a.PROC_TVAV,decode(d.nr_pag,6,1,7,1,0) as preturi_cu_tva, 0 as CURS,1 as multiplicator,a.PRET as preta,] + ; - *!* [a.pretv+a.tvav as pretctva,a.pretv as pretftva,] + ; - *!* [a.tvav,0 as pret_val,b.nume_val,]+; - *!* [ 0 as discount_unitar_val, 0 as tip_valuta,a.cont,a.pretd,a.id_valuta as id_valuta_d ]+; - *!* [ from rul A left join ] + ; - *!* [ (select id_valuta, nume_val from vnom_valute where moneda_nationala = 1 and rownum = 1) b on 1 = 1 ] + ; - *!* [ left join nom_articole c on a.id_articol = c.id_articol ] + ; - *!* [ left join nom_gestiuni d on a.id_gestiune = d.id_gestiune ] + ; - *!* [ where a.sters = 0 and a.id_gestiune = ?poDate.id_client and a.cod in (select max(a1.cod) ]+; - *!* [ from act a1 where a1.sters = 0 and a1.id_partc = ?poDate.id_furnizor and a1.scc = '401' and a1.nract = ?poDate.nrfactachi] + ; - *!* STRTRAN(gcCondSucursala,[id_sucursala],[a1.id_sucursala]) + [)] - *!* modificare v 2.0.61 ^ - lcSqlCursor = [{call pack_facturare.cursor_aviz_nir(?poDate.id_client,?poDate.id_furnizor,?poDate.nrfactachi,?gnIdSucursala)}] - *!* modificare v 2.0.90 ^ - Case tnTip = 27 - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_lucrare(?poDate.zi_curs,?poDate.id_client,] + ; - [?poDate.id_lucrare,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] - *!* modificare v 2.0.56 - Case Inlist(tnTip, 8, 9) && facturi de retur - lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_retur(?poDate.in_valuta,?poDate.listaid,?gnIdUtil)}] - *!* modificare v 2.0.56 ^ - Endcase - If .F. - lcCursor = [crsarticole] - lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor) - Endif - lnSucces = 1 - If lnSucces < 0 - AMESSAGEBOX(goExecutor.oPrelucrareEroare(), 16, "Eroare") - If goExecutor.nEroare = 20005 - vizualizeaza_curs(poDate.zi_curs) - Endif - *!* nu inchid crsCtrTemp - *!* modificare v 2.0.56 - *!* poGeneratorNumere.dezaloca_numar(pnIdTipDoc) - *!* modificare v 2.0.56 ^ - Else - If .F. And Reccount(lcCursor) = 0 And (!Used(lcCursor + '1') Or (Used(lcCursor + '1') And Reccount(lcCursor + '1') = 0)) - AMESSAGEBOX("Nu exista articole pentru optiunile alese!", 48, "Atentie") - poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) - *!* modificare v 2.0.67 - If Used('crsCtrTemp') - Use In ('crsCtrTemp') - Endif - *!* modificare v 2.0.67 ^ - Else - *!* modificare v 2.0.67 - *!* If Inlist(pnTipFacturare,1,2) - *!* *!* modificare v 2.0.56 : am mutat codul in procedura - *!* creeaza_crsfactura_rate() - *!* *!* modificare v 2.0.56 ^ - *!* lcObject = [frm_facturare_rate] - *!* Else - *!* modificare v 2.0.67 ^ - *!* modificare v 2.0.56 : am mutat codul in procedura - creeaza_facturacrs([crsfactura]) - *!* modificare v 2.0.56 ^ - If tnTip = 30 - Local lcIdJtva - Select (lcCursor) - Scan - Scatter Name loArticole Memo - Select crsfactura - update_jtva_coloane([JV], 'CrsCotaTva', 0) - Select CrsCotaTva - Locate For cota_tva = (loArticole.proc_tvav * 100 - 100) - If Found() - lcIdJtva = id_jtva_coloana - Else - lcIdJtva = Null - Endif - Use In CrsCotaTva - *!* modificare v 2.0.61 - *!* modificare v 2.0.56 : am adaugat pretd,id_valuta_d - *!* Insert Into crsfactura ; - *!* (id_c,id_temp,id_articol,id_gestiune,Cont,um,; - *!* id_valuta,gestionabil ,tip_valuta ,Curs ,id_jtva_coloana ,codmat ,; - *!* pret_achizitie,pretd,id_valuta_d,denumire ,pretftva ,pretctva ,valftva , valtva ,valctva ,; - *!* cantitate ,discountftva , discountctva , valdiscountftva ,valdiscounttva ,; - *!* valdiscountctva ,valdiminuatftva ,valdiminuattva , valdiminuatctva ,proc_tvav ,cu_tva ,serie ,; - *!* id_set_fact ,explicatie,id_pol ) ; - *!* values (; - *!* loArticole.id_c,loArticole.id_c,loArticole.id_articol,loArticole.id_gestiune,loArticole.Cont,loArticole.um,; - *!* loArticole.id_valuta,loArticole.gestionabil,loArticole.tip_valuta,loArticole.Curs,lcIdJtva ,Nvl(loArticole.codmat,' '),; - *!* loArticole.preta,loArticole.pretd,loArticole.id_valuta_d,loArticole.denumire,loArticole.Pret,loArticole.Pret+loArticole.tvav,Round(loArticole.cantitate*loArticole.Pret,gnpa),Round(loArticole.cantitate*loArticole.tvav,gnpa),Round((loArticole.cantitate*loArticole.Pret)+(loArticole.cantitate*loArticole.tvav),gnpa),; - *!* loArticole.cantitate,0,0,0,0,; - *!* 0,Round(loArticole.cantitate*loArticole.Pret,gnpa),Round(loArticole.cantitate*loArticole.tvav,gnpa),Round((loArticole.cantitate*loArticole.Pret)+(loArticole.cantitate*loArticole.tvav),gnpa),loArticole.proc_tvav,loArticole.preturi_cu_tva,'',; - *!* null,'',Null) - *!* modificare v 2.0.71 : am adaugat id_ctr = Null - *!* modificare v 2.0.90 : am adaugat multiplicator - Insert Into crsfactura ; - (id_c, id_temp, id_articol, id_gestiune, Cont, um, ; - id_valuta, gestionabil, tip_valuta, Curs, multiplicator, id_jtva_coloana, codmat, ; - pret_achizitie, pretd, id_valuta_d, denumire, pretftva, pretctva, valftva, valtva, valctva, ; - cantitate, discountftva, discountctva, valdiscountftva, valdiscounttva, ; - valdiscountctva, valdiminuatftva, valdiminuattva, valdiminuatctva, proc_tvav, cu_tva, serie, ; - id_set_fact, explicatie, id_pol, id_ctr ) ; - Values (; - loArticole.id_c, loArticole.id_c, loArticole.id_articol, loArticole.id_gestiune, loArticole.Cont, loArticole.um, ; - loArticole.id_valuta, loArticole.gestionabil, loArticole.tip_valuta, loArticole.Curs, ; - loArticole.multiplicator, lcIdJtva, Nvl(loArticole.codmat, ' '), ; - loArticole.preta, loArticole.pretd, loArticole.id_valuta_d, loArticole.denumire, ; - loArticole.pretftva, loArticole.pretctva, ; - Round(loArticole.cantitate * loArticole.pretftva, gnpc), ; - Round(loArticole.cantitate * loArticole.tvav, gnpc), ; - Round(loArticole.cantitate * loArticole.pretctva, gnpc), ; - loArticole.cantitate, 0, 0, 0, 0, ; - 0, Round(loArticole.cantitate * loArticole.pretftva, gnpc), Round(loArticole.cantitate * loArticole.tvav, gnpc), ; - Round(loArticole.cantitate * loArticole.pretctva, gnpc), loArticole.proc_tvav, loArticole.preturi_cu_tva, '', ; - Null, '', Null, Null) - *!* modificare v 2.0.61 ^ - &&25039 - Select (lcCursor) - Endscan - Release lcIdJtva + If tnTip = 30 && Aviz din NIR + * populez factura cu articolele din NIR + Local lcIdJtva + Select (lcCursor) + Scan + Scatter Name loArticole Memo Select crsfactura - Release loArticole - Endif - - If tnTip = 27 - lcObject = [frm_avizare_lucrare] - Create Cursor crsgestiunidest(id_gestiune N(20), nume_gestiune c(100)) - Select crsgestiunidest - Append Blank - Replace id_gestiune With - 9999, nume_gestiune With '' - Insert Into crsgestiunidest(id_gestiune, nume_gestiune) ; - Select Distinct id_gestiune, nume_gestiune From (lcCursor) Order By nume_gestiune - Else - lcObject = [frm_facturare_articole2] - Endif - *!* modificare v 2.0.67 - *!* Endif - *!* modificare v 2.0.67 ^ - *!* modificare v 2.0.56 - *!* If Type('crsarticole.curs')<>'U' - *!* Select Distinct Curs,nume_val From crsArticole With (Buffering = .T.) Where tip_valuta = 1 Into Cursor crscursuri - *!* If poDate.in_valuta = 1 - *!* Select crscursuri - *!* poDate.Curs = Curs - *!* Endif - If poDate.in_valuta = 1 - Select Distinct Curs, nume_val, id_valuta, multiplicator From (lcCursor) With (Buffering = .T.) Where tip_valuta = 1 Order By nume_val Into Cursor crscursuri - Select crscursuri - poDate.Curs = Curs - poDate.multiplicator = multiplicator - Else - Do citeste_cursuri_zi With poDate.zi_curs In oproceduri_curs.prg - If Used('crscursuri') - If Reccount('crscursuri') = 0 - Use In (Select('crscursuri')) - Endif - Endif - *!* modificare v 2.0.56 ^ - Endif - - If .F. - If Type(lcCursor + '.nume_lista_preturi') <> 'U' - Create Cursor crspolitici (id_pol N(20), nume_lista_preturi c(100)) - Select crspolitici - *!* modificare v 2.0.77 - *!* Append Blank - *!* Replace id_pol With -9999,nume_lista_preturi With '' - Insert Into crspolitici(id_pol, nume_lista_preturi) Values (-9999, '') - *!* modificare v 2.0.77 ^ - Insert Into crspolitici(id_pol, nume_lista_preturi) ; - Select Distinct id_pol, nume_lista_preturi From (lcCursor) Order By nume_lista_preturi - Endif - Endif && .F. - If .F. - *!* modificare v 2.0.67 - If Inlist(tnTip, 2, 6, 26) - Create Cursor crscontracte(id_ctr N(20), numar_contract c(100), Data d Null, numar c(50) Null) - Select crscontracte - Append Blank - Replace id_ctr With - 9999, numar_contract With '' - Insert Into crscontracte(id_ctr, numar_contract, Data, numar) ; - Select Distinct id_ctr, numar_contract, Data, numar From (lcCursor + [1]) Order By Data, numar - Endif - Endif && .F. - *!* modificare v 2.0.67 ^ - ofrmdetaliifactura = Createobject(lcObject) - If tnTip = 30 - Private plreturn - Store .T. To plreturn - ofrmdetaliifactura.do_calculeaza_totaluri() - ofrmdetaliifactura.but_termin1.Click() - plVizibil = .F. - If !plreturn - Return - Endif - Else - If plVizibil - ofrmdetaliifactura.Show() + update_jtva_coloane([JV], 'CrsCotaTva', 0) + Select CrsCotaTva + Locate For cota_tva = (loArticole.proc_tvav * 100 - 100) + If Found() + lcIdJtva = id_jtva_coloana Else - ofrmdetaliifactura.Release() - pnButon = 2 + lcIdJtva = Null Endif - Endif + Use In CrsCotaTva - If Used('crspolitici') - Use In crspolitici - Endif + Insert Into crsfactura ; + (id_c, id_temp, id_articol, id_gestiune, Cont, um, ; + id_valuta, gestionabil, tip_valuta, Curs, multiplicator, id_jtva_coloana, codmat, ; + pret_achizitie, pretd, id_valuta_d, denumire, pretftva, pretctva, valftva, valtva, valctva, ; + cantitate, discountftva, discountctva, valdiscountftva, valdiscounttva, ; + valdiscountctva, valdiminuatftva, valdiminuattva, valdiminuatctva, proc_tvav, cu_tva, serie, ; + id_set_fact, explicatie, id_pol, id_ctr ) ; + Values (; + loArticole.id_c, loArticole.id_c, loArticole.id_articol, loArticole.id_gestiune, loArticole.Cont, loArticole.um, ; + loArticole.id_valuta, loArticole.gestionabil, loArticole.tip_valuta, loArticole.Curs, ; + loArticole.multiplicator, lcIdJtva, Nvl(loArticole.codmat, ' '), ; + loArticole.preta, loArticole.pretd, loArticole.id_valuta_d, loArticole.denumire, ; + loArticole.pretftva, loArticole.pretctva, ; + Round(loArticole.cantitate * loArticole.pretftva, gnpc), ; + Round(loArticole.cantitate * loArticole.tvav, gnpc), ; + Round(loArticole.cantitate * loArticole.pretctva, gnpc), ; + loArticole.cantitate, 0, 0, 0, 0, ; + 0, Round(loArticole.cantitate * loArticole.pretftva, gnpc), Round(loArticole.cantitate * loArticole.tvav, gnpc), ; + Round(loArticole.cantitate * loArticole.pretctva, gnpc), loArticole.proc_tvav, loArticole.preturi_cu_tva, '', ; + Null, '', Null, Null) - If Used('crscursuri') + Select (lcCursor) + Endscan + Release lcIdJtva + Select crsfactura + Release loArticole + + ENDIF && tnTip = 30 + + If tnTip = 27 + Create Cursor crsgestiunidest(id_gestiune N(20), nume_gestiune c(100)) + Select crsgestiunidest + Append Blank + Replace id_gestiune With - 9999, nume_gestiune With '' + Insert Into crsgestiunidest(id_gestiune, nume_gestiune) ; + Select Distinct id_gestiune, nume_gestiune From (lcCursor) Order By nume_gestiune + Endif + *!* modificare v 2.0.67 + *!* Endif + *!* modificare v 2.0.67 ^ + *!* modificare v 2.0.56 + *!* If Type('crsarticole.curs')<>'U' + *!* Select Distinct Curs,nume_val From crsArticole With (Buffering = .T.) Where tip_valuta = 1 Into Cursor crscursuri + *!* If poDate.in_valuta = 1 + *!* Select crscursuri + *!* poDate.Curs = Curs + *!* Endif + If poDate.in_valuta = 1 + Select Distinct Curs, nume_val, id_valuta, multiplicator From (lcCursor) With (Buffering = .T.) Where tip_valuta = 1 Order By nume_val Into Cursor crscursuri + Select crscursuri + poDate.Curs = Curs + poDate.multiplicator = multiplicator + Else + citeste_cursuri_zi(poDate.zi_curs) + If Reccount('crscursuri') = 0 Use In crscursuri Endif - - *!* modificare v 2.0.67 - If Used('crscontracte') - Use In crscontracte - Endif - If Used('crsCtrTemp') - Use In crsCtrTemp - Endif - *!* modificare v 2.0.67 ^ - - *!* modificare v 2.0.80 - If poDate.incasat <> 0 - poGeneratorNumere.verifica_numar(16, poDate.nr_incasare) - Endif - *!* modificare v 2.0.80 - - If pnButon = 1 - * Completare codmat client - Select crsfactura - Scan - Replace codmatc With GetCodmatC(poDate.id_client, crsfactura.id_articol) In crsfactura - Endscan - - If poDate.tip <> 27 - If poDate.ntip_incasare = 2 && bon fiscal - If Type('gnListareAvizBonFiscal') = 'N' And m.gnListareAvizBonFiscal = 1 - lnTipTemp = poDate.tip - poDate.tip = 22 && La bonul fiscal listez AVIZ DE EXPEDITIE - listeaza_ofacturare() - poDate.tip = m.lnTipTemp - Endif - ltDataOra = Get_Ora() - listeaza_bon_fiscal(ltDataOra, poDate.nr_incasare, poDate.incasat, poDate.incasatCARD, poDate.proc_tva, poDate.nract, poDate.nBonDetaliat, "crsFactura") - Else - listeaza_ofacturare() - Endif - Endif - Else - poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) - Endif - - If Used('crsfactura') - Use In crsfactura - Endif - If Used('crsfacturaset') - Use In crsfacturaset - Endif - If Used('crsfacturafinala') - Use In crsfacturafinala - Endif + *!* modificare v 2.0.56 ^ Endif - *!* lnRaspuns = amessagebox("Doriti sa continuati cu operatii de acest fel?", 4 + 32, "Confirmare") - lnRaspuns = AMESSAGEBOX([Doriti sa continuati cu operatii de acest fel?] + Chr(13) + Chr(10) + [DA=copiere date / NU=fara copiere date / Abandon], 3 + 32, "Confirmare") - If lnRaspuns = 6 && DA - loDateAnterior = CloneObj(m.poDate) && se retin informatiile pentru completarea pe factura urmatoare - Else - loDateAnterior = Null - If m.lnRaspuns = 7 && NU inseamna DA fara copierea datelor - lnRaspuns = 6 && DA - Endif + If Type(lcCursor + '.nume_lista_preturi') <> 'U' + Create Cursor crspolitici (id_pol N(20), nume_lista_preturi c(100)) + Select crspolitici + *!* modificare v 2.0.77 + *!* Append Blank + *!* Replace id_pol With -9999,nume_lista_preturi With '' + Insert Into crspolitici(id_pol, nume_lista_preturi) Values (-9999, '') + *!* modificare v 2.0.77 ^ + Insert Into crspolitici(id_pol, nume_lista_preturi) ; + Select Distinct id_pol, nume_lista_preturi From (lcCursor) Order By nume_lista_preturi Endif - poDate.Reset(7 - lnRaspuns) - poDateGestiuneDest.Reset() + *!* modificare v 2.0.67 + If Inlist(tnTip, 2, 6, 26) + Create Cursor crscontracte(id_ctr N(20), numar_contract c(100), Data d Null, numar c(50) Null) + Select crscontracte + Append Blank + Replace id_ctr With - 9999, numar_contract With '' + Insert Into crscontracte(id_ctr, numar_contract, Data, numar) ; + Select Distinct id_ctr, numar_contract, Data, numar From (lcCursor + [1]) Order By Data, numar + Endif + *!* modificare v 2.0.67 ^ Endif - *!* Endif - *!* Endif - Enddo - *!* modificare v 2.2.0 - Use In (Select('jtva_coloane_temp')) - Use In (Select('jtva_coloane')) - *!* modificare v 2.2.0 ^ - Release poDate, poGeneratorNumere -Endproc && factureaza2 -******************************************** SFARSIT: factureaza2 ********************************************** + Endif + + Return loRezultat +Endfunc +************************************** SFARSIT: incarca_cursor_articole ************************************** +************************************ INCEPUT: configurare_tip_document **************************************** +Function creeaza_configuratie_tip_document + Local lcAliasAnt + lcAliasAnt = Alias() + + If Used('configuratie_tip_document') + Use In configuratie_tip_document + Endif + + Create Cursor configuratie_tip_document ( ; + tip N(3), ; + titlu C(50), ; + sufix_titlu C(12), ; + cap_cantitate C(30), ; + mesaj_stoc C(80), ; + ascunde_discount L, ; + sterge_serie L, ; + buton_tot L, ; + buton_retur L, ; + tip_doc C(7)) + Index On tip Tag tip + + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (-1, [PROFORMA], [], [], [], .F., .F., .T., .F., [factura]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (-2, [COPIERE FACTURA/AVIZ ], [descriere], [Cantitate maxima], [A fost facturata intreaga cantitate pentru acest articol!], .F., .F., .T., .F., [factura]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (1, [], [], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .T., [factura]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (5, [], [], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .T., [factura]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (7, [], [], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .T., [factura]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (10, [], [], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .T., [factura]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (2, [FACTURA PE CTR. ], [descriere], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .F., [factura]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (6, [FACTURA PE CTR. ], [descriere], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .F., [factura]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (3, [FACTURA LA COMANDA ], [descriere], [Cantitate comandata], [A fost facturata intreaga cantitate comandata pentru acest articol!], .F., .T., .T., .F., [factura]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (4, [FACTURA DIN AVIZE], [], [], [A fost facturata intreaga cantitate de pe aviz pentru acest articol!], .T., .F., .T., .F., [factura]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (21, [AVIZ DE EXPEDITIE DIN COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (28, [AVIZ DE EXPEDITIE DIN COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (42, [AVIZ DE EXPEDITIE DIN COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (47, [AVIZ DE EXPEDITIE DIN COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (22, [AVIZ DE EXPEDITIE DIN LISTA DE PRETURI], [], [], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (29, [AVIZ DE EXPEDITIE DIN LISTA DE PRETURI], [], [], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (23, [TRANSFER ÎNTRE SUBUNITATI], [], [], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (41, [RETUR TRANSFER], [], [], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (25, [TRANSFER ÎNTRE SUBUNITATI PE BAZA DE COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (26, [AVIZ DE EXPEDITIE DIN CONTRACTUL ], [descriere], [Cantitate in stoc], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (8, [], [], [Cant. max. de returnat], [Nu se mai poate face retur pentru acest articol!], .F., .F., .T., .F., [factura]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (9, [], [], [Cant. max. de returnat], [Nu se mai poate face retur pentru acest articol!], .F., .F., .T., .F., [factura]) + Insert Into configuratie_tip_document (tip, titlu, sufix_titlu, cap_cantitate, mesaj_stoc, ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc) Values ; + (24, [RETUR AVIZ DE EXPEDITIE], [], [Cant. max. de returnat], [Nu se mai poate face retur pentru acest articol!], .F., .T., .T., .F., [factura]) + + If !Empty(m.lcAliasAnt) And Used(m.lcAliasAnt) + Select (m.lcAliasAnt) + Endif +Endfunc + +Function configurare_tip_document + Lparameters tnTip, tlProforma, tlCopiere + Local lcAliasAnt, lnTipEfectiv, loRezultat + + If !Used('configuratie_tip_document') + creeaza_configuratie_tip_document() + Endif + + lcAliasAnt = Alias() + loRezultat = .Null. + lnTipEfectiv = Iif(m.tlProforma, -1, Iif(m.tlCopiere, -2, m.tnTip)) + + Select configuratie_tip_document + If Seek(m.lnTipEfectiv, 'configuratie_tip_document', 'tip') + Scatter Name loRezultat + Endif + + If !Empty(m.lcAliasAnt) + Select (m.lcAliasAnt) + Endif + + Return loRezultat +Endfunc +************************************ SFARSIT: configurare_tip_document **************************************** + + + + +*** *** diff --git a/programe/ofacturare_antet.prg b/programe/ofacturare_antet.prg new file mode 100644 index 0000000..5e68e8a --- /dev/null +++ b/programe/ofacturare_antet.prg @@ -0,0 +1,925 @@ +*!* 21.08.2026 +*!* marius.mutu +*!* oAntetFacturare - logica de antet a formularului unificat frm_facturare_articole2, portata din frm_date_factura / +*!* frm_date_aviz (ofacturare.vcx): cautarile (do_cauta_*), do_verifica, validarea antetului (valideaza_antet) si regulile +*!* schimbarii felului de document (alege_tipdoc, schimba_tipdoc); formularul vine ca parametru toForm, ramura +*!* factura/aviz se alege pe poDate.nIdTipDoc = poDate.nIdTipDocAvizExpeditie. + +*!* 28.08.2026 +*!* marius.mutu +*!* controalele grupului de contabilitate (Ct_clb_venchelt, Ct_clb_sectie, Ct_clb_lucrare, Ct_clb_responsabil, +*!* Ct_clb_gestiune_init, Ed_tx_simplu1) au trecut in containerul ct_contabilitate al formularului, deci +*!* referintele lor din acest fisier sunt prefixate cu containerul, inclusiv in expresiile Type(). + +Define Class oAntetFacturare As Custom + + Function EsteAviz + Return poDate.nIdTipDoc = poDate.nIdTipDocAvizExpeditie + Endfunc + + Procedure do_cauta_altele + Lparameters toForm + Local llAviz + llAviz = This.EsteAviz() + If m.llAviz + Do Case + Case Inlist(toForm.nid_tip,23,41) + toForm.do_cauta_gestiune_dest() + Case Inlist(toForm.nid_tip,21,25,28,42,47) && modificare v 2.0.93 : am adaugat 47 + toForm.do_cauta_comanda() + Case toForm.nid_tip = 26 + toForm.do_cauta_contract() + Case toForm.nid_tip = 24 && aviz retur + toForm.do_cauta_avize() + Endcase + Else + Do Case + Case toForm.nid_tip=2 + toForm.do_cauta_contract() + Case toForm.nid_tip=3 + toForm.do_cauta_comanda() + Case toForm.nid_tip=4 + toForm.do_cauta_avize() + *!* modificare v 2.0.46 + Case toForm.nid_tip=7 + toForm.do_cauta_factura() + *!* modificare v 2.0.46 ^ + *!* modificare v 2.0.56 + Case Inlist(toForm.nid_tip,8,9) + toForm.do_cauta_facturi() + *!* modificare v 2.0.56 ^ + *!* modificare v 2.0.87 + Case toForm.nid_tip = 45 + toForm.do_cauta_locatii() + *!* modificare v 2.0.87 ^ + Endcase + Endif + Endproc + + Procedure do_cauta_avize + Lparameters toForm + Local lcXMLAvize + If Empty(Nvl(poDate.id_client,0)) + amessagebox("Nu ati ales clientul!",0+48,"Atentie") + toForm.ct_clb_nume_client.SetFocus() + Else + lcXMLAvize = caut_avize(poDate.id_client) && oproceduri_facturare.prg + If !Empty(lcXMLAvize) + Xmltocursor(lcXMLAvize, "crsAvizeTemp") + *!* modificare v 2.0.44 + Select id_vanzare,id_comanda,; + Padl(Iif(!Empty(Nvl(serie_act,[])),Alltrim(serie_act)+[ ],[])+Alltrim(Str(numar_act,20)),50,[ ]) As numar_act ; + From crsAvizeTemp Into Cursor crsAvizeTemp + *!* modificare v 2.0.44 ^ + lcIdVanzare = cursor2lista("crsAvizeTemp", "id_vanzare", ",") + lcNumar_Act = cursor2lista("crsAvizeTemp", "numar_act", ",") + + poDate.listaid = lcIdVanzare + poDate.descriere = lcNumar_Act + AddProperty(poDate,"id_comanda_aviz",0) + Select crsAvizeTemp + Locate For Not Empty(ID_COMANDA) + If Found() + poDate.id_comanda_aviz=ID_COMANDA + Endif + Use In crsAvizeTemp + + toForm.ct_clb_altele.Refresh() + If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41 + toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus() + Else + toForm.but_TERMIN1.SetFocus() + Endif + Endif + Endif + Endproc + + Procedure do_cauta_client + Lparameters toForm + Local llAviz + llAviz = This.EsteAviz() + If m.llAviz + Local loCauta + Do Case + Case poDate.tip = 23 + loCauta = caut_gestiune_sursa([2,4,5,6,7]) && modificare v 2.0.71 : am adaugat 2 + If !Isnull(loCauta) And !Empty(loCauta.id_gestiune) + poDate.id_client = loCauta.id_gestiune + poDate.nume_client = loCauta.nume_gestiune + + poDate.listaid = [] + poDate.descriere = [] + Endif + *!* modificare v 2.0.16 + Case poDate.tip = 41 + loCauta = caut_gestiune_sursa([2,4,5,6,7]) + If !Isnull(loCauta) And !Empty(loCauta.id_gestiune) + poDate.id_client = loCauta.id_gestiune + poDate.nume_client = loCauta.nume_gestiune + + poDate.listaid = [] + poDate.descriere = [] + Endif + *!* modificare v 2.0.16 ^ + Case poDate.tip = 25 + loCauta = caut_gestiune_dest() + If !Isnull(loCauta) And !Empty(Nvl(loCauta.id_gestiune,0)) + poDate.id_client = loCauta.id_gestiune + poDate.nume_client = loCauta.nume_gestiune + + poDateGestiuneDest.id_gestiune = loCauta.id_gestiune + poDateGestiuneDest.id_tipgest = loCauta.id_tipgest + poDateGestiuneDest.Cont = Nvl(loCauta.Cont,[XXXX]) + poDateGestiuneDest.acont = Nvl(loCauta.acont,[XXXX]) + + lcSql = [begin ] + gcS + [.pack_facturare.cauta_date_comanda_gest(?poDate.id_client,?gnIdSucursala,] + ; + [?poDate.dataact,?@poDate.listaid,?@poDate.descriere); end;] + lnSucces = goExecutor.oExecute(lcSql) + If lnSucces < 0 + amessagebox(goExecutor.oPrelucrareEroare(),0+16,"Eroare") + poDate.listaid = [] + poDate.descriere = [] + Endif + + Endif + Otherwise + && modificare v 2.0.93 : am adaugat 47 + loHash = GetHash([cTitlu=>Clienti??cCont=>]+Iif(INLIST(poDate.tip,42,47),[357],Iif(Inlist(poDate.tip,28,29),[461],Alltrim(gcCont411)))+[??lAdaugCorespondente=>1??lVerificaANAF=>1]) + loHash.SetValue('dDataDoc', Iif(Type('poDate.dataact') = 'D', poDate.dataact, {})) + loCauta = CautPartenerContabilitate(loHash) + If !Empty(Nvl(loCauta.id_part,0)) And !Empty(loCauta.denumire) + poDate.id_client = loCauta.id_part + poDate.nume_client = loCauta.denumire + + If Inlist(poDate.tip,21,28,42,47) && modificare v 2.0.93 : am adaugat 47 + lcSql = [begin ] + gcS + [.pack_facturare.cauta_date_comanda(?poDate.id_client,?gnIdSucursala,] + ; + [?poDate.dataact,?@poDate.listaid,?@poDate.descriere); end;] + lnSucces = goExecutor.oExecute(lcSql) + If lnSucces < 0 + amessagebox(goExecutor.oPrelucrareEroare(),0+16,"Eroare") + poDate.listaid = [] + poDate.descriere = [] + Endif + Else + poDate.listaid = [] + poDate.descriere = [] + Endif + + Endif + Endcase + + *!* modificare v 2.0.70 + If Type('toForm.ct_clb_altele.visible')<>'U' + toForm.ct_clb_altele.Refresh() + Endif + *!* modificare v 2.0.70 ^ + toForm.ct_clb_nume_client.Refresh() + toForm.ct_contabilitate.ct_clb_lucrare.SetFocus() + Else + Local loCauta + loHash = GetHash([cTitlu=>Clienti??cCont=>4111??lAdaugCorespondente=>1??lVerificaANAF=>1]) + loHash.SetValue('dDataDoc', Iif(Type('poDate.dataact') = 'D', poDate.dataact, {})) + loCauta = CautPartenerContabilitate(loHash) + If !Empty(Nvl(loCauta.id_part,0)) And !Empty(loCauta.denumire) + If loCauta.id_part <> poDate.id_client + poDate.listaid = [] + poDate.descriere = [] + poDate.text_aditional = [] + Endif + poDate.id_client = loCauta.id_part + poDate.nume_client = loCauta.denumire + poDate.cod_fiscal = loCauta.cod_fiscal + + If poDate.tip = 3 + lcSql = [begin ] + gcS + [.pack_facturare.cauta_date_comanda(?poDate.id_client,?gnIdSucursala,] + ; + [?poDate.dataact,?@poDate.listaid,?@poDate.descriere); end;] + lnSucces = goExecutor.oExecute(lcSql) + If lnSucces < 0 + amessagebox(goExecutor.oPrelucrareEroare(),0+16,"Eroare") + poDate.listaid = [] + poDate.descriere = [] + poDate.text_aditional = [] + Endif + Endif + + *!* If Type('toForm.ct_clb_altele.visible')<>'U' + *!* toForm.ct_clb_altele.Refresh() + *!* Endif + + * Soldul curent + loSoldClient = GetSoldClient(poDate.id_client) + toForm.nSoldLei = loSoldClient.sold_lei + toForm.nSoldValuta = loSoldClient.sold_valuta + toForm.txtSoldLei.Refresh() + + toForm.txtCodFiscal.Refresh() + + toForm.ct_clb_nume_client.Refresh() + toForm.ct_contabilitate.ct_clb_lucrare.SetFocus() + + toForm.ct_clb_nume_client.clb_TX_CAUTARE.text_SIMPLU1.ToolTipText = 'Id client: ' + TRANSFORM(poDate.id_client) + Else + poDate.listaid = [] + poDate.descriere = [] + poDate.text_aditional = [] + + toForm.ct_clb_nume_client.clb_TX_CAUTARE.text_SIMPLU1.ToolTipText = '' + + toForm.nSoldLei = 0 + toForm.nSoldValuta = 0 + toForm.txtSoldLei.Refresh() + Endif + *!* modificare v 2.0.70 + If Type('toForm.ct_clb_altele.visible')<>'U' + toForm.ct_clb_altele.Refresh() + ENDIF + *!* modificare v 2.0.70 ^ + Endif + Endproc + + Procedure do_cauta_comanda + Lparameters toForm + Local llAviz + llAviz = This.EsteAviz() + If m.llAviz + Local loCauta + If Empty(Nvl(poDate.id_client,0)) + amessagebox("Nu ati ales " + Iif(poDate.tip = 25,[gestiunea destinatie],[clientul]) + " !",0+48,"Atentie") + toForm.ct_clb_nume_client.SetFocus() + Else + If poDate.tip = 25 + loCauta = caut_comanda_gestiune(poDate.id_client) + Else + loCauta = caut_comanda_client(poDate.id_client) + Endif + If !Isnull(loCauta) And !Empty(Nvl(loCauta.id_comanda,0)) + poDate.listaid = loCauta.id_comanda + poDate.descriere = ALLTRIM(loCauta.nr_comanda) + toForm.ct_clb_altele.Refresh() + If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41 + toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus() + Else + toForm.buT_TERMIN1.SetFocus() + Endif + Endif + Endif + Else + * 12.03.2021 + * folosesc caut_comanda_clienti in loc de caut_comanda_client, + * ca sa pot folosi un client diferit fata de comanda (ex: pers. fizica in loc de pers. juridica) + Local loCauta + If Empty(Nvl(poDate.id_client,0)) + amessagebox("Nu ati ales clientul!",0+48,"Atentie") + toForm.ct_clb_nume_client.SetFocus() + Else + * loCauta = caut_comanda_client(poDate.id_client) + loCauta = caut_comanda_clienti(poDate.id_client) + If !Isnull(loCauta) And !Empty(loCauta.id_comanda) + IF poDate.id_client <> loCauta.id_part + AMESSAGEBOX('Comanda ' + ALLTRIM(TRANSFORM(loCauta.nr_comanda)) + ' (Client: ' + ALLTRIM(loCauta.nume) + ' Id: ' + ALLTRIM(TRANSFORM(loCauta.id_part)) + ')' + ; + ' nu apartine clientului ales (' + ALLTRIM(poDate.nume_client) + ' Id: ' + ALLTRIM(TRANSFORM(poDate.id_client)) + ')',0+48,_sCREEN.Caption) + ENDIF + poDate.listaid = loCauta.id_comanda + poDate.descriere = loCauta.nr_comanda + + toForm.ct_clb_altele.Refresh() + If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41 + toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus() + Else + toForm.but_TERMIN1.SetFocus() + Endif + Endif + Endif + Endif + Endproc + + Procedure do_cauta_contract + Lparameters toForm + Local llAviz + llAviz = This.EsteAviz() + If m.llAviz + Local loCauta + If Empty(Nvl(poDate.id_client,0)) + amessagebox("Nu ati ales clientul!",0+48,"Atentie") + toForm.ct_clb_nume_client.SetFocus() + Else + *!* modificare v 2.0.67 + *!* loCauta = caut_contract_facturare(poDate.id_client) + *!* If !Isnull(loCauta) And !Empty(Nvl(loCauta.id_ctr,0)) + *!* poDate.listaid = loCauta.id_ctr + *!* poDate.descriere = loCauta.contract + *!* *!* If Inlist(loCauta.opt_facturare,3,4) And !Empty(loCauta.scadenta_incasare) + *!* *!* poDate.datascad = poDate.dataact + loCauta.scadenta_incasare + *!* *!* toForm.clb_data_scadenta.Refresh() + *!* *!* *!* Else + *!* *!* *!* poDate.datascad = Iif(gnScadentaAutomata=0,Gomonth(poDate.dataact,1),poDate.dataact+gnZileScadentaFact) + *!* *!* Endif + *!* toForm.ct_clb_altele.Refresh() + *!* *!* modificare v 2.0.41 + *!* If Inlist(loCauta.opt_facturare,3,4) + *!* If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' + *!* toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .T. + *!* toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus() + *!* Else + *!* toForm.but_termin1.SetFocus() + *!* Endif + *!* Else + *!* poDate.id_gestiune_init = Null + *!* toForm.cgestiune_init = [] + *!* *!* If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' + *!* *!* toForm.ct_contabilitate.ct_clb_gestiune_init.Refresh() + *!* *!* toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .F. + *!* *!* Endif + *!* *!* toForm.but_termin1.SetFocus() + *!* amessagebox("Acest contract este in rate si nu se poate emite aviz pentru el!",48,"Atentie") + *!* Endif + *!* *!* modificare v 2.0.41 ^ + *!* *!* toForm.buT_TERMIN1.SetFocus() + *!* Endif + lcXMLContracte = caut_contract_facturare(poDate.id_client,[3,4]) + If !Empty(lcXMLContracte) And gnButon = 1 + Xmltocursor(lcXMLContracte, "crsCtrTemp") + poDate.listaid = cursor2lista("crsCtrTemp", "id_ctr", ",") + poDate.descriere = cursor2lista("crsCtrTemp", "contract", ",") + toForm.ct_clb_altele.Refresh() + If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' + toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .T. + toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus() + Else + toForm.but_termin1.SetFocus() + Endif + *!* Use In crsCtrTemp + Endif + *!* modificare v 2.0.67 ^ + Endif + Else + Local loCauta,lcXMLContracte + If Empty(Nvl(poDate.id_client,0)) + amessagebox("Nu ati ales clientul!",0+48,"Atentie") + toForm.ct_clb_nume_client.SetFocus() + Else + *!* modificare v 2.0.67 + *!* loCauta = caut_contract_facturare(poDate.id_client) + *!* If !Isnull(loCauta) And !Empty(loCauta.id_ctr) + *!* poDate.listaid = loCauta.id_ctr + *!* poDate.descriere = loCauta.contract + *!* toForm.ct_clb_altele.Refresh() + *!* If Inlist(loCauta.opt_facturare,3,4) + *!* If !Empty(loCauta.scadenta_incasare) + *!* poDate.datascad = poDate.dataact + loCauta.scadenta_incasare + *!* toForm.clb_data_scadenta.Refresh() + *!* Endif + *!* *!* modificare v 2.0.41 + *!* If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' + *!* toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .T. + *!* toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus() + *!* Else + *!* toForm.but_termin1.SetFocus() + *!* Endif + *!* *!* modificare v 2.0.41 ^ + *!* Else + *!* *!* poDate.datascad = Iif(gnScadentaAutomata=0,Gomonth(poDate.dataact,1),poDate.dataact+gnZileScadentaFact) + *!* *!* modificare v 2.0.41 + *!* poDate.id_gestiune_init = Null + *!* toForm.cgestiune_init = [] + *!* If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' + *!* toForm.ct_contabilitate.ct_clb_gestiune_init.Refresh() + *!* toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .F. + *!* Endif + *!* toForm.but_termin1.SetFocus() + *!* Endif + *!* *!* modificare v 2.0.41 ^ + lcXMLContracte = caut_contract_facturare(poDate.id_client) + If !Empty(lcXMLContracte) And gnButon = 1 + Xmltocursor(lcXMLContracte, "crsCtrTemp") + poDate.listaid = cursor2lista("crsCtrTemp", "id_ctr", ",") + poDate.descriere = cursor2lista("crsCtrTemp", "contract", ",") + toForm.ct_clb_altele.Refresh() + Select crsCtrTemp + Calculate Min(scadenta_incasare),MAX(afisare_scadenta) For Inlist(opt_facturare,3,4,0) To lnScadentaIncasare,lnAfisareScadenta + If lnScadentaIncasare <> 0 + poDate.datascad = poDate.dataact + lnScadentaIncasare + toForm.clb_data_scadenta.Refresh() + Endif + poDate.afisare_scadenta = lnAfisareScadenta && modificare ROACONTRACTE v 2.0.38 + If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' + toForm.ct_contabilitate.ct_clb_gestiune_init.Visible = .T. + toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus() + Else + toForm.but_termin1.SetFocus() + Endif + *!* Use In crsCtrTemp + *!* modificare v 2.0.67 ^ + Endif + Endif + Endif + Endproc + + Procedure do_cauta_factura + Lparameters toForm + *!* modificare v 2.0.46 + Local loCauta + If Empty(Nvl(poDate.id_client,0)) + amessagebox("Nu ati ales clientul!",0+48,"Atentie") + toForm.ct_clb_nume_client.SetFocus() + Else + loCauta = caut_facturi_client(poDate.id_client) + If !Isnull(loCauta) And !Empty(loCauta.id_fact) + poDate.descriere = Alltrim(Alltrim(Nvl(loCauta.serie_act,[]))+[ ]+Alltrim(Str(loCauta.nract,14,0))) + poDate.text_aditional = [INVOICE ] + poDate.descriere + toForm.ct_clb_altele.Refresh() + toForm.buT_TERMIN1.SetFocus() + Endif + EndIf + *!* modificare v 2.0.46 ^ + Endproc + + Procedure do_cauta_facturi + Lparameters toForm + *!* modificare v 2.0.56 + Local loCauta + Do Case + Case Empty(Nvl(poDate.id_client,0)) + amessagebox("Nu ati ales clientul!",0+48,"Atentie") + toForm.ct_clb_nume_client.SetFocus() + Case Empty(Nvl(poDate.id_valuta,0)) And poDate.tip = 9 + amessagebox("Nu ati ales valuta!",0+48,"Atentie") + toForm.ct_clb_valuta.SetFocus() + OTHERWISE + * 03.07.2020, marius + * Nu stiu de ce se alegea o singura factura la retur. + * Era si codul pentru mai multe facturi retur, dar era comentat + + *!* loCauta = caut_facturi_multiple_client(poDate.id_client,poDate.in_valuta,poDate.id_valuta) + *!* If gnButon = 1 and !Empty(Nvl(loCauta.id_vanzare,0)) + *!* poDate.listaid = Alltrim(Str(loCauta.id_vanzare)) + *!* poDate.descriere = Alltrim(Iif(!Empty(Nvl(loCauta.serie_act,[])),Alltrim(loCauta.serie_act)+[ ],[])+Alltrim(Str(loCauta.numar_act,20,0))) + + * pentru mai multe facturi : + lcXMLFacturi = caut_facturi_multiple_client(poDate.id_client,poDate.in_valuta,poDate.id_valuta,.T.) + If !Empty(lcXMLFacturi) and gnButon = 1 + Xmltocursor(lcXMLFacturi, "crsFacturiTemp") + Select id_vanzare,; + Padl(Iif(!Empty(Nvl(serie_act,[])),Alltrim(serie_act)+[ ],[])+Alltrim(Str(numar_act,20,0)),50,[ ]) As numar_act ; + From crsFacturiTemp Into Cursor crsFacturiTemp + poDate.listaid = cursor2lista("crsFacturiTemp", "id_vanzare", ",") + poDate.descriere = cursor2lista("crsFacturiTemp", "numar_act", ",") + USE IN (SELECT('crsFacturiTemp')) + + poDate.text_aditional = Iif(poDate.tip=8,[RETUR FACTURA ],[REFUND INVOICE FOR ]) + poDate.descriere + + toForm.ct_clb_altele.Refresh() + toForm.buT_TERMIN1.SetFocus() + Endif + Endcase + *!* modificare v 2.0.56 ^ + Endproc + + Procedure do_cauta_fdoc + Lparameters toForm + Local loCauta + loCauta = caut_fdoc() + If !Isnull(loCauta) And !Empty(loCauta.fel_document) + poDate.id_fdoc = loCauta.id_fdoc + poDate.fdoc = loCauta.fel_document + + toForm.clb_fdoc.Refresh() + toForm.clb_dataact.SetFocus() + Endif + Endproc + + Procedure do_cauta_gestiune_dest + Lparameters toForm + Local loCauta + If Empty(NVL(poDate.id_client,0)) + amessagebox("Nu ati ales gestiunea " + Iif(poDate.tip = 41,"de la care se face returul!","sursa!") ,0+48,"Atentie") + toForm.ct_clb_nume_client.SetFocus() + Else + If poDate.tip = 41 + loCauta = caut_gestiune_dest(poDate.id_client,[2,4,5,6,7]) && modificare v 2.0.71 : am adaugat 2 + Else + loCauta = caut_gestiune_dest(poDate.id_client) + Endif + If !Isnull(loCauta) And !Empty(NVL(loCauta.id_gestiune,0)) + poDate.listaid = loCauta.id_gestiune + poDate.descriere = loCauta.nume_gestiune + + poDateGestiuneDest.id_gestiune = loCauta.id_gestiune + poDateGestiuneDest.id_tipgest = loCauta.id_tipgest + poDateGestiuneDest.Cont = Nvl(loCauta.Cont,[XXXX]) + poDateGestiuneDest.acont = Nvl(loCauta.acont,[XXXX]) + + toForm.ct_clb_altele.Refresh() + toForm.ct_clb_politici_preturi.SetFocus() + Endif + Endif + Endproc + + Procedure do_cauta_gestiune_init + Lparameters toForm + Local llAviz + llAviz = This.EsteAviz() + loCauta = caut_gestiune(0,gnIdUtil) + If !Isnull(loCauta) And !Empty(loCauta.id_gestiune) + poDate.id_gestiune_init = loCauta.id_gestiune + toForm.cgestiune_init = loCauta.nume_gestiune + Else + poDate.id_gestiune_init = Null + toForm.cgestiune_init = [] + Endif + toForm.ct_contabilitate.ct_clb_gestiune_init.Refresh() + If m.llAviz + toForm.buT_TERMIN1.SetFocus() + Else + *!* modificare ROACONTRACTE v 2.0.42 + *!* toForm.buT_TERMIN1.SetFocus() + toForm.ct_contabilitate.ed_tx_simplu1._edbase1.SetFocus() + *!* modificare ROACONTRACTE v 2.0.42 ^ + Endif + Endproc + + Procedure do_cauta_locatii + Lparameters toForm + Local loCauta + loCauta = caut_locatie_restaurant() + If !Isnull(loCauta) And !Empty(loCauta.id_rest_locatie) + poDate.listaid = loCauta.id_rest_locatie + poDate.descriere = loCauta.locatie + toForm.ct_clb_altele.Refresh() + toForm.but_TERMIN1.SetFocus() + Endif + Endproc + + Procedure do_cauta_lucrare + Lparameters toForm + Local llAviz + llAviz = This.EsteAviz() + Local loCauta + LOCAL llToateIreg, llNou, lcFiltruOriginal + llToateIreg = .F. + llNou = .T. + lcFiltruOriginal = '' + + loCauta = caut_lucrare(m.llToateIreg, m.llNou, m.lcFiltruOriginal) + If m.llAviz + + If !Empty(Nvl(loCauta.id_lucrare,0)) + poDate.id_lucrare = loCauta.id_lucrare + poDate.nrord = loCauta.nrord + Else + poDate.id_lucrare = Null + poDate.nrord = [] + Endif + toForm.ct_contabilitate.ct_clb_lucrare.Refresh() + Else + *!* modificare v 2.0.46 + *!* If !Empty(Nvl(loCauta.id_lucrare,0)) + *!* poDate.id_lucrare = loCauta.id_lucrare + *!* poDate.nrord = loCauta.nrord + + *!* toForm.ct_contabilitate.ct_clb_lucrare.Refresh() + *!* Endif + If gnButon = 1 + poDate.id_lucrare = loCauta.id_lucrare + poDate.nrord = loCauta.nrord + Else + poDate.id_lucrare = Null + poDate.nrord = [] + Endif + *!* modificare v 2.0.46 ^ + Endif + toForm.ct_contabilitate.ct_clb_sectie.SetFocus() + Endproc + + Procedure do_cauta_politica + Lparameters toForm + Local loCauta + loCauta = caut_politici_curente_util() + If !Isnull(loCauta) And !Empty(Nvl(loCauta.id_pol,0)) + poDate.id_pol = loCauta.id_pol + poDate.nume_politica = loCauta.nume + + toForm.ct_clb_politici_preturi.SetFocus() + If Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41 + toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus() + Else + toForm.buT_TERMIN1.SetFocus() + Endif + Endif + Endproc + + Procedure do_cauta_responsabil + Lparameters toForm + Local loCauta + loCauta = CautPartenerContabilitate(GetHash([cTitlu=>Responsabili??cTipuriParteneri=>]+Alltrim(Str(gnIdTipResponsabili))+[??lAdaugCorespondente=>1])) + If !Empty(Nvl(loCauta.id_part,0)) And !Empty(loCauta.denumire) + poDate.id_responsabil = loCauta.id_part + poDate.responsabil = loCauta.denumire + Else + poDate.id_responsabil = Null + poDate.responsabil = [] + Endif + toForm.ct_contabilitate.ct_clb_responsabil.Refresh() + Do Case + Case Type('toForm.ct_clb_altele.visible')<>'U' + toForm.ct_clb_altele.SetFocus() + Case Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41 + toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus() + Otherwise + toForm.buT_TERMIN1.SetFocus() + Endcase + Endproc + + Procedure do_cauta_sectie + Lparameters toForm + Local llAviz + llAviz = This.EsteAviz() + Local loCauta + LOCAL lnPornire, llDesktop, llToateIreg, llNou, lcFiltruOriginal + lnPornire = 0 + llDesktop = .F. + llToateIreg = .F. + llNou = .T. + lcFiltruOriginal = '' + + loCauta = caut_sectie(lnPornire, llDesktop, m.llToateIreg, m.llNou, m.lcFiltruOriginal) + If m.llAviz + If !Empty(Nvl(loCauta.id_sectie,0)) + poDate.id_sectie = loCauta.id_sectie + poDate.sectie = loCauta.sectie + Else + poDate.id_sectie = Null + poDate.sectie = [] + Endif + toForm.ct_contabilitate.ct_clb_sectie.Refresh() + Else + *!* modificare v 2.0.46 + *!* If !Empty(Nvl(loCauta.id_sectie,0)) + *!* poDate.id_sectie = loCauta.id_sectie + *!* poDate.sectie = loCauta.sectie + *!* toForm.ct_contabilitate.ct_clb_sectie.Refresh() + *!* Endif + If gnButon = 1 + poDate.id_sectie = loCauta.id_sectie + poDate.sectie = loCauta.sectie + Else + poDate.id_sectie = Null + poDate.sectie = [] + Endif + toForm.ct_contabilitate.ct_clb_sectie.Refresh() + *!* modificare v 2.0.46 ^ + Endif + Do Case + *!* modificare v 2.0.46 + Case Type('toForm.ct_contabilitate.ct_clb_venchelt.visible')<>'U' + toForm.ct_contabilitate.ct_clb_venchelt.SetFocus() + *!* modificare v 2.0.46 ^ + Case Type('toForm.ct_contabilitate.ct_clb_responsabil.visible')<>'U' + toForm.ct_contabilitate.ct_clb_responsabil.SetFocus() + Case Type('toForm.ct_clb_altele.visible')<>'U' + If m.llAviz + toForm.ct_clb_altele.Refresh() + Endif + toForm.ct_clb_altele.SetFocus() + Case Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' && modificare v 2.0.41 + toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus() + Otherwise + toForm.buT_TERMIN1.SetFocus() + Endcase + Endproc + + Procedure do_cauta_valuta + Lparameters toForm + Local loCauta + loCauta = caut_valuta(1,.F.,.T.) + If !Isnull(loCauta) And !Empty(loCauta.id_valuta) + poDate.id_valuta = loCauta.id_valuta + poDate.nume_valuta = loCauta.nume_val + + toForm.ct_clb_valuta.Refresh() + If Type('toForm.clb_zi_curs.visible')<>'U' + toForm.clb_zi_curs.SetFocus() + Else + toForm.clb_serie_act1.SetFocus() + Endif + Endif + Endproc + + Procedure do_cauta_venchelt + Lparameters toForm + Local llAviz + llAviz = This.EsteAviz() + Local loCauta + LOCAL lnPornire, llDesktop, lnTip, lnId, llToateIreg, llNou, lcFiltruOriginal + lnPornire = 0 + llDesktop = .F. + lnTip = 2 && venituri + lnId = 0 + llToateIreg = .F. + llNou = .T. + lcFiltruOriginal = '' + loCauta = caut_venchelt(m.lnPornire, m.llDesktop, m.lnTip, m.lnId, m.llToateIreg, m.llNou, m.lcFiltruOriginal) + + If gnButon = 1 + poDate.id_venchelt = loCauta.id_venchelt + poDate.venchelt = loCauta.explicatie + Else + poDate.id_venchelt = Null + poDate.venchelt = [] + Endif + toForm.ct_contabilitate.ct_clb_venchelt.Refresh() + Do Case + Case Type('toForm.ct_contabilitate.ct_clb_responsabil.visible')<>'U' + toForm.ct_contabilitate.ct_clb_responsabil.SetFocus() + Case Type('toForm.ct_clb_altele.visible')<>'U' + If m.llAviz + toForm.ct_clb_altele.Refresh() + Endif + toForm.ct_clb_altele.SetFocus() + Case Type('toForm.ct_contabilitate.ct_clb_gestiune_init.visible')<>'U' + toForm.ct_contabilitate.ct_clb_gestiune_init.SetFocus() + Otherwise + toForm.buT_TERMIN1.SetFocus() + Endcase + Endproc + + Procedure do_verifica + Lparameters toForm + Local loDate As "empty" + Local lnOptiune, lnRaspuns, loPartener + + lnOptiune = 1 + loPartener = Null + loDate = Createobject("empty") + + AddProperty(loDate, "denumire", poDate.nume_client) + AddProperty(loDate, "cod_fiscal", poDate.cod_fiscal) + AddProperty(loDate, "tip_verificare", "ANAF_SERVICIU_WEB") + + lnRaspuns = VerificaCodFiscal(loDate, @lnOptiune, @loPartener) + Endproc + + Procedure valideaza_antet + Lparameters toForm + Local plReturn,lcFacturi_dublate, llCopiere, llAviz + Store .T. To plReturn + llAviz = This.EsteAviz() + llCopiere = toForm.lCopiere && copiere factura/aviz + + Do Case + Case Empty(poDate.dataireg) + amessagebox("Nu ati completat data inregistrarii!",48,"Atentie") + toForm.clb_dataireg.SetFocus() + plReturn = .F. + Case Empty(poDate.dataact) + amessagebox("Nu ati completat data documentului!",48,"Atentie") + toForm.clb_dataact.SetFocus() + plReturn = .F. + Case !m.llAviz And Empty(poDate.datascad) + amessagebox("Nu ati completat data scadenta!",48,"Atentie") + toForm.clb_data_scadenta.SetFocus() + plReturn = .F. + Case Isnull(poDate.id_fdoc) Or Empty(poDate.id_fdoc) + amessagebox("Nu ati ales felul documentului!",48,"Atentie") + toForm.clb_fdoc.SetFocus() + plReturn = .F. + *!* modificare v 2.0.56 + Case !m.llAviz And poDate.in_valuta = 1 And Empty(Nvl(poDate.zi_curs,{})) And Type('toForm.clb_zi_curs.visible')<>'U' + *!* Case poDate.in_valuta = 1 And Empty(Nvl(poDate.zi_curs,{})) + *!* modificare v 2.0.56 ^ + amessagebox("Nu ati completat ziua cursului valutar!",48,"Atentie") + toForm.clb_zi_curs.SetFocus() + plReturn = .F. + Case !m.llAviz And poDate.in_valuta = 1 And Empty(Nvl(poDate.id_valuta,0)) + amessagebox("Nu ati completat valuta!",48,"Atentie") + toForm.ct_clb_valuta.SetFocus() + plReturn = .F. + Case Empty(poDate.nract) + amessagebox("Nu ati completat numarul documentului!",48,"Atentie") + toForm.clb_nract.SetFocus() + plReturn = .F. + Case !Between(poDate.dataireg,Date(gnAn,gnLuna,1),Gomonth(Date(gnAn,gnLuna,1),1)-1) + amessagebox("Data inregistrarii trebuie sa fie din luna "+Alltrim(Str(gnLuna))+"/"+Alltrim(Str(gnAn))+" !",48,"Atentie") + toForm.clb_dataireg.SetFocus() + plReturn = .F. + Case !m.llAviz And poDate.datascadpoDate.dataireg + amessagebox("Data documentului trebuie sa fie mai mica sau egala cu data inregistrarii!",48,"Atentie") + toForm.clb_dataact.SetFocus() + plReturn = .F. + Case !m.llAviz And (Empty(poDate.id_client) Or Isnull(poDate.id_client)) && aviz: fara validare client + amessagebox("Nu ati ales clientul!",48,"Atentie") + toForm.ct_clb_nume_client.SetFocus() + plReturn = .F. + Case !m.llAviz And Empty(Nvl(poDate.descriere,[])) And poDate.tip = 7 + amessagebox("Nu ati ales factura!",48,"Atentie") + toForm.ct_clb_altele.SetFocus() + plReturn = .F. + Case !m.llAviz And Empty(Nvl(poDate.descriere,[])) And m.llCopiere + amessagebox("Nu ati ales factura de copiat!",48,"Atentie") + toForm.ct_clb_altele.SetFocus() + plReturn = .F. + Case m.llAviz And Empty(Nvl(poDate.descriere,[])) And m.llCopiere + amessagebox("Nu ati ales avizul de copiat!",48,"Atentie") + toForm.ct_clb_altele.SetFocus() + plReturn = .F. + *!* modificare v 2.0.56 + Case !m.llAviz And Empty(Nvl(poDate.descriere,[])) And Inlist(poDate.tip,8,9) + amessagebox("Nu ati ales factura/facturile pentru care se face returul!",48,"Atentie") + toForm.ct_clb_altele.SetFocus() + plReturn = .F. + *!* modificare v 2.0.56 ^ + Case !m.llAviz And Empty(Nvl(poDate.listaid,[])) And !Inlist(poDate.tip,1,5,7,8,9,10,48,49) && modificare : am adaugat 10 ( v 2.0.56 ), 48 ( v 2.0.93 ), 49 ( v 2.0.95 ) + Do Case + Case Inlist(poDate.tip, 2, 6, 52) + lcMesaj = [Nu ati ales contractul!] + Case poDate.tip = 3 + lcMesaj = [Nu ati ales comanda!] + Case poDate.tip = 4 + lcMesaj = [Nu ati ales avizul!] + Case poDate.tip = 45 && modificare v 2.0.87 + lcMesaj = [Nu ati ales locatia!] + Endcase + amessagebox(lcMesaj,48,"Atentie") + toForm.ct_clb_altele.SetFocus() + plReturn = .F. + Case m.llAviz And Empty(Nvl(poDate.listaid,[])) And Inlist(poDate.tip,21,23,25,26,28,41,42,47) && modificare v 2.0.93 : am adaugat 47 + Do Case + Case INLIST(poDate.tip,21,25,28,42,47) && modificare v 2.0.93 : am adaugat 47 + lcMesaj = [Nu ati ales comanda!] + Case poDate.tip = 23 + lcMesaj = [Nu ati ales gestiunea destinatie!] + *!* modificare v 2.0.16 + Case poDate.tip = 41 + lcMesaj = [Nu ati ales gestiunea catre care se face returul!] + *!* modificare v 2.0.16 ^ + Case poDate.tip = 26 + lcMesaj = [Nu ati ales contractul!] + Endcase + amessagebox(lcMesaj,48,"Atentie") + toForm.ct_clb_altele.SetFocus() + plReturn = .F. + Case m.llAviz And Empty(Nvl(poDate.id_pol,0)) And InList(poDate.tip,23,41) + amessagebox("Nu ati ales politica de preturi!",48,"Atentie") + toForm.ct_clb_politici_preturi.SetFocus() + plReturn = .F. + Otherwise + *!* modificare v 2.0.46 + *!* plReturn = .T. + lcFacturi_dublate = facturi_duplicate(Iif(m.llAviz,'418','4111'), 0, poDate.serie_act, poDate.nract, []) + If !Empty(lcFacturi_dublate) + lnRaspuns = amessagebox(lcFacturi_dublate + Chr(13)+"Doriti sa continuati?",4+32,Iif(m.llAviz,"Avize dublate","Facturi dublate")) + plReturn = (m.lnRaspuns = 6) + Endif + *!* modificare v 2.0.46 ^ + + * Daca FACTURA si clientul se numeste "CLIENT"[I DIVERSI] + * Atentionez ca ar trebui sa se aleaga "BON FISCAL" in loc de "FACTURA" + IF poDate.nIdTipDoc = poDate.nIdTipDocFactura AND 'CLIENT'$UPPER(NVL(poDate.nume_client,'')) + lnRaspuns = amessagebox('Ati ales clientul ' + ALLTRIM(poDate.nume_client) + ' si Tip document = FACTURA in loc de BON FISCAL' + Chr(13)+"Doriti sa continuati?",4+32,"Bon Fiscal") + plReturn = (m.lnRaspuns = 6) + ENDIF + Endcase + Return plReturn + Endproc + + Function alege_tipdoc + Lparameters tcTipDoc + LOCAL lnIdTipDoc, lcTipDoc + lcTipDoc = UPPER(m.tcTipDoc) + + lnIdTipDoc = IIF(m.lcTipDoc = 'FACTURA', poDate.nIdTipDocFactura, ; + IIF(m.lcTipDoc = 'PROFORMA', poDate.nIdTipDocProforma, ; + IIF(m.lcTipDoc = 'BON FISCAL', poDate.nIdTipDocBonFiscal, ; + IIF(m.lcTipDoc = 'AVIZ', poDate.nIdTipDocAvizExpeditie, poDate.nIdTipDocFactura)))) + + *!* poDate.nIdTipDocFactura = 5 + *!* poDate.nIdTipDocProforma = 23 + *!* poDate.nIdTipDocBonFiscal = 3 + *!* poDate.nIdTipDocAvizExpeditie = 6 + + *!* poDate.eProforma = IIF(m.lnIdTipDoc = poDate.nIdTipDocProforma, 1, 0) + *!* poDate.eBonFiscal = IIF(m.lnIdTipDoc = poDate.nIdTipDocBonFiscal, 1, 0) + poDate.initializeaza_setari_document(IIF(m.lnIdTipDoc = poDate.nIdTipDocBonFiscal, -101, IIF(m.lnIdTipDoc = poDate.nIdTipDocProforma, -102, poDate.Tip))) + Return m.lnIdTipDoc + Endfunc + + Function schimba_tipdoc + Lparameters tnIdTipDoc + IF poDate.nIdTipDoc = m.tnIdTipDoc + RETURN .F. + ENDIF + + poDate.nract = 0 + poDate.serie_act = "" + + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + poDate.nIdTipDoc = m.tnIdTipDoc && se initializeaza automat si .eBonFiscal, .eProforma + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) && 1 = CU SERIE, 2 = FARA SERIE CU PLAJE, 3 = CU SERIE SI PLAJE + Return .T. + Endfunc + +Enddefine diff --git a/programe/ofacturare_comun.prg b/programe/ofacturare_comun.prg index 1ab523e..9846759 100644 --- a/programe/ofacturare_comun.prg +++ b/programe/ofacturare_comun.prg @@ -55,6 +55,15 @@ *!* 14.04.2026 *!* + oDateFactura.cod_fiscal +*!* 31.08.2026 +*!* agent +*!* creeaza_facturacrs + campul procdisc (procent discount calculat, needitabil) pentru S4c + +*!* 04.09.2026 +*!* agent +*!* prelucreaza_facturacrs + vpretctva/vdiscountctva in lista de insert (pretul si discountul +*!* unitar in valuta cu TVA inclus, care plecau 0 la Oracle la reemiterea documentelor in valuta) + *************************************************************************************************************** **** Clase: **** oDateFactura @@ -202,6 +211,7 @@ Define Class oDateFactura As Custom tva_incasare = 0 && modificare ROAGEST v 2.2.0 id_facturare = NULL && id adresa facturare adresa_facturare = '' && adresa factuare text + motiv_discount = '' && motivul discountului pe factura, valabil doar in sesiunea de editare nListareDetaliata = 0 && articolele se listeaza cumulat dupa cantitate sau detaliat, asa cum au fost adaugate pe factura nListareSilentioasa = 0 && listare fara previzualizare nListareJustPDF = 0 && listare doar pdf @@ -219,13 +229,19 @@ Define Class oDateFactura As Custom eFactura = 0 && 0/1 = se transmite in borderoul eFactura sold_lei = 0 && soldul total pe client la emiterea facturii in lei sold_valuta = 0 && soldul total pe client la emiterea facturii in valuta (nediferentiat pe valuta) - + lProformaSursa = .F. && documentul a fost copiat dintr-o proforma + nIdProformaSursa = 0 && id_vanzare al proformei sursa, pentru legatura VANZARI_CORESP + lEditare = .F. && document existent deschis in editare, nu document nou + id_ruta = NULL && ID_RUTA al documentului deschis in editare + cListaSursa = [] && comanda/contract sursa a documentului deschis in editare + cListaSursaAvize = [] && avizele sursa ale documentului deschis in editare + Procedure Init - Lparameters tnIdSet, tnTip + Lparameters tnIdSet, tnTip, toSursa && 0,0 - la listare && id_set,tip - Local ldData + Local ldData, loSursa If !Empty(m.tnIdSet) && modificare ROAFACTURARE v 2.0.58 Use In (SELECT('crsoDateDocAtasate')) @@ -258,22 +274,27 @@ Define Class oDateFactura As Custom .discount_evidentiat = IIF(TYPE('gnDiscountEvidentiat') = 'N', m.gnDiscountEvidentiat, 1) .nRelistare = 0 && modificare ROAFACTURARE v 2.0.58 - If INLIST(m.tnTip, 2, 6, 52) And Type('goContract') <> 'U' && FACTURARE DIN ROACONTRACTE - .id_client = goContract.id_part - .nume_client = goContract.denumire - .cod_fiscal = ALLTRIM(NVL(goContract.cod_fiscal, '')) - .listaid = goContract.id_ctr - .descriere = goContract.contract - .id_sectie = goContract.id_sectie - .sectie = goContract.sectie - .id_responsabil = goContract.id_responsabil - .responsabil = goContract.responsabil - .id_valuta = goContract.id_valuta - .nume_valuta = goContract.nume_val + loSursa = Iif(Type('toSursa') = 'O', toSursa, Null) + + If INLIST(m.tnTip, 2, 6, 52) And (Type('loSursa') = 'O' Or Type('goContract') <> 'U') && FACTURARE DIN ROACONTRACTE + If Type('loSursa') <> 'O' + loSursa = goContract + Endif + .id_client = loSursa.id_part + .nume_client = loSursa.denumire + .cod_fiscal = ALLTRIM(NVL(loSursa.cod_fiscal, '')) + .listaid = loSursa.id_ctr + .descriere = loSursa.contract + .id_sectie = loSursa.id_sectie + .sectie = loSursa.sectie + .id_responsabil = loSursa.id_responsabil + .responsabil = loSursa.responsabil + .id_valuta = loSursa.id_valuta + .nume_valuta = loSursa.nume_val lcSql = [ select id_ctr, contract, numar, data, denumire, scadenta_incasare, opt_facturare, text_standard, afisare_scadenta ]+; [ FROM fact_vcontracte ]+; - [ where id_ctr = ] + Alltrim(Str(goContract.id_ctr)) + [ where id_ctr = ] + Alltrim(Str(loSursa.id_ctr)) lnSucces = goExecutor.oExecute(lcSql,'crsCtrTemp') If lnSucces < 0 @@ -298,18 +319,23 @@ Define Class oDateFactura As Custom - If tnTip = 3 And Type('goComanda') = 'O' && FACTURARE DIN ROACOMENZI - .id_client = goComanda.id_part - .nume_client = ALLTRIM(goComanda.nume) - .cod_fiscal = ALLTRIM(NVL(goComanda.cod_fiscal, '')) - .listaid = goComanda.id_comanda - .descriere = goComanda.nr_comanda - .id_sectie = goComanda.id_sectie + loSursa = Iif(Type('toSursa') = 'O', toSursa, Null) + + If tnTip = 3 And (Type('loSursa') = 'O' Or Type('goComanda') = 'O') && FACTURARE DIN ROACOMENZI + If Type('loSursa') <> 'O' + loSursa = goComanda + Endif + .id_client = loSursa.id_part + .nume_client = ALLTRIM(loSursa.nume) + .cod_fiscal = ALLTRIM(NVL(loSursa.cod_fiscal, '')) + .listaid = loSursa.id_comanda + .descriere = loSursa.nr_comanda + .id_sectie = loSursa.id_sectie *!* .sectie = goComanda.sectie *!* .id_responsabil = goComanda.id_responsabil *!* .responsabil = goComanda.responsabil - lcSql = [ select sectie from nom_sectii where id_sectie = ] + ALLTRIM(STR(goComanda.id_sectie)) + lcSql = [ select sectie from nom_sectii where id_sectie = ] + ALLTRIM(STR(loSursa.id_sectie)) lnSucces = goExecutor.oExecute(lcSql,'crsComTemp') If lnSucces < 0 @@ -385,6 +411,8 @@ Define Class oDateFactura As Custom .nrinmat = ALLTRIM(NVL(toDateAnterior.nrinmat, '')) .id_masina = toDateAnterior.id_masina .listaid = toDateAnterior.id_vanzare + .lProformaSursa = PEMSTATUS(toDateAnterior,'eproforma',5) And Nvl(toDateAnterior.eproforma,0) = 1 + .nIdProformaSursa = Iif(This.lProformaSursa, toDateAnterior.id_vanzare, 0) .descriere = Alltrim(Alltrim(Nvl(toDateAnterior.serie_act,[]))+[ ]+Alltrim(Str(toDateAnterior.numar_act,14,0))) .id_client = toDateAnterior.id_part .nume_client = toDateAnterior.client @@ -570,6 +598,7 @@ Define Class oDateFactura As Custom .sumavorbe = [] && modificare ROAFACTURARE v 2.0.78 .coeficient_k = 0 && modificare ROAFACTURARE v 2.0.93 .explicatia4 = [] && modificare ROACONTRACTE v 2.0.42 + .motiv_discount = '' .id_ordl = NULL && modificare ROAAUTO v 2.0.33 .id_facturare = NULL .nListareDetaliata = 0 @@ -577,6 +606,8 @@ Define Class oDateFactura As Custom .nListareJustPDF = 0 && listare doar pdf .oClient = NULL .lCopiere = .F. && copiere factura/aviz + .lProformaSursa = .F. + .nIdProformaSursa = 0 .nIdBeneficiar = Null .nTipFactura = NULL && tip intern factura (ex: ACN 0=TRANZIT/1=CHEIAJ/3=CHIRII/5=APA/6=PENALITATI) .id_util = NULL && id utilizator @@ -762,6 +793,32 @@ Function recalculeaza_pret_vanzare_lei Endfunc && recalculeaza_pret_vanzare_lei ********************************************************************************************************* ********************************************************************************************************* +Function deriva_cont_venit_fara_pol +* S4g: contul de venit pentru linia fara politica de pret - coresp_cont_venchelt pe contul de gestiune, apoi nom_articole.cont daca incepe cu 6/7, altfel 704 + Lparameters tnIdArticol,tcContGestiune + Local lcCont,lcSql,lnSucces + lcCont = [704] + If Isnull(tnIdArticol) + Return lcCont + Endif + lcSql = [select nvl((select cont_venit from vcoresp_cont_venchelt where cont = '] + ; + OracleSpecialCharacters(Alltrim(Nvl(tcContGestiune,[]))) + [' and cont_venit is not null),] + ; + [case when substr(cont,1,1) in ('6','7') then cont else '704' end) as cont_venit ] + ; + [from nom_articole where id_articol = ] + Alltrim(Str(tnIdArticol)) + If Used('crscontvenit') + Use In crscontvenit + Endif + lnSucces = goExecutor.oExecute(lcSql,[crscontvenit]) + If lnSucces >= 0 And Used('crscontvenit') And Reccount('crscontvenit') > 0 + lcCont = Alltrim(Nvl(crscontvenit.cont_venit,[704])) + Endif + If Used('crscontvenit') + Use In crscontvenit + Endif + Return lcCont +Endfunc && deriva_cont_venit_fara_pol +********************************************************************************************************* +********************************************************************************************************* *!* Function recalculeaza_pret_vanzare_lei_set *!* Lparameters tcTabel,tnCurs *!* Local llReturn @@ -1775,7 +1832,7 @@ Procedure creeaza_facturacrs Create Cursor (tcNumeCursor) (id_c N(20),id_temp N(20),id_articol N(20) null,id_pol N(20) Null,id_gestiune N(20),Cont c(4),um c(10) Null, cod_um_iso c(5) null, ; id_valuta N(10),gestionabil N(1),tip_valuta N(1),Curs N(20,4),multiplicator N(10),id_jtva_coloana N(20) Null,id_jtva_coloana_ex N(20) Null,codmat c(100),codmatc c(100),codmatf c(100),codbare c(50),; pret_achizitie N(20,max(gnPPret,4)),denumire c(100),pretftva N(20,max(gnPPretV,precizie_max_pret_vz)),pretctva N(20,max(gnPPretV,precizie_max_pret_vz)),valftva N(20,max(gnPc,4)), valtva N(20,max(gnPc,4)),valctva N(20,max(gnPc,4)),; - cantitate N(20,max(gnPCant,4)),discountftva N(20,max(gnPPretV,4)), discountctva N(20,max(gnPPretV,precizie_max_pret_vz)), valdiscountftva N(20,max(gnPc,4)),valdiscounttva N(20,max(gnPc,4)),; + cantitate N(20,max(gnPCant,4)),discountftva N(20,max(gnPPretV,4)), discountctva N(20,max(gnPPretV,precizie_max_pret_vz)), procdisc N(10,2), valdiscountftva N(20,max(gnPc,4)),valdiscounttva N(20,max(gnPc,4)),; valdiscountctva N(20,max(gnPc,4)),valdiminuatftva N(20,max(gnPc,4)),valdiminuattva N(20,max(gnPc,4)),valdiminuatctva N(20,max(gnPc,4)),proc_Tvav N(20,4),cu_tva N(1), lot C(20) null, serie c(100) Null,; vpretftva N(20,max(gnPVal,precizie_max_pret_vz)),vpretctva N(20,max(gnPVal,precizie_max_pret_vz)),vvalftva N(20,max(gnPVal,4)),vvaltva N(20,max(gnPVal,4)),vvalctva N(20,max(gnPVal,4)),; vdiscountftva N(20,max(gnPVal,4)),vdiscountctva N(20,max(gnPVal,4)),vvaldiscountftva N(20,max(gnPVal,4)),vvaldiscounttva N(20,max(gnPVal,4)),; @@ -1806,7 +1863,7 @@ Procedure prelucreaza_facturacrs Insert Into (tcCursorDestinatie) (id_articol,id_temp,explicatie,denumire,lot,serie,codmat,codmatc,id_jtva_coloana,id_jtva_coloana_ex,taxcode,codmatf,codbare,pret_achizitie,cantitate,proc_Tvav,um,cod_um_iso,; cu_tva,pretctva,discountctva,valctva,valdiscountctva,valdiminuatctva,pretftva,; valftva,valtva,discountftva,valdiscountftva,valdiscounttva,valdiminuatftva,; - valdiminuattva,vpretftva,vvalftva,vvaltva,vdiscountftva,vvaldiscountftva,vvaldiscounttva,; + valdiminuattva,vpretftva,vpretctva,vvalftva,vvaltva,vdiscountftva,vdiscountctva,vvaldiscountftva,vvaldiscounttva,; vvaldiminuatftva,vvaldiminuattva,id_set_fact,gestionabil,id_ctr,numar_contract,id_valuta,tip_valuta,Curs,multiplicator,nume_val,codnc8,codcpv) ; SELECT CAST(IIF(TYPE(tcCursorSursa+".id_articol")='U',0,id_articol) as N(20)) as id_articol,id_vanzare_det As id_temp,; explicatie,denumire,lot,serie,Nvl(codmat,Space(50)) As codmat,IIF(TYPE(tcCursorSursa + '.codmatc') = 'C', Nvl(codmatc,Space(50)), SPACE(50)) As codmatc,id_jtva_coloana,id_jtva_coloana_ex,taxcode,; @@ -1853,6 +1910,8 @@ Procedure prelucreaza_facturacrs IIF(pret_cu_tva = 0,; Round(Pret_val,gnPVal),; Round(Round(Pret_val,gnPVal)/proc_Tvav,gnPVal)) As vpretftva,; + Iif(pret_cu_tva = 1,Round(Pret_val,gnPVal),; + Round(Pret_val,gnPVal)+Round(Round(Pret_val,gnPVal)*(proc_Tvav-1),gnPVal)) As vpretctva,; IIF(pret_cu_tva = 0,; Round(Round(Pret_val,gnPVal)*Nvl(cantitate,1),gnPVal),; ROUND(Round(Pret_val,gnPVal)*Nvl(cantitate,1),gnPVal) - ; @@ -1863,6 +1922,7 @@ Procedure prelucreaza_facturacrs IIF(pret_cu_tva = 0,; Round(discount_unitar_val,gnPVal),; Round(Round(discount_unitar_val,gnPVal)/proc_Tvav,gnPVal)) As vdiscountftva,; + Iif(pret_cu_tva = 1,Round(discount_unitar_val,gnPVal),0.000) As vdiscountctva,; IIF(pret_cu_tva = 0,; Round(Round(discount_unitar_val,gnPVal)*Nvl(cantitate,1),gnPVal),; ROUND(Round(discount_unitar_val,gnPVal)*Nvl(cantitate,1),gnPVal) - ; @@ -2222,3 +2282,25 @@ Procedure completeaza_explicatie_contract Release lnPozI,lnPozF,lnIdCtr, lnIdCtrPrec, lnDimArray,lnIndex,lcNrContract,lnIndexMax Endproc && completeaza_explicatie_contract ********************************************************************************************************* +********************************************************************************************************* +******************************* INCEPUT: scrie_legatura_proforma **************************************** +Function scrie_legatura_proforma + Local lcSql, lnSucces, llReturn + llReturn = .T. + * legatura proforma -> factura in VANZARI_CORESP (TIP = 4); clistaid se trimite explicit, + * nu se citeste din starea sesiunii, pentru ca poDate.listaid poate fi rescris de articolele retur + If Type('poDate') = 'O' And poDate.lProformaSursa And Nvl(poDate.nIdProformaSursa,0) > 0 ; + And Between(Nvl(poDate.nid_vanzare,0), 1, 9999999998) + lcSql = [begin pack_facturare.nid_vanzare := ] + Alltrim(Str(poDate.nid_vanzare,20,0)) + [;] + ; + [ pack_facturare.clistaid := '] + Alltrim(Str(poDate.nIdProformaSursa,20,0)) + [';] + ; + [ pack_facturare.scrie_corespondente_vanzari(4); end;] + lnSucces = goExecutor.oExecute(lcSql) + If lnSucces < 0 + AMESSAGEBOX(goExecutor.oPrelucrareEroare(),16,"Eroare") + llReturn = .F. + Endif + Endif + Return llReturn +Endfunc && scrie_legatura_proforma +******************************* SFARSIT: scrie_legatura_proforma ***************************************** +********************************************************************************************************* diff --git a/programe/ofacturare_editare.prg b/programe/ofacturare_editare.prg index 68b7c44..8eee4ca 100644 --- a/programe/ofacturare_editare.prg +++ b/programe/ofacturare_editare.prg @@ -1,8 +1,16 @@ *** ofacturare_editare -*!* 11.08.2026 +*!* 06.09.2026 *!* marius.mutu -*!* helpere comune pentru editarea unei facturi emise: garda eFactura, cursoarele notei si ale rulajelor, +*!* helpere comune pentru editarea unei facturi emise: garda eFactura, garda pe urmasi in lantul +*!* aviz -> factura -> retur (VANZARI_CORESP), incarcarea antetului unui document existent (FACT_VFACTURI) +*!* intr-un oDateFactura nou (tnIdSet=0, lEditare=.T.), cu discountul de document ca suma si lista de +*!* avize sursa (VANZARI_CORESP, TIP=1), liniile unui document existent (VVANZARI_ARTICOLE) direct in +*!* crsfactura, cu gestionabil din nomenclatorul curent, contul liniei din document, pretul de +*!* vanzare al lotului reluat din rulajul original (RUL) numai pe gestiunile la pret de vanzare +*!* (nr_pag 6/7, ca in STOC) si legatura de rezervare (id_part_rez/id_lucrare_rez) tot din RUL, +*!* si zi_curs/dataact/datascad normalizate la Date (Ttod) din data_act/data_scad, care vin din +*!* Oracle ca DateTime, cursoarele notei si ale rulajelor, *!* randul de vanzare corespunzator notei (inclusiv valuta documentului: in_valuta/id_valuta/nume_val, *!* si id_fact - pentru garda eFactura pe pagina de articole), *!* liniile de articole pentru pagina de articole factura (inclusiv in_stoc si id_vanzare_set/pret_achizitie, @@ -13,7 +21,10 @@ *!* compararea/aplicarea sincronizarii cantitate/pret intre rulaje (trul) si articolele facturii (tvd), *!* agregate pe id_articol, in ambele sensuri (documentele in valuta raman doar semnalate, neaplicate); *!* pe linia de articol se poate alege si explicatia TVA (filtrata pe cota liniei), care recoreleaza -*!* codul SAF-T, iar liniile deja salvate se actualizeaza cu toate campurile pe care grila le schimba +*!* codul SAF-T, iar liniile deja salvate se actualizeaza cu toate campurile pe care grila le schimba, +*!* si oglindirea in IncarcaAntetFacturaEditare a copierii incasat->incasatCARD facuta la emitere +*!* directa pentru documentele cu tip_incasare=3 (POS/Card), ca reemiterea sa nu mai gaseasca +*!* lista de incasare goala in do_scrie_factura *!* parametru: id_fact @@ -30,6 +41,257 @@ FUNCTION EsteInEFactura ENDFUNC && EsteInEFactura +*!* parametru: id_vanzare; verifica daca documentul are urmasi (aviz/factura/retur) prin VANZARI_CORESP +FUNCTION DocumentAreUrmasi + LPARAMETERS tnIdVanzare + + LOCAL lcSql, lnNr, llSucces + lnNr = 0 + lcSql = [select count(*) as lnnr from vanzari_coresp where sters = 0 and (] + ; + [(tip in (1,2,3) and id_vanzare_aviz = ] + Alltrim(Str(Nvl(m.tnIdVanzare,0))) + [) or ] + ; + [(tip = 2 and id_vanzare_aviz in (select id_vanzare_aviz from vanzari_coresp ] + ; + [where sters = 0 and tip = 1 and id_vanzare_fact = ] + Alltrim(Str(Nvl(m.tnIdVanzare,0))) + [)))] + llSucces = goExecutor.oSelecteaza2Value(m.lcSql, @lnNr) + + RETURN (Nvl(m.lnNr,0) > 0) +ENDFUNC && DocumentAreUrmasi + + +*!* parametru: id_vanzare al unui document existent; iesire prin referinta - tnDiscountRon/tnDiscountValuta, +*!* discountul de document ca suma, in lei si in valuta; construieste oDateFactura cu tnIdSet=0, lEditare=.T. +*!* intoarce oDateFactura populat, sau .NULL. daca documentul nu exista/e sters sau la eroare Oracle +FUNCTION IncarcaAntetFacturaEditare + LPARAMETERS tnIdVanzare, tnDiscountRon, tnDiscountValuta + + LOCAL lcSql, lnSucces, loDate, lcListaSursa, lnDiscount, lnDiscountVal + tnDiscountRon = 0 + tnDiscountValuta = 0 + + IF Used('v_antet_editare') + Use In v_antet_editare + ENDIF + + lcSql = [select id_vanzare, tip, eproforma, serie_act, numar_act, data_act, data_scad, discount, ] + ; + [discount_evidentiat, delegat, id_delegat, bidelegat, cnpdelegat, nrinmat, id_masina, nume_agent, ] + ; + [id_agent, adresa_facturare, id_facturare, dataora_exp, text_aditional, listare_detaliata, tip_saft, ] + ; + [efactura, id_ruta, in_valuta, id_valuta, nume_val, curs, multiplicator, id_part, client, cod_fiscal, ] + ; + [incasat, nr_incasare, serie_chit, tip_incasare, ] + ; + [id_gestiune, id_comanda, id_ctr from fact_vfacturi where id_vanzare = ] + Alltrim(Str(Nvl(m.tnIdVanzare,0))) + [ and sters = 0] + + lnSucces = goExecutor.oExecute(lcSql,[v_antet_editare]) + goExecutor.oReset() + + IF lnSucces < 0 + AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare") + RETURN .NULL. + ENDIF + + IF Reccount('v_antet_editare') <> 1 + Use In v_antet_editare + RETURN .NULL. + ENDIF + + SELECT v_antet_editare + loDate = Createobject('oDateFactura',0,0) + loDate.lEditare = .T. + loDate.zi_curs = Ttod(data_act) && Init cheama citeste_cursuri_zi(poDate.zi_curs), altfel ramane {} si Oracle da ORA-01840 + + loDate.tip = tip + loDate.nIdTipDoc = Iif(Nvl(eproforma,0) = 1, loDate.nIdTipDocProforma, loDate.nIdTipDocFactura) + loDate.serie_act = Nvl(serie_act,[]) + loDate.nract = Nvl(numar_act,0) + loDate.dataact = Ttod(data_act) + loDate.datascad = Ttod(data_scad) + + loDate.discount_evidentiat = Nvl(discount_evidentiat,0) + loDate.in_valuta = Nvl(in_valuta,0) + IF loDate.in_valuta = 1 + loDate.id_valuta = id_valuta + loDate.nume_valuta = Nvl(nume_val,[]) + loDate.Curs = Nvl(curs,1) + loDate.multiplicator = Nvl(multiplicator,1) + lnDiscountVal = Nvl(discount,0) + lnDiscount = Round(lnDiscountVal * loDate.Curs / loDate.multiplicator, gnPPretV) + ELSE + lnDiscount = Nvl(discount,0) + lnDiscountVal = 0 + ENDIF + tnDiscountRon = lnDiscount + tnDiscountValuta = lnDiscountVal + + loDate.id_client = id_part + loDate.nume_client = Nvl(client,[]) + loDate.cod_fiscal = Alltrim(Nvl(cod_fiscal,[])) + loDate.id_gestiune_init = id_gestiune + + loDate.incasat = Nvl(incasat,0) + loDate.nr_incasare = Nvl(nr_incasare,0) + loDate.serie_chit = Alltrim(Nvl(serie_chit,[])) + loDate.ntip_incasare = Nvl(tip_incasare,0) + IF loDate.ntip_incasare = 3 + loDate.incasatCARD = loDate.incasat + loDate.incasat = 0 + ENDIF + + loDate.id_delegat = id_delegat + loDate.nume_delegat = Nvl(delegat,[]) + loDate.BIdelegat = Nvl(bidelegat,[]) + loDate.CNPdelegat = Nvl(cnpdelegat,[]) + loDate.id_masina = id_masina + loDate.nrinmat = Nvl(nrinmat,[]) + loDate.id_agent = id_agent + loDate.nume_agent = Nvl(nume_agent,[]) + loDate.id_facturare = id_facturare + loDate.adresa_facturare = Nvl(adresa_facturare,[]) + loDate.dataora_exp = dataora_exp + *!* Chr(170) e substitutul CR+LF scris la salvare (ofacturare.vc2:14281) - se inverseaza la incarcare + loDate.text_aditional = Strtran(Nvl(text_aditional,[]), Chr(170), Chr(13)+Chr(10)) + loDate.nListareDetaliata = Nvl(listare_detaliata,0) + loDate.tip_saft = Nvl(tip_saft,380) + loDate.eFactura = Nvl(efactura,0) + loDate.id_ruta = id_ruta + + *!* sursa comanda/contract vine direct din antet - doar avizele trec prin VANZARI_CORESP + DO CASE + CASE !Empty(Nvl(id_comanda,0)) + lcListaSursa = Alltrim(Str(id_comanda)) + CASE !Empty(Nvl(id_ctr,0)) + lcListaSursa = Alltrim(Str(id_ctr)) + OTHERWISE + lcListaSursa = [] + ENDCASE + loDate.cListaSursa = lcListaSursa + + Use In v_antet_editare + + loDate.cListaSursaAvize = IncarcaListaAvizeSursa(m.tnIdVanzare) + + RETURN loDate +ENDFUNC && IncarcaAntetFacturaEditare + + +*!* parametru: id_vanzare al facturii; intoarce lista (separata prin virgula) a id_vanzare ale avizelor +*!* sursa (VANZARI_CORESP, TIP=1); lista goala daca documentul nu are avize sursa sau la eroare Oracle +FUNCTION IncarcaListaAvizeSursa + LPARAMETERS tnIdVanzare + + LOCAL lcSql, lnSucces, lcLista + lcLista = [] + + IF Used('v_avize_sursa') + Use In v_avize_sursa + ENDIF + + lcSql = [select id_vanzare_aviz from vanzari_coresp where sters = 0 and tip = 1 and id_vanzare_fact = ] + ; + Alltrim(Str(Nvl(m.tnIdVanzare,0))) + lnSucces = goExecutor.oExecute(lcSql,[v_avize_sursa]) + goExecutor.oReset() + + IF lnSucces < 0 + AMESSAGEBOX(goExecutor.cEroare,0+16,"Eroare") + RETURN lcLista + ENDIF + + IF lnSucces > 0 + SELECT v_avize_sursa + SCAN + lcLista = lcLista + Iif(Empty(m.lcLista),[],[,]) + Alltrim(Str(id_vanzare_aviz)) + ENDSCAN + ENDIF + Use In v_avize_sursa + + RETURN lcLista +ENDFUNC && IncarcaListaAvizeSursa + + +*!* parametri: oDateFactura deja incarcat (antet), id_vanzare; incarca liniile nesterse din +*!* VVANZARI_ARTICOLE in crsfactura (deschis READWRITE, gol la eroare Oracle); intoarce mereu .T. +FUNCTION IncarcaLiniiFacturaEditare + LPARAMETERS toDate, tnIdVanzare + + LOCAL llInValuta, lnCursDoc, lnMultDoc, lnIdTemp, lnGestionabil, lcSql + + llInValuta = (toDate.in_valuta = 1) + lnCursDoc = Nvl(toDate.Curs,1) + lnMultDoc = Nvl(toDate.multiplicator,1) + + IncarcaArticoleFactura(m.tnIdVanzare, 'crsarticole_doc') + + *!* pret/discount_unitar din view sunt in moneda documentului; prelucreaza_facturacrs le vrea in lei + IF Used('crsarticole_editare') + Use In crsarticole_editare + ENDIF + SELECT id_vanzare_det, id_articol, explicatie, Nvl(denumire,[]) As denumire, lot, serie, codmat, id_jtva_coloana, taxcode, ; + pret_achizitie, cantitate, proc_tvav, pret_cu_tva, id_vanzare_set, id_gestiune, nume_gestiune, Cont, id_ctr, id_valuta, nume_val, in_stoc, ; + id_pol, pretd, id_valutad, ; + Nvl(curs, m.lnCursDoc) As curs, Nvl(multiplicator, m.lnMultDoc) As multiplicator, ; + Iif(m.llInValuta, Round(pret * Nvl(curs, m.lnCursDoc) / Nvl(multiplicator, m.lnMultDoc), gnPPretV), pret) As pret, ; + Iif(m.llInValuta, pret, 0) As pret_val, ; + Iif(m.llInValuta, Round(discount_unitar * Nvl(curs, m.lnCursDoc) / Nvl(multiplicator, m.lnMultDoc), gnPPretV), discount_unitar) As discount_unitar, ; + Iif(m.llInValuta, discount_unitar, 0) As discount_unitar_val, ; + Iif(m.llInValuta,1,0) As tip_valuta, ; + Cast(.Null. As N(10)) As id_jtva_coloana_ex, Space(50) As codmatf, Space(50) As codbare, Space(10) As um, Space(50) As numar_contract ; + FROM crsarticole_doc INTO CURSOR crsarticole_editare READWRITE + + creeaza_facturacrs('crsfactura') + prelucreaza_facturacrs('crsarticole_editare','crsfactura',0,0,0) + + *!* gestionabil vine din nomenclatorul curent, nu din id_gestiune; id_gestiune, nume_gestiune, Cont, id_pol/ + *!* pretd/id_valuta_d si vvaldiminuatctva (total in valuta cu tva, cf. oproceduri_facturare.prg:2282) + *!* nu sunt in lista de insert a lui prelucreaza_facturacrs + SELECT crsarticole_editare + SCAN + lnIdTemp = id_vanzare_det + lnGestionabil = Iif(Nvl(in_stoc,0) <> 0, 1, 0) + SELECT crsfactura + REPLACE gestionabil WITH m.lnGestionabil, ; + id_gestiune WITH Nvl(crsarticole_editare.id_gestiune, -1000), ; + nume_gestiune WITH Nvl(crsarticole_editare.nume_gestiune, []), ; + Cont WITH Nvl(crsarticole_editare.Cont, []), ; + id_pol WITH crsarticole_editare.id_pol, ; + pretd WITH crsarticole_editare.pretd, ; + id_valuta_d WITH crsarticole_editare.id_valutad, ; + vvaldiminuatctva WITH vvaldiminuatftva + vvaldiminuattva ; + FOR id_temp = m.lnIdTemp + SELECT crsarticole_editare + ENDSCAN + + *!* pretv_orig si legatura de rezervare nu sunt stocate pe document; se reiau din rulajul original + *!* pretv are sens doar pe gestiunile la pret de vanzare (nr_pag 6/7); in rest STOC.PRETV e 0 + lcSql = [select r.id_articol, r.id_gestiune, Nvl(r.cont,' ') as cont, r.pret, ] + ; + [Nvl(r.serie,' ') as serie, r.cante as cantitate, ] + ; + [case when (select max(g.nr_pag) from nom_gestiuni g ] + ; + [where g.id_gestiune = r.id_gestiune) in (6,7) ] + ; + [then r.pretv else 0 end as pretv, r.id_tip_rulaj, ] + ; + [r.id_part_rez, r.id_lucrare_rez ] + ; + [from rul r, vanzari v ] + ; + [where v.id_vanzare = ] + Alltrim(Str(m.tnIdVanzare)) + ; + [ and r.cod = v.cod and r.sters = 0 and r.cante <> 0 ] + ; + [order by r.id_tip_rulaj desc, r.id_rul] + IF goExecutor.oExecuta(m.lcSql, 'crs_lot_orig') + SELECT crsfactura + SCAN FOR gestionabil = 1 + SELECT crs_lot_orig + LOCATE FOR id_articol = crsfactura.id_articol AND id_gestiune = crsfactura.id_gestiune ; + AND Alltrim(cont) == Alltrim(crsfactura.Cont) AND pret = crsfactura.pret_achizitie ; + AND Alltrim(serie) == Alltrim(Nvl(crsfactura.serie,[])) AND cantitate = crsfactura.cantitate + IF Found() + REPLACE pretv_orig WITH crs_lot_orig.pretv, ; + id_part_rez WITH crs_lot_orig.id_part_rez, ; + id_lucrare_rez WITH crs_lot_orig.id_lucrare_rez IN crsfactura + ENDIF + SELECT crsfactura + ENDSCAN + Use In crs_lot_orig + ENDIF + + Use In crsarticole_doc + Use In crsarticole_editare + + RETURN .T. +ENDFUNC && IncarcaLiniiFacturaEditare + + *!* parametri: cod, an, luna, arata si randurile sterse (implicit .F.) *!* incarca cursoarele notei (tact) si ale rulajelor (trul, trul_obinv), cu recalculul de *!* valoare/valtva/valoarev/valtvav pe randurile goale; raman deschise READWRITE pe seama apelantului @@ -283,6 +545,7 @@ FUNCTION CreeazaCursorArticoleGol CREATE CURSOR (m.lcAlias) (id_vanzare I NULL, id_vanzare_det I NULL, id_articol N(20) NULL, cantitate N(12,3) NULL, pret N(14,4) NULL, pret_cu_tva N(14,4) NULL, proc_tvav N(6,4) NULL, ; discount_unitar N(14,4) NULL, id_gestiune I NULL, cont C(20) NULL, id_valuta I NULL, id_jtva_coloana I NULL, serie C(20) NULL, explicatie C(60) NULL, ; taxcode I NULL, lot C(20) NULL, sters I NULL, id_vanzare_set I NULL, pret_achizitie N(14,4) NULL, denumire C(100) NULL, codmat C(30) NULL, nume_gestiune C(60) NULL, nume_val C(20) NULL, ; + id_pol I NULL, id_ctr I NULL, diferenta N(14,4) NULL, pretd N(14,4) NULL, id_valutad I NULL, curs N(10,4) NULL, multiplicator N(10,4) NULL, ; lmodificat L, valoare N(14,2), in_stoc I NULL) ENDFUNC && CreeazaCursorArticoleGol diff --git a/programe/ofacturare_rutare_scriere.prg b/programe/ofacturare_rutare_scriere.prg new file mode 100644 index 0000000..27c06f7 --- /dev/null +++ b/programe/ofacturare_rutare_scriere.prg @@ -0,0 +1,568 @@ +*** ofacturare_rutare_scriere +*!* helpere pentru S8b: comparatia stare-incarcata / stare-curenta la editarea unui document existent, +*!* si alegerea rutei de scriere (regenerare / modifica_date_factura / modifica_explicatie_articol / nimic), +*!* si mutarea borderoului eFactura la reemitere + +*!* parametri: poDate deja incarcat (dupa IncarcaAntetFacturaEditare + IncarcaLiniiFacturaEditare), +*!* discountul curent in lei/valuta (Thisform.ndiscfactron/ndiscfactval, DUPA do_calculeaza_totaluri) +*!* construieste si intoarce instantaneul: identitatea documentului vechi (id_vanzare, id_fact, cod, +*!* an, luna - din variabilele PRIVATE deja capturate in do_editare_unificata, inainte de stergere), +*!* cei 14 parametri de antet, discountul de document (suma + indicator, separat de antet - nu e +*!* parametru al modifica_date_factura), copie a liniilor din crsfactura (doar campurile-intrare, +*!* cheie id_temp); .NULL. daca poDate nu e in editare +FUNCTION CreeazaSnapshotEditare + LPARAMETERS toDate, tnDiscountRon, tnDiscountValuta, tnIdVanzare, tnIdFact, tnCod, tnAn, tnLuna + + LOCAL loSnapshot + IF VARTYPE(toDate) <> 'O' OR !toDate.lEditare + RETURN .NULL. + ENDIF + + loSnapshot = CREATEOBJECT('Empty') + *!* id-ul real al documentului - NU toDate.nid_vanzare (ramane la sentinela 9999999999 pe calea de + *!* editare, IncarcaAntetFacturaEditare nu-l populeaza) - transmis explicit din do_editare_unificata + =AddProperty(loSnapshot, 'id_vanzare', NVL(m.tnIdVanzare,0)) + *!* identitatea documentului vechi - pentru stergerea si reemiterea din S9, nu pentru scrierea azi + =AddProperty(loSnapshot, 'id_fact', NVL(m.tnIdFact,0)) + =AddProperty(loSnapshot, 'cod', NVL(m.tnCod,0)) + =AddProperty(loSnapshot, 'an', NVL(m.tnAn,0)) + =AddProperty(loSnapshot, 'luna', NVL(m.tnLuna,0)) + *!* id_util/dataora ale creatiei documentului vechi - din crsFacturi (gridul din frm_facturi) cand e + *!* deschis, fara interogare Oracle noua; altfel (apel fara grid) interogare minima directa pe VANZARI + LOCAL lnAreaSnapshot, llGasitAudit, lnIdUtilAudit, ldDataoraAudit + lnAreaSnapshot = 0 + llGasitAudit = .F. + IF USED('crsfacturi') + lnAreaSnapshot = SELECT() + SELECT crsfacturi + LOCATE FOR id_vanzare = m.tnIdVanzare + IF FOUND('crsfacturi') + =AddProperty(loSnapshot, 'id_util', NVL(crsfacturi.id_util,0)) + =AddProperty(loSnapshot, 'dataora', NVL(crsfacturi.dataora,{})) + llGasitAudit = .T. + ENDIF + IF m.lnAreaSnapshot > 0 + SELECT (m.lnAreaSnapshot) + ENDIF + ENDIF + IF !m.llGasitAudit + lnIdUtilAudit = 0 + ldDataoraAudit = {} + IF USED('v_snap_audit_s14') + USE IN v_snap_audit_s14 + ENDIF + IF goExecutor.oExecuta([select id_util, dataora from vanzari where id_vanzare = ] + ALLTRIM(STR(NVL(m.tnIdVanzare,0),14,0)), 'v_snap_audit_s14') + SELECT v_snap_audit_s14 + IF RECCOUNT('v_snap_audit_s14') > 0 + GO TOP + lnIdUtilAudit = NVL(id_util,0) + ldDataoraAudit = NVL(dataora,{}) + ENDIF + USE IN v_snap_audit_s14 + ENDIF + =AddProperty(loSnapshot, 'id_util', lnIdUtilAudit) + =AddProperty(loSnapshot, 'dataora', ldDataoraAudit) + ENDIF + *!* cei 14 parametri de antet (modifica_date_factura_parametri.md) - valorile brute din poDate + =AddProperty(loSnapshot, 'id_ruta', NVL(toDate.id_ruta,0)) + =AddProperty(loSnapshot, 'id_delegat', NVL(toDate.id_delegat,0)) + =AddProperty(loSnapshot, 'id_agent', NVL(toDate.id_agent,0)) + =AddProperty(loSnapshot, 'id_masina', NVL(toDate.id_masina,0)) + =AddProperty(loSnapshot, 'dataora_exp', NVL(toDate.dataora_exp,{})) + =AddProperty(loSnapshot, 'id_facturare', NVL(toDate.id_facturare,0)) + =AddProperty(loSnapshot, 'listare_detaliata', NVL(toDate.nListareDetaliata,0)) + =AddProperty(loSnapshot, 'text_aditional', NVL(toDate.text_aditional,'')) + =AddProperty(loSnapshot, 'tip_saft', NVL(toDate.tip_saft,0)) + =AddProperty(loSnapshot, 'efactura', NVL(toDate.eFactura,0)) + =AddProperty(loSnapshot, 'data_act', NVL(toDate.dataact,{})) + =AddProperty(loSnapshot, 'data_scad', NVL(toDate.datascad,{})) + =AddProperty(loSnapshot, 'numar_act', NVL(toDate.nract,0)) + =AddProperty(loSnapshot, 'serie_act', NVL(toDate.serie_act,'')) + *!* discountul de document - grup de sume, NU parametru al modifica_date_factura (S8b §1, 9e); + *!* suma vine din Thisform.ndiscfactron/ndiscfactval DUPA do_calculeaza_totaluri, nu din poDate + =AddProperty(loSnapshot, 'discount_ron', NVL(m.tnDiscountRon,0)) + =AddProperty(loSnapshot, 'discount_val', NVL(m.tnDiscountValuta,0)) + =AddProperty(loSnapshot, 'discount_evidentiat', NVL(toDate.discount_evidentiat,0)) + + *!* liniile - doar campurile pe care utilizatorul le poate schimba, cheie id_temp (=id_vanzare_det) + IF USED('crsfactura') + IF USED('snap_linii_editare') + USE IN snap_linii_editare + ENDIF + SELECT id_temp, cantitate, pretctva, pretftva, discountctva, discountftva, cu_tva, proc_tvav, ; + id_articol, id_gestiune, id_jtva_coloana, taxcode, explicatie, lot, serie, id_pol, pretd, id_valuta_d ; + FROM crsfactura INTO CURSOR snap_linii_editare READWRITE + ENDIF + + RETURN loSnapshot +ENDFUNC && CreeazaSnapshotEditare + + +*!* parametri: poSnapshotEditare (din CreeazaSnapshotEditare), poDate curent, discountul curent in +*!* lei/valuta (Thisform.ndiscfactron/ndiscfactval), alias curent al liniilor (crsfactura) +*!* intoarce un cod de ruta: 1=regenerare, 2=modifica_date_factura, 3=modifica_explicatie_articol, +*!* 0=nimic; lant cu prioritate (sumele primele) - vezi s8b_rutarea_scrierii.md sectiunea 3.1 +*!* .NULL. de instantaneu => 0 (document nou, nu editare - nu se ruteaza) +FUNCTION AlegeRutaScriereEditare + LPARAMETERS toSnapshot, toDate, tnDiscRonCurent, tnDiscValCurent, tcAliasLinii + + LOCAL lcAlias, llSumeSchimbate + IF VARTYPE(toSnapshot) <> 'O' + RETURN 0 + ENDIF + lcAlias = IIF(TYPE('tcAliasLinii') = 'C' AND !EMPTY(m.tcAliasLinii), m.tcAliasLinii, 'crsfactura') + + llSumeSchimbate = LiniiAuSumeSchimbate(m.lcAlias) OR ; + !(ROUND(NVL(m.tnDiscRonCurent,0), gnPc) == ROUND(toSnapshot.discount_ron, gnPc)) OR ; + !(ROUND(NVL(m.tnDiscValCurent,0), gnPc) == ROUND(toSnapshot.discount_val, gnPc)) OR ; + NVL(toDate.discount_evidentiat,0) <> toSnapshot.discount_evidentiat + IF m.llSumeSchimbate + RETURN 1 && regenerare - implementarea propriu-zisa e S9 + ENDIF + + IF !AntetIdenticCuSnapshot(m.toSnapshot, m.toDate) + RETURN 2 && modifica_date_factura + ENDIF + + IF ExplicatieLinieSchimbata(m.lcAlias) + RETURN 3 && modifica_explicatie_articol + ENDIF + + RETURN 0 && nimic +ENDFUNC && AlegeRutaScriereEditare + + +*!* parametru: alias curent al liniilor (implicit crsfactura) +*!* .T. daca s-a adaugat/sters o linie sau s-a schimbat cantitate/pret/discount/tva/gestiune/lot/serie +*!* pe o linie existenta, comparat cu snap_linii_editare (cheie id_temp); precizie: gnPPretV pe +*!* pret/discount, gnPCant pe cantitate - nu pe valoarea bruta +FUNCTION LiniiAuSumeSchimbate + LPARAMETERS tcAlias + + LOCAL lcAlias, llRezultat, lnAreaOrigine, lnIdTemp + lcAlias = IIF(TYPE('tcAlias') = 'C' AND !EMPTY(m.tcAlias), m.tcAlias, 'crsfactura') + IF !USED('snap_linii_editare') OR !USED(m.lcAlias) + RETURN .F. + ENDIF + lnAreaOrigine = SELECT() + llRezultat = .F. + + *!* chei doar in snapshot => linie stearsa; chei doar in curent (sau id_temp = 0) => linie noua; + *!* daca reccount-urile coincid dar continutul difera (o stergere + o adaugare), scan-ul de mai + *!* jos gaseste oricum cheia din snapshot lipsa din curent + IF RECCOUNT('snap_linii_editare') <> RECCOUNT(m.lcAlias) + llRezultat = .T. + ELSE + SELECT snap_linii_editare + SCAN + lnIdTemp = id_temp + SELECT (m.lcAlias) + LOCATE FOR id_temp = m.lnIdTemp + IF !FOUND() + llRezultat = .T. + EXIT + ENDIF + IF !(ROUND(cantitate, gnPCant) == ROUND(snap_linii_editare.cantitate, gnPCant)) OR ; + !(ROUND(IIF(cu_tva=1,pretctva,pretftva), gnPPretV) == ROUND(IIF(snap_linii_editare.cu_tva=1,snap_linii_editare.pretctva,snap_linii_editare.pretftva), gnPPretV)) OR ; + !(ROUND(IIF(cu_tva=1,discountctva,discountftva), gnPPretV) == ROUND(IIF(snap_linii_editare.cu_tva=1,snap_linii_editare.discountctva,snap_linii_editare.discountftva), gnPPretV)) OR ; + !(ROUND(proc_tvav,4) == ROUND(snap_linii_editare.proc_tvav,4)) OR ; + NVL(id_articol,0) <> NVL(snap_linii_editare.id_articol,0) OR ; + NVL(id_gestiune,0) <> NVL(snap_linii_editare.id_gestiune,0) OR ; + ALLTRIM(NVL(lot,'')) <> ALLTRIM(NVL(snap_linii_editare.lot,'')) OR ; + ALLTRIM(NVL(serie,'')) <> ALLTRIM(NVL(snap_linii_editare.serie,'')) + llRezultat = .T. + EXIT + ENDIF + SELECT snap_linii_editare + ENDSCAN + ENDIF + + IF m.lnAreaOrigine > 0 + SELECT (m.lnAreaOrigine) + ENDIF + RETURN m.llRezultat +ENDFUNC && LiniiAuSumeSchimbate + + +*!* .T. daca oricare din cei 14 parametri de antet difera fata de snapshot (comparatie simetrica NVL) +FUNCTION AntetIdenticCuSnapshot + LPARAMETERS toSnapshot, toDate + + RETURN (NVL(toDate.id_ruta,0) == toSnapshot.id_ruta) AND ; + (NVL(toDate.id_delegat,0) == toSnapshot.id_delegat) AND ; + (NVL(toDate.id_agent,0) == toSnapshot.id_agent) AND ; + (NVL(toDate.id_masina,0) == toSnapshot.id_masina) AND ; + (NVL(toDate.dataora_exp,{}) == toSnapshot.dataora_exp) AND ; + (NVL(toDate.id_facturare,0) == toSnapshot.id_facturare) AND ; + (NVL(toDate.nListareDetaliata,0) == toSnapshot.listare_detaliata) AND ; + (NVL(toDate.text_aditional,'') == toSnapshot.text_aditional) AND ; + (NVL(toDate.tip_saft,0) == toSnapshot.tip_saft) AND ; + (NVL(toDate.eFactura,0) == toSnapshot.efactura) AND ; + (NVL(toDate.dataact,{}) == toSnapshot.data_act) AND ; + (NVL(toDate.datascad,{}) == toSnapshot.data_scad) AND ; + (NVL(toDate.nract,0) == toSnapshot.numar_act) AND ; + (NVL(toDate.serie_act,'') == toSnapshot.serie_act) +ENDFUNC && AntetIdenticCuSnapshot + + +*!* .T. daca s-a schimbat explicatia sau taxcode-ul pe cel putin o linie existenta (fara alte schimbari - +*!* apelat doar dupa ce LiniiAuSumeSchimbate a intors .F.) +FUNCTION ExplicatieLinieSchimbata + LPARAMETERS tcAlias + + LOCAL lcAlias, llRezultat, lnAreaOrigine, lnIdTemp + lcAlias = IIF(TYPE('tcAlias') = 'C' AND !EMPTY(m.tcAlias), m.tcAlias, 'crsfactura') + IF !USED('snap_linii_editare') OR !USED(m.lcAlias) + RETURN .F. + ENDIF + lnAreaOrigine = SELECT() + llRezultat = .F. + + SELECT snap_linii_editare + SCAN + lnIdTemp = id_temp + SELECT (m.lcAlias) + LOCATE FOR id_temp = m.lnIdTemp + IF FOUND() AND (ALLTRIM(NVL(explicatie,'')) <> ALLTRIM(NVL(snap_linii_editare.explicatie,'')) OR ; + NVL(taxcode,0) <> NVL(snap_linii_editare.taxcode,0) OR ; + NVL(id_jtva_coloana,0) <> NVL(snap_linii_editare.id_jtva_coloana,0)) + llRezultat = .T. + EXIT + ENDIF + SELECT snap_linii_editare + ENDSCAN + + IF m.lnAreaOrigine > 0 + SELECT (m.lnAreaOrigine) + ENDIF + RETURN m.llRezultat +ENDFUNC && ExplicatieLinieSchimbata + + +*!* parametri: poDate curent (antet complet), poSnapshotEditare (id-ul real al documentului - vezi +*!* CreeazaSnapshotEditare); scrie cei 14 parametri prin modifica_date_factura, acelasi tipar SQL ca +*!* frm_facturi.do_modifica (ofacturare_comun.vc2:4705-4726) - fara tranzactie manuala, la fel ca +*!* apelantul copiat; .T. la succes, .F. la eroare Oracle sau la id de document lipsa (cu amessagebox) +FUNCTION ScrieAntetEditare + LPARAMETERS toDate, toSnapshot + + LOCAL lcSql, lnSucces + *!* PRIVATE, nu LOCAL: parametrii legati (?) din TEXT TO se rezolva in scopul in care ruleaza + *!* goExecutor.oExecute, nu in cel al acestei functii - un LOCAL/LPARAMETERS e invizibil acolo si + *!* SQLExec ramane agatat (acelasi idiom ca poRec in frm_facturi.do_modifica, Private declarat) + PRIVATE poRecEditare, lnTipSaft + IF VARTYPE(toSnapshot) <> 'O' OR EMPTY(NVL(toSnapshot.id_vanzare,0)) OR toSnapshot.id_vanzare = 9999999999 + amessagebox('Documentul editat nu are un id valid - nimic nu a fost scris.',16,'Eroare') + RETURN .F. + ENDIF + + poRecEditare = toDate + + *!* tip_saft = 0 inseamna nesetat (documente vechi, dinainte de SAFT) - se scrie NULL, nu 0, la fel + *!* ca frm_facturi.do_modifica (ofacturare_comun.vc2:4701-4703) + lnTipSaft = poRecEditare.tip_saft + IF NVL(m.lnTipSaft,0) = 0 + lnTipSaft = .NULL. + ENDIF + + TEXT TO lcSql NOSHOW TEXTMERGE + begin pack_facturare.modifica_date_factura(<>, + <>, + <>, + <>, + <>, + to_date('<>','YYYYMMDDHH24:MI:SS'), + <>, + <>, + ?poRecEditare.text_aditional, + ?lnTipSaft, + ?poRecEditare.eFactura, + ?poRecEditare.dataact, + ?poRecEditare.datascad, + ?poRecEditare.nract, + ?poRecEditare.serie_act); + end; + ENDTEXT + + lnSucces = goExecutor.oExecute(lcSql) + IF lnSucces < 0 + amessagebox(goExecutor.oPrelucrareEroare(),16,"Eroare") + RETURN .F. + ENDIF + RETURN .T. +ENDFUNC && ScrieAntetEditare + + +*!* parametru: alias curent al liniilor (crsfactura); scrie explicatia/taxcode pe fiecare linie +*!* modificata fata de snap_linii_editare, prin modifica_explicatie_articol - acelasi tipar SQL ca +*!* frm_modifica_articol_factura.inainte_de_do_termin (ofacturare_comun.vc2:5407-5409); se opreste +*!* la primul esec Oracle (.F.), fara tranzactie manuala +FUNCTION ScrieExplicatieEditare + LPARAMETERS tcAlias + + LOCAL lcAlias, lnAreaOrigine, lnIdTemp, lcSql, llSucces + *!* PRIVATE, nu LOCAL - vezi ScrieAntetEditare: ?lnTaxcodeEditare trebuie vizibil din interiorul + *!* goExecutor.oExecuta; acelasi tipar ca ?poRec.taxcode in frm_modifica_articol_factura + PRIVATE lnTaxcodeEditare + lcAlias = IIF(TYPE('tcAlias') = 'C' AND !EMPTY(m.tcAlias), m.tcAlias, 'crsfactura') + IF !USED('snap_linii_editare') OR !USED(m.lcAlias) + RETURN .T. + ENDIF + lnAreaOrigine = SELECT() + llSucces = .T. + + SELECT snap_linii_editare + SCAN + lnIdTemp = id_temp + SELECT (m.lcAlias) + LOCATE FOR id_temp = m.lnIdTemp + IF FOUND() AND (ALLTRIM(NVL(explicatie,'')) <> ALLTRIM(NVL(snap_linii_editare.explicatie,'')) OR ; + NVL(taxcode,0) <> NVL(snap_linii_editare.taxcode,0) OR ; + NVL(id_jtva_coloana,0) <> NVL(snap_linii_editare.id_jtva_coloana,0)) + lnTaxcodeEditare = taxcode + lcSql = [begin pack_facturare.modifica_explicatie_articol(] + Alltrim(Str(m.lnIdTemp)) + [,] + ; + ['] + Nvl(Alltrim(OracleSpecialCharacters(explicatie)),'') + [',?gnIdUtil,?lnTaxcodeEditare,] + ; + Iif(Isnull(id_jtva_coloana),[null],Alltrim(Str(id_jtva_coloana))) + [); end;] + llSucces = goExecutor.oExecuta(lcSql) + IF !m.llSucces + EXIT + ENDIF + ENDIF + SELECT snap_linii_editare + ENDSCAN + + IF m.lnAreaOrigine > 0 + SELECT (m.lnAreaOrigine) + ENDIF + RETURN m.llSucces +ENDFUNC && ScrieExplicatieEditare + + +*!* parametru: toDate (oDateFactura incarcat pentru editare - IncarcaAntetFacturaEditare populeaza deja +*!* cListaSursa - comanda/contract - si cListaSursaAvize - avize, din VANZARI_CORESP TIP=1; S9 §1.5/1.7) +*!* intoarce lista de refurnizat ca poDate.listaid la reemitere, aleasa dupa tip - acelasi CASE ca +*!* dispecerizarea de scriere din do_scrie_factura (ofacturare.vc2:20171,20214,20249): avize (Tip=4) +*!* -> cListaSursaAvize; comenzi (3,21,25,28,42,47) -> cListaSursa; restul (contract/ELSE) -> '' (nu +*!* foloseau listaid la emiterea normala nici azi) +*!* .NULL. de toDate => ''; nu modifica toDate - apelantul decide cand scrie rezultatul pe poDate.listaid +FUNCTION CalculeazaListaidReemitere + LPARAMETERS toDate + + IF VARTYPE(toDate) <> 'O' + RETURN '' + ENDIF + + DO CASE + CASE toDate.tip = 4 + RETURN ALLTRIM(NVL(toDate.cListaSursaAvize, '')) + CASE INLIST(toDate.tip, 3, 21, 25, 28, 42, 47) + RETURN ALLTRIM(NVL(toDate.cListaSursa, '')) + OTHERWISE + RETURN '' + ENDCASE +ENDFUNC && CalculeazaListaidReemitere + + +*!* piciorul de stergere extras din ofacturare_comun.vc2:4837-4977 (frm_facturi.do_sterge), parametrizat - +*!* fara UI (fara confirmare "sunteti sigur", fara refresh de grid) si fara tranzactie proprie: +*!* nici SQLSetprop, nici COMMIT/ROLLBACK cand apelantul are deja Transactions=2 - +*!* oscrie_in_fisiere e deja transaction-aware (oscrie_in_fisiere.prg:111-117): daca apelantul a +*!* deschis deja Transactions=2 inainte de a chema aceasta functie, intra in aceeasi tranzactie +*!* (necesar pentru S9-4, stergere+reemitere atomic); altfel fiecare pas isi face singur commit +*!* oscrie_in_fisiere posteaza reversarea sub perioada globala activa gnAn/gnLuna (linia lui interna, +*!* neschimbabila de aici) - de-aia interogarea vact_tot/vrul_tot si sterge_factura raman pe gnAn/gnLuna +*!* ca in original, iar tnAn/tnLuna (perioada documentului) intra doar la finalizeaza_stergere_nota, +*!* exact ca pnAn/pnLuna in do_sterge - garda de mai jos impune egalitatea, ca in do_sterge original +*!* tnIdUtil optional - implicit gnIdUtil daca nu e transmis +*!* tnIdSetVechi, tnIdFdocVechi, tdDataIregVechi optionale, prin referinta: id_set-ul, felul de +*!* document si data inregistrarii contabile ale notei sterse, citite din acelasi cursor; +*!* raman neatinse daca documentul nu are nota contabila +*!* intoarce .T. daca documentul a fost sters (cu sau fara reversare de stoc), .F. la eroare sau garda +FUNCTION StergeDocumentFacturare + LPARAMETERS tnIdVanzare, tnCod, tnAn, tnLuna, tnIdUtil, tnIdSetVechi, tnIdFdocVechi, tdDataIregVechi + + LOCAL lcSql, lcCursor, lcConditieSters, llRul, llSucces, lnIdSet, lnIdFact, lnIdFactD + LOCAL lcCaleDateMenu, lnRezOscrie + *!* PRIVATE - legate cu ? in SQL trimis prin goExecutor, invizibile ca LPARAMETERS in scopul lui oExecuta + PRIVATE pnIdVanzareSterge, pnAnSterge, pnLunaSterge, pnIdUtilSterge + pnIdVanzareSterge = NVL(tnIdVanzare, 0) + pnAnSterge = NVL(tnAn, 0) + pnLunaSterge = NVL(tnLuna, 0) + pnIdUtilSterge = NVL(tnIdUtil, gnIdUtil) + + IF EMPTY(m.pnIdVanzareSterge) OR EMPTY(m.pnAnSterge) OR EMPTY(m.pnLunaSterge) + RETURN .F. + ENDIF + *!* aceeasi garda "luna curenta" ca in do_sterge (ofacturare_comun.vc2:4809) - obligatorie, nu doar UI: + *!* oscrie_in_fisiere posteaza mereu sub gnAn/gnLuna, indiferent ce se cere aici + IF (m.pnAnSterge * 12) + m.pnLunaSterge <> (gnAn * 12) + gnLuna + RETURN .F. + ENDIF + + llRul = .F. + llSucces = .F. + lcConditieSters = [ STERS = 0 AND ] + + Use In (SELECT('actactan')) + + lcSql = [select * from ] + gcs + [.vact_tot where ] + lcConditieSters + [ an = ] + Transform(gnAn) + [ and luna = ] + Transform(gnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_act] + lcCursor = [v_act] + IF goExecutor.oExecuta(lcSql, lcCursor) + Select * From v_act Into Cursor actactan + Use In v_act + + lcSql = [select * from ] + gcs + [.vrul_tot where ] + lcConditieSters + [ an = ] + Transform(gnAn) + [ and luna = ] + Transform(gnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_rul] + lcCursor = [v_rul] + IF goExecutor.oExecuta(lcSql, lcCursor) + IF Reccount(lcCursor) > 0 + llRul = .T. + ENDIF + + lcSql = [select * from ] + gcs + [.vrul_obinv_tot where ] + lcConditieSters + [ an = ] + Transform(gnAn) + [ and luna = ] + Transform(gnLuna) + [ and cod = ] + Alltrim(Str(m.tnCod)) + [ order by id_rul_obinv] + lcCursor = [v_rul_obinv] + IF goExecutor.oExecuta(lcSql, lcCursor) + IF Reccount(lcCursor) > 0 + llRul = .T. + ENDIF + Select * From v_rul Into Cursor rul_temp + Use In v_rul + Select * From v_rul_obinv Into Cursor rul_temp_obinv + Use In v_rul_obinv + + IF Reccount('actactan') > 0 + lcCaleDateMenu = gcAppPath + [\COMUN\DATEMENU\] + IF !Used('INFISIERE') + Use &lcCaleDateMenu.INFISIERE In 0 Alias INFISIERE + ENDIF + lnRezOscrie = OSCRIE_IN_FISIERE(2, .F., m.llRul) + IF Used('infisiere') + Use In INFISIERE + ENDIF + + IF lnRezOscrie < 0 + IF lnRezOscrie <> -5 + amessagebox(goExecutor.cEroare, 0+16, "Eroare") + ENDIF + ELSE + Select actactan + GO top + lnIdSet = id_set + *!* VARTYPE, nu PARAMETERS() - acesta din urma raporteaza ultimul apel imbricat + IF VARTYPE(m.tnIdSetVechi) = 'N' + tnIdSetVechi = m.lnIdSet + ENDIF + IF VARTYPE(m.tnIdFdocVechi) = 'N' AND !Isnull(id_fdoc) + tnIdFdocVechi = id_fdoc + ENDIF + IF Inlist(VARTYPE(m.tdDataIregVechi), 'D', 'T') AND !Isnull(dataireg) + tdDataIregVechi = dataireg + ENDIF + lnIdFact = id_fact + lnIdFactD = id_factd + lcSql = [begin pack_contafin.finalizeaza_stergere_nota(?pnLunaSterge,?pnAnSterge,Null,] + Alltrim(Str(m.lnIdSet)) + [,] + ; + Alltrim(Str(m.tnCod)) + [,] + Alltrim(Str(m.lnIdFact)) + [,] + Alltrim(Str(m.lnIdFactD)) + [,?pnIdUtilSterge); end;] + IF goExecutor.oExecuta(lcSql) + llSucces = .T. + ENDIF + ENDIF + *!* doar cand apelantul nu are deja o tranzactie manuala deschisa - altfel COMMIT-ul + *!* ar inchide-o inainte ca apelantul sa-si termine propria scriere + IF SQLGetprop(gnHandle, "Transactions") <> 2 + goExecutor.oExecuta(IIF(m.llSucces, "COMMIT", "ROLLBACK")) + ENDIF + ELSE + lcSql = [begin ] + gcs + [.pack_facturare.sterge_factura(?pnIdVanzareSterge,?gnLuna,?gnAn,?pnIdUtilSterge); end;] + llSucces = goExecutor.oExecuta(lcSql) + ENDIF + ENDIF + ENDIF + ENDIF + + IF Used('actactan') + Use In actactan + ENDIF + IF Used('rul_temp') + Use In rul_temp + ENDIF + IF Used('rul_temp_obinv') + Use In rul_temp_obinv + ENDIF + + RETURN m.llSucces +ENDFUNC && StergeDocumentFacturare + + +*!* impune ID_FACT-ul documentului vechi pentru reemiterea curenta, tintit pe grupul (nract, serie_act) +*!* al facturii - bucla din SCRIE_IN_ACT parcurge si grupul de incasare, care poate fi primul cand +*!* chitanta are aceeasi serie ca factura (masurat: docs\propunere_s9_7_cablare_idfact.md sectiunea 1.5) +*!* literale, nu bind ? - bind-ul prin goExecutor se leaga de PRIVATE/PUBLIC, nu de LOCAL/LPARAMETERS +*!* .F. daca id-ul lipseste (document fara nota contabila) sau daca apelul Oracle a picat +FUNCTION ForteazaIdFactReemitere + LPARAMETERS tnIdFact, tnNract, tcSerieAct + + IF EMPTY(NVL(m.tnIdFact, 0)) + RETURN .F. + ENDIF + RETURN goExecutor.oExecuta([begin pack_contafin.nIdFactFortat := ] + ALLTRIM(STR(m.tnIdFact,14,0)) + ; + [; pack_contafin.nNractFortat := ] + ALLTRIM(STR(NVL(m.tnNract,0),14,0)) + ; + [; pack_contafin.cSerieFortata := ] + ; + IIF(EMPTY(NVL(m.tcSerieAct,[])), [NULL], ['] + OracleSpecialCharacters(ALLTRIM(m.tcSerieAct)) + [']) + ; + [; end;]) +ENDFUNC && ForteazaIdFactReemitere + + +*!* sterge fortarea din sesiunea Oracle: ROLLBACK nu reseteaza starea PL/SQL de pachet, iar gnHandle +*!* traieste cat aplicatia - o reemitere picata ar contamina documentul urmator al aceluiasi utilizator +*!* no-op in afara regenerarii, ca sa nu coste un apel pe drumul normal de scriere +FUNCTION CurataIdFactFortat + IF TYPE('plRegenerareEditare') <> 'L' OR !plRegenerareEditare + RETURN .T. + ENDIF + RETURN goExecutor.oExecuta([begin pack_contafin.nIdFactFortat := NULL; ] + ; + [pack_contafin.nNractFortat := NULL; pack_contafin.cSerieFortata := NULL; end;]) +ENDFUNC && CurataIdFactFortat + + +*!* impune id_util/dataora ale creatiei documentului vechi la reemitere - simetric cu ForteazaIdFactReemitere, +*!* dar pe variabile proprii PACK_FACTURARE (nid_util_fortat/ddataora_fortata), resetate de +*!* initializeaza_date_factura: apelul trebuie facut DUPA acel apel, altfel e inert +*!* .F. daca id_util lipseste (document fara creator) sau daca apelul Oracle a picat +FUNCTION ForteazaAuditCreareReemitere + LPARAMETERS tnIdUtil, tdDataora + + IF EMPTY(NVL(m.tnIdUtil, 0)) + RETURN .F. + ENDIF + RETURN goExecutor.oExecuta([begin pack_facturare.nid_util_fortat := ] + ALLTRIM(STR(m.tnIdUtil,14,0)) + ; + [; pack_facturare.ddataora_fortata := ] + ; + IIF(EMPTY(NVL(m.tdDataora,{})), [NULL], [to_date(']+TTOC(m.tdDataora,1)+[','YYYYMMDDHH24MISS')]) + ; + [; end;]) +ENDFUNC && ForteazaAuditCreareReemitere + + +*!* sterge fortarea auditului de creare din sesiunea Oracle - simetric cu CurataIdFactFortat +*!* no-op in afara regenerarii, ca sa nu coste un apel pe drumul normal de scriere +FUNCTION CurataAuditCreareFortat + IF TYPE('plRegenerareEditare') <> 'L' OR !plRegenerareEditare + RETURN .T. + ENDIF + RETURN goExecutor.oExecuta([begin pack_facturare.nid_util_fortat := NULL; ] + ; + [pack_facturare.ddataora_fortata := NULL; end;]) +ENDFUNC && CurataAuditCreareFortat + + +*!* parametri: id_vanzare vechi si nou; muta randurile de borderou eFactura ale documentului +*!* regenerat pe id-ul nou - FACT_BORDEROU_DETALII n-are STERS, iar FACT_VBORDEROU_DETALII nu +*!* filtreaza vanzari.sters, deci fara mutare borderoul ar afisa in continuare valorile +*!* documentului sters, cu serie si numar corecte +*!* UPDATE fara randuri potrivite = succes; .F. doar la eroare Oracle sau id lipsa +FUNCTION MutaBorderouReemitere + LPARAMETERS tnIdVanzareVechi, tnIdVanzareNou + + IF EMPTY(NVL(m.tnIdVanzareVechi,0)) OR EMPTY(NVL(m.tnIdVanzareNou,0)) + RETURN .F. + ENDIF + RETURN goExecutor.oExecuta([update ] + gcs + [.fact_borderou_detalii set id_vanzare = ] + ; + ALLTRIM(STR(m.tnIdVanzareNou,14,0)) + [ where id_vanzare = ] + ; + ALLTRIM(STR(m.tnIdVanzareVechi,14,0))) +ENDFUNC && MutaBorderouReemitere diff --git a/programe/ogrid_latimi.prg b/programe/ogrid_latimi.prg new file mode 100644 index 0000000..a891441 --- /dev/null +++ b/programe/ogrid_latimi.prg @@ -0,0 +1,104 @@ +#DEFINE SYSMETRIC_VSCROLLBARWIDTH 5 && Width of a vertical scroll bar +#DEFINE SYSMETRIC_WINDOWBORDERWIDTH 10 && Width of a window border + +*!* 22.08.2026 +*!* marius.mutu +*!* distribuie - imparte spatiul liber sau lipsa dintr-un grid proportional cu latimile de +*!* referinta (baseline) ale coloanelor vizibile; baseline-ul se captureaza per coloana, dupa +*!* Name, la prima intalnire a fiecarei coloane pe fiecare grid, si nu se mai modifica dupa aceea + +Define Class oGridLatimi As Custom + + nLatimeMinima = 30 && sub acest prag coloana nu mai afiseaza nimic lizibil + oBaseline = .Null. + + Procedure Init + This.oBaseline = Createobject('Collection') + Endproc + + Procedure distribuie + Lparameters toGrid + + Local lnColCount, lnI, lnUltimaCol, lnLatimeUtila, lnSpatiuLiber, lnSumBaseline, lnSumaAlocata, lnTarget + Local lcGridKey, lnKeyIndex, llModificat + Local loBaselineGrid, loCol + + If Vartype(m.toGrid) <> 'O' + Return .F. + Endif + + lnColCount = toGrid.ColumnCount + If m.lnColCount <= 0 + Return .F. + Endif + + * baseline separat per grid, identificat prin adresa obiectului - un al doilea grid nu mosteneste baseline-ul primului + lcGridKey = Sys(1272, m.toGrid) + lnKeyIndex = This.oBaseline.Getkey(m.lcGridKey) + If m.lnKeyIndex = 0 + loBaselineGrid = Createobject('Collection') + This.oBaseline.Add(m.loBaselineGrid, m.lcGridKey) + Else + loBaselineGrid = This.oBaseline.Item(m.lnKeyIndex) + Endif + + * coloana noua sau intalnita prima data pe acest grid - latimea ei curenta devine referinta + For lnI = 1 To m.lnColCount + loCol = toGrid.Columns(m.lnI) + If loCol.Visible And loBaselineGrid.Getkey(loCol.Name) = 0 + loBaselineGrid.Add(loCol.Width, loCol.Name) + Endif + Endfor + + * coloanele scoase cu RemoveObject nu mai sunt in toGrid.Columns - se ignora automat, baseline-ul lor ramane neatins + lnSumBaseline = 0 + lnUltimaCol = 0 + For lnI = 1 To m.lnColCount + loCol = toGrid.Columns(m.lnI) + If loCol.Visible + lnSumBaseline = m.lnSumBaseline + loBaselineGrid.Item(loCol.Name) + lnUltimaCol = m.lnI + Endif + Endfor + + If m.lnUltimaCol = 0 Or m.lnSumBaseline <= 0 + Return .F. + Endif + + lnLatimeUtila = toGrid.Width + If toGrid.ScrollBars = 2 Or toGrid.ScrollBars = 3 + lnLatimeUtila = m.lnLatimeUtila - Sysmetric(SYSMETRIC_VSCROLLBARWIDTH) + Endif + If toGrid.BorderStyle = 1 + lnLatimeUtila = m.lnLatimeUtila - Sysmetric(SYSMETRIC_WINDOWBORDERWIDTH) * 2 + Endif + + lnSpatiuLiber = m.lnLatimeUtila - m.lnSumBaseline + + llModificat = .F. + lnSumaAlocata = 0 + For lnI = 1 To m.lnColCount + loCol = toGrid.Columns(m.lnI) + If loCol.Visible And m.lnI <> m.lnUltimaCol + lnTarget = loBaselineGrid.Item(loCol.Name) + Round(m.lnSpatiuLiber * loBaselineGrid.Item(loCol.Name) / m.lnSumBaseline, 0) + lnTarget = Max(m.lnTarget, This.nLatimeMinima) + lnSumaAlocata = m.lnSumaAlocata + m.lnTarget + If loCol.Width <> m.lnTarget + loCol.Width = m.lnTarget + llModificat = .T. + Endif + Endif + Endfor + + * ultima coloana vizibila primeste restul exact, ca sa nu ramana pixeli goi din rotunjire + loCol = toGrid.Columns(m.lnUltimaCol) + lnTarget = Max(m.lnLatimeUtila - m.lnSumaAlocata, This.nLatimeMinima) + If loCol.Width <> m.lnTarget + loCol.Width = m.lnTarget + llModificat = .T. + Endif + + Return m.llModificat + Endproc + +Enddefine diff --git a/programe/oproceduri_facturare.prg b/programe/oproceduri_facturare.prg index 2a80993..3f43660 100644 --- a/programe/oproceduri_facturare.prg +++ b/programe/oproceduri_facturare.prg @@ -117,7 +117,7 @@ Endproc && facturare_lista_de_preturi ************************************ SFARSIT: facturare_lista_de_preturi *********************************** ************************************ INCEPUT: facturare_contracte ****************************************** Procedure facturare_contracte - LPARAMETERS tcTip + LPARAMETERS tcTip, toSursa LOCAL lcTip lcTip = UPPER(ALLTRIM(TRANSFORM(m.tcTip))) @@ -127,17 +127,18 @@ Procedure facturare_contracte ENDIF DO CASE CASE m.lcTip = 'FACTURA LEI' - factureaza(2) + factureaza(2, NULL, toSursa) CASE m.lcTip = 'INVOICE' - factureaza(6) + factureaza(6, NULL, toSursa) CASE m.lcTip = 'FACTURA VALUTA' - factureaza(52) + factureaza(52, NULL, toSursa) ENDCASE Endproc && facturare_contracte ************************************ SFARSIT: facturare_contracte ****************************************** ************************************ INCEPUT: facturare_comenzi ******************************************** Procedure facturare_comenzi - factureaza(3) + LPARAMETERS toSursa + factureaza(3, NULL, toSursa) Endproc && facturare_comenzi ************************************ SFARSIT: facturare_comenzi ******************************************** ************************************ INCEPUT: facturare_avize *********************************************** @@ -338,7 +339,7 @@ Procedure vizualizare_facturi lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; - ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),id_utilm I,utilm c(30),dataoram t,delegat c(70),'+] + ; ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; @@ -350,7 +351,7 @@ Procedure vizualizare_facturi lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; - ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,id_utilm,utilm,dataoram,delegat,bidelegat,cnpdelegat,'+] + ; ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; ['valuta,id_valuta,valval,tvaval,totval,'+] + ; @@ -2391,4 +2392,56 @@ Function calculeaza_totaluri Release lnProcTvav_19_119 Return toArticol Endfunc -******************************************* SFARSIT: calculeaza_totaluri ******************************************* \ No newline at end of file +******************************************* SFARSIT: calculeaza_totaluri ******************************************* + +******************************************* INCEPUT: recalc_discount_linie ******************************************* +Function recalc_discount_linie + Lparameters toArticol, tnValoare, tnTip + Local lnProcent, lnDiscountTva, lnDiscountTva_val + If toArticol.cu_tva = 0 + Do Case + Case tnTip = 1 + lnProcent = tnValoare + If toArticol.tip_valuta = 0 + toArticol.discountftva = Round(toArticol.pretftva * lnProcent / 100, gnPPretV) + Else + toArticol.vdiscountftva = Round(toArticol.vpretftva * lnProcent / 100, gnPVal) + toArticol.discountftva = Round(toArticol.vdiscountftva * toArticol.Curs / toArticol.multiplicator, gnPPretV) + Endif + Case tnTip = 2 + toArticol.discountftva = tnValoare + Case tnTip = 3 + toArticol.vdiscountftva = tnValoare + toArticol.discountftva = Round(toArticol.vdiscountftva * toArticol.Curs / toArticol.multiplicator, gnPPretV) + Endcase + lnDiscountTva = Round(toArticol.discountftva * (toArticol.proc_tvav-1), gnPPretV) + toArticol.discountctva = lnDiscountTva + toArticol.discountftva + If toArticol.tip_valuta = 1 + lnDiscountTva_val = Round(toArticol.vdiscountftva * (toArticol.proc_tvav-1), gnPVal) + toArticol.vdiscountctva = lnDiscountTva_val + toArticol.vdiscountftva + Endif + Else + Do Case + Case tnTip = 1 + lnProcent = tnValoare + If toArticol.tip_valuta = 0 + toArticol.discountctva = Round(toArticol.pretctva * lnProcent / 100, gnPPretV) + Else + toArticol.vdiscountctva = Round(toArticol.vpretctva * lnProcent / 100, gnPVal) + toArticol.discountctva = Round(toArticol.vdiscountctva * toArticol.Curs / toArticol.multiplicator, gnPPretV) + Endif + Case tnTip = 2 + toArticol.discountctva = tnValoare + Case tnTip = 3 + toArticol.vdiscountctva = tnValoare + toArticol.discountctva = Round(toArticol.vdiscountctva * toArticol.Curs / toArticol.multiplicator, gnPPretV) + Endcase + toArticol.discountftva = IIF(toArticol.proc_tvav<>0,Round(toArticol.discountctva / toArticol.proc_tvav , gnPPretV),0) + If toArticol.tip_valuta = 1 + toArticol.vdiscountftva = IIF(toArticol.proc_tvav<>0,Round(toArticol.vdiscountctva / toArticol.proc_tvav , gnPVal),0) + Endif + Endif + toArticol.procdisc = IIF(toArticol.pretftva <> 0, Round(toArticol.discountftva / toArticol.pretftva * 100, 2), 0) + Return toArticol +Endfunc +******************************************* SFARSIT: recalc_discount_linie ******************************************* \ No newline at end of file diff --git a/utile/Teste/cache_anaf/test_benchmark_in1000.prg b/utile/Teste/cache_anaf/test_benchmark_in1000.prg index 13bbd95..ca6b07d 100644 --- a/utile/Teste/cache_anaf/test_benchmark_in1000.prg +++ b/utile/Teste/cache_anaf/test_benchmark_in1000.prg @@ -27,7 +27,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcTestLog) ON ERROR DO ErrBench WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT -DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 DO WrLogB WITH 'EROARE: conectare Oracle esuata - GATA' QUIT diff --git a/utile/Teste/cache_anaf/test_de_ce_rand_nou.prg b/utile/Teste/cache_anaf/test_de_ce_rand_nou.prg index 4897a32..71655b7 100644 --- a/utile/Teste/cache_anaf/test_de_ce_rand_nou.prg +++ b/utile/Teste/cache_anaf/test_de_ce_rand_nou.prg @@ -28,7 +28,7 @@ gcUltimaEroareSQL = '' ON ERROR DO ErrDeCe WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT -DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 DO WrLog5 WITH 'EROARE: conectare Oracle esuata - GATA' QUIT diff --git a/utile/Teste/cache_anaf/test_echivalenta_cache_anaf_200.prg b/utile/Teste/cache_anaf/test_echivalenta_cache_anaf_200.prg index fadec4d..6a7bd49 100644 --- a/utile/Teste/cache_anaf/test_echivalenta_cache_anaf_200.prg +++ b/utile/Teste/cache_anaf/test_echivalenta_cache_anaf_200.prg @@ -68,7 +68,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog) ON ERROR DO VpaErr200 WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT -DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 DO WriteTestLog200 WITH 'EROARE: conectare Oracle esuata - GATA' QUIT diff --git a/utile/Teste/cache_anaf/test_echivalenta_cache_rtvai.prg b/utile/Teste/cache_anaf/test_echivalenta_cache_rtvai.prg index 2f52930..2ef459b 100644 --- a/utile/Teste/cache_anaf/test_echivalenta_cache_rtvai.prg +++ b/utile/Teste/cache_anaf/test_echivalenta_cache_rtvai.prg @@ -50,7 +50,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog) ON ERROR DO VpaErrRTVAI WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT -DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 DO WriteTestLogRTVAI WITH 'EROARE: conectare Oracle esuata - GATA' QUIT diff --git a/utile/Teste/cache_anaf/test_margine_inactiv_frontiera.prg b/utile/Teste/cache_anaf/test_margine_inactiv_frontiera.prg index 428f9d8..f33c282 100644 --- a/utile/Teste/cache_anaf/test_margine_inactiv_frontiera.prg +++ b/utile/Teste/cache_anaf/test_margine_inactiv_frontiera.prg @@ -33,7 +33,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog) ON ERROR DO VpaErrMargine WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT -DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 DO WriteTestLogMargine WITH 'EROARE: conectare Oracle esuata - GATA' QUIT diff --git a/utile/Teste/cache_anaf/test_margine_tvaincasare_frontiera.prg b/utile/Teste/cache_anaf/test_margine_tvaincasare_frontiera.prg index 1401a29..fc2a687 100644 --- a/utile/Teste/cache_anaf/test_margine_tvaincasare_frontiera.prg +++ b/utile/Teste/cache_anaf/test_margine_tvaincasare_frontiera.prg @@ -28,7 +28,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog) ON ERROR DO VpaErrTvainc WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT -DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 DO WriteTestLogTvainc WITH 'EROARE: conectare Oracle esuata - GATA' QUIT diff --git a/utile/Teste/cache_anaf/test_mock_batch_anaf_demo.prg b/utile/Teste/cache_anaf/test_mock_batch_anaf_demo.prg index 95ad215..8d1c910 100644 --- a/utile/Teste/cache_anaf/test_mock_batch_anaf_demo.prg +++ b/utile/Teste/cache_anaf/test_mock_batch_anaf_demo.prg @@ -40,7 +40,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcTestLog) ON ERROR DO VpaErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT -DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 DO WriteTestLog WITH 'EROARE: conectare Oracle esuata - GATA' QUIT diff --git a/utile/Teste/cache_anaf/test_rand_nou_din_cache.prg b/utile/Teste/cache_anaf/test_rand_nou_din_cache.prg index 990e157..7eb0b7e 100644 --- a/utile/Teste/cache_anaf/test_rand_nou_din_cache.prg +++ b/utile/Teste/cache_anaf/test_rand_nou_din_cache.prg @@ -29,7 +29,7 @@ gcUltimaEroareSQL = '' ON ERROR DO ErrRand WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT -DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 DO WrLog4 WITH 'EROARE: conectare Oracle esuata - GATA' QUIT diff --git a/utile/Teste/cache_anaf/test_timp_completare_tabel.prg b/utile/Teste/cache_anaf/test_timp_completare_tabel.prg index ed7e213..ace843f 100644 --- a/utile/Teste/cache_anaf/test_timp_completare_tabel.prg +++ b/utile/Teste/cache_anaf/test_timp_completare_tabel.prg @@ -26,7 +26,7 @@ STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcTestLog) ON ERROR DO ErrCompl WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT -DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 DO WrLog3 WITH 'mediu OK' SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE diff --git a/utile/Teste/cache_anaf/test_timp_masa_peste1000.prg b/utile/Teste/cache_anaf/test_timp_masa_peste1000.prg index 8e3d77e..16caa9c 100644 --- a/utile/Teste/cache_anaf/test_timp_masa_peste1000.prg +++ b/utile/Teste/cache_anaf/test_timp_masa_peste1000.prg @@ -29,7 +29,7 @@ gnMockRaspuns = 6 ON ERROR DO ErrP1000 WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT -DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 DO WrLog2 WITH 'EROARE: conectare Oracle esuata - GATA' QUIT diff --git a/utile/Teste/cache_anaf/test_timp_verificare_masa.prg b/utile/Teste/cache_anaf/test_timp_verificare_masa.prg index 42dd1ea..5b86cc1 100644 --- a/utile/Teste/cache_anaf/test_timp_verificare_masa.prg +++ b/utile/Teste/cache_anaf/test_timp_verificare_masa.prg @@ -45,7 +45,7 @@ gnMockRaspuns = 6 ON ERROR DO ErrTimp WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() ON SHUTDOWN QUIT -DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 DO WrLog WITH 'EROARE: conectare Oracle esuata - GATA' QUIT diff --git a/utile/Teste/editare_factura/assert_id_part_rez.prg b/utile/Teste/editare_factura/assert_id_part_rez.prg new file mode 100644 index 0000000..4e05dbf --- /dev/null +++ b/utile/Teste/editare_factura/assert_id_part_rez.prg @@ -0,0 +1,100 @@ +* assert_id_part_rez.prg +* Verificarea pe date vii ceruta inainte de reparatia 3.3 (id_part_rez / id_lucrare_rez la editare). +* Doar SELECT pe MARIUSM_AUTO. + +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnS, lcSql + +*!* A. coloanele exista in VANZARI_DETALII? +lcSql = "select column_name, data_type, nullable from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_DETALII' and column_name in ('ID_PART_REZ','ID_LUCRARE_REZ','ID_VANZARE','ID_VANZARE_DET','STERS') order by column_name" +lnS = goExecutor.oExecute(lcSql, 'crsA') +STRTOFILE('A) VANZARI_DETALII coloane rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsA'), RECCOUNT('crsA'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsA') + SELECT crsA + SCAN + STRTOFILE(' ' + PADR(ALLTRIM(column_name), 18) + ' ' + PADR(ALLTRIM(data_type), 10) + ' null=' + ALLTRIM(NVL(nullable,'?')) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsA +ENDIF +goExecutor.oReset() + +*!* B. exista randuri cu valori nenule? +lcSql = "select count(*) as tot, count(id_part_rez) as cu_part, count(id_lucrare_rez) as cu_lucr from vanzari_detalii where sters = 0" +lnS = goExecutor.oExecute(lcSql, 'crsB') +STRTOFILE('B) numaratoare rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsB') AND RECCOUNT('crsB') > 0 + STRTOFILE(' total=' + TRANSFORM(crsB.tot) + ' cu id_part_rez=' + TRANSFORM(crsB.cu_part) + ' cu id_lucrare_rez=' + TRANSFORM(crsB.cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1) + USE IN crsB +ENDIF +goExecutor.oReset() + +*!* C. documentele cu valori nenule (top 20) +lcSql = "select id_vanzare, count(*) as nr, count(id_part_rez) as cu_part, count(id_lucrare_rez) as cu_lucr from vanzari_detalii where sters = 0 and (id_part_rez is not null or id_lucrare_rez is not null) group by id_vanzare order by id_vanzare desc" +lnS = goExecutor.oExecute(lcSql, 'crsC') +STRTOFILE('C) documente cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsC'), RECCOUNT('crsC'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsC') + SELECT crsC + SCAN + STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' linii=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsC +ENDIF +goExecutor.oReset() + +*!* D. VVANZARI_ARTICOLE chiar nu le expune? +lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VVANZARI_ARTICOLE' and column_name in ('ID_PART_REZ','ID_LUCRARE_REZ') order by column_name" +lnS = goExecutor.oExecute(lcSql, 'crsD') +STRTOFILE('D) VVANZARI_ARTICOLE expune? rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsD'), RECCOUNT('crsD'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsD') + SELECT crsD + SCAN + STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsD +ENDIF +goExecutor.oReset() + +*!* E. ce face Oracle cu valoarea (BODY 4110-4165) +lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 4100 and 4165 order by line" +lnS = goExecutor.oExecute(lcSql, 'crsE') +STRTOFILE('E) BODY 4100-4165 rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsE'), RECCOUNT('crsE'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsE') + SELECT crsE + SCAN + STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsE +ENDIF +goExecutor.oReset() + +*!* F. orice consumator al coloanelor in PL/SQL (unde conteaza 0 vs NULL) +lcSql = "select name, type, line, text from user_source where (lower(text) like '%id_part_rez%' or lower(text) like '%id_lucrare_rez%') order by name, type, line" +lnS = goExecutor.oExecute(lcSql, 'crsF') +STRTOFILE('F) consumatori PL/SQL rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsF'), RECCOUNT('crsF'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsF') + SELECT crsF + SCAN + STRTOFILE(' ' + PADR(ALLTRIM(name), 22) + ' ' + PADR(ALLTRIM(type), 14) + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsF +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/assert_id_part_rez2.prg b/utile/Teste/editare_factura/assert_id_part_rez2.prg new file mode 100644 index 0000000..3b28de6 --- /dev/null +++ b/utile/Teste/editare_factura/assert_id_part_rez2.prg @@ -0,0 +1,100 @@ +* assert_id_part_rez2.prg +* Unde traiesc de fapt ID_PART_REZ / ID_LUCRARE_REZ: VANZARI_DETALII nu le are (proba 1). +* Doar SELECT pe MARIUSM_AUTO. + +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez2_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnS, lcSql + +*!* G. toate obiectele MARIUSM_AUTO care au coloanele +lcSql = "select t.table_name, o.object_type, count(*) as nr from all_tab_columns t, all_objects o where t.owner = 'MARIUSM_AUTO' and o.owner = t.owner and o.object_name = t.table_name and t.column_name in ('ID_PART_REZ','ID_LUCRARE_REZ') group by t.table_name, o.object_type order by t.table_name" +lnS = goExecutor.oExecute(lcSql, 'crsG') +STRTOFILE('G) obiecte cu coloanele rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsG'), RECCOUNT('crsG'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsG') + SELECT crsG + SCAN + STRTOFILE(' ' + PADR(ALLTRIM(table_name), 32) + ' ' + PADR(ALLTRIM(object_type), 12) + ' col=' + TRANSFORM(nr) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsG +ENDIF +goExecutor.oReset() + +*!* H. cate randuri RUL au valori nenule, si pe ce documente +lcSql = "select count(*) as tot, count(id_part_rez) as cu_part, count(id_lucrare_rez) as cu_lucr from rul where sters = 0" +lnS = goExecutor.oExecute(lcSql, 'crsH') +STRTOFILE('H) RUL rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsH') AND RECCOUNT('crsH') > 0 + STRTOFILE(' total=' + TRANSFORM(crsH.tot) + ' cu id_part_rez=' + TRANSFORM(crsH.cu_part) + ' cu id_lucrare_rez=' + TRANSFORM(crsH.cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1) + USE IN crsH +ENDIF +goExecutor.oReset() + +*!* I. documente de vanzare cu rezervare pe RUL +lcSql = "select v.id_vanzare, v.tip, count(*) as nr, count(r.id_part_rez) as cu_part, count(r.id_lucrare_rez) as cu_lucr from rul r, vanzari v where r.cod = v.cod and r.sters = 0 and v.sters = 0 and (r.id_part_rez is not null or r.id_lucrare_rez is not null) group by v.id_vanzare, v.tip order by v.id_vanzare desc" +lnS = goExecutor.oExecute(lcSql, 'crsI') +STRTOFILE('I) documente vanzare cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsI'), RECCOUNT('crsI'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsI') + SELECT crsI + SCAN + STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(NVL(tip,-1)) + ' linii=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsI +ENDIF +goExecutor.oReset() + +*!* J. de unde citeste PACK_FACTURARE coloanele (BODY 3190-3270) +lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 3190 and 3270 order by line" +lnS = goExecutor.oExecute(lcSql, 'crsJ') +STRTOFILE('J) BODY 3190-3270 rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsJ'), RECCOUNT('crsJ'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsJ') + SELECT crsJ + SCAN + STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsJ +ENDIF +goExecutor.oReset() + +*!* K. ce coloane are VANZARI_DETALII, integral (ca sa nu ramana dubiu) +lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_DETALII' order by column_id" +lnS = goExecutor.oExecute(lcSql, 'crsK') +STRTOFILE('K) VANZARI_DETALII toate coloanele rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsK'), RECCOUNT('crsK'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsK') + SELECT crsK + SCAN + STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsK +ENDIF +goExecutor.oReset() + +*!* L. ce coloane are VANZARI_DETALII_TEMP +lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_DETALII_TEMP' order by column_id" +lnS = goExecutor.oExecute(lcSql, 'crsL') +STRTOFILE('L) VANZARI_DETALII_TEMP coloane rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsL'), RECCOUNT('crsL'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsL') + SELECT crsL + SCAN + STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsL +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/assert_id_part_rez3.prg b/utile/Teste/editare_factura/assert_id_part_rez3.prg new file mode 100644 index 0000000..5dbe5a5 --- /dev/null +++ b/utile/Teste/editare_factura/assert_id_part_rez3.prg @@ -0,0 +1,86 @@ +* assert_id_part_rez3.prg +* Unde persista legatura de rezervare, daca VANZARI_DETALII nu are coloanele (proba 2). +* Doar SELECT pe MARIUSM_AUTO. + +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez3_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnS, lcSql + +*!* M. coloanele RUL +lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'RUL' order by column_id" +lnS = goExecutor.oExecute(lcSql, 'crsM') +STRTOFILE('M) RUL coloane rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsM'), RECCOUNT('crsM'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsM') + SELECT crsM + SCAN + STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsM +ENDIF +goExecutor.oReset() + +*!* N. documente de vanzare cu rezervare pe RUL (fara v.tip) +lcSql = "select v.id_vanzare as idv, count(*) as nr, count(r.id_part_rez) as cu_part, count(r.id_lucrare_rez) as cu_lucr from rul r, vanzari v where r.cod = v.cod and r.sters = 0 and v.sters = 0 and (r.id_part_rez is not null or r.id_lucrare_rez is not null) group by v.id_vanzare order by v.id_vanzare desc" +lnS = goExecutor.oExecute(lcSql, 'crsN') +STRTOFILE('N) documente vanzare cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsN'), RECCOUNT('crsN'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsN') + SELECT crsN + SCAN + STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' randuri_rul=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsN +ENDIF +goExecutor.oReset() + +*!* O. unde scrie PACK_FACTURARE in VANZARI_DETALII (mutarea din TEMP) +lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and lower(text) like '%vanzari_detalii%' order by line" +lnS = goExecutor.oExecute(lcSql, 'crsO') +STRTOFILE('O) referinte VANZARI_DETALII in BODY rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsO'), RECCOUNT('crsO'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsO') + SELECT crsO + SCAN + STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsO +ENDIF +goExecutor.oReset() + +*!* P. cum se calculeaza CUSTODIE (BODY 4166-4200) +lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 4166 and 4200 order by line" +lnS = goExecutor.oExecute(lcSql, 'crsP') +STRTOFILE('P) BODY 4166-4200 rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsP'), RECCOUNT('crsP'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsP') + SELECT crsP + SCAN + STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsP +ENDIF +goExecutor.oReset() + +*!* Q. sursa view-ului VVANZARI_ARTICOLE (ca sa se vada de unde vine, si ce se poate adauga fara sa se atinga) +lcSql = "select count(*) as nr from all_views where owner = 'MARIUSM_AUTO' and view_name = 'VVANZARI_ARTICOLE'" +lnS = goExecutor.oExecute(lcSql, 'crsQ') +STRTOFILE('Q) VVANZARI_ARTICOLE e view? rc=' + TRANSFORM(lnS) + ' nr=' + TRANSFORM(IIF(USED('crsQ') AND RECCOUNT('crsQ')>0, crsQ.nr, -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsQ') + USE IN crsQ +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/assert_id_part_rez4.prg b/utile/Teste/editare_factura/assert_id_part_rez4.prg new file mode 100644 index 0000000..6686b86 --- /dev/null +++ b/utile/Teste/editare_factura/assert_id_part_rez4.prg @@ -0,0 +1,74 @@ +* assert_id_part_rez4.prg +* Documentele de vanzare care au legatura de rezervare pe RUL (candidati pentru proba pe date reale). +* Doar SELECT pe MARIUSM_AUTO. + +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez4_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnS, lcSql + +lcSql = [select v.id_vanzare as idv, v.id_firma as idf, count(*) as nr, ] + ; + [count(r.id_part_rez) as cu_part, count(r.id_lucrare_rez) as cu_lucr ] + ; + [from rul r, vanzari v ] + ; + [where r.cod = v.cod and r.sters = 0 and v.sters = 0 ] + ; + [and (r.id_part_rez is not null or r.id_lucrare_rez is not null) ] + ; + [group by v.id_vanzare, v.id_firma order by v.id_vanzare desc] +lnS = goExecutor.oExecute(lcSql, 'crsN') +STRTOFILE('N) documente vanzare cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsN'), RECCOUNT('crsN'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsN') + SELECT crsN + SCAN + STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' id_firma=' + TRANSFORM(NVL(idf,-1)) + ' randuri_rul=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsN +ENDIF +goExecutor.oReset() + +*!* distributia pe tipuri de rulaj a randurilor cu rezervare +lcSql = [select r.id_tip_rulaj as tipr, count(*) as nr from rul r ] + ; + [where r.sters = 0 and (r.id_part_rez is not null or r.id_lucrare_rez is not null) ] + ; + [group by r.id_tip_rulaj order by r.id_tip_rulaj] +lnS = goExecutor.oExecute(lcSql, 'crsO') +STRTOFILE('O) distributie id_tip_rulaj rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsO'), RECCOUNT('crsO'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsO') + SELECT crsO + SCAN + STRTOFILE(' id_tip_rulaj=' + TRANSFORM(NVL(tipr,-1)) + ' randuri=' + TRANSFORM(nr) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsO +ENDIF +goExecutor.oReset() + +*!* constrangeri pe RUL.ID_PART_REZ / ID_LUCRARE_REZ (0 vs NULL) +lcSql = [select c.constraint_name as cnume, c.constraint_type as ctip, cc.column_name as ccol ] + ; + [from all_constraints c, all_cons_columns cc ] + ; + [where c.owner = 'MARIUSM_AUTO' and c.constraint_name = cc.constraint_name ] + ; + [and c.owner = cc.owner and cc.table_name = 'RUL' ] + ; + [and cc.column_name in ('ID_PART_REZ','ID_LUCRARE_REZ')] +lnS = goExecutor.oExecute(lcSql, 'crsP') +STRTOFILE('P) constrangeri RUL rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsP'), RECCOUNT('crsP'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsP') + SELECT crsP + SCAN + STRTOFILE(' ' + ALLTRIM(NVL(cnume,'')) + ' tip=' + ALLTRIM(NVL(ctip,'')) + ' col=' + ALLTRIM(NVL(ccol,'')) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsP +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/assert_id_part_rez5.prg b/utile/Teste/editare_factura/assert_id_part_rez5.prg new file mode 100644 index 0000000..abb682c --- /dev/null +++ b/utile/Teste/editare_factura/assert_id_part_rez5.prg @@ -0,0 +1,55 @@ +* assert_id_part_rez5.prg +* Candidatii pentru proba pe date reale + coloanele VANZARI. +* Doar SELECT pe MARIUSM_AUTO. + +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez5_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnS, lcSql + +lcSql = [select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ; + [and table_name = 'VANZARI' order by column_id] +lnS = goExecutor.oExecute(lcSql, 'crsV') +STRTOFILE('V) VANZARI coloane rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsV'), RECCOUNT('crsV'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsV') + SELECT crsV + SCAN + STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsV +ENDIF +goExecutor.oReset() + +lcSql = [select v.id_vanzare as idv, count(*) as nr, ] + ; + [count(r.id_part_rez) as cu_part, count(r.id_lucrare_rez) as cu_lucr ] + ; + [from rul r, vanzari v ] + ; + [where r.cod = v.cod and r.sters = 0 and v.sters = 0 ] + ; + [and (r.id_part_rez is not null or r.id_lucrare_rez is not null) ] + ; + [group by v.id_vanzare order by v.id_vanzare desc] +lnS = goExecutor.oExecute(lcSql, 'crsN') +STRTOFILE('N) documente vanzare cu rezervare rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsN'), RECCOUNT('crsN'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsN') + SELECT crsN + SCAN + STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' randuri_rul=' + TRANSFORM(nr) + ' cu_part=' + TRANSFORM(cu_part) + ' cu_lucr=' + TRANSFORM(cu_lucr) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsN +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/assert_id_part_rez6.prg b/utile/Teste/editare_factura/assert_id_part_rez6.prg new file mode 100644 index 0000000..a91f921 --- /dev/null +++ b/utile/Teste/editare_factura/assert_id_part_rez6.prg @@ -0,0 +1,78 @@ +* assert_id_part_rez6.prg +* Exista o cheie directa intre randul RUL si linia de document (id_vanzare_det)? +* Doar SELECT pe MARIUSM_AUTO. + +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez6_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnS, lcSql, lcDoc +lcDoc = '540' + +*!* randurile RUL ale documentului +lcSql = [select r.id_rul as idrul, r.id_fact as idfact, r.id_articol as idart, r.id_gestiune as idgest, ] + ; + [r.cont as ccont, r.pret as npret, r.cante as ncante, r.pretv as npretv, ] + ; + [r.id_tip_rulaj as tipr, r.id_part_rez as ipr, r.id_lucrare_rez as ilr, r.serie as cserie ] + ; + [from rul r, vanzari v where r.cod = v.cod and v.id_vanzare = ] + lcDoc + ; + [ and r.sters = 0 order by r.id_tip_rulaj desc, r.id_rul] +lnS = goExecutor.oExecute(lcSql, 'crsR') +STRTOFILE('R) RUL doc ' + lcDoc + ' rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsR'), RECCOUNT('crsR'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsR') + SELECT crsR + SCAN + STRTOFILE(' id_rul=' + TRANSFORM(idrul) + ' id_fact=' + IIF(ISNULL(idfact),'NULL',TRANSFORM(idfact)) + ; + ' art=' + TRANSFORM(NVL(idart,-1)) + ' gest=' + TRANSFORM(NVL(idgest,-1)) + ; + ' cont=[' + ALLTRIM(NVL(ccont,'')) + '] pret=' + TRANSFORM(NVL(npret,0)) + ; + ' cante=' + TRANSFORM(NVL(ncante,0)) + ' pretv=' + TRANSFORM(NVL(npretv,0)) + ; + ' tipr=' + TRANSFORM(NVL(tipr,-1)) + ' serie=[' + ALLTRIM(NVL(cserie,'')) + ']' + ; + ' id_part_rez=' + IIF(ISNULL(ipr),'NULL',TRANSFORM(ipr)) + ; + ' id_lucrare_rez=' + IIF(ISNULL(ilr),'NULL',TRANSFORM(ilr)) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsR +ENDIF +goExecutor.oReset() + +*!* liniile documentului +lcSql = [select d.id_vanzare_det as idvd, d.id_articol as idart, d.id_gestiune as idgest, ] + ; + [d.cont as ccont, d.pret_achizitie as npa, d.cantitate as ncant, d.serie as cserie ] + ; + [from vanzari_detalii d where d.id_vanzare = ] + lcDoc + [ and d.sters = 0 order by d.id_vanzare_det] +lnS = goExecutor.oExecute(lcSql, 'crsD') +STRTOFILE('S) VANZARI_DETALII doc ' + lcDoc + ' rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsD'), RECCOUNT('crsD'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsD') + SELECT crsD + SCAN + STRTOFILE(' id_vanzare_det=' + TRANSFORM(idvd) + ' art=' + TRANSFORM(NVL(idart,-1)) + ; + ' gest=' + TRANSFORM(NVL(idgest,-1)) + ' cont=[' + ALLTRIM(NVL(ccont,'')) + ']' + ; + ' pret_achiz=' + TRANSFORM(NVL(npa,0)) + ' cant=' + TRANSFORM(NVL(ncant,0)) + ; + ' serie=[' + ALLTRIM(NVL(cserie,'')) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsD +ENDIF +goExecutor.oReset() + +*!* cate randuri RUL au id_fact care exista in vanzari_detalii (potrivire directa) +lcSql = [select count(*) as tot, count(r.id_fact) as cu_fact ] + ; + [from rul r where r.sters = 0 and (r.id_part_rez is not null or r.id_lucrare_rez is not null)] +lnS = goExecutor.oExecute(lcSql, 'crsT') +STRTOFILE('T) RUL cu rezervare: id_fact completat rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsT') AND RECCOUNT('crsT') > 0 + STRTOFILE(' total=' + TRANSFORM(crsT.tot) + ' cu_id_fact=' + TRANSFORM(crsT.cu_fact) + CHR(13) + CHR(10), gcErrLog, 1) + USE IN crsT +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/assert_id_part_rez7.prg b/utile/Teste/editare_factura/assert_id_part_rez7.prg new file mode 100644 index 0000000..c99c88b --- /dev/null +++ b/utile/Teste/editare_factura/assert_id_part_rez7.prg @@ -0,0 +1,78 @@ +* assert_id_part_rez7.prg +* Cate randuri au valori NENULE SI NENULE-DE-ZERO; ce documente. Doar SELECT pe MARIUSM_AUTO. + +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez7_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnS, lcSql + +lcSql = [select count(*) as tot, ] + ; + [sum(case when r.id_part_rez is not null and r.id_part_rez <> 0 then 1 else 0 end) as part_nz, ] + ; + [sum(case when r.id_lucrare_rez is not null and r.id_lucrare_rez <> 0 then 1 else 0 end) as lucr_nz, ] + ; + [sum(case when r.id_part_rez = 0 then 1 else 0 end) as part_z ] + ; + [from rul r where r.sters = 0] +lnS = goExecutor.oExecute(lcSql, 'crsA') +STRTOFILE('A) RUL rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsA') AND RECCOUNT('crsA') > 0 + STRTOFILE(' total=' + TRANSFORM(crsA.tot) + ' part<>0=' + TRANSFORM(NVL(crsA.part_nz,0)) + ; + ' lucr<>0=' + TRANSFORM(NVL(crsA.lucr_nz,0)) + ' part=0=' + TRANSFORM(NVL(crsA.part_z,0)) + CHR(13) + CHR(10), gcErrLog, 1) + USE IN crsA +ENDIF +goExecutor.oReset() + +lcSql = [select v.id_vanzare as idv, count(*) as nr, ] + ; + [sum(case when r.id_part_rez is not null and r.id_part_rez <> 0 then 1 else 0 end) as part_nz, ] + ; + [sum(case when r.id_lucrare_rez is not null and r.id_lucrare_rez <> 0 then 1 else 0 end) as lucr_nz ] + ; + [from rul r, vanzari v where r.cod = v.cod and r.sters = 0 and v.sters = 0 ] + ; + [and ((r.id_part_rez is not null and r.id_part_rez <> 0) or (r.id_lucrare_rez is not null and r.id_lucrare_rez <> 0)) ] + ; + [group by v.id_vanzare order by v.id_vanzare desc] +lnS = goExecutor.oExecute(lcSql, 'crsB') +STRTOFILE('B) documente cu rezervare reala rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsB'), RECCOUNT('crsB'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsB') + SELECT crsB + SCAN + STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' randuri_rul=' + TRANSFORM(nr) + ; + ' part<>0=' + TRANSFORM(NVL(part_nz,0)) + ' lucr<>0=' + TRANSFORM(NVL(lucr_nz,0)) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsB +ENDIF +goExecutor.oReset() + +*!* valorile efective, cu documentul si linia +lcSql = [select v.id_vanzare as idv, r.id_rul as idrul, r.id_articol as idart, r.id_gestiune as idgest, ] + ; + [r.cont as ccont, r.pret as npret, r.cante as ncante, r.id_tip_rulaj as tipr, ] + ; + [r.id_part_rez as ipr, r.id_lucrare_rez as ilr ] + ; + [from rul r, vanzari v where r.cod = v.cod and r.sters = 0 and v.sters = 0 ] + ; + [and ((r.id_part_rez is not null and r.id_part_rez <> 0) or (r.id_lucrare_rez is not null and r.id_lucrare_rez <> 0)) ] + ; + [order by v.id_vanzare desc, r.id_rul] +lnS = goExecutor.oExecute(lcSql, 'crsC') +STRTOFILE('C) randurile cu rezervare reala rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsC'), RECCOUNT('crsC'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsC') + SELECT crsC + SCAN + STRTOFILE(' doc=' + TRANSFORM(idv) + ' id_rul=' + TRANSFORM(idrul) + ' art=' + TRANSFORM(NVL(idart,-1)) + ; + ' gest=' + TRANSFORM(NVL(idgest,-1)) + ' cont=[' + ALLTRIM(NVL(ccont,'')) + ']' + ; + ' pret=' + TRANSFORM(NVL(npret,0)) + ' cante=' + TRANSFORM(NVL(ncante,0)) + ' tipr=' + TRANSFORM(NVL(tipr,-1)) + ; + ' id_part_rez=' + IIF(ISNULL(ipr),'NULL',TRANSFORM(ipr)) + ; + ' id_lucrare_rez=' + IIF(ISNULL(ilr),'NULL',TRANSFORM(ilr)) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsC +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/assert_id_part_rez8.prg b/utile/Teste/editare_factura/assert_id_part_rez8.prg new file mode 100644 index 0000000..d23833b --- /dev/null +++ b/utile/Teste/editare_factura/assert_id_part_rez8.prg @@ -0,0 +1,43 @@ +* assert_id_part_rez8.prg +* Alegerea unui document de control cu id_part_rez = 0 SI linii gestionabile (in_stoc <> 0). +* Doar SELECT pe MARIUSM_AUTO. + +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_id_part_rez8_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnS, lcSql + +lcSql = [select v.id_vanzare as idv, count(*) as nr, ] + ; + [sum(case when nvl(n.in_stoc,0) <> 0 then 1 else 0 end) as gest ] + ; + [from rul r, vanzari v, nom_articole n ] + ; + [where r.cod = v.cod and r.sters = 0 and v.sters = 0 and n.id_articol = r.id_articol ] + ; + [and r.id_part_rez = 0 and r.cante <> 0 ] + ; + [group by v.id_vanzare having sum(case when nvl(n.in_stoc,0) <> 0 then 1 else 0 end) > 0 ] + ; + [order by v.id_vanzare desc] +lnS = goExecutor.oExecute(lcSql, 'crsA') +STRTOFILE('A) docuri cu id_part_rez=0 si articole in stoc rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsA'), RECCOUNT('crsA'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsA') + SELECT crsA + SCAN + STRTOFILE(' id_vanzare=' + TRANSFORM(idv) + ' randuri=' + TRANSFORM(nr) + ' gestionabile=' + TRANSFORM(NVL(gest,0)) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsA +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/assert_pretval_apelanti.prg b/utile/Teste/editare_factura/assert_pretval_apelanti.prg new file mode 100644 index 0000000..dc2b798 --- /dev/null +++ b/utile/Teste/editare_factura/assert_pretval_apelanti.prg @@ -0,0 +1,68 @@ +* assert_pretval_apelanti.prg +* Asertiune ceruta inainte de reparatia vpretctva/vdiscountctva (docs\propunere_comparatie_coloane_crsfactura.md:310): +* toti apelantii lui prelucreaza_facturacrs trebuie sa aiba pret_val si discount_unitar_val in cursorul sursa. +* Doar SELECT pe MARIUSM_AUTO. Sursele statice (Create Cursor / SELECT ... As pret_val) se verifica in raport. + +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_pretval_apelanti_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnS, lcSql + +*!* A. crsdetalii (ofacturare_stoc.prg:578 "select * from fact_vfacturi_detalii") +lcSql = "select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'FACT_VFACTURI_DETALII' and column_name in ('PRET_VAL','DISCOUNT_UNITAR_VAL') order by column_name" +lnS = goExecutor.oExecute(lcSql, 'crsA') +STRTOFILE('A) FACT_VFACTURI_DETALII rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsA'), RECCOUNT('crsA'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsA') + SELECT crsA + SCAN + STRTOFILE(' ' + ALLTRIM(column_name) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsA +ENDIF +goExecutor.oReset() + +*!* B. antetele procedurilor care produc ref cursoarele celorlalti apelanti Oracle +lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' " + ; + "and (lower(text) like '%procedure citeste_vanzari_seturi%' or lower(text) like '%procedure citeste_proforme_seturi%' " + ; + "or lower(text) like '%procedure finalizeaza_scriere_verificare%') order by line" +lnS = goExecutor.oExecute(lcSql, 'crsB') +STRTOFILE('B) antete proceduri rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsB'), RECCOUNT('crsB'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsB') + SELECT crsB + SCAN + STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsB +ENDIF +goExecutor.oReset() + +*!* C. toate liniile din corpul pachetului care numesc pret_val / discount_unitar_val +lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' " + ; + "and (lower(text) like '%pret_val%' or lower(text) like '%discount_unitar_val%') order by line" +lnS = goExecutor.oExecute(lcSql, 'crsC') +STRTOFILE('C) linii cu pret_val/discount_unitar_val rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsC'), RECCOUNT('crsC'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsC') + SELECT crsC + SCAN + STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsC +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/assert_pretval_apelanti2.prg b/utile/Teste/editare_factura/assert_pretval_apelanti2.prg new file mode 100644 index 0000000..fda47ae --- /dev/null +++ b/utile/Teste/editare_factura/assert_pretval_apelanti2.prg @@ -0,0 +1,42 @@ +* assert_pretval_apelanti2.prg -- delimitarea procedurilor din PACK_FACTURARE intre 14200 si 15900 +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_pretval_apelanti2_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +LOCAL lnS, lcSql +lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' " + ; + "and line between 14200 and 15900 and regexp_like(text, '^\s*(procedure|function)\s', 'i') order by line" +lnS = goExecutor.oExecute(lcSql, 'crsH') +STRTOFILE('antete 14200..15900 rc=' + TRANSFORM(lnS) + ' n=' + TRANSFORM(IIF(USED('crsH'), RECCOUNT('crsH'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsH') + SELECT crsH + SCAN + STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsH +ENDIF +goExecutor.oReset() +lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 15100 and 15200 order by line" +lnS = goExecutor.oExecute(lcSql, 'crsD') +STRTOFILE('corp 15100..15200 rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsD') + SELECT crsD + SCAN + STRTOFILE(' ' + PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsD +ENDIF +goExecutor.oReset() +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/assert_pretval_apelanti3.prg b/utile/Teste/editare_factura/assert_pretval_apelanti3.prg new file mode 100644 index 0000000..7f6a341 --- /dev/null +++ b/utile/Teste/editare_factura/assert_pretval_apelanti3.prg @@ -0,0 +1,30 @@ +* assert_pretval_apelanti3.prg -- corpul finalizeaza_scriere_verificare (14238..14340) +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_pretval_apelanti3_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +LOCAL lnS, lcSql +lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 14238 and 14340 order by line" +lnS = goExecutor.oExecute(lcSql, 'crsD') +STRTOFILE('rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsD') + SELECT crsD + SCAN + STRTOFILE(PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsD +ENDIF +goExecutor.oReset() +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/assert_pretval_apelanti4.prg b/utile/Teste/editare_factura/assert_pretval_apelanti4.prg new file mode 100644 index 0000000..5ae6d63 --- /dev/null +++ b/utile/Teste/editare_factura/assert_pretval_apelanti4.prg @@ -0,0 +1,30 @@ +* assert_pretval_apelanti3.prg -- corpul finalizeaza_scriere_verificare (14238..14340) +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\assert_pretval_apelanti4_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +LOCAL lnS, lcSql +lcSql = "select line, text from user_source where name = 'PACK_FACTURARE' and type = 'PACKAGE BODY' and line between 14183 and 14238 order by line" +lnS = goExecutor.oExecute(lcSql, 'crsD') +STRTOFILE('rc=' + TRANSFORM(lnS) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('crsD') + SELECT crsD + SCAN + STRTOFILE(PADL(TRANSFORM(line), 6) + ' | ' + ALLTRIM(STRTRAN(STRTRAN(NVL(text,''), CHR(13), ''), CHR(10), '')) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN crsD +ENDIF +goExecutor.oReset() +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/check_cols.prg b/utile/Teste/editare_factura/check_cols.prg new file mode 100644 index 0000000..77dc5aa --- /dev/null +++ b/utile/Teste/editare_factura/check_cols.prg @@ -0,0 +1,60 @@ +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_cols_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnS +lnS = goExecutor.oExecute("select column_name from user_tab_columns where table_name='VPLAJE_NUMERE' order by column_id", 'crsCol1') +STRTOFILE('VPLAJE_NUMERE cols: ' + Transform(lnS) + CHR(13) + CHR(10), gcErrLog, 1) +IF Used('crsCol1') + SELECT crsCol1 + SCAN + STRTOFILE(column_name + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN +ENDIF +goExecutor.oReset() + +LOCAL lnS2 +lnS2 = goExecutor.oExecute("select column_name, data_type from user_tab_columns where table_name in ('FACT_VFACTURI') and column_name in ('INCASAT','NR_INCASARE','INCASATCARD','INCASATTICHETE','TIP_INCASARE','SERIE_CHIT') order by column_name", 'crsCol2') +STRTOFILE('FACT_VFACTURI incasare cols: ' + Transform(lnS2) + CHR(13) + CHR(10), gcErrLog, 1) +IF Used('crsCol2') + SELECT crsCol2 + SCAN + STRTOFILE(column_name + ' ' + data_type + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN +ENDIF +goExecutor.oReset() + +LOCAL lnS3 +lnS3 = goExecutor.oExecute("select column_name, data_type from user_tab_columns where table_name = 'VANZARI' and column_name in ('INCASAT','NR_INCASARE','INCASATCARD','INCASATTICHETE','TIP_INCASARE','SERIE_CHIT','ID_CASA') order by column_name", 'crsCol3') +STRTOFILE('VANZARI incasare cols: ' + Transform(lnS3) + CHR(13) + CHR(10), gcErrLog, 1) +IF Used('crsCol3') + SELECT crsCol3 + SCAN + STRTOFILE(column_name + ' ' + data_type + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN +ENDIF +goExecutor.oReset() + +LOCAL lnS4 +lnS4 = goExecutor.oExecute("select id_vanzare, incasat, nr_incasare from fact_vfacturi where id_vanzare=1071", 'crsDoc') +STRTOFILE('doc 1071: ' + Transform(lnS4) + CHR(13) + CHR(10), gcErrLog, 1) +IF Used('crsDoc') + SELECT crsDoc + STRTOFILE('incasat=' + Transform(incasat) + ' nr_incasare=' + Transform(Nvl(nr_incasare,-1)) + CHR(13) + CHR(10), gcErrLog, 1) +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/check_doc1071_incasare.prg b/utile/Teste/editare_factura/check_doc1071_incasare.prg new file mode 100644 index 0000000..093d08b --- /dev/null +++ b/utile/Teste/editare_factura/check_doc1071_incasare.prg @@ -0,0 +1,50 @@ +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_doc1071_incasare_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnS +lnS = goExecutor.oExecute("select id_vanzare, incasat, nr_incasare, serie_chit, tip_incasare, cod, numar_act from fact_vfacturi where id_vanzare=1071", 'crsD') +STRTOFILE('doc1071: ' + Transform(lnS) + CHR(13) + CHR(10), gcErrLog, 1) +IF Used('crsD') + SELECT crsD + STRTOFILE('incasat=' + Transform(incasat) + ' nr_incasare=' + Transform(Nvl(nr_incasare,-1)) + ; + ' serie_chit=[' + Transform(Nvl(serie_chit,'?')) + '] tip_incasare=' + Transform(Nvl(tip_incasare,-1)) + ; + ' cod=' + Transform(cod) + ' numar_act=' + Transform(numar_act) + CHR(13) + CHR(10), gcErrLog, 1) +ENDIF +goExecutor.oReset() + +LOCAL lnS2 +lnS2 = goExecutor.oExecute("select scd, scc, id_fdoc, serie_act, nract, suma, sters, perechec from act where cod=(select cod from fact_vfacturi where id_vanzare=1071) and perechec=(select numar_act from fact_vfacturi where id_vanzare=1071) and substr(scd,1,1)='5' and scc<>'418'", 'crsAct') +STRTOFILE('act rows: ' + Transform(lnS2) + ' reccount=' + Transform(Iif(Used('crsAct'),Reccount('crsAct'),-1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF Used('crsAct') + SELECT crsAct + SCAN + STRTOFILE('scd=' + scd + ' scc=' + scc + ' id_fdoc=' + Transform(Nvl(id_fdoc,-1)) + ' serie_act=' + Transform(Nvl(serie_act,'?')) + ; + ' nract=' + Transform(Nvl(nract,0)) + ' suma=' + Transform(Nvl(suma,0)) + ' sters=' + Transform(sters) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN +ENDIF +goExecutor.oReset() + +LOCAL lnS3 +lnS3 = goExecutor.oExecute("select PACK_SESIUNE.getoptiunefirma(USER,'ID_FDOC_CHITANTA') as chit, PACK_SESIUNE.getoptiunefirma(USER,'ID_FDOC_BONFISCAL') as bon, PACK_SESIUNE.getoptiunefirma(USER,'ID_FDOC_CARD') as card from dual", 'crsOpt') +STRTOFILE('optiuni fdoc: ' + Transform(lnS3) + CHR(13) + CHR(10), gcErrLog, 1) +IF Used('crsOpt') + SELECT crsOpt + STRTOFILE('ID_FDOC_CHITANTA=' + Transform(chit) + ' ID_FDOC_BONFISCAL=' + Transform(bon) + ' ID_FDOC_CARD=' + Transform(card) + CHR(13) + CHR(10), gcErrLog, 1) +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/check_tip_incasare_distrib.prg b/utile/Teste/editare_factura/check_tip_incasare_distrib.prg new file mode 100644 index 0000000..699dc4a --- /dev/null +++ b/utile/Teste/editare_factura/check_tip_incasare_distrib.prg @@ -0,0 +1,29 @@ +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_tip_incasare_distrib_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnS +lnS = goExecutor.oExecute("select tip_incasare, count(*) as nr from fact_vfacturi where incasat<>0 and sters=0 group by tip_incasare order by tip_incasare", 'crsD') +STRTOFILE('distrib: ' + Transform(lnS) + CHR(13) + CHR(10), gcErrLog, 1) +IF Used('crsD') + SELECT crsD + SCAN + STRTOFILE('tip_incasare=' + Transform(Nvl(tip_incasare,-1)) + ' nr=' + Transform(nr) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/check_vartype_semantics.prg b/utile/Teste/editare_factura/check_vartype_semantics.prg new file mode 100644 index 0000000..a9c7286 --- /dev/null +++ b/utile/Teste/editare_factura/check_vartype_semantics.prg @@ -0,0 +1,27 @@ +* check_vartype_semantics.prg +* Verifica empiric daca Vartype(varNedeclarata) arunca eroare sau intoarce 'U', +* fara Oracle, fara conectare - doar semantica limbajului VFP. +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_vartype_semantics_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +LOCAL lcRezultat +lcRezultat = 'NEATINS' +lcRezultat = Vartype(poNedeclaratXyz) +STRTOFILE('Vartype(poNedeclaratXyz) = [' + Transform(lcRezultat) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + +LOCAL lcRezultat2 +lcRezultat2 = 'NEATINS' +lcRezultat2 = Type('poNedeclaratXyz') +STRTOFILE('Type(''poNedeclaratXyz'') = [' + Transform(lcRezultat2) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/check_view_def.prg b/utile/Teste/editare_factura/check_view_def.prg new file mode 100644 index 0000000..1ff47b7 --- /dev/null +++ b/utile/Teste/editare_factura/check_view_def.prg @@ -0,0 +1,38 @@ +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\check_view_def_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnS +lnS = goExecutor.oExecute("select text from user_views where view_name='FACT_VFACTURI'", 'crsV') +STRTOFILE('view text: ' + Transform(lnS) + CHR(13) + CHR(10), gcErrLog, 1) +IF Used('crsV') + SELECT crsV + STRTOFILE(Text + CHR(13) + CHR(10), gcErrLog, 1) +ENDIF +goExecutor.oReset() + +LOCAL lnS2 +lnS2 = goExecutor.oExecute("select table_name from user_tables where table_name in ('VANZARI','VANZARI_DETALII','VANZARI_INCASARI','VANZARI_CORESP')", 'crsT') +STRTOFILE('tabele: ' + Transform(lnS2) + CHR(13) + CHR(10), gcErrLog, 1) +IF Used('crsT') + SELECT crsT + SCAN + STRTOFILE(table_name + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/creeaza_documente_s8.prg b/utile/Teste/editare_factura/creeaza_documente_s8.prg index 83e5e9b..30c582d 100644 --- a/utile/Teste/editare_factura/creeaza_documente_s8.prg +++ b/utile/Teste/editare_factura/creeaza_documente_s8.prg @@ -125,6 +125,8 @@ TRY *----- PROCEDURI (mock amessagebox PRIMUL) ----- SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" + *-- CdocGasesteIdVanzare: dovada de scriere pe jonctiunea serie_act + nract + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE SET PROCEDURE TO proceduri_comune ADDITIVE SET PROCEDURE TO quitapp ADDITIVE SET PROCEDURE TO init_program ADDITIVE @@ -406,7 +408,10 @@ FUNCTION CreeazaDocument PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat + LOCAL lcSerieAlocata, lnNractAlocat lnIdVanzareRezultat = 0 + lcSerieAlocata = '' + lnNractAlocat = 0 pnTotalDiscountAvize = 0 update_jtva_coloane([JV], [jtva_coloane_temp]) @@ -460,6 +465,8 @@ FUNCTION CreeazaDocument poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) gnIdUtil = -3 + lcSerieAlocata = ALLTRIM(TRANSFORM(NVL(poDate.serie_act, []))) + lnNractAlocat = poDate.nract DO S8Log WITH ' numar alocat: serie_act=[' + TRANSFORM(NVL(poDate.serie_act,[])) + '] nract=' + TRANSFORM(poDate.nract) IF poDate.tva_incasare = 0 @@ -513,8 +520,13 @@ FUNCTION CreeazaDocument *-- crsarticole vine cu Buffering optimistic pe rand (3) - REPLACE fara TABLEUPDATE() ramane *-- in bufferul local si e pierdut la urmatoarea citire/mutare de recno (verificat empiric: *-- REPLACE arata cantitate=1 imediat, dar orice citire ulterioara arata iar 0). + *-- Lista de preturi a articolului e in EURO (tip_valuta=1), iar do_scrie_articole + *-- trimite pe ramura aceea vpretftva, derivat din pret_val - fortand doar pret, + *-- documentul iesea cu VANZARI_DETALII.PRET=0. Se forteaza perechea, coerent cu cursul. SELECT (lcCursor) - REPLACE ALL cantitate WITH 1 + REPLACE ALL cantitate WITH 1, ; + pret_val WITH IIF(tip_valuta = 1, 100, 0), ; + pret WITH IIF(tip_valuta = 1, ROUND(100 * IIF(NVL(curs, 0) = 0, 1, curs) / IIF(NVL(multiplicator, 0) = 0, 1, multiplicator), gnPPretV), 100) =TABLEUPDATE(.T., .T., lcCursor) GO TOP DO S8Log WITH ' dupa fix cantitate: ' + lcCursor + '.cantitate=' + TRANSFORM(cantitate) @@ -580,11 +592,14 @@ FUNCTION CreeazaDocument ENDDO DO S8Log WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' (frm_alte_date tratat=' + TRANSFORM(glDlgTratat8) + ') poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0)) - IF lnScris - lnIdVanzareRezultat = NVL(poDate.nid_vanzare, 0) - ELSE + *-- do_termin() intoarce mereu .T. (_frm_base.vc2:363, DoDefault fara RETURN) si nid_vanzare + *-- ramane santinela la esec: singura dovada e randul din VANZARI, pe serie_act + nract. + lnIdVanzareRezultat = CdocGasesteIdVanzare(lcSerieAlocata, lnNractAlocat) + IF lnIdVanzareRezultat < 0 lnIdVanzareRezultat = 0 ENDIF + DO S8Log WITH ' verificare in VANZARI pe ' + lcSerieAlocata + ' ' + TRANSFORM(lnNractAlocat) + ; + ' -> id_vanzare=' + TRANSFORM(lnIdVanzareRezultat) IF TYPE('goFrm8') = 'O' AND !ISNULL(goFrm8) goFrm8.Release() diff --git a/utile/Teste/editare_factura/curata_s11_borderou.prg b/utile/Teste/editare_factura/curata_s11_borderou.prg new file mode 100644 index 0000000..825b52f --- /dev/null +++ b/utile/Teste/editare_factura/curata_s11_borderou.prg @@ -0,0 +1,57 @@ +* curata_s11_borderou.prg - sterge fizic borderourile semanate de proba S11 (rularile 2 si 4 ale +* lui test_s9_4_regenerare.prg le lasa in urma; rularile 3 si 5 se curata singure). +* Parametru: lista de id-uri FACT_BORDEROU, separate prin virgula. Borderourile dinainte de proba +* (id <= 19 pe MARIUSM_AUTO la 04.09.2026) NU se ating. +LPARAMETERS tcListaId + +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\curata_s11_borderou_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' lista=' + TRANSFORM(tcListaId) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +LOCAL lcLista +lcLista = CHRTRAN(ALLTRIM(TRANSFORM(tcListaId)), ' ', '') +IF EMPTY(lcLista) OR !ISDIGIT(LEFT(lcLista, 1)) + STRTOFILE('EROARE: se cere o lista de id-uri numerice, ex: DO curata_s11_borderou WITH "20,21"' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnDet, lnAnt +lnDet = -1 +lnAnt = -1 +goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou_detalii where id_borderou in (] + lcLista + [)], @lnDet) +goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou where id in (] + lcLista + [)], @lnAnt) +STRTOFILE('inainte: ' + TRANSFORM(lnAnt) + ' borderouri, ' + TRANSFORM(lnDet) + ' randuri de detaliu' + CHR(13) + CHR(10), gcErrLog, 1) + +IF goExecutor.oExecuta([delete from ] + gcs + [.fact_borderou_detalii where id_borderou in (] + lcLista + [)]) AND ; + goExecutor.oExecuta([delete from ] + gcs + [.fact_borderou where id in (] + lcLista + [)]) + goExecutor.oExecuta([COMMIT]) +ELSE + STRTOFILE('ESEC la stergere: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + goExecutor.oExecuta([ROLLBACK]) +ENDIF + +lnDet = -1 +lnAnt = -1 +goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou_detalii where id_borderou in (] + lcLista + [)], @lnDet) +goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou where id in (] + lcLista + [)], @lnAnt) +STRTOFILE('dupa: ' + TRANSFORM(lnAnt) + ' borderouri, ' + TRANSFORM(lnDet) + ' randuri de detaliu' + CHR(13) + CHR(10), gcErrLog, 1) + +lnDet = -1 +goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou_detalii], @lnDet) +STRTOFILE('total ramas in FACT_BORDEROU_DETALII: ' + TRANSFORM(lnDet) + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/curata_s9_5_atasamente.prg b/utile/Teste/editare_factura/curata_s9_5_atasamente.prg new file mode 100644 index 0000000..d248665 --- /dev/null +++ b/utile/Teste/editare_factura/curata_s9_5_atasamente.prg @@ -0,0 +1,40 @@ +* curata_s9_5_atasamente.prg - sterge fizic atasamentele semanate de probele S9-5 si S11 pe +* documentele atinse (S9-5: 1073 controlul negativ, 1074 rularea verde; S11: 1127 rularea verde, +* 1128 controlul negativ, 1076/1111/1129 rulari care nu au consumat documentul). +* Randurile legate prin COD (cele 20 mostenite) NU se ating. +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\curata_s9_5_atasamente_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lnNr +lnNr = -1 +goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.atasamente_vanzari where id_vanzare in (1073,1074,1076,1111,1127,1128,1129)], @lnNr) +STRTOFILE('inainte: ' + TRANSFORM(lnNr) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) + +IF goExecutor.oExecuta([delete from ] + gcs + [.atasamente_vanzari where id_vanzare in (1073,1074,1076,1111,1127,1128,1129)]) + goExecutor.oExecuta([COMMIT]) +ENDIF + +lnNr = -1 +goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.atasamente_vanzari where id_vanzare in (1073,1074,1076,1111,1127,1128,1129)], @lnNr) +STRTOFILE('dupa: ' + TRANSFORM(lnNr) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) + +lnNr = -1 +goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.atasamente_vanzari], @lnNr) +STRTOFILE('total ramas in tabela: ' + TRANSFORM(lnNr) + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/descopera_caz_test.prg b/utile/Teste/editare_factura/descopera_caz_test.prg index f0a8496..6474f80 100644 --- a/utile/Teste/editare_factura/descopera_caz_test.prg +++ b/utile/Teste/editare_factura/descopera_caz_test.prg @@ -4,6 +4,11 @@ * (pack_contafin.finalizeaza_modificare_nota -> pack_facturare.actualizeaza_vanzari), deci orice * ancorare pe cod moare tacut; ID_VANZARE ramane, dar nici el nu e cunoscut dinainte. * +* *!* 06.09.2026 +* *!* marius.mutu +* *!* Cazurile care aleg documente cu articole reale exclud notele cu un rand activ pe un cont +* *!* care cere simbol analitic si nu il are; altfel verificare_note_contabile respinge salvarea. +* * DescoperaCazTest(, ) -> .T. daca a gasit un document, lasand in alias * un singur rand cu cod, an, luna, id_vanzare, tip, nlin (plus nract/serie_act/dataact/nract_fara * pentru cazul de coliziune). Pe .F. aliasul ramane cu 0 randuri. @@ -26,7 +31,7 @@ FUNCTION DescoperaCazTest LPARAMETERS tcCaz, tcAlias - LOCAL lcAlias, lcNlin, lcPrim, lcJoinP, lcTriplete, lcJoinT, lcOrb, lcNractFara, lcSql, lnSucces + LOCAL lcAlias, lcNlin, lcPrim, lcJoinP, lcTriplete, lcJoinT, lcOrb, lcNractFara, lcFiltruAnalitic, lcSql, lnSucces lcAlias = IIF(Type('tcAlias') = 'C' AND !Empty(m.tcAlias), m.tcAlias, 'crscaz') @@ -59,15 +64,21 @@ FUNCTION DescoperaCazTest [(select 1 from vanzari w where w.cod=y.cod and nvl(w.numar_act,-1)=nvl(y.nract,-1) ] + ; [and nvl(w.serie_act,' ')=nvl(y.serie_act,' ') and trunc(w.data_act)=trunc(y.dataact) and w.sters=0))] + *!* verificare_note_contabile respinge salvarea unei note cu cont ce cere analitic si nu il are + lcFiltruAnalitic = [not exists (select 1 from vact_tot x where x.cod=p.cod and x.an=p.an and x.luna=p.luna ] + ; + [and x.sters=0 and nvl(x.suma,0)<>0 and ( ] + ; + [(x.ascd is null and exists (select 1 from vplcont_analitic pa where pa.cont=x.scd and pa.an=?gnAn and pa.inactiv=0)) ] + ; + [or (x.ascc is null and exists (select 1 from vplcont_analitic pa where pa.cont=x.scc and pa.an=?gnAn and pa.inactiv=0)) ))] + DO CASE CASE Upper(Alltrim(m.tcCaz)) == 'FACTURA_ARTICOLE' lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ; - m.lcPrim + [ ] + m.lcJoinP + [ where v.tip = 1 and ] + m.lcNlin + [ > 0 ] + ; + m.lcPrim + [ ] + m.lcJoinP + [ where v.tip = 1 and ] + m.lcNlin + [ > 0 and ] + m.lcFiltruAnalitic + [ ] + ; [order by v.id_vanzare desc) where rownum = 1] CASE Upper(Alltrim(m.tcCaz)) == 'NEFACTURA_ARTICOLE' lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ; - m.lcPrim + [ ] + m.lcJoinP + [ where v.tip <> 1 and ] + m.lcNlin + [ > 0 ] + ; + m.lcPrim + [ ] + m.lcJoinP + [ where v.tip <> 1 and ] + m.lcNlin + [ > 0 and ] + m.lcFiltruAnalitic + [ ] + ; [order by v.id_vanzare desc) where rownum = 1] CASE Upper(Alltrim(m.tcCaz)) == 'FARA_RULAJE' @@ -75,11 +86,12 @@ FUNCTION DescoperaCazTest m.lcPrim + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 ] + ; [and not exists (select 1 from vrul_tot r where r.cod=p.cod and r.an=p.an and r.luna=p.luna and r.sters=0) ] + ; [and not exists (select 1 from vrul_obinv_tot r where r.cod=p.cod and r.an=p.an and r.luna=p.luna and r.sters=0) ] + ; + [and ] + m.lcFiltruAnalitic + [ ] + ; [order by v.id_vanzare desc) where rownum = 1] CASE Upper(Alltrim(m.tcCaz)) == 'PRIM_RAND_ORB' lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ; - m.lcTriplete + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 and ] + m.lcOrb + [ ] + ; + m.lcTriplete + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 and ] + m.lcOrb + [ and ] + m.lcFiltruAnalitic + [ ] + ; [order by v.id_vanzare desc) where rownum = 1] CASE Upper(Alltrim(m.tcCaz)) == 'COLIZIUNE_COD' @@ -91,6 +103,7 @@ FUNCTION DescoperaCazTest m.lcTriplete + [ ] + m.lcJoinP + [ where ] + m.lcNlin + [ > 0 and ] + m.lcOrb + [ ] + ; [and (select count(distinct v2.id_vanzare) from vanzari v2 where v2.cod=p.cod and v2.sters=0) >= 2 ] + ; [and ] + Strtran(m.lcNractFara, [], [nract]) + [ is not null ] + ; + [and ] + m.lcFiltruAnalitic + [ ] + ; [order by v.id_vanzare desc) where rownum = 1] CASE Upper(Alltrim(m.tcCaz)) == 'NOTA_FARA_VANZARI' diff --git a/utile/Teste/editare_factura/emite_document_stoc_s93.prg b/utile/Teste/editare_factura/emite_document_stoc_s93.prg new file mode 100644 index 0000000..9e5a970 --- /dev/null +++ b/utile/Teste/editare_factura/emite_document_stoc_s93.prg @@ -0,0 +1,454 @@ +* emite_document_stoc_s93.prg +* Reumple rezervorul lui test_s9_3_stergere.prg (candidat eligibil: STERS=0, in luna activa, +* fara referinte/urmasi, cu randuri REALE in vact_tot SI vrul_tot). Emite UN document REAL +* in MARIUSM_AUTO@ROA_CENTRAL prin fluxul de productie (docs\raport_datoria4_stergere.md). +* +* Baza: COMUN\utile\Teste\facturare_unificat\test_s3b_emitere_reala.prg (tnTip=22, AVIZ din lista +* de preturi, client RAJA id_part=463, forma veche frm_facturare_articole, tip_incasare=1) - +* singura combinatie confirmata ca scrie in VANZARI in acest mediu. DOUA modificari fata de acel +* fisier, ambele necesare ca sa apara randuri in RUL (nu doar in ACT): +* +* 1) NU se mai reseteaza gnIdUtil la -3 inainte de cursor_preturi (acolo ramane doar pentru +* alocarea numarului). Cu gnIdUtil=8 lista de preturi FACT_VPRETURI_UTILIZATOR intoarce +* articole GESTIONABILE cu stoc real (verificat read-only); cu -3 intoarce un singur articol +* negestionabil, cantitate 0 - de-asta suita S3b/creeaza_documente_s8 nu producea niciodata +* randuri vrul_tot (docs\raport_s13b_fixturi.md §6.1). +* 2) V_FILTRU_COD = '11.00003' (id_articol=315554536, ACOPERIRE FAR VOLVO FH12) restrange +* cursor_preturi la UN singur articol gestionabil cu stoc mare (>11000 bucati la data +* scrierii acestui fisier), ca sa nu intre in document toata lista de preturi a utilizatorului 8. +* +* Rulare: vfp9.exe -A -T "D:\ROA\...\emite_document_stoc_s93.prg" (headless, cateva secunde) +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out\emite_document_stoc_s93.log +* Rezultat: STRTOFILE cu 'id_vanzare=' la succes, sau 'ESEC' - vezi raportul pentru numerele arse. + +SET SAFETY OFF +SET TALK OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog, gnPass, gnFail +IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out") + MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out" +ENDIF +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out\emite_document_stoc_s93.log" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLog) +gnPass = 0 +gnFail = 0 + +ON ERROR DO EmiteErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + + 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 EmiteLog WITH 'EROARE: conectare Oracle esuata' + DO EmiteFinal + ENDIF + DO EmiteLog WITH 'test_init_env_auto_roafacturare OK, gnHandle=' + TRANSFORM(gnHandle) + SQLSETPROP(gnHandle, "QueryTimeOut", 45) + + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + SET CLASSLIB TO gridextras.vcx ADDITIVE + SET CLASSLIB TO _cb_base.vcx ADDITIVE + + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE + + IF !actualizeaza_optiuni_program() + DO EmiteLog WITH 'EROARE: actualizeaza_optiuni_program()' + DO EmiteFinal + ENDIF + *-- gnScadereStoc=1 (nu 0, spre deosebire de test_s3b_emitere_reala.prg): cu 0, do_adauga_articol + *-- ocoleste mereu do_alege_stoc (ofacturare.vc2:13021), deci ID_GESTIUNE ramane null pe linie si + *-- nu apare niciun rand in vrul_tot, indiferent de cantitate/stoc. Cu 1 si UN singur candidat de + *-- gestiune (Reccount(crsgestarticol)=1) + tlImplicit=.T., do_alege_stoc(ofacturare.vc2:13478) + *-- alege automat gestiunea, FARA sa arate modalul (frm_articol_gest_factura.inainte_de_do_termin + *-- se autoconfirma cand nu exista nicio eroare de validare). + gnScadereStoc = 1 + gnModTotFact = 0 + gnFactSeturi = 0 + gnListareAvizBonFiscal = 0 + gnid_part_casa = 0 + gnIdSucursala = 167 + goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]) + DO EmiteLog WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + + PUBLIC goDriverAD, glDlgTratatAD, gnTipIncasareCerut, gnNrIncasareCapturat, gcClaseVazute + glDlgTratatAD = .F. + gnTipIncasareCerut = 1 + gnNrIncasareCapturat = 0 + gcClaseVazute = ';' + goDriverAD = CREATEOBJECT('driverAlteDateEmite') + _SCREEN.AddObject('tmrDrvEmite', 'Timer') + _SCREEN.tmrDrvEmite.Interval = 200 + BINDEVENT(_SCREEN.tmrDrvEmite, 'Timer', goDriverAD, 'Executa') + _SCREEN.tmrDrvEmite.Enabled = .T. + + *-- driverGestArticol: acelasi timer, un al doilea BINDEVENT - conduce modalul per-linie + *-- FRM_ARTICOL_GEST_FACTURA (do_alege_stoc, ofacturare.vc2:13518/13526/13540) + PUBLIC goDriverGest, glDlgTratatGest, goUltimulFormGest + glDlgTratatGest = .F. + goUltimulFormGest = .NULL. + goDriverGest = CREATEOBJECT('driverGestArticol') + BINDEVENT(_SCREEN.tmrDrvEmite, 'Timer', goDriverGest, 'Executa') + + _SCREEN.Caption = 'emite_document_stoc_s93 - reumplere pool S9-3' + + LOCAL lnIdVz + lnIdVz = CreeazaDocumentStoc() + _SCREEN.tmrDrvEmite.Enabled = .F. + + DO Assert WITH lnIdVz > 0, 'documentul exista in VANZARI (jonctiune serie_act+nract), e=' + TRANSFORM(lnIdVz) + IF lnIdVz > 0 + DO EmiteLog WITH 'id_vanzare=' + TRANSFORM(lnIdVz) + ELSE + DO EmiteLog WITH 'ESEC' + ENDIF + + DO EmiteFinal + +CATCH TO loExc + DO EmiteLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO EmiteFinal +ENDTRY + +QUIT + +*================================================================================== +PROCEDURE EmiteLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13)+CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE EmiteErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO EmiteLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE EmiteFinal + DO EmiteLog WITH CHR(13)+CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + DO EmiteLog WITH 'END ' + TTOC(DATETIME()) + QUIT +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO EmiteLog WITH 'PASS: ' + tcMsg + ELSE + gnFail = gnFail + 1 + DO EmiteLog WITH 'FAIL: ' + tcMsg + ENDIF +ENDPROC + +*================================================================================== +* CreeazaDocumentStoc: emite un document REAL (tnTip=22, cursor_preturi filtrat pe UN articol +* gestionabil cu stoc), tip_incasare=1 (Fara incasare), forma veche. Intoarce id_vanzare (>0 +* succes) sau 0. +FUNCTION CreeazaDocumentStoc + *-- lcFiltruCod PRIVATE, nu LOCAL: goExecutor.oExecute leaga parametrii dupa numele + *-- variabilei (ca poDate.* mai jos), deci trebuie vizibila din metoda apelata, nu doar aici. + PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, lcFiltruCod + LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat, tnTip, tnIdClient, tnIdDelegat + LOCAL lcSerieAlocata, lnNractAlocat + lnIdVanzareRezultat = 0 + lcSerieAlocata = '' + lnNractAlocat = 0 + gnNrIncasareCapturat = 0 + tnTip = 22 + tnIdClient = 463 + tnIdDelegat = 256 + *-- 4294507796 / MOTOREDUCTOR 20SEC: UN singur lot in gestiunea 1 (Reccount(crsgestarticol)=1, + *-- verificat read-only) - conditia lui do_alege_stoc pentru autoselectie fara modal. + lcFiltruCod = '0V2549' + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + + lnIdSet = 25900 + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + poDate.nIdTipDoc = 6 && AVIZ - plaja globala + + gnIdUtil = 8 + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + + poDate.id_client = tnIdClient + poDate.id_delegat = tnIdDelegat + poDate.zi_curs = {^2026-08-10} + *-- gestiune reala (nu NULL): fara ea cursor_preturi arata articolul gestionabil dar + *-- scrierea documentului nu are de unde sa scada stocul - primul document emis (id_vanzare=1474) + *-- a iesit cu 0 randuri in vrul_tot desi articolul era gestionabil, cu stoc. + poDate.id_gestiune_init = 1 + + IF poDate.rezultat_serii = 3 + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + ENDIF + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + *-- gnIdUtil ramane 8 (NU -3, spre deosebire de test_s3b_emitere_reala.prg): cu -3 + *-- cursor_preturi intoarce un singur articol negestionabil, cantitate 0 - fara asta + *-- documentul nu ar avea nicio sansa de rand in RUL. + lcSerieAlocata = ALLTRIM(TRANSFORM(NVL(poDate.serie_act, []))) + lnNractAlocat = poDate.nract + DO EmiteLog WITH 'poDate.nract=' + TRANSFORM(poDate.nract) + ' serie_act=[' + TRANSFORM(NVL(poDate.serie_act,[])) + ']' + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + [?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?lcFiltruCod)}] + + lcCursor = [crsarticole] + lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor) + IF lnSucces < 0 + DO EmiteLog WITH 'EROARE cursor articole: ' + goExecutor.oPrelucrareEroare() + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO CurataJtva + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + RETURN 0 + ENDIF + + IF RECCOUNT(lcCursor) = 0 + DO EmiteLog WITH 'Nu exista articole (Reccount=0) - abandon document' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO CurataJtva + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + RETURN 0 + ENDIF + DO EmiteLog WITH 'crsarticole Reccount=' + TRANSFORM(RECCOUNT(lcCursor)) + + SELECT (lcCursor) + REPLACE ALL cantitate WITH 1, ; + pret_val WITH IIF(tip_valuta = 1, 100, 0), ; + pret WITH IIF(tip_valuta = 1, ROUND(100 * IIF(NVL(curs, 0) = 0, 1, curs) / IIF(NVL(multiplicator, 0) = 0, 1, multiplicator), gnPPretV), 100) + =TABLEUPDATE(.T., .T., lcCursor) + GO TOP + + creeaza_facturacrs([crsfactura]) + + IF poDate.in_valuta = 1 + SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM (lcCursor) WITH (Buffering = .T.) WHERE tip_valuta = 1 ORDER BY nume_val INTO CURSOR crscursuri + SELECT crscursuri + poDate.Curs = Curs + poDate.multiplicator = multiplicator + ELSE + citeste_cursuri_zi(poDate.zi_curs) + IF RECCOUNT('crscursuri') = 0 + USE IN crscursuri + ENDIF + ENDIF + + IF TYPE(lcCursor + '.nume_lista_preturi') <> 'U' + CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100)) + SELECT crspolitici + INSERT INTO crspolitici(id_pol, nume_lista_preturi) VALUES (-9999, '') + INSERT INTO crspolitici(id_pol, nume_lista_preturi) ; + SELECT DISTINCT id_pol, nume_lista_preturi FROM (lcCursor) ORDER BY nume_lista_preturi + ENDIF + + PUBLIC goFrmEmite + goFrmEmite = CREATEOBJECT('frm_facturare_articole') + goFrmEmite.WindowType = 0 + goFrmEmite.Show() + DOEVENTS FORCE + DO EmiteLog WITH 'formular afisat modeless (VECHI frm_facturare_articole)' + + glDlgTratatGest = .F. + goFrmEmite.do_adauga_tot() + DOEVENTS FORCE + DO EmiteLog WITH 'do_adauga_tot() -> Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + ; + ' glDlgTratatGest=' + TRANSFORM(glDlgTratatGest) + + *-- do_initializeaza_articol zeroeste cantitatea la adaugare (ca la tip 1, ofacturare.vc2:13890) - + *-- se scrie explicit dupa adaugare, ca in test_s6_1_lista_preturi.prg (SeteazaCantitati): + *-- fara asta VANZARI_DETALII.CANTITATE ramane 0 si nu apare niciun rand in vrul_tot. + LOCAL loArtCant + SELECT crsfactura + SCAN + REPLACE cantitate WITH 1 + SCATTER NAME loArtCant MEMO + loArtCant = calculeaza_totaluri(loArtCant) + GATHER NAME loArtCant MEMO + ENDSCAN + DO EmiteLog WITH 'cantitate setata explicit pe crsfactura' + + goFrmEmite.do_calculeaza_totaluri() + DOEVENTS FORCE + + LOCAL lnScris + glDlgTratatAD = .F. + gnTipIncasareCerut = 1 + lnScris = goFrmEmite.do_termin() + LOCAL lnWait + lnWait = 0 + DO WHILE !glDlgTratatAD AND lnWait < 10 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + DO EmiteLog WITH 'do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0)) + + lnIdVanzareRezultat = CdocGasesteIdVanzare(lcSerieAlocata, lnNractAlocat) + IF lnIdVanzareRezultat < 0 + lnIdVanzareRezultat = 0 + ENDIF + DO EmiteLog WITH 'verificare in VANZARI pe ' + lcSerieAlocata + ' ' + TRANSFORM(lnNractAlocat) + ' -> id_vanzare=' + TRANSFORM(lnIdVanzareRezultat) + + IF TYPE('goFrmEmite') = 'O' AND !ISNULL(goFrmEmite) + goFrmEmite.Release() + ENDIF + goFrmEmite = NULL + + IF USED('crspolitici') + USE IN crspolitici + ENDIF + IF USED('crscursuri') + USE IN crscursuri + ENDIF + IF USED('crsfactura') + USE IN crsfactura + ENDIF + IF USED('crsarticole') + USE IN crsarticole + ENDIF + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF USED('jtva_coloane_temp') + USE IN jtva_coloane_temp + ENDIF + + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + RETURN lnIdVanzareRezultat +ENDFUNC + +PROCEDURE CurataJtva + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF USED('jtva_coloane_temp') + USE IN jtva_coloane_temp + ENDIF +ENDPROC + +*================================================================================== +*-- driverAlteDateEmite: identic cu driverAlteDateAD din test_s3b_emitere_reala.prg - cauta +* FRM_ALTE_DATE prin _SCREEN.Forms si ii seteaza opt_incasat.Value INAINTE de do_termin(). +DEFINE CLASS driverAlteDateEmite AS Custom + PROCEDURE Executa + LOCAL lnI, loForm, llGasit, loMsgForm + llGasit = .F. + loMsgForm = NULL + FOR lnI = 1 TO _SCREEN.FormCount + LOCAL lcClasa + lcClasa = UPPER(_SCREEN.Forms(lnI).Class) + IF lcClasa == 'FRM_ALTE_DATE' + loForm = _SCREEN.Forms(lnI) + llGasit = .T. + ENDIF + IF 'MESSAGEBOX_FORM' $ lcClasa + loMsgForm = _SCREEN.Forms(lnI) + ENDIF + IF !(lcClasa $ gcClaseVazute) + gcClaseVazute = gcClaseVazute + lcClasa + ';' + ENDIF + ENDFOR + IF !ISNULL(loMsgForm) + TRY + DO CASE + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) + loMsgForm.cmgBotones.cmdYes.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) + loMsgForm.cmgBotones.cmdOk.Click() + ENDCASE + CATCH TO loExcMsg + DO EmiteLog WITH '[diag timer] messagebox_form: CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message + ENDTRY + ENDIF + IF glDlgTratatAD OR !llGasit + RETURN + ENDIF + TRY + loForm.opt_incasat.Value = gnTipIncasareCerut + gnNrIncasareCapturat = poDate.nr_incasare + loForm.do_termin() + glDlgTratatAD = .T. + CATCH TO loExcDrv + DO EmiteLog WITH 'driverAlteDateEmite: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ; + ' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo) + glDlgTratatAD = .T. + ENDTRY + ENDPROC +ENDDEFINE + +*================================================================================== +*-- driverGestArticol: acelasi mecanism (poll _SCREEN.Forms + apel direct do_termin(), fara input +* real) ca driverAlteDateAD/driverAlteDateEmite, dar pentru FRM_ARTICOL_GEST_FACTURA - modalul +* per-linie al lui do_alege_stoc (ofacturare.vc2:13518/13526/13540), aratat neconditionat cand +* inainte_de_do_termin() esueaza pe randul curent din crsgestarticol (chiar si pe ramura cu un +* singur lot + tlImplicit, ofacturare.vc2:13495-13524, pentru ca poArticol.cantitate a fost deja +* zeroit de do_initializeaza_articol - ofacturare.vc2:13922, tip 22 fara opt_facturare 1/2). +* Copiaza pe poArticol campurile randului curent din crsgestarticol (ce ar face si navigarea in +* grid_gestiuni.AfterRowColChange, ofacturare.vc2:4227-4239) plus o cantitate nenula, apoi cheama +* do_termin() direct pe formular. +*-- do_adauga_tot() SCANeaza crsarticole (aici 2 randuri, acelasi articol pe doua liste de preturi +* ale utilizatorului 8) si cheama do_alege_stoc() o data PE RAND - modalul poate aparea de mai multe +* ori, secvential, in aceeasi rulare. De-asta flagul de "tratat" nu e global (ca la frm_alte_date, +* aratat o singura data): retine INSTANTA de formular deja tratata (goUltimulFormGest) - o instanta +* noua (formular urmator) tot se trateaza, aceeasi instanta nu se retrateaza daca timer-ul mai apuca +* un tick inainte sa se inchida. +DEFINE CLASS driverGestArticol AS Custom + PROCEDURE Executa + LOCAL lnI, loForm, llGasit + llGasit = .F. + FOR lnI = 1 TO _SCREEN.FormCount + LOCAL lcClasa + lcClasa = UPPER(_SCREEN.Forms(lnI).Class) + IF lcClasa == 'FRM_ARTICOL_GEST_FACTURA' + loForm = _SCREEN.Forms(lnI) + llGasit = .T. + ENDIF + ENDFOR + IF !llGasit OR loForm = goUltimulFormGest + RETURN + ENDIF + TRY + SELECT crsgestarticol + GO TOP + poArticol.cantitate = 1 + poArticol.pret_achizitie = Pret + poArticol.lot = NVL(lot, []) + poArticol.serie = NVL(serie, []) + poArticol.id_gestiune = id_gestiune + poArticol.Cont = ALLTRIM(Cont) + poArticol.id_lucrare_rez = id_lucrare_rez + poArticol.id_part_rez = id_part_rez + poArticol.pretv_orig = pretv + poArticol.id_valuta_d = NVL(id_valuta, 0) + poArticol.pretd = pretd + DO EmiteLog WITH ' driverGestArticol: id_gestiune=' + TRANSFORM(poArticol.id_gestiune) + ; + ' pret_achizitie=' + TRANSFORM(poArticol.pret_achizitie) + ' cantitate=' + TRANSFORM(poArticol.cantitate) + loForm.do_termin() + glDlgTratatGest = .T. + goUltimulFormGest = loForm + CATCH TO loExcDrv + DO EmiteLog WITH 'driverGestArticol: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ; + ' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo) + glDlgTratatGest = .T. + goUltimulFormGest = loForm + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/find_defect5_doc.prg b/utile/Teste/editare_factura/find_defect5_doc.prg new file mode 100644 index 0000000..81c3682 --- /dev/null +++ b/utile/Teste/editare_factura/find_defect5_doc.prg @@ -0,0 +1,49 @@ +* find_defect5_doc.prg +* Cautare read-only: document real cu incasat<>0, tip 1-4, ne-proforma, in luna curenta, +* care trece garzile din do_editare_unificata (nesters, fara referinte/urmasi/eFactura). +* Nu scrie nimic. Scris pentru dovada defectului 5 (docs\raport_s8_defect5_incasat.md). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\find_defect5_doc_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lcSelect, lnSucces +lcSelect = [select id_vanzare, tip, eproforma, sters, incasat, data_act, nr_incasare, id_fact from fact_vfacturi ] + ; + [where incasat <> 0 and tip between 1 and 4 and eproforma = 0 and sters = 0 ] + ; + [and extract(year from data_act) = ] + TRANSFORM(gnAn) + [ and extract(month from data_act) = ] + TRANSFORM(gnLuna) + [ ] + ; + [order by id_vanzare] + +lnSucces = goExecutor.oExecute(lcSelect, 'crsCandidati') +STRTOFILE('oExecute: ' + TRANSFORM(lnSucces) + ' eroare: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) +goExecutor.oReset() + +IF lnSucces >= 0 AND USED('crsCandidati') + STRTOFILE('candidati gasiti: ' + TRANSFORM(RECCOUNT('crsCandidati')) + CHR(13) + CHR(10), gcErrLog, 1) + SELECT crsCandidati + SCAN + STRTOFILE('id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' incasat=' + TRANSFORM(incasat) + ; + ' data_act=' + TRANSFORM(data_act) + ' nr_incasare=' + TRANSFORM(nr_incasare) + ' id_fact=' + TRANSFORM(NVL(id_fact,0)) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN +ELSE + STRTOFILE('interogare esuata' + CHR(13) + CHR(10), gcErrLog, 1) +ENDIF + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC diff --git a/utile/Teste/editare_factura/find_tipincasare23_doc.prg b/utile/Teste/editare_factura/find_tipincasare23_doc.prg new file mode 100644 index 0000000..53332cd --- /dev/null +++ b/utile/Teste/editare_factura/find_tipincasare23_doc.prg @@ -0,0 +1,61 @@ +* find_tipincasare23_doc.prg +* Cautare read-only: document real cu tip_incasare in (2,3), incasat<>0, tip 1-4, ne-proforma, +* nesters, ca sa probeze maparea D4 (bon fiscal / card) alaturi de documentul 1071 (chitanta). +* Nu scrie nimic. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\find_tipincasare23_doc_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lcSelect, lnSucces +lcSelect = [select id_vanzare, tip, eproforma, sters, incasat, nr_incasare, tip_incasare, serie_chit, data_act, id_fact from fact_vfacturi ] + ; + [where incasat <> 0 and tip between 1 and 4 and eproforma = 0 and sters = 0 and tip_incasare in (2,3) ] + ; + [order by tip_incasare, id_vanzare] + +lnSucces = goExecutor.oExecute(lcSelect, 'crsCandidati') +STRTOFILE('oExecute: ' + TRANSFORM(lnSucces) + ' eroare: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) +goExecutor.oReset() + +IF lnSucces >= 0 AND USED('crsCandidati') + STRTOFILE('candidati gasiti: ' + TRANSFORM(RECCOUNT('crsCandidati')) + CHR(13) + CHR(10), gcErrLog, 1) + SELECT crsCandidati + SCAN + STRTOFILE('id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' incasat=' + TRANSFORM(incasat) + ; + ' nr_incasare=' + TRANSFORM(nr_incasare) + ' tip_incasare=' + TRANSFORM(tip_incasare) + ; + ' serie_chit=[' + TRANSFORM(NVL(serie_chit,'')) + ']' + ; + ' data_act=' + TRANSFORM(data_act) + ' id_fact=' + TRANSFORM(NVL(id_fact,0)) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN +ELSE + STRTOFILE('interogare esuata' + CHR(13) + CHR(10), gcErrLog, 1) +ENDIF + +*!* verifica si luna documentului 1071, util pentru decizia rutei de proba (do_editare_unificata cere luna curenta) +IF Used('crs1071') + Use In crs1071 +ENDIF +lnSucces = goExecutor.oExecute([select id_vanzare, data_act, sters, eproforma, tip, id_fact from fact_vfacturi where id_vanzare = 1071], 'crs1071') +goExecutor.oReset() +IF lnSucces >= 0 AND USED('crs1071') AND RECCOUNT('crs1071') = 1 + STRTOFILE('1071: data_act=' + TRANSFORM(crs1071.data_act) + ' sters=' + TRANSFORM(crs1071.sters) + ' eproforma=' + TRANSFORM(crs1071.eproforma) + ' tip=' + TRANSFORM(crs1071.tip) + ' id_fact=' + TRANSFORM(NVL(crs1071.id_fact,0)) + CHR(13) + CHR(10), gcErrLog, 1) +ENDIF +STRTOFILE('gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC diff --git a/utile/Teste/editare_factura/mock_incarca_linii_prefix.prg b/utile/Teste/editare_factura/mock_incarca_linii_prefix.prg new file mode 100644 index 0000000..25cf8c0 --- /dev/null +++ b/utile/Teste/editare_factura/mock_incarca_linii_prefix.prg @@ -0,0 +1,57 @@ +* mock_incarca_linii_prefix.prg +* Control negativ pentru FACT-008: versiunea DINAINTE de reparatie a lui +* IncarcaLiniiFacturaEditare (fara Cont in crsarticole_editare / REPLACE si fara re-derivarea lui +* pretv_orig din RUL). Se incarca INAINTEA lui ofacturare_editare.prg in SET PROCEDURE, deci +* castiga la nume duplicat. Nu atinge niciun fisier de productie. +FUNCTION IncarcaLiniiFacturaEditare + LPARAMETERS toDate, tnIdVanzare + + LOCAL llInValuta, lnCursDoc, lnMultDoc, lnIdTemp, lnGestionabil + + llInValuta = (toDate.in_valuta = 1) + lnCursDoc = Nvl(toDate.Curs,1) + lnMultDoc = Nvl(toDate.multiplicator,1) + + IncarcaArticoleFactura(m.tnIdVanzare, 'crsarticole_doc') + + IF Used('crsarticole_editare') + Use In crsarticole_editare + ENDIF + SELECT id_vanzare_det, id_articol, explicatie, Nvl(denumire,[]) As denumire, lot, serie, codmat, id_jtva_coloana, taxcode, ; + pret_achizitie, cantitate, proc_tvav, pret_cu_tva, id_vanzare_set, id_gestiune, id_ctr, id_valuta, nume_val, in_stoc, ; + id_pol, pretd, id_valutad, ; + Nvl(curs, m.lnCursDoc) As curs, Nvl(multiplicator, m.lnMultDoc) As multiplicator, ; + Iif(m.llInValuta, Round(pret * Nvl(curs, m.lnCursDoc) / Nvl(multiplicator, m.lnMultDoc), gnPPretV), pret) As pret, ; + Iif(m.llInValuta, pret, 0) As pret_val, ; + Iif(m.llInValuta, Round(discount_unitar * Nvl(curs, m.lnCursDoc) / Nvl(multiplicator, m.lnMultDoc), gnPPretV), discount_unitar) As discount_unitar, ; + Iif(m.llInValuta, discount_unitar, 0) As discount_unitar_val, ; + Iif(m.llInValuta,1,0) As tip_valuta, ; + Cast(.Null. As N(10)) As id_jtva_coloana_ex, Space(50) As codmatf, Space(50) As codbare, Space(10) As um, Space(50) As numar_contract ; + FROM crsarticole_doc INTO CURSOR crsarticole_editare READWRITE + + creeaza_facturacrs('crsfactura') + prelucreaza_facturacrs('crsarticole_editare','crsfactura',0,0,0) + + *!* gestionabil vine din nomenclatorul curent, nu din id_gestiune; id_gestiune, Cont, id_pol/ + *!* pretd/id_valuta_d si vvaldiminuatctva (total in valuta cu tva, cf. oproceduri_facturare.prg:2282) + *!* nu sunt in lista de insert a lui prelucreaza_facturacrs + SELECT crsarticole_editare + SCAN + lnIdTemp = id_vanzare_det + lnGestionabil = Iif(Nvl(in_stoc,0) <> 0, 1, 0) + SELECT crsfactura + REPLACE gestionabil WITH m.lnGestionabil, ; + id_gestiune WITH Nvl(crsarticole_editare.id_gestiune, -1000), ; + id_pol WITH crsarticole_editare.id_pol, ; + pretd WITH crsarticole_editare.pretd, ; + id_valuta_d WITH crsarticole_editare.id_valutad, ; + vvaldiminuatctva WITH vvaldiminuatftva + vvaldiminuattva ; + FOR id_temp = m.lnIdTemp + SELECT crsarticole_editare + ENDSCAN + + Use In crsarticole_doc + Use In crsarticole_editare + + RETURN .T. +ENDFUNC diff --git a/utile/Teste/editare_factura/probe_defect5.prg b/utile/Teste/editare_factura/probe_defect5.prg new file mode 100644 index 0000000..eda72a7 --- /dev/null +++ b/utile/Teste/editare_factura/probe_defect5.prg @@ -0,0 +1,147 @@ +* probe_defect5.prg +* Proba unica, ne-permanenta: deschide pe traseul real (frm_facturi.do_editare_unificata) un +* document cu incasat<>0, tip 1-4, ne-proforma (id_vanzare=1071, gasit prin find_defect5_doc.prg) +* si logheaza daca apare eroare VFP sau daca formularul se deschide normal. Nu scrie in Oracle. +* Foloseste acelasi mecanism ca test_s8_pas7_cablare.prg (driverS8p7), copiat aici temporar. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_defect5_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 + +PUBLIC goDriverS8p7 +goDriverS8p7 = Createobject('driverS8p7') +_SCREEN.AddObject('tmrS8p7', 'Timer') +_SCREEN.tmrS8p7.Interval = 150 +Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa') +_SCREEN.tmrS8p7.Enabled = .T. + +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +LOCAL lcSchema, lcSelect, lcOrder, lcFiltru +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +lcOrder = [data_act,numar_act] +lcFiltru = [id_vanzare = 1071] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +IF !Used('crsfacturi') OR Reccount('crsfacturi') <> 1 + STRTOFILE('EROARE: crsfacturi nu are 1071' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +STRTOFILE('crsfacturi OK, incasat=' + Transform(crsfacturi.incasat) + ' tip=' + Transform(crsfacturi.tip) + ' eproforma=' + Transform(crsfacturi.eproforma) + CHR(13) + CHR(10), gcErrLog, 1) + +Select crsfacturi +Local loFrm +loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') +STRTOFILE('Newobject(frm_facturi): ' + Vartype(m.loFrm) + CHR(13) + CHR(10), gcErrLog, 1) + +Select crsfacturi +Locate For id_vanzare = 1071 +STRTOFILE('Locate 1071: Found=' + Transform(Found()) + CHR(13) + CHR(10), gcErrLog, 1) + +goDriverS8p7.Reseteaza() +STRTOFILE('inainte de do_editare_unificata' + CHR(13) + CHR(10), gcErrLog, 1) +loFrm.do_editare_unificata() +STRTOFILE('dupa do_editare_unificata, mesaj amessagebox=[' + gcMockUltimMesaj + '] driver.lGasit=' + Transform(goDriverS8p7.lGasit) + CHR(13) + CHR(10), gcErrLog, 1) + +_SCREEN.tmrS8p7.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrS8p7') +Catch +Endtry + +Try + loFrm.Release() +Catch +Endtry + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +DEFINE CLASS driverS8p7 AS Custom + lBusy = .F. + lGasit = .F. + + PROCEDURE Reseteaza + This.lGasit = .F. + ENDPROC + + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + TRY + LOCAL lnI, loFrm2 + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + loFrm2.Release() + EXIT + ENDIF + ENDFOR + CATCH TO loExcS8p7 + STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/probe_defect5_latent.prg b/utile/Teste/editare_factura/probe_defect5_latent.prg new file mode 100644 index 0000000..8492c98 --- /dev/null +++ b/utile/Teste/editare_factura/probe_defect5_latent.prg @@ -0,0 +1,233 @@ +* probe_defect5_latent.prg +* I1 din mandatul defect5b: simuleaza reparatia golului de incarcare (poDate.incasat nepopulat, +* docs\raport_s8_defect5_incasat.md) FARA sa atinga codul de productie. Repeta pas-cu-pas corpul +* real al frm_facturi.do_editare_unificata (ofacturare_comun.vc2:3890-3975), cu poDate.incasat +* fortat la valoarea reala din baza dupa IncarcaAntetFacturaEditare si inainte de Createobject/Show, +* ca sa arate ce s-ar intampla daca golul de incarcare ar fi reparat. Nu scrie in Oracle (doar +* SELECT prin gencursor/goExecutor), nu modifica niciun .vc2/.vcx. +* Document: id_vanzare=1071 (tip=1, incasat=119, eproforma=0, sters=0), gasit de +* find_defect5_doc.prg. Driver de inchidere modal: acelasi driverS8p7 din test_s8_pas7_cablare.prg. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_defect5_latent_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 + +PUBLIC goDriverS8p7 +goDriverS8p7 = Createobject('driverS8p7') +_SCREEN.AddObject('tmrS8p7', 'Timer') +_SCREEN.tmrS8p7.Interval = 150 +Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa') +_SCREEN.tmrS8p7.Enabled = .T. + +*!* --- G2: instantaneu vplaje_numere INAINTE --- +LOCAL lnSuccesG2a +lnSuccesG2a = goExecutor.oExecute('select * from vplaje_numere order by 1', 'crsplaje_inainte') +STRTOFILE('vplaje_numere INAINTE: oExecute=' + Transform(lnSuccesG2a) + ' randuri=' + ; + Transform(Iif(Used('crsplaje_inainte'), Reccount('crsplaje_inainte'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +goExecutor.oReset() + +LOCAL lnIdVanzare +lnIdVanzare = 1071 + +*!* --- replica exacta a corpului do_editare_unificata (ofacturare_comun.vc2:3890-3975) --- +Local lnSters, llEProforma, lnTipDoc, loForm, pnDiscountRon, pnDiscountValuta +Private pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP, poDate +Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP + +LOCAL lnSuccesSel +lnSuccesSel = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip,incasat from fact_vfacturi where id_vanzare=' + Transform(lnIdVanzare), 'crsUnic') +IF lnSuccesSel < 0 OR !Used('crsUnic') OR Reccount('crsUnic') <> 1 + STRTOFILE('EROARE: documentul 1071 nu a putut fi reincarcat pentru replica' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +SELECT crsUnic +lnIdVanzareP = id_vanzare +lnCod = cod +pnAn = Year(data_act) +pnLuna = Month(data_act) +lnSters = sters +lnIdFact = id_fact +llEProforma = (eproforma = 1) +lnTipDoc = tip +LOCAL lnIncasatReal +lnIncasatReal = incasat + +STRTOFILE('replica: id_vanzare=' + Transform(lnIdVanzareP) + ' tip=' + Transform(lnTipDoc) + ; + ' eproforma=' + Transform(llEProforma) + ' sters=' + Transform(lnSters) + ' incasat_real=' + Transform(lnIncasatReal) + CHR(13) + CHR(10), gcErrLog, 1) + +IF lnSters = 1 + STRTOFILE('OPRIT: document sters' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +IF llEProforma + STRTOFILE('OPRIT: proforma' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +IF Inlist(lnTipDoc, 44, 45, 46, 51) + STRTOFILE('OPRIT: tip in afara perimetrului' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +IF (pnAn * 12) + pnLuna <> (gnAn * 12) + gnLuna + STRTOFILE('OPRIT: nu e in luna curenta de lucru' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +IF ReferinteDocumenteNota(pnAn, pnLuna, lnCod) + STRTOFILE('OPRIT: are referinte (incasari/plati)' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +IF EsteInEFactura(lnIdFact) + STRTOFILE('OPRIT: e in eFactura' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +IF DocumentAreUrmasi(lnIdVanzareP) + STRTOFILE('OPRIT: are urmasi' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +poDate = IncarcaAntetFacturaEditare(lnIdVanzareP, @pnDiscountRon, @pnDiscountValuta) +IF Vartype(poDate) <> 'O' + STRTOFILE('OPRIT: IncarcaAntetFacturaEditare a esuat' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +STRTOFILE('poDate.incasat INAINTE de fortare (asa cum e azi, defect infirmat/latent) = ' + Transform(poDate.incasat) + CHR(13) + CHR(10), gcErrLog, 1) + +*!* FORTARE - simuleaza reparatia golului de incarcare, fara sa atinga IncarcaAntetFacturaEditare +poDate.incasat = lnIncasatReal + +STRTOFILE('poDate.incasat DUPA fortare (simuleaza reparatia) = ' + Transform(poDate.incasat) + CHR(13) + CHR(10), gcErrLog, 1) + +IncarcaLiniiFacturaEditare(poDate, lnIdVanzareP) + +update_jtva_coloane([JV], [jtva_coloane_temp]) +update_saft_taxtable() +IF Used('jtva_coloane') + Use In jtva_coloane +ENDIF +IF poDate.tva_incasare = 0 + Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane +ELSE + Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane +ENDIF + +STRTOFILE('inainte de Createobject(frm_facturare_articole2)' + CHR(13) + CHR(10), gcErrLog, 1) + +goDriverS8p7.Reseteaza() +loForm = Createobject('frm_facturare_articole2') + +STRTOFILE('Createobject terminat (Init a rulat deja aici, inclusiv blocul incasat<>0 daca poDate.incasat<>0)' + CHR(13) + CHR(10), gcErrLog, 1) + +loForm.ndiscfactron = pnDiscountRon +loForm.ndiscfactval = pnDiscountValuta +loForm.do_calculeaza_totaluri() + +STRTOFILE('inainte de Show()' + CHR(13) + CHR(10), gcErrLog, 1) +loForm.Show() +STRTOFILE('dupa Show(), mesaj amessagebox=[' + gcMockUltimMesaj + '] driver.lGasit=' + Transform(goDriverS8p7.lGasit) + CHR(13) + CHR(10), gcErrLog, 1) + +_SCREEN.tmrS8p7.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrS8p7') +Catch +Endtry + +Try + loForm.Release() +Catch +Endtry + +*!* --- G2: instantaneu vplaje_numere DUPA --- +LOCAL lnSuccesG2b +lnSuccesG2b = goExecutor.oExecute('select * from vplaje_numere order by 1', 'crsplaje_dupa') +STRTOFILE('vplaje_numere DUPA: oExecute=' + Transform(lnSuccesG2b) + ' randuri=' + ; + Transform(Iif(Used('crsplaje_dupa'), Reccount('crsplaje_dupa'), -1)) + CHR(13) + CHR(10), gcErrLog, 1) +goExecutor.oReset() + +IF Used('crsplaje_inainte') AND Used('crsplaje_dupa') + LOCAL lnDiferente, lnIdPlajaC, lnUrmvalInainte, lnUrmvalDupa + lnDiferente = 0 + SELECT crsplaje_inainte + SCAN + lnIdPlajaC = id_plaja + lnUrmvalInainte = urmval + SELECT crsplaje_dupa + LOCATE FOR id_plaja = lnIdPlajaC + IF FOUND() + lnUrmvalDupa = urmval + IF lnUrmvalInainte <> lnUrmvalDupa + lnDiferente = lnDiferente + 1 + STRTOFILE('DIFERENTA vplaje_numere: id_plaja=' + Transform(lnIdPlajaC) + ; + ' urmval_inainte=' + Transform(lnUrmvalInainte) + ' urmval_dupa=' + Transform(lnUrmvalDupa) + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + ELSE + lnDiferente = lnDiferente + 1 + STRTOFILE('LIPSA in dupa: id_plaja=' + Transform(lnIdPlajaC) + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + SELECT crsplaje_inainte + ENDSCAN + STRTOFILE('G2 vplaje_numere: total diferente urmval=' + Transform(lnDiferente) + CHR(13) + CHR(10), gcErrLog, 1) +ENDIF + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +DEFINE CLASS driverS8p7 AS Custom + lBusy = .F. + lGasit = .F. + + PROCEDURE Reseteaza + This.lGasit = .F. + ENDPROC + + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + TRY + LOCAL lnI, loFrm2 + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + loFrm2.Release() + EXIT + ENDIF + ENDFOR + CATCH TO loExcS8p7 + STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/probe_fact005_avize.prg b/utile/Teste/editare_factura/probe_fact005_avize.prg new file mode 100644 index 0000000..4b8c2c5 --- /dev/null +++ b/utile/Teste/editare_factura/probe_fact005_avize.prg @@ -0,0 +1,403 @@ +* probe_fact005_avize.prg +* Diagnostic pentru "Nu exista articole in lista de vanzare! (FACT-005)" pe documentul 1119 +* (AVIZ-B, rularea 2 din test_s9_8_flux.prg, firma 167). Repeta EXACT scenariul rularii 2, dar cu +* goExecutor inlocuit de o subclasa care logheaza fiecare statement, masoara starea reala in +* Oracle in punctele-cheie (dupa stergere, inainte de scrie_factura_avize) si BLOCHEAZA apelul +* scrie_factura_avize - deci nu se scrie nimic si nu se consuma niciun numar. +* +* Masoara, in ordine, in ACEEASI tranzactie: +* - inainte: FACTURAT pe avizul sursa 684, randurile VANZARI_CORESP, VANZARI_CANTITATI +* - dupa StergeDocumentFacturare (detectat prin primul initializeaza_date_factura): aceleasi +* - inainte de scrie_factura_avize: count(*) pe VANZARI_DETALII_TEMP + listaid + ramas avize +* La final: ROLLBACK. + +*!* tnIdFirma: firma pe care intra harness-ul. 167 = firma documentului 1119 (corect); +*!* 0 = fara firma, exact cum a rulat sweep-ul S12 din 04.09 01:23 (cade pe firma implicita 110) +*!* tnControlNegativ = 1: goleste CONT-ul in apelurile adauga_articol_factura (ca inainte de +*!* reparatia FACT-008), ca sa se vada daca reapare FACT-005 +*!* tnFaraInfasurare = 1: apelul se trimite EXACT cum il trimite productia, fara EXCEPTION WHEN +*!* OTHERS - se vede codul real intors de SQLExec, deci daca eroarea e tacuta sau zgomotoasa +LPARAMETERS tnIdFirma, tnControlNegativ, tnFaraInfasurare + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, poDate, poSnapshotEditare, gnNrAdaugaArt, pcErrF005, gnControlNegativ, gnFaraInfasurare +pcErrF005 = SPACE(400) +gnControlNegativ = VAL(TRANSFORM(tnControlNegativ)) +gnFaraInfasurare = VAL(TRANSFORM(tnFaraInfasurare)) + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_fact005_avize_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=F005-AVIZ doc=1119 aviz=684 firma_ceruta=' + ; + TRANSFORM(VAL(TRANSFORM(tnIdFirma))) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8, VAL(TRANSFORM(tnIdFirma)) +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +LOCAL lcPathVechi, lcPathNou +lcPathVechi = SET("PATH") +lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi +SET PATH TO &lcPathNou + +PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnNrAdaugaArt = 0 + +STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + ; + ' gnIdFirma=' + TRANSFORM(gnIdFirma) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + CHR(13) + CHR(10), gcErrLog, 1) + +DO Probeaza + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +*============================================================================================== +PROCEDURE Probeaza + LOCAL loForm, lnDiscRon, lnDiscVal, lnIdV, lnRuta, llRez, loSpy, loReal + lnIdV = 1119 + + DO StareAvize WITH 'INAINTE' + + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal) + IF VARTYPE(poDate) <> 'O' + STRTOFILE('EROARE: antetul nu s-a incarcat' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + STRTOFILE('poDate.tip=' + TRANSFORM(poDate.tip) + ' poDate.listaid=[' + TRANSFORM(NVL(poDate.listaid,'')) + ; + '] poDate.cListaSursaAvize=[' + TRANSFORM(NVL(poDate.cListaSursaAvize,'')) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + + IncarcaLiniiFacturaEditare(poDate, lnIdV) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + STRTOFILE('EROARE: liniile nu s-au incarcat' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + STRTOFILE('crsfactura: ' + TRANSFORM(RECCOUNT('crsfactura')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) + SELECT crsfactura + SCAN + STRTOFILE(' rand ' + TRANSFORM(RECNO()) + ': id_temp=' + TRANSFORM(NVL(crsfactura.id_temp,-1)) + ; + ' id_articol=' + TRANSFORM(NVL(crsfactura.id_articol,-1)) + ; + ' id_gestiune=' + TRANSFORM(NVL(crsfactura.id_gestiune,-1)) + ; + ' cantitate=' + TRANSFORM(crsfactura.cantitate) + ; + ' opt_facturare=' + TRANSFORM(NVL(crsfactura.opt_facturare,-1)) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + GO TOP IN crsfactura + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + loForm = CREATEOBJECT('SpyFrm005') + loForm.ndiscfactron = lnDiscRon + loForm.ndiscfactval = lnDiscVal + loForm.do_calculeaza_totaluri() + poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ; + lnIdV, Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), ; + Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), gnAn, gnLuna) + IF VARTYPE(poSnapshotEditare) <> 'O' + STRTOFILE('EROARE: instantaneul nu s-a creat' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + + SELECT crsfactura + GO TOP + REPLACE cantitate WITH cantitate + 1 IN crsfactura + loForm.do_calculeaza_totaluri() + + lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura') + STRTOFILE('ruta aleasa = ' + TRANSFORM(lnRuta) + CHR(13) + CHR(10), gcErrLog, 1) + + loReal = goExecutor + loSpy = CREATEOBJECT('SpyF005') + loSpy.nHandle = gnHandle + goExecutor = loSpy + + STRTOFILE('--- INCEPE do_scrie_factura ---' + CHR(13) + CHR(10), gcErrLog, 1) + llRez = loForm.do_scrie_factura() + STRTOFILE('--- do_scrie_factura a intors ' + TRANSFORM(llRez) + ' ---' + CHR(13) + CHR(10), gcErrLog, 1) + + goExecutor = loReal + STRTOFILE('statemente capturate: ' + TRANSFORM(loSpy.nIdx) + ' adauga_articol_factura: ' + TRANSFORM(gnNrAdaugaArt) + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) + + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + + DO StareAvize WITH 'DUPA ROLLBACK' +ENDPROC + + +*============================================================================================== +* StareAvize: starea legaturii aviz->factura, citita prin conexiunea curenta (deci vede si ce e +* nescris-inca-necomis in tranzactia proprie). +*============================================================================================== +PROCEDURE StareAvize + LPARAMETERS tcEticheta + STRTOFILE(tcEticheta + ' | vanzari.1119 sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from vanzari where id_vanzare = 1119])) + ; + ' id_fact=' + TRANSFORM(Val1([select nvl(id_fact,-9) as v from vanzari where id_vanzare = 1119])) + ; + ' | aviz 684 facturat=' + TRANSFORM(Val1([select nvl(facturat,-9) as v from vanzari where id_vanzare = 684])) + ; + ' sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from vanzari where id_vanzare = 684])) + ; + ' | coresp(fact=1119,sters=0)=' + TRANSFORM(Val1([select count(*) as v from vanzari_coresp where id_vanzare_fact = 1119 and sters = 0])) + ; + ' coresp(fact=1119,total)=' + TRANSFORM(Val1([select count(*) as v from vanzari_coresp where id_vanzare_fact = 1119])) + ; + ' | cantitati vii pe det 1119=' + TRANSFORM(Val1([select count(*) as v from vanzari_cantitati where sters = 0 and id_vanzare_det in (select id_vanzare_det from vanzari_detalii where id_vanzare = 1119)])) + ; + ' | ramas_avize_lista(684)=' + TRANSFORM(Val1([select pack_facturare.exista_ramas_avize_lista('684') as v from dual])) + ; + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*============================================================================================== +* ListeazaTemp: continutul VANZARI_DETALII_TEMP in tranzactia curenta (tabela temporara pe +* tranzactie - se vede doar din aceasta sesiune). +*============================================================================================== +PROCEDURE ListeazaTemp + LPARAMETERS tcEticheta + LOCAL lnR + IF USED('v_tmp95') + USE IN v_tmp95 + ENDIF + lnR = SQLExec(gnHandle, [select id_temp, id_articol, id_gestiune, cantitate, pret, proc_tvav, in_stoc from vanzari_detalii_temp order by id_temp], 'v_tmp95') + IF lnR < 0 OR !USED('v_tmp95') + STRTOFILE(tcEticheta + ': EROARE la citirea VANZARI_DETALII_TEMP' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + STRTOFILE(tcEticheta + ': VANZARI_DETALII_TEMP are ' + TRANSFORM(RECCOUNT('v_tmp95')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) + SELECT v_tmp95 + SCAN + STRTOFILE(' id_temp=' + TRANSFORM(NVL(v_tmp95.id_temp,-1)) + ; + ' id_articol=' + TRANSFORM(NVL(v_tmp95.id_articol,-1)) + ; + ' id_gestiune=' + TRANSFORM(NVL(v_tmp95.id_gestiune,-1)) + ; + ' cantitate=' + TRANSFORM(NVL(v_tmp95.cantitate,-1)) + ; + ' pret=' + TRANSFORM(NVL(v_tmp95.pret,-1)) + ; + ' proc_tvav=' + TRANSFORM(NVL(v_tmp95.proc_tvav,-1)) + ; + ' in_stoc=' + TRANSFORM(NVL(v_tmp95.in_stoc,-1)) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_tmp95 +ENDPROC + + +FUNCTION Val1 + LPARAMETERS tcSql + LOCAL lnRet, lnR + lnRet = -1 + IF USED('v_val96') + USE IN v_val96 + ENDIF + lnR = SQLExec(gnHandle, tcSql, 'v_val96') + IF lnR >= 0 AND USED('v_val96') + SELECT v_val96 + IF RECCOUNT('v_val96') > 0 + GO TOP + lnRet = NVL(v_val96.v, -1) + ENDIF + USE IN v_val96 + ENDIF + RETURN lnRet +ENDFUNC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE NEPRINSA ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) + IF TYPE('gnHandle') = 'N' AND gnHandle > 0 + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + ENDIF + STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC + + +*============================================================================================== +* SpyFrm005: subclasa a formularului real, cu o singura schimbare - do_inchide_tranzactie face +* MEREU ROLLBACK, niciodata COMMIT. Restul fluxului ruleaza neatins, deci nimic nu se scrie. +*============================================================================================== +DEFINE CLASS SpyFrm005 AS frm_facturare_articole2 OF "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx" + PROCEDURE do_inchide_tranzactie + LPARAMETERS tnTip + STRTOFILE(' [SpyFrm005] do_inchide_tranzactie(' + TRANSFORM(tnTip) + ') -> fortat ROLLBACK' + CHR(13) + CHR(10), gcErrLog, 1) + *!* documentul reemis se masoara AICI - dupa acest apel nu mai exista nimic + LOCAL lnIdVNou + lnIdVNou = Val1([select nvl(max(id_vanzare),0) as v from vanzari]) + STRTOFILE('DOCUMENT REEMIS (inainte de rollback) id_vanzare=' + TRANSFORM(lnIdVNou) + ; + ' linii vii=' + TRANSFORM(Val1([select count(*) as v from vanzari_detalii where id_vanzare = ] + TRANSFORM(lnIdVNou) + [ and sters = 0])) + ; + ' (originalul 1119 are 4)' + ; + ' id_fact=' + TRANSFORM(Val1([select nvl(id_fact,-9) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou))) + ; + ' tip=' + TRANSFORM(Val1([select nvl(tip,-9) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou))) + ; + ' coresp(fact=nou,tip=1,sters=0)=' + TRANSFORM(Val1([select count(*) as v from vanzari_coresp where id_vanzare_fact = ] + TRANSFORM(lnIdVNou) + [ and tip = 1 and sters = 0])) + ; + ' total_cu_tva=' + TRANSFORM(Val1([select nvl(total_cu_tva,-9) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou))) + ; + CHR(13) + CHR(10), gcErrLog, 1) + RETURN DODEFAULT(2) + ENDPROC +ENDDEFINE + + +*============================================================================================== +* SpyF005: subclasa a lui oexecutor. Logheaza fiecare statement, masoara starea in punctele-cheie +* si BLOCHEAZA scrie_factura_avize (RETURN -1) - deci nu se scrie nimic. +*============================================================================================== +DEFINE CLASS SpyF005 AS oexecutor + nIdx = 0 + nVazutInit = 0 + nUrmaTemp = 0 + + PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect) + LOCAL lnI, lnRet, loEx, lcS, lcC, lnPc + THIS.nIdx = THIS.nIdx + 1 + lnI = THIS.nIdx + lnPc = PCOUNT() + lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '') + lcC = IIF(VARTYPE(m.tcCursor) = 'C', m.tcCursor, '') + + STRTOFILE('#' + TRANSFORM(lnI) + ' pcount=' + TRANSFORM(lnPc) + ' cursor=[' + lcC + ']' + ; + ' len=' + TRANSFORM(LEN(lcS)) + CHR(13) + CHR(10) + ; + ' SQL=[' + LEFT(lcS, 1400) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + + *!* apelul se ruleaza infasurat intr-un EXCEPTION WHEN OTHERS care intoarce sqlcode/sqlerrm + *!* prin bind OUT - acelasi apel, aceleasi argumente, dar cu eroarea vizibila + IF 'adauga_articol_factura' $ lcS + gnNrAdaugaArt = gnNrAdaugaArt + 1 + LOCAL lcInner, lnB, lcNou + IF gnControlNegativ = 1 + lcS = STRTRAN(lcS, [,'371',], [,'',]) + STRTOFILE(' [control negativ] CONT golit in apel' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + lcInner = SUBSTR(lcS, 7) + lnB = RAT('end;', lcInner) + IF lnB > 1 + lcInner = LEFT(lcInner, lnB - 1) + ENDIF + pcErrF005 = SPACE(400) + IF gnFaraInfasurare = 1 + LOCAL ARRAY laErr[1] + lnRet = SQLExec(gnHandle, lcS) + pcErrF005 = IIF(lnRet < 0 AND AERROR(laErr) > 0, TRANSFORM(laErr[1,3]), 'OK') + STRTOFILE(' -> [neinfasurat] ret=' + TRANSFORM(lnRet) + ' err=[' + ALLTRIM(TRANSFORM(pcErrF005)) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + DO ListeazaTemp WITH ' dupa acest adauga_articol_factura' + RETURN lnRet + ENDIF + LOCAL lcQ + lcQ = CHR(39) + lcNou = [begin begin ] + lcInner + [ ?@pcErrF005 := ] + lcQ + [OK] + lcQ + [; exception when others then ] + ; + [?@pcErrF005 := to_char(sqlcode) || ] + lcQ + [ ] + lcQ + [ || substr(sqlerrm,1,300); end; end;] + lnRet = SQLExec(gnHandle, lcNou) + STRTOFILE(' -> [infasurat] ret=' + TRANSFORM(lnRet) + ' pcErrF005=[' + ALLTRIM(TRANSFORM(pcErrF005)) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + DO ListeazaTemp WITH ' dupa acest adauga_articol_factura' + RETURN IIF(lnRet < 0, -1, 1) + ENDIF + + *!* primul initializeaza_date_factura vine imediat DUPA StergeDocumentFacturare + IF 'initializeaza_date_factura' $ lcS AND THIS.nVazutInit = 0 + THIS.nVazutInit = 1 + DO StareAvize WITH 'DUPA STERGERE (inainte de initializeaza_date_factura)' + ENDIF + + IF 'scrie_factura_avize' $ lcS + STRTOFILE(' *** punct de masura: inainte de scrie_factura_avize ***' + CHR(13) + CHR(10) + ; + ' vanzari_detalii_temp = ' + TRANSFORM(Val1([select count(*) as v from vanzari_detalii_temp])) + ' randuri' + CHR(13) + CHR(10) + ; + ' act_temp = ' + TRANSFORM(Val1([select count(*) as v from act_temp])) + ' randuri' + CHR(13) + CHR(10) + ; + ' poDate.listaid = [' + TRANSFORM(NVL(poDate.listaid,'')) + ']' + CHR(13) + CHR(10) + ; + ' clistaid Oracle = [' + TRANSFORM(Sir1([select nvl(pack_facturare.clistaid,'') as v from dual])) + ']' + CHR(13) + CHR(10) + ; + ' ntip Oracle = ' + TRANSFORM(Val1([select nvl(pack_facturare.ntip,-9) as v from dual])) + CHR(13) + CHR(10) + ; + ' nid_sucursala Oracle = ' + TRANSFORM(Val1([select nvl(pack_facturare.nid_sucursala,-9) as v from dual])) + CHR(13) + CHR(10), gcErrLog, 1) + DO ListeazaTemp WITH ' inainte de scrie_factura_avize' + DO StareAvize WITH 'INAINTE DE scrie_factura_avize' + + *!* acelasi apel, dar cu REF CURSOR-ul si OUT-ul in variabile PL/SQL locale si cu + *!* EXCEPTION WHEN OTHERS care intoarce sqlcode/sqlerrm - apoi se intoarce mereu -1, + *!* deci fluxul cade pe ramura de eroare (ROLLBACK) chiar daca apelul ar fi reusit + LOCAL lcQ2, lnP1, lcArg, lcBloc + lcQ2 = CHR(39) + lnP1 = AT('(', lcS) + lcArg = SUBSTR(lcS, lnP1 + 1, RAT(')', lcS) - lnP1 - 1) + lcArg = STRTRAN(lcArg, '?@poDate.nid_vanzare', 'v') + pcErrF005 = SPACE(400) + THIS.nUrmaTemp = 2 + ENDIF + + lnRet = -1 + TRY + DO CASE + CASE lnPc <= 1 + lnRet = DODEFAULT(m.tcSql) + CASE lnPc = 2 + lnRet = DODEFAULT(m.tcSql, m.tcCursor) + CASE lnPc = 3 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress) + CASE lnPc = 4 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress) + CASE lnPc = 5 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle) + CASE lnPc = 6 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError) + CASE lnPc = 7 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError) + OTHERWISE + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect) + ENDCASE + STRTOFILE(' -> ret=' + TRANSFORM(lnRet) + IIF(lnRet < 0, ' EROARE=[' + THIS.cEroare + ']', '') + CHR(13) + CHR(10), gcErrLog, 1) + IF THIS.nUrmaTemp > 0 + THIS.nUrmaTemp = 0 + DO ListeazaTemp WITH ' dupa acest statement' + ENDIF + CATCH TO loEx + STRTOFILE(' -> EXCEPTIE VFP la statement #' + TRANSFORM(lnI) + ; + ': ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ; + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + lnRet = -1 + THIS.cEroare = 'SpyF005: ' + TRANSFORM(loEx.Message) + ENDTRY + + RETURN lnRet + ENDPROC + + FUNCTION oPrelucrareEroare + RETURN 'SpyF005: ' + TRANSFORM(THIS.cEroare) + ENDFUNC +ENDDEFINE + + +FUNCTION Sir1 + LPARAMETERS tcSql + LOCAL lcRet, lnR + lcRet = '' + IF USED('v_sir96') + USE IN v_sir96 + ENDIF + lnR = SQLExec(gnHandle, tcSql, 'v_sir96') + IF lnR >= 0 AND USED('v_sir96') + SELECT v_sir96 + IF RECCOUNT('v_sir96') > 0 + GO TOP + lcRet = ALLTRIM(TRANSFORM(NVL(v_sir96.v, ''))) + ENDIF + USE IN v_sir96 + ENDIF + RETURN lcRet +ENDFUNC diff --git a/utile/Teste/editare_factura/probe_incarca_antet.prg b/utile/Teste/editare_factura/probe_incarca_antet.prg new file mode 100644 index 0000000..f96d682 --- /dev/null +++ b/utile/Teste/editare_factura/probe_incarca_antet.prg @@ -0,0 +1,39 @@ +* probe_incarca_antet.prg - apeleaza direct IncarcaAntetFacturaEditare (fara do_editare_unificata, +* fara Createobject pe forma) pe cele 4 documente vechi, sa vada daca poDate se construieste OK. +* Read-only. Diagnostic pentru docs\triaj_s8_regresie_28fail.md. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_incarca_antet_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +PROCEDURE Proba + LPARAMETERS tnId + LOCAL loDate, pnA, pnB + loDate = IncarcaAntetFacturaEditare(tnId, @pnA, @pnB) + STRTOFILE(Transform(tnId) + ': Vartype=' + Vartype(loDate) + ' oExecutor.cEroare=[' + Nvl(goExecutor.cEroare,'') + ']' + CHR(13) + CHR(10), gcErrLog, 1) + IF Vartype(loDate) == 'O' + STRTOFILE(Transform(tnId) + ': tip=' + Transform(loDate.tip) + ' incasat=' + Transform(loDate.incasat) + ' lEditare=' + Transform(loDate.lEditare) + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + +DO Proba WITH 1113 +DO Proba WITH 1055 +DO Proba WITH 1048 +DO Proba WITH 1130 + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT diff --git a/utile/Teste/editare_factura/probe_s11_borderou_schema.prg b/utile/Teste/editare_factura/probe_s11_borderou_schema.prg new file mode 100644 index 0000000..0192175 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s11_borderou_schema.prg @@ -0,0 +1,50 @@ +* probe_s11_borderou_schema.prg - read-only: semnaturile PACK_FACT_BORDEROU + structurile +* FACT_BORDEROU / FACT_BORDEROU_DETALII / FACT_VBORDEROU_DETALII +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s11_borderou_schema_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +DO Dump WITH [select line, text from user_source where name = 'PACK_FACT_BORDEROU' and type = 'PACKAGE' order by line], 'SPEC PACK_FACT_BORDEROU' +DO Dump WITH [select column_name, data_type, data_length, nullable, column_id from user_tab_columns where table_name = 'FACT_BORDEROU' order by column_id], 'COLOANE FACT_BORDEROU' +DO Dump WITH [select column_name, data_type, data_length, nullable, column_id from user_tab_columns where table_name = 'FACT_BORDEROU_DETALII' order by column_id], 'COLOANE FACT_BORDEROU_DETALII' +DO Dump WITH [select column_name, data_type, data_length, column_id from user_tab_columns where table_name = 'FACT_VBORDEROU_DETALII' order by column_id], 'COLOANE FACT_VBORDEROU_DETALII' +DO Dump WITH [select id, id_borderou, id_vanzare from ] + gcs + [.fact_borderou_detalii order by id], 'CONTINUT FACT_BORDEROU_DETALII' + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE Dump + LPARAMETERS tcSql, tcTitlu + LOCAL lnI, lcLinie + STRTOFILE(CHR(13) + CHR(10) + '=== ' + m.tcTitlu + ' ===' + CHR(13) + CHR(10), gcErrLog, 1) + IF USED('v_dump') + USE IN v_dump + ENDIF + IF !goExecutor.oExecuta(m.tcSql, 'v_dump') + STRTOFILE('ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + SELECT v_dump + SCAN + lcLinie = '' + FOR lnI = 1 TO FCOUNT('v_dump') + lcLinie = lcLinie + IIF(lnI > 1, ' | ', '') + ALLTRIM(TRANSFORM(NVL(EVALUATE(FIELD(lnI, 'v_dump')), ''))) + ENDFOR + STRTOFILE(STRTRAN(STRTRAN(lcLinie, CHR(13), ''), CHR(10), '') + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_dump +ENDPROC + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s11_borderou_view.prg b/utile/Teste/editare_factura/probe_s11_borderou_view.prg new file mode 100644 index 0000000..79f77b7 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s11_borderou_view.prg @@ -0,0 +1,53 @@ +* probe_s11_borderou_view.prg - read-only: coloanele de total din VANZARI + definitia +* FACT_VBORDEROU_DETALII prin dbms_metadata (CLOB, nu LONG - LONG agata ODBC-ul) +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s11_borderou_view_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +DO Dump WITH [select column_name, data_type from user_tab_columns where table_name = 'VANZARI' ] + ; + [and (column_name like '%TOTAL%' or column_name like '%VAL%') order by column_id], 'COLOANE TOTAL/VAL in VANZARI' + +DO Dump WITH [select rn, substr(d, 1 + (rn-1)*180, 180) as bucata from ] + ; + [(select dbms_metadata.get_ddl('VIEW','FACT_VBORDEROU_DETALII') d from dual), ] + ; + [(select level rn from dual connect by level <= 60) ] + ; + [where 1 + (rn-1)*180 <= length(d) order by rn], 'DDL FACT_VBORDEROU_DETALII' + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE Dump + LPARAMETERS tcSql, tcTitlu + LOCAL lnI, lcLinie + STRTOFILE(CHR(13) + CHR(10) + '=== ' + m.tcTitlu + ' ===' + CHR(13) + CHR(10), gcErrLog, 1) + IF USED('v_dump') + USE IN v_dump + ENDIF + IF !goExecutor.oExecuta(m.tcSql, 'v_dump') + STRTOFILE('ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + SELECT v_dump + SCAN + lcLinie = '' + FOR lnI = 1 TO FCOUNT('v_dump') + lcLinie = lcLinie + IIF(lnI > 1, ' | ', '') + ALLTRIM(TRANSFORM(NVL(EVALUATE(FIELD(lnI, 'v_dump')), ''))) + ENDFOR + STRTOFILE(STRTRAN(STRTRAN(lcLinie, CHR(13), ''), CHR(10), ' '), gcErrLog, 1) + STRTOFILE(CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_dump +ENDPROC + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s11_candidati.prg b/utile/Teste/editare_factura/probe_s11_candidati.prg new file mode 100644 index 0000000..eaa1250 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s11_candidati.prg @@ -0,0 +1,52 @@ +* probe_s11_candidati.prg - read-only: candidatii eligibili pentru rularea 2, cu totalul si +* numarul de linii, ca sa se vada care sunt reziduuri degenerate (total 0). +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s11_candidati_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lcSql, lnI, lcLinie +lcSql = [select v.id_vanzare, v.cod, v.tip, v.id_fact, v.total_cu_tva, v.serie_act, v.numar_act, ] + ; + [(select count(*) from vanzari_detalii d where d.sters = 0 and d.id_vanzare = v.id_vanzare) as linii, ] + ; + [(select nvl(min(d.id_articol),0) from vanzari_detalii d where d.sters = 0 and d.id_vanzare = v.id_vanzare) as art_min ] + ; + [from vanzari v where v.sters = 0 ] + ; + [ and extract(year from v.data_act) = ] + TRANSFORM(gnAn) + ; + [ and extract(month from v.data_act) = ] + TRANSFORM(gnLuna) + ; + [ and nvl(v.eproforma,0) = 0 ] + ; + [ and v.id_vanzare not in (1047,1048,1055,1113,1130) ] + ; + [ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ; + [ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + ; + [ and v.tip not in (4,3,21,25,28,42,47,44,45,46,51) ] + ; + [ and exists (select 1 from vanzari_detalii d where d.sters = 0 and d.id_vanzare = v.id_vanzare and nvl(d.cantitate,0) > 0) ] + ; + [ order by v.id_vanzare] + +IF !goExecutor.oExecuta(lcSql, 'v_c') + STRTOFILE('ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +STRTOFILE('id_vanzare | cod | tip | id_fact | total_cu_tva | serie | numar | linii | art_min' + CHR(13) + CHR(10), gcErrLog, 1) +SELECT v_c +SCAN + lcLinie = '' + FOR lnI = 1 TO FCOUNT('v_c') + lcLinie = lcLinie + IIF(lnI > 1, ' | ', '') + ALLTRIM(TRANSFORM(NVL(EVALUATE(FIELD(lnI, 'v_c')), ''))) + ENDFOR + STRTOFILE(lcLinie + CHR(13) + CHR(10), gcErrLog, 1) +ENDSCAN +USE IN v_c + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s11_stare_dupa.prg b/utile/Teste/editare_factura/probe_s11_stare_dupa.prg new file mode 100644 index 0000000..8184cf5 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s11_stare_dupa.prg @@ -0,0 +1,52 @@ +* probe_s11_stare_dupa.prg - read-only: starea lasata de rularile probei S11 (documente atinse, +* atasamente semanate, borderouri semanate), inainte de curatenie. +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s11_stare_dupa_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +DO Dump WITH [select id_vanzare, sters, serie_act, numar_act, total_cu_tva, id_fact from vanzari ] + ; + [where id_vanzare in (1076,1111,1127,1128,1129,1169,1170) order by id_vanzare], 'DOCUMENTE ATINSE' +DO Dump WITH [select id_vanzare, sters, count(*) as nr from ] + gcs + [.atasamente_vanzari ] + ; + [where id_vanzare in (1076,1111,1127,1128,1129,1169,1170) group by id_vanzare, sters order by 1,2], 'ATASAMENTE SEMANATE' +DO Dump WITH [select id, id_part, sters, trimis from ] + gcs + [.fact_borderou where id >= 20 order by id], 'BORDEROURI SEMANATE' +DO Dump WITH [select id, id_borderou, id_vanzare from ] + gcs + [.fact_borderou_detalii where id_borderou >= 20 order by id], 'DETALII BORDEROU SEMANATE' +DO Dump WITH [select max(numar_act) as ultim_sss from vanzari where serie_act = 'SSS'], 'ULTIMUL NUMAR SSS' + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE Dump + LPARAMETERS tcSql, tcTitlu + LOCAL lnI, lcLinie + STRTOFILE(CHR(13) + CHR(10) + '=== ' + m.tcTitlu + ' ===' + CHR(13) + CHR(10), gcErrLog, 1) + IF USED('v_dump') + USE IN v_dump + ENDIF + IF !goExecutor.oExecuta(m.tcSql, 'v_dump') + STRTOFILE('ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + SELECT v_dump + SCAN + lcLinie = '' + FOR lnI = 1 TO FCOUNT('v_dump') + lcLinie = lcLinie + IIF(lnI > 1, ' | ', '') + ALLTRIM(TRANSFORM(NVL(EVALUATE(FIELD(lnI, 'v_dump')), ''))) + ENDFOR + STRTOFILE(lcLinie + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_dump +ENDPROC + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s12_gestiune.prg b/utile/Teste/editare_factura/probe_s12_gestiune.prg new file mode 100644 index 0000000..e2a8b90 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s12_gestiune.prg @@ -0,0 +1,278 @@ +* probe_s12_gestiune.prg +* Proba care APARA reparatia FACT-007 (docs\propunere_fact007_gestiune.md, aplicata in +* ofacturare_editare.prg): verifica ca id_gestiune ajunge de la VANZARI_DETALII pana la +* argumentul V_ID_GESTIUNE al apelului pack_facturare.adauga_articol_factura, cu NULL in sursa +* mapat la -1000. Cade daca reparatia dispare sau daca e inlocuita cu o alta valoare (ex. 0). +* NIMIC nu se scrie in Oracle: citirile sunt reale, dar do_scrie_articole() ruleaza cu goExecutor +* mockat (tipar identic cu test_s11_izolare_camp_1472.prg). +* +* Pasul 1: sursa reala (VVANZARI_ARTICOLE prin IncarcaArticoleFactura) - construieste harta +* id_temp -> gestiune asteptata (NULL -> -1000). +* Pasul 2: crsfactura dupa IncarcaLiniiFacturaEditare - compara linie cu linie cu harta. +* Pasul 3: SQL-ul generat de do_scrie_articole, argumentul 6 (V_ID_GESTIUNE) per apel, comparat +* cu harta. +* Pasul 4: rerulare pe acelasi crsfactura - verifica idempotenta rezultatului. +LPARAMETERS tnIdV + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail +PUBLIC poDate + +IF VARTYPE(tnIdV) = 'C' + tnIdV = VAL(tnIdV) +ENDIF +IF EMPTY(tnIdV) + tnIdV = 631 +ENDIF + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s12_gestiune_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' doc = ' + TRANSFORM(tnIdV) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO probe_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +LOCAL lcPathVechi, lcPathNou +lcPathVechi = SET("PATH") +lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi +SET PATH TO &lcPathNou + +PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnPass = 0 +gnFail = 0 + +PUBLIC gcGestiuniSql +gcGestiuniSql = '' + +DO Diagnostic WITH tnIdV + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*============================================================================================== +PROCEDURE Diagnostic + LPARAMETERS tnIdV + LOCAL lnDiscRon, lnDiscVal, lnRanduri, lnCorecte, lcAsteptatGestiuni, lnGestAsteptata + + *!* PASUL 1: sursa reala, inainte de orice prelucrare; construieste harta id_temp -> gestiune asteptata + IncarcaArticoleFactura(tnIdV, 'crs_src_probe') + IF USED('crs_gest_expect') + USE IN crs_gest_expect + ENDIF + CREATE CURSOR crs_gest_expect (id_temp N(10), gest_exp N(10)) + INDEX ON id_temp TAG id_temp + + STRTOFILE('--- PAS 1: sursa VVANZARI_ARTICOLE (crs_src_probe) ---' + CHR(13) + CHR(10), gcErrLog, 1) + LOCAL lnIdTempSrc, lnGestExpSrc + SELECT crs_src_probe + SCAN + STRTOFILE(' id_vanzare_det=' + TRANSFORM(id_vanzare_det) + ; + ' id_articol=' + TRANSFORM(NVL(id_articol,-1)) + ; + ' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ; + ' in_stoc=' + TRANSFORM(NVL(in_stoc,-1)) + CHR(13) + CHR(10), gcErrLog, 1) + lnIdTempSrc = id_vanzare_det + lnGestExpSrc = NVL(id_gestiune,-1000) + INSERT INTO crs_gest_expect (id_temp, gest_exp) VALUES (lnIdTempSrc, lnGestExpSrc) + ENDSCAN + DO asserteaza WITH 'P1 sursa contine cel putin o linie', RECCOUNT('crs_src_probe') > 0, TRANSFORM(RECCOUNT('crs_src_probe')) + + *!* PASUL 2: incarcarea de editare + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal) + DO asserteaza WITH 'P2 antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate) + IF VARTYPE(poDate) <> 'O' + RETURN + ENDIF + + IncarcaLiniiFacturaEditare(poDate, tnIdV) + DO asserteaza WITH 'P2 liniile s-au incarcat in crsfactura', ; + USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1)) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + RETURN + ENDIF + + STRTOFILE('--- PAS 2: crsfactura dupa IncarcaLiniiFacturaEditare ---' + CHR(13) + CHR(10), gcErrLog, 1) + lnRanduri = 0 + lnCorecte = 0 + lcAsteptatGestiuni = '' + SELECT crsfactura + SCAN + lnRanduri = lnRanduri + 1 + lnGestAsteptata = GestiuneAsteptata(id_temp) + STRTOFILE(' id_temp=' + TRANSFORM(id_temp) + ; + ' id_articol=' + IIF(ISNULL(id_articol), 'NULL', TRANSFORM(id_articol)) + ; + ' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ; + ' gestionabil=' + TRANSFORM(gestionabil) + CHR(13) + CHR(10), gcErrLog, 1) + IF NVL(id_gestiune,-9999999) = lnGestAsteptata + lnCorecte = lnCorecte + 1 + ENDIF + lcAsteptatGestiuni = lcAsteptatGestiuni + ALLTRIM(STR(lnGestAsteptata)) + ';' + ENDSCAN + DO asserteaza WITH 'P2 liniile din crsfactura poarta gestiunea din sursa (NULL -> -1000)', ; + lnCorecte = lnRanduri AND lnRanduri > 0, TRANSFORM(lnCorecte) + '/' + TRANSFORM(lnRanduri) + + *!* normalizare locala: fara virgule in sirurile din SQL, ca argumentul 6 sa fie extractibil + SELECT crsfactura + REPLACE ALL explicatie WITH 'probe-s12', serie WITH '', lot WITH '', opt_facturare WITH 0 IN crsfactura + GO TOP IN crsfactura + + *!* PASUL 3: ce ajunge in SQL, cu mock (nimic nu se executa in Oracle) + DO RuleazaCuMock WITH 'PAS3' + DO asserteaza WITH 'P3 argumentul 6 (V_ID_GESTIUNE) e gestiunea sursei pe fiecare apel', ; + gcGestiuniSql == lcAsteptatGestiuni, gcGestiuniSql + ' <> ' + lcAsteptatGestiuni + + *!* PASUL 4: idempotenta - a doua rulare pe acelasi crsfactura trebuie sa dea acelasi rezultat + GO TOP IN crsfactura + DO RuleazaCuMock WITH 'PAS4-idempotenta' + DO asserteaza WITH 'P4 a doua rulare da acelasi argument 6 (idempotenta)', ; + gcGestiuniSql == lcAsteptatGestiuni, gcGestiuniSql + ' <> ' + lcAsteptatGestiuni +ENDPROC + + +*============================================================================================== +* RuleazaCuMock: do_scrie_articole() cu goExecutor mockat; strange argumentul 6 al fiecarui apel +* pack_facturare.adauga_articol_factura in gcGestiuniSql, separat prin ';'. +*============================================================================================== +PROCEDURE RuleazaCuMock + LPARAMETERS tcPrefix + LOCAL loForm, loMock, loExecutorReal, llReturn + + loForm = CREATEOBJECT('frm_facturare_articole2') + + IF TYPE('plRegenerareEditare') <> 'U' + RELEASE plRegenerareEditare + ENDIF + + loExecutorReal = goExecutor + loMock = CREATEOBJECT('MockGoExecutorS12Gest') + goExecutor = loMock + + llReturn = loForm.do_scrie_articole() + + goExecutor = loExecutorReal + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + + gcGestiuniSql = loMock.cGestiuni + + STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ; + ' apeluri_articol=' + TRANSFORM(loMock.nApeluriArticol) + ; + ' argumente_6=[' + gcGestiuniSql + ']' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(tcPrefix + ' --- ultimul SQL de articol ---' + CHR(13) + CHR(10) + ; + TRANSFORM(loMock.cSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1) + + RELEASE loForm +ENDPROC + + +PROCEDURE GestiuneAsteptata + LPARAMETERS tnIdTemp + LOCAL lnRet, lnSelPrev + + lnSelPrev = SELECT() + SELECT crs_gest_expect + IF SEEK(m.tnIdTemp) + lnRet = gest_exp + ELSE + lnRet = -9999999 + ENDIF + SELECT (lnSelPrev) + + RETURN lnRet +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE probe_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) + IF TYPE('gnHandle') = 'N' AND gnHandle > 0 + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + ENDIF + gnFail = gnFail + 1 + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC + + +*============================================================================================== +DEFINE CLASS MockGoExecutorS12Gest AS Custom + cGestiuni = '' + cSqlUltim = '' + nApeluri = 0 + nApeluriArticol = 0 + cEroare = '' + + FUNCTION oExecute(tcSql) + LOCAL lcSql, lnPoz, lcRest + THIS.nApeluri = THIS.nApeluri + 1 + IF VARTYPE(m.tcSql) <> 'C' + RETURN 1 + ENDIF + lcSql = m.tcSql + lnPoz = AT('adauga_articol_factura(', lcSql) + DO WHILE lnPoz > 0 + THIS.nApeluriArticol = THIS.nApeluriArticol + 1 + lcRest = SUBSTR(lcSql, lnPoz + LEN('adauga_articol_factura(')) + THIS.cGestiuni = THIS.cGestiuni + ALLTRIM(GETWORDNUM(lcRest, 6, ',')) + ';' + THIS.cSqlUltim = m.tcSql + lcSql = lcRest + lnPoz = AT('adauga_articol_factura(', lcSql) + ENDDO + RETURN 1 + ENDFUNC + + FUNCTION oExecuta(tcSql, tcCursor) + THIS.nApeluri = THIS.nApeluri + 1 + IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor) + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + CREATE CURSOR (m.tcCursor) (xdummy I) + ENDIF + RETURN .T. + ENDFUNC + + FUNCTION oPrelucrareEroare() + RETURN 'MockGoExecutorS12Gest: ' + THIS.cEroare + ENDFUNC +ENDDEFINE diff --git a/utile/Teste/editare_factura/probe_s12_stoc.prg b/utile/Teste/editare_factura/probe_s12_stoc.prg new file mode 100644 index 0000000..ca730bc --- /dev/null +++ b/utile/Teste/editare_factura/probe_s12_stoc.prg @@ -0,0 +1,297 @@ +* probe_s12_stoc.prg +* Proba de izolare pentru FACT-008 ("Articolul ... nu mai e in stoc!"): verifica daca pretv_orig +* (pretul de vanzare din STOC ales la emiterea initiala) supravietuieste traseului de reemitere. +* pack_facturare.descarca_gestiune cauta randul de stoc cu A.PRETV = V_PRETV_ALES, iar +* V_PRETV_ALES vine din VANZARI_DETALII_TEMP.PRETV_ORIG, adica din argumentul 22 al apelului +* pack_facturare.adauga_articol_factura, adica din crsfactura.pretv_orig. +* Asertiunile sunt scrise in sensul CORECT: pretv_orig = STOC.PRETV al lotului, adica nenul +* doar pe gestiunile la pret de vanzare (NOM_GESTIUNI.NR_PAG in 6/7) si 0 in rest. +* NIMIC nu se scrie in Oracle: citirile sunt reale, do_scrie_articole() ruleaza cu goExecutor +* mockat (tipar identic cu probe_s12_gestiune.prg / test_s11_izolare_camp_1472.prg). +* +* Pasul 1: sursa reala (VVANZARI_ARTICOLE prin IncarcaArticoleFactura). +* Pasul 2: crsfactura dupa IncarcaLiniiFacturaEditare - pretv_orig per linie. +* Pasul 3: SQL-ul generat de do_scrie_articole, argumentul 22 (V_PRETV_ORIG) per apel. +LPARAMETERS tnIdV + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail +PUBLIC poDate + +IF VARTYPE(tnIdV) = 'C' + tnIdV = VAL(tnIdV) +ENDIF +IF EMPTY(tnIdV) + tnIdV = 1188 +ENDIF + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s12_stoc_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' doc = ' + TRANSFORM(tnIdV) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO probe_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +LOCAL lcPathVechi, lcPathNou +lcPathVechi = SET("PATH") +lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi +SET PATH TO &lcPathNou + +PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnPass = 0 +gnFail = 0 + +PUBLIC gcPretvSql, gcContSql +gcPretvSql = '' +gcContSql = '' + +DO Diagnostic WITH tnIdV + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*============================================================================================== +PROCEDURE Diagnostic + LPARAMETERS tnIdV + LOCAL lnDiscRon, lnDiscVal, lnGestionabile, lnCuPretv, lnArg, lnArgNenule, lnArgTotal + LOCAL lnAsteptatNenule, lcGestPV + LOCAL lnCuCont, lnSrcCuCont, lnCtTotal, lnCtNenule + + IncarcaArticoleFactura(tnIdV, 'crs_src_probe') + STRTOFILE('--- PAS 1: sursa VVANZARI_ARTICOLE (crs_src_probe) ---' + CHR(13) + CHR(10), gcErrLog, 1) + SELECT crs_src_probe + SCAN + STRTOFILE(' id_vanzare_det=' + TRANSFORM(id_vanzare_det) + ; + ' id_articol=' + TRANSFORM(NVL(id_articol,-1)) + ; + ' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ; + ' in_stoc=' + TRANSFORM(NVL(in_stoc,-1)) + ; + ' cont=[' + NVL(cont,'') + ']' + ; + ' pret_achizitie=' + TRANSFORM(NVL(pret_achizitie,-1)) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + SELECT COUNT(*) AS n FROM crs_src_probe WHERE !EMPTY(NVL(cont,'')) INTO CURSOR crs_cnt_cont + lnSrcCuCont = crs_cnt_cont.n + USE IN crs_cnt_cont + DO asserteaza WITH 'P1 sursa contine cel putin o linie', RECCOUNT('crs_src_probe') > 0, TRANSFORM(RECCOUNT('crs_src_probe')) + + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal) + DO asserteaza WITH 'P2 antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate) + IF VARTYPE(poDate) <> 'O' + RETURN + ENDIF + + IncarcaLiniiFacturaEditare(poDate, tnIdV) + DO asserteaza WITH 'P2 liniile s-au incarcat in crsfactura', ; + USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1)) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + RETURN + ENDIF + + STRTOFILE('--- PAS 2: crsfactura dupa IncarcaLiniiFacturaEditare ---' + CHR(13) + CHR(10), gcErrLog, 1) + *!* pe gestiunile la pret de achizitie STOC.PRETV e 0, deci si pretv_orig trebuie sa fie 0 + lcGestPV = ',' + IF goExecutor.oExecuta('select id_gestiune from nom_gestiuni where nr_pag in (6,7)', 'crs_gest_pv') + SELECT crs_gest_pv + SCAN + lcGestPV = lcGestPV + ALLTRIM(STR(crs_gest_pv.id_gestiune)) + ',' + ENDSCAN + USE IN crs_gest_pv + ENDIF + DO asserteaza WITH 'P2 lista gestiunilor la pret de vanzare s-a incarcat', LEN(lcGestPV) > 1, lcGestPV + + lnGestionabile = 0 + lnCuPretv = 0 + lnAsteptatNenule = 0 + lnCuCont = 0 + SELECT crsfactura + SCAN + STRTOFILE(' id_temp=' + TRANSFORM(id_temp) + ; + ' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ; + ' gestionabil=' + TRANSFORM(gestionabil) + ; + ' pret_achizitie=' + TRANSFORM(pret_achizitie) + ; + ' cont=[' + Cont + ']' + ; + ' pretv_orig=' + TRANSFORM(pretv_orig) + CHR(13) + CHR(10), gcErrLog, 1) + IF !EMPTY(Cont) + lnCuCont = lnCuCont + 1 + ENDIF + IF gestionabil = 1 + lnGestionabile = lnGestionabile + 1 + IF ',' + ALLTRIM(STR(NVL(id_gestiune, -1))) + ',' $ lcGestPV + lnAsteptatNenule = lnAsteptatNenule + 1 + ENDIF + IF pretv_orig <> 0 + lnCuPretv = lnCuPretv + 1 + ENDIF + ENDIF + ENDSCAN + DO asserteaza WITH 'P2 documentul are cel putin o linie gestionabila', lnGestionabile > 0, TRANSFORM(lnGestionabile) + DO asserteaza WITH 'P2 crsfactura.pretv_orig e nenul exact pe liniile de pe gestiuni la pret de vanzare', ; + lnCuPretv = lnAsteptatNenule AND lnGestionabile > 0, ; + TRANSFORM(lnCuPretv) + ' nenule fata de ' + TRANSFORM(lnAsteptatNenule) + ' asteptate din ' + TRANSFORM(lnGestionabile) + ' gestionabile' + DO asserteaza WITH 'P2 crsfactura.Cont e completat pe toate liniile care au CONT in sursa', ; + lnCuCont = lnSrcCuCont AND lnSrcCuCont > 0, TRANSFORM(lnCuCont) + '/' + TRANSFORM(lnSrcCuCont) + + *!* normalizare locala: fara virgule in sirurile din SQL, ca argumentul 22 sa fie extractibil + SELECT crsfactura + REPLACE ALL explicatie WITH 'probe-s12', serie WITH '', lot WITH '', opt_facturare WITH 0 IN crsfactura + GO TOP IN crsfactura + + DO RuleazaCuMock WITH 'PAS3' + + lnArgTotal = 0 + lnArgNenule = 0 + FOR lnArg = 1 TO GETWORDCOUNT(gcPretvSql, ';') + lnArgTotal = lnArgTotal + 1 + IF VAL(GETWORDNUM(gcPretvSql, lnArg, ';')) <> 0 + lnArgNenule = lnArgNenule + 1 + ENDIF + ENDFOR + DO asserteaza WITH 'P3 argumentul 22 (V_PRETV_ORIG) reia pretv_orig din crsfactura', ; + lnArgTotal > 0 AND lnArgNenule = lnCuPretv, gcPretvSql + + lnCtTotal = 0 + lnCtNenule = 0 + FOR lnArg = 1 TO GETWORDCOUNT(gcContSql, ';') + lnCtTotal = lnCtTotal + 1 + IF !EMPTY(STRTRAN(GETWORDNUM(gcContSql, lnArg, ';'), CHR(39), '')) + lnCtNenule = lnCtNenule + 1 + ENDIF + ENDFOR + DO asserteaza WITH 'P3 argumentul 16 (V_CONT) e nevid pe fiecare apel de articol', ; + lnCtTotal > 0 AND lnCtNenule = lnCtTotal, gcContSql +ENDPROC + + +*============================================================================================== +* RuleazaCuMock: do_scrie_articole() cu goExecutor mockat; strange argumentul 22 al fiecarui apel +* pack_facturare.adauga_articol_factura in gcPretvSql, separat prin ';'. +*============================================================================================== +PROCEDURE RuleazaCuMock + LPARAMETERS tcPrefix + LOCAL loForm, loMock, loExecutorReal, llReturn + + loForm = CREATEOBJECT('frm_facturare_articole2') + + IF TYPE('plRegenerareEditare') <> 'U' + RELEASE plRegenerareEditare + ENDIF + + loExecutorReal = goExecutor + loMock = CREATEOBJECT('MockGoExecutorS12Stoc') + goExecutor = loMock + + llReturn = loForm.do_scrie_articole() + + goExecutor = loExecutorReal + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + + gcPretvSql = loMock.cPretv + gcContSql = loMock.cCont + + STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ; + ' apeluri_articol=' + TRANSFORM(loMock.nApeluriArticol) + ; + ' argumente_22=[' + gcPretvSql + ']' + ; + ' argumente_16=[' + gcContSql + ']' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(tcPrefix + ' --- ultimul SQL de articol ---' + CHR(13) + CHR(10) + ; + TRANSFORM(loMock.cSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1) + + RELEASE loForm +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE probe_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) + IF TYPE('gnHandle') = 'N' AND gnHandle > 0 + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + ENDIF + gnFail = gnFail + 1 + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC + + +*============================================================================================== +DEFINE CLASS MockGoExecutorS12Stoc AS Custom + cPretv = '' + cCont = '' + cSqlUltim = '' + nApeluri = 0 + nApeluriArticol = 0 + cEroare = '' + + FUNCTION oExecute(tcSql) + LOCAL lcSql, lnPoz, lcRest + THIS.nApeluri = THIS.nApeluri + 1 + IF VARTYPE(m.tcSql) <> 'C' + RETURN 1 + ENDIF + lcSql = m.tcSql + lnPoz = AT('adauga_articol_factura(', lcSql) + DO WHILE lnPoz > 0 + THIS.nApeluriArticol = THIS.nApeluriArticol + 1 + lcRest = SUBSTR(lcSql, lnPoz + LEN('adauga_articol_factura(')) + THIS.cPretv = THIS.cPretv + ALLTRIM(GETWORDNUM(lcRest, 22, ',')) + ';' + THIS.cCont = THIS.cCont + ALLTRIM(GETWORDNUM(lcRest, 16, ',')) + ';' + THIS.cSqlUltim = m.tcSql + lcSql = lcRest + lnPoz = AT('adauga_articol_factura(', lcSql) + ENDDO + RETURN 1 + ENDFUNC + + FUNCTION oExecuta(tcSql, tcCursor) + THIS.nApeluri = THIS.nApeluri + 1 + IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor) + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + CREATE CURSOR (m.tcCursor) (xdummy I) + ENDIF + RETURN .T. + ENDFUNC + + FUNCTION oPrelucrareEroare() + RETURN 'MockGoExecutorS12Stoc: ' + THIS.cEroare + ENDFUNC +ENDDEFINE diff --git a/utile/Teste/editare_factura/probe_s12_stoc_ctrlneg.prg b/utile/Teste/editare_factura/probe_s12_stoc_ctrlneg.prg new file mode 100644 index 0000000..bc0612c --- /dev/null +++ b/utile/Teste/editare_factura/probe_s12_stoc_ctrlneg.prg @@ -0,0 +1,282 @@ +* probe_s12_stoc.prg +* Proba de izolare pentru FACT-008 ("Articolul ... nu mai e in stoc!"): verifica daca pretv_orig +* (pretul de vanzare din STOC ales la emiterea initiala) supravietuieste traseului de reemitere. +* pack_facturare.descarca_gestiune cauta randul de stoc cu A.PRETV = V_PRETV_ALES, iar +* V_PRETV_ALES vine din VANZARI_DETALII_TEMP.PRETV_ORIG, adica din argumentul 22 al apelului +* pack_facturare.adauga_articol_factura, adica din crsfactura.pretv_orig. +* Asertiunile sunt scrise in sensul CORECT (pretv_orig <> 0 pe liniile gestionabile), deci ele +* PICA atat timp cat defectul exista si TREC dupa reparatie. +* NIMIC nu se scrie in Oracle: citirile sunt reale, do_scrie_articole() ruleaza cu goExecutor +* mockat (tipar identic cu probe_s12_gestiune.prg / test_s11_izolare_camp_1472.prg). +* +* Pasul 1: sursa reala (VVANZARI_ARTICOLE prin IncarcaArticoleFactura). +* Pasul 2: crsfactura dupa IncarcaLiniiFacturaEditare - pretv_orig per linie. +* Pasul 3: SQL-ul generat de do_scrie_articole, argumentul 22 (V_PRETV_ORIG) per apel. +LPARAMETERS tnIdV + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail +PUBLIC poDate + +IF VARTYPE(tnIdV) = 'C' + tnIdV = VAL(tnIdV) +ENDIF +IF EMPTY(tnIdV) + tnIdV = 631 +ENDIF + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s12_stoc_ctrlneg_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' doc = ' + TRANSFORM(tnIdV) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO probe_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\mock_incarca_linii_prefix.prg", &lcProcExistent + +LOCAL lcPathVechi, lcPathNou +lcPathVechi = SET("PATH") +lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi +SET PATH TO &lcPathNou + +PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnPass = 0 +gnFail = 0 + +PUBLIC gcPretvSql, gcContSql +gcPretvSql = '' +gcContSql = '' + +DO Diagnostic WITH tnIdV + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*============================================================================================== +PROCEDURE Diagnostic + LPARAMETERS tnIdV + LOCAL lnDiscRon, lnDiscVal, lnGestionabile, lnCuPretv, lnArg, lnArgNenule, lnArgTotal + LOCAL lnCuCont, lnSrcCuCont, lnCtTotal, lnCtNenule + + IncarcaArticoleFactura(tnIdV, 'crs_src_probe') + STRTOFILE('--- PAS 1: sursa VVANZARI_ARTICOLE (crs_src_probe) ---' + CHR(13) + CHR(10), gcErrLog, 1) + SELECT crs_src_probe + SCAN + STRTOFILE(' id_vanzare_det=' + TRANSFORM(id_vanzare_det) + ; + ' id_articol=' + TRANSFORM(NVL(id_articol,-1)) + ; + ' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ; + ' in_stoc=' + TRANSFORM(NVL(in_stoc,-1)) + ; + ' cont=[' + NVL(cont,'') + ']' + ; + ' pret_achizitie=' + TRANSFORM(NVL(pret_achizitie,-1)) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + SELECT COUNT(*) AS n FROM crs_src_probe WHERE !EMPTY(NVL(cont,'')) INTO CURSOR crs_cnt_cont + lnSrcCuCont = crs_cnt_cont.n + USE IN crs_cnt_cont + DO asserteaza WITH 'P1 sursa contine cel putin o linie', RECCOUNT('crs_src_probe') > 0, TRANSFORM(RECCOUNT('crs_src_probe')) + + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal) + DO asserteaza WITH 'P2 antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate) + IF VARTYPE(poDate) <> 'O' + RETURN + ENDIF + + IncarcaLiniiFacturaEditare(poDate, tnIdV) + DO asserteaza WITH 'P2 liniile s-au incarcat in crsfactura', ; + USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1)) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + RETURN + ENDIF + + STRTOFILE('--- PAS 2: crsfactura dupa IncarcaLiniiFacturaEditare ---' + CHR(13) + CHR(10), gcErrLog, 1) + lnGestionabile = 0 + lnCuPretv = 0 + lnCuCont = 0 + SELECT crsfactura + SCAN + STRTOFILE(' id_temp=' + TRANSFORM(id_temp) + ; + ' id_gestiune=' + IIF(ISNULL(id_gestiune), 'NULL', TRANSFORM(id_gestiune)) + ; + ' gestionabil=' + TRANSFORM(gestionabil) + ; + ' pret_achizitie=' + TRANSFORM(pret_achizitie) + ; + ' cont=[' + Cont + ']' + ; + ' pretv_orig=' + TRANSFORM(pretv_orig) + CHR(13) + CHR(10), gcErrLog, 1) + IF !EMPTY(Cont) + lnCuCont = lnCuCont + 1 + ENDIF + IF gestionabil = 1 + lnGestionabile = lnGestionabile + 1 + IF pretv_orig <> 0 + lnCuPretv = lnCuPretv + 1 + ENDIF + ENDIF + ENDSCAN + DO asserteaza WITH 'P2 documentul are cel putin o linie gestionabila', lnGestionabile > 0, TRANSFORM(lnGestionabile) + DO asserteaza WITH 'P2 crsfactura.pretv_orig e nenul pe liniile gestionabile', ; + lnCuPretv = lnGestionabile AND lnGestionabile > 0, TRANSFORM(lnCuPretv) + '/' + TRANSFORM(lnGestionabile) + DO asserteaza WITH 'P2 crsfactura.Cont e completat pe toate liniile care au CONT in sursa', ; + lnCuCont = lnSrcCuCont AND lnSrcCuCont > 0, TRANSFORM(lnCuCont) + '/' + TRANSFORM(lnSrcCuCont) + + *!* normalizare locala: fara virgule in sirurile din SQL, ca argumentul 22 sa fie extractibil + SELECT crsfactura + REPLACE ALL explicatie WITH 'probe-s12', serie WITH '', lot WITH '', opt_facturare WITH 0 IN crsfactura + GO TOP IN crsfactura + + DO RuleazaCuMock WITH 'PAS3' + + lnArgTotal = 0 + lnArgNenule = 0 + FOR lnArg = 1 TO GETWORDCOUNT(gcPretvSql, ';') + lnArgTotal = lnArgTotal + 1 + IF VAL(GETWORDNUM(gcPretvSql, lnArg, ';')) <> 0 + lnArgNenule = lnArgNenule + 1 + ENDIF + ENDFOR + DO asserteaza WITH 'P3 argumentul 22 (V_PRETV_ORIG) e nenul pe fiecare apel de articol', ; + lnArgTotal > 0 AND lnArgNenule = lnArgTotal, gcPretvSql + + lnCtTotal = 0 + lnCtNenule = 0 + FOR lnArg = 1 TO GETWORDCOUNT(gcContSql, ';') + lnCtTotal = lnCtTotal + 1 + IF !EMPTY(STRTRAN(GETWORDNUM(gcContSql, lnArg, ';'), CHR(39), '')) + lnCtNenule = lnCtNenule + 1 + ENDIF + ENDFOR + DO asserteaza WITH 'P3 argumentul 16 (V_CONT) e nevid pe fiecare apel de articol', ; + lnCtTotal > 0 AND lnCtNenule = lnCtTotal, gcContSql +ENDPROC + + +*============================================================================================== +* RuleazaCuMock: do_scrie_articole() cu goExecutor mockat; strange argumentul 22 al fiecarui apel +* pack_facturare.adauga_articol_factura in gcPretvSql, separat prin ';'. +*============================================================================================== +PROCEDURE RuleazaCuMock + LPARAMETERS tcPrefix + LOCAL loForm, loMock, loExecutorReal, llReturn + + loForm = CREATEOBJECT('frm_facturare_articole2') + + IF TYPE('plRegenerareEditare') <> 'U' + RELEASE plRegenerareEditare + ENDIF + + loExecutorReal = goExecutor + loMock = CREATEOBJECT('MockGoExecutorS12Stoc') + goExecutor = loMock + + llReturn = loForm.do_scrie_articole() + + goExecutor = loExecutorReal + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + + gcPretvSql = loMock.cPretv + gcContSql = loMock.cCont + + STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ; + ' apeluri_articol=' + TRANSFORM(loMock.nApeluriArticol) + ; + ' argumente_22=[' + gcPretvSql + ']' + ; + ' argumente_16=[' + gcContSql + ']' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(tcPrefix + ' --- ultimul SQL de articol ---' + CHR(13) + CHR(10) + ; + TRANSFORM(loMock.cSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1) + + RELEASE loForm +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE probe_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) + IF TYPE('gnHandle') = 'N' AND gnHandle > 0 + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + ENDIF + gnFail = gnFail + 1 + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC + + +*============================================================================================== +DEFINE CLASS MockGoExecutorS12Stoc AS Custom + cPretv = '' + cCont = '' + cSqlUltim = '' + nApeluri = 0 + nApeluriArticol = 0 + cEroare = '' + + FUNCTION oExecute(tcSql) + LOCAL lcSql, lnPoz, lcRest + THIS.nApeluri = THIS.nApeluri + 1 + IF VARTYPE(m.tcSql) <> 'C' + RETURN 1 + ENDIF + lcSql = m.tcSql + lnPoz = AT('adauga_articol_factura(', lcSql) + DO WHILE lnPoz > 0 + THIS.nApeluriArticol = THIS.nApeluriArticol + 1 + lcRest = SUBSTR(lcSql, lnPoz + LEN('adauga_articol_factura(')) + THIS.cPretv = THIS.cPretv + ALLTRIM(GETWORDNUM(lcRest, 22, ',')) + ';' + THIS.cCont = THIS.cCont + ALLTRIM(GETWORDNUM(lcRest, 16, ',')) + ';' + THIS.cSqlUltim = m.tcSql + lcSql = lcRest + lnPoz = AT('adauga_articol_factura(', lcSql) + ENDDO + RETURN 1 + ENDFUNC + + FUNCTION oExecuta(tcSql, tcCursor) + THIS.nApeluri = THIS.nApeluri + 1 + IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor) + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + CREATE CURSOR (m.tcCursor) (xdummy I) + ENDIF + RETURN .T. + ENDFUNC + + FUNCTION oPrelucrareEroare() + RETURN 'MockGoExecutorS12Stoc: ' + THIS.cEroare + ENDFUNC +ENDDEFINE diff --git a/utile/Teste/editare_factura/probe_s12_sucursala.prg b/utile/Teste/editare_factura/probe_s12_sucursala.prg new file mode 100644 index 0000000..b18b3f4 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s12_sucursala.prg @@ -0,0 +1,316 @@ +* probe_s12_sucursala.prg +* Masoara starea de sesiune Oracle care intra in predicatul de stoc al lui +* pack_facturare.descarca_gestiune (PACK_FACTURARE BODY:7329-7341): nid_sucursala, nan, nluna. +* O variabila de pachet PL/SQL traieste per sesiune, deci se citeste pe ACELASI gnHandle pe care +* ruleaza fluxul, printr-un bloc anonim care intoarce valorile in textul unui +* raise_application_error (fara DML, fara DDL). +* +* tnIdV - documentul reemis (631 sau 580) +* tnForceAn - perioada activa fortata (ca in test_s9_8_flux: 2014 1) +* tnForceLuna +* tnSuc - daca <> 0, forteaza gnIdSucursala inainte de do_scrie_factura (experimentul +* decisiv: daca FACT-008 dispare, esecul era artefact de harness). ATENTIE: pe +* valoarea corecta fluxul SCRIE in Oracle. +LPARAMETERS tnIdV, tnForceAn, tnForceLuna, tnSuc + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail +PUBLIC poDate, poSnapshotEditare + +IF VARTYPE(tnIdV) = 'C' + tnIdV = VAL(tnIdV) +ENDIF +IF EMPTY(tnIdV) + tnIdV = 631 +ENDIF +IF VARTYPE(tnSuc) = 'C' + tnSuc = VAL(tnSuc) +ENDIF +IF EMPTY(tnSuc) + tnSuc = 0 +ENDIF + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s12_sucursala_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' doc=' + TRANSFORM(tnIdV) + ; + ' suc_fortata=' + TRANSFORM(tnSuc) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO probe_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', VAL(TRANSFORM(tnForceAn)), VAL(TRANSFORM(tnForceLuna)) +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +LOCAL lcPathVechi, lcPathNou +lcPathVechi = SET("PATH") +lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi +SET PATH TO &lcPathNou + +PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnPass = 0 +gnFail = 0 + +DO Masoara WITH tnIdV, tnSuc + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +*============================================================================================== +PROCEDURE Masoara + LPARAMETERS tnIdV, tnSuc + LOCAL loForm, lnDiscRon, lnDiscVal, lnRuta, llRez, lnIdVMaxInainte, lnNr, lnIdVNou + + STRTOFILE('--- STAREA VFP DUPA INIT ---' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(' gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(' gnIdFirma = ' + TRANSFORM(gnIdFirma) + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(' gnIdSucursala: tip=' + VARTYPE(gnIdSucursala) + ' isnull=' + TRANSFORM(ISNULL(gnIdSucursala)) + ; + ' valoare=' + TRANSFORM(NVL(gnIdSucursala, -777)) + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(' gcCondSucursala = <' + TRANSFORM(gcCondSucursala) + '>' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(' goFirma.id_firma = ' + TRANSFORM(NVL(goFirma.Id_Firma, -777)) + ; + ' goFirma.id_mama = ' + TRANSFORM(NVL(goFirma.id_mama, -777)) + ; + ' goFirma.firma = ' + TRANSFORM(NVL(goFirma.firma, '')) + CHR(13) + CHR(10), gcErrLog, 1) + + *!* ce intoarce interogarea de firma din harness, in ordinea reala a randurilor + IF USED('c_fsuc') + USE IN c_fsuc + ENDIF + IF goExecutor.oExecuta("select id_firma, firma, id_mama from syn_v_nom_firme where schema = ?gcS", 'c_fsuc') + STRTOFILE('--- syn_v_nom_firme pentru schema (ordinea reala) ---' + CHR(13) + CHR(10), gcErrLog, 1) + SELECT c_fsuc + SCAN + STRTOFILE(' rand ' + TRANSFORM(RECNO()) + ': id_firma=' + TRANSFORM(id_firma) + ; + ' id_mama=' + TRANSFORM(NVL(id_mama, -777)) + ' firma=' + ALLTRIM(NVL(firma, '')) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN c_fsuc + ENDIF + + *!* id_sucursala al documentului tintit + STRTOFILE(' VANZARI.id_sucursala doc ' + TRANSFORM(tnIdV) + ' = ' + ; + TRANSFORM(Val1("select nvl(id_sucursala,-777) as v from vanzari where id_vanzare = " + TRANSFORM(tnIdV))) + ; + CHR(13) + CHR(10), gcErrLog, 1) + + DO CitestePachet WITH 'INAINTE de flux' + + IF tnSuc <> 0 + gnIdSucursala = tnSuc + STRTOFILE('*** gnIdSucursala FORTAT la ' + TRANSFORM(gnIdSucursala) + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + + lnIdVMaxInainte = Val1("select nvl(max(id_vanzare),0) as v from vanzari") + + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal) + IF VARTYPE(poDate) <> 'O' + STRTOFILE('EROARE: antetul nu s-a incarcat' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + STRTOFILE(' poDate.dataireg = ' + TRANSFORM(poDate.dataireg) + ; + ' poDate.dataact = ' + TRANSFORM(poDate.dataact) + ; + ' poDate.tip = ' + TRANSFORM(poDate.Tip) + CHR(13) + CHR(10), gcErrLog, 1) + + IncarcaLiniiFacturaEditare(poDate, tnIdV) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + STRTOFILE('EROARE: liniile nu s-au incarcat' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + + update_jtva_coloane("JV", "jtva_coloane_temp") + update_saft_taxtable() + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + loForm = CREATEOBJECT('frm_facturare_articole2') + loForm.ndiscfactron = lnDiscRon + loForm.ndiscfactval = lnDiscVal + loForm.do_calculeaza_totaluri() + poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ; + tnIdV, Val1("select nvl(id_fact,0) as v from vanzari where id_vanzare = " + TRANSFORM(tnIdV)), ; + Val1("select nvl(cod,0) as v from vanzari where id_vanzare = " + TRANSFORM(tnIdV)), gnAn, gnLuna) + IF VARTYPE(poSnapshotEditare) <> 'O' + STRTOFILE('EROARE: instantaneul nu s-a creat' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + + SELECT crsfactura + GO TOP + REPLACE cantitate WITH cantitate + 1 IN crsfactura + loForm.do_calculeaza_totaluri() + + lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura') + STRTOFILE(' ruta aleasa = ' + TRANSFORM(lnRuta) + CHR(13) + CHR(10), gcErrLog, 1) + + llRez = loForm.do_scrie_factura() + STRTOFILE(' do_scrie_factura() = ' + TRANSFORM(llRez) + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(' ultimul mesaj prin mock: <' + gcMockUltimMesaj + '>' + CHR(13) + CHR(10), gcErrLog, 1) + + DO CitestePachet WITH 'DUPA do_scrie_factura' + + lnNr = Val1("select count(*) as v from vanzari where sters = 0 and id_vanzare > " + TRANSFORM(lnIdVMaxInainte)) + lnIdVNou = Val1("select nvl(max(id_vanzare),0) as v from vanzari where sters = 0 and id_vanzare > " + TRANSFORM(lnIdVMaxInainte)) + STRTOFILE(' documente noi nesterse dupa apel = ' + TRANSFORM(lnNr) + ' id_vanzare nou = ' + TRANSFORM(lnIdVNou) + CHR(13) + CHR(10), gcErrLog, 1) + + DO ReplayPredicat WITH tnIdV + + RELEASE loForm +ENDPROC + + +*============================================================================================== +* ReplayPredicat: rejoaca ramura ELSE "din STOC" a lui descarca_gestiune (BODY:7328-7345) in +* ACEEASI sesiune, cu valorile reale trimise pentru prima linie a documentului, de doua ori: +* (a) cu pack_facturare.nid_sucursala asa cum e in sesiune, (b) cu 167 pus literal in locul ei. +* Singura diferenta intre cele doua rulari e sucursala. Doar SELECT, in bloc PL/SQL (variabilele +* de pachet nu se pot referi din SQL pur); rezultatul vine in textul unei erori. +*============================================================================================== +PROCEDURE ReplayPredicat + LPARAMETERS tnIdV + LOCAL lcArt, lcGest, lcPret, lcPretd, lcValutad, lcPretv, lcCante, lcUnde + + DO CASE + CASE tnIdV = 631 + lcArt = '315554536' + lcGest = '19' + lcPret = '100' + lcPretd = '0' + lcValutad = '0' + lcPretv = '200' + lcCante = '4' + CASE tnIdV = 580 + lcArt = '315554536' + lcGest = '4' + lcPret = '100' + lcPretd = '0' + lcValutad = '3' + lcPretv = '120.97' + lcCante = '2' + OTHERWISE + STRTOFILE(' ReplayPredicat: document necunoscut, sarit' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDCASE + + lcUnde = " from stoc a where " + lcCante + " <> 0 and nvl(a.id_sucursala,-99) = @SUC@" + ; + " and a.id_articol = " + lcArt + ; + " and a.id_gestiune = " + lcGest + ; + " and nvl(a.cont,'XXXX') = '371'" + ; + " and a.pret = " + lcPret + ; + " and a.pretd = " + lcPretd + ; + " and nvl(a.id_valuta,0) = decode(" + lcValutad + ", -99, 0, nvl(" + lcValutad + ",0))" + ; + " and a.pretv = " + lcPretv + ; + " and nvl(a.serie,'+_') = nvl(null,'+_')" + ; + " and a.luna = pack_facturare.nluna and a.an = pack_facturare.nan" + ; + " and a.cants + a.cant > a.cante" + ; + " and nvl(a.id_part_rez,0) = 0 and nvl(a.id_lucrare_rez,0) = 0" + + DO NumaraLoturi WITH 'REPLAY sucursala = cea din sesiune', ; + STRTRAN(lcUnde, '@SUC@', 'nvl(pack_facturare.nid_sucursala,-99)') + DO NumaraLoturi WITH 'REPLAY sucursala = 167 (literal)', ; + STRTRAN(lcUnde, '@SUC@', 'nvl(167,-99)') +ENDPROC + + +PROCEDURE NumaraLoturi + LPARAMETERS tcEticheta, tcUnde + LOCAL lcSql, lnR, laErr, lcVechi + lcVechi = SQLGETPROP(gnHandle, 'DispWarnings') + SQLSETPROP(gnHandle, 'DispWarnings', .F.) + + lcSql = "declare n number; begin select count(*) into n" + tcUnde + ; + "; raise_application_error(-20998, 'REPLAY n=<'||n||'>'); end;" + + DIMENSION laErr[1] + lnR = SQLEXEC(gnHandle, lcSql) + IF lnR < 0 + AERROR(laErr) + STRTOFILE(' [' + tcEticheta + '] ' + STRTRAN(STRTRAN(TRANSFORM(laErr[1,3]), CHR(13), ' '), CHR(10), ' ') + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + STRTOFILE(' [' + tcEticheta + '] NEASTEPTAT: fara eroare (r=' + TRANSFORM(lnR) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + + SQLSETPROP(gnHandle, 'DispWarnings', lcVechi) +ENDPROC + + +*============================================================================================== +* CitestePachet: citeste variabilele publice de pachet pe ACELASI handle, printr-un bloc anonim +* care le intoarce in textul erorii (nu scrie nimic). SQLEXEC nu declanseaza ON ERROR. +*============================================================================================== +PROCEDURE CitestePachet + LPARAMETERS tcMoment + LOCAL lcSql, lnR, laErr, lcVechi + lcVechi = SQLGETPROP(gnHandle, 'DispWarnings') + SQLSETPROP(gnHandle, 'DispWarnings', .F.) + + lcSql = "begin raise_application_error(-20999, 'PKVAR nid_sucursala=<'" + ; + "||nvl(to_char(pack_facturare.nid_sucursala),'NULL')||'> nan=<'" + ; + "||nvl(to_char(pack_facturare.nan),'NULL')||'> nluna=<'" + ; + "||nvl(to_char(pack_facturare.nluna),'NULL')||'>'); end;" + + DIMENSION laErr[1] + lnR = SQLEXEC(gnHandle, lcSql) + IF lnR < 0 + AERROR(laErr) + STRTOFILE(' [' + tcMoment + '] ' + STRTRAN(STRTRAN(TRANSFORM(laErr[1,3]), CHR(13), ' '), CHR(10), ' ') + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + STRTOFILE(' [' + tcMoment + '] NEASTEPTAT: blocul nu a intors eroare (r=' + TRANSFORM(lnR) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + + SQLSETPROP(gnHandle, 'DispWarnings', lcVechi) +ENDPROC + + +*============================================================================================== +FUNCTION Val1 + LPARAMETERS tcSql + LOCAL lnV + lnV = -1 + IF USED('c_val1') + USE IN c_val1 + ENDIF + IF goExecutor.oExecuta(tcSql, 'c_val1') + SELECT c_val1 + IF RECCOUNT('c_val1') >= 1 + GO TOP + lnV = NVL(v, -1) + ENDIF + USE IN c_val1 + ENDIF + RETURN lnV +ENDFUNC + + +*============================================================================================== +PROCEDURE probe_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) + IF TYPE('gnHandle') = 'N' AND gnHandle > 0 + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + ENDIF + STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s13_callshape.prg b/utile/Teste/editare_factura/probe_s13_callshape.prg new file mode 100644 index 0000000..ed2cb92 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s13_callshape.prg @@ -0,0 +1,99 @@ +* probe_s13_callshape.prg +* Forma apelului care cade: {call proc(...argumente..., ?@obiect.proprietate)} unde procedura are +* si un ultim parametru OUT REF CURSOR nedat in apel (legat automat de driver ca result set). +* Reproducem forma pe pack_facturare.cursor_avize (V_LISTAID IN, V_ID_UTIL IN, V_DISCOUNT OUT +* NUMBER, V_CURSOR OUT REF CURSOR) - aceeasi forma ca scrie_factura2, dar procedura NU scrie nimic +* (initializeaza_facturare seteaza doar variabile de pachet; cursorul se deschide pe lista goala). +* +* Trei variante, ca sa izolam ce declanseaza VFP 1872: +* 1) ?@ legat de o variabila PUBLIC simpla +* 2) ?@ legat de o proprietate de obiect (exact ca ?@poDate.nid_vanzare) +* 3) acelasi cursor, dar chemat fara {call} (control) + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, pnDisc, poX +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_callshape_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-CALLSHAPE' + CHR(13) + CHR(10), gcErrLog) + +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +pnDisc = 0 +poX = CREATEOBJECT('Empty') +ADDPROPERTY(poX, 'nid_vanzare', 0) + +DO Incearca WITH '1. {call cursor_avize(...,?@pnDisc)} - variabila PUBLIC', [{call pack_facturare.cursor_avize('',8,?@pnDisc)}], 'c_1' +DO Incearca WITH '2. {call cursor_avize(...,?@poX.nid_vanzare)} - proprietate de obiect', [{call pack_facturare.cursor_avize('',8,?@poX.nid_vanzare)}], 'c_2' +DO Incearca WITH '3. {call cursor_verificare} - fara parametru OUT scalar (control)', [{call pack_facturare.cursor_verificare}], 'c_3' + +*!* CONTROLUL care conteaza: aceeasi procedura (are OUT REF CURSOR), dar cu un argument care +*!* face Oracle sa arunce INAINTE de OPEN-ul cursorului. Daca VFP raporteaza 1872 in loc de +*!* eroarea Oracle, atunci "Too many columns." e MASCA unei erori Oracle, nu un defect de coloane. +DO Incearca WITH '4. {call cursor_avize} cu lista invalida - Oracle arunca inainte de OPEN', [{call pack_facturare.cursor_avize('abc',8,?@pnDisc)}], 'c_4' +DO Incearca WITH '5. {call cursor_avize} cu id_util inexistent', [{call pack_facturare.cursor_avize('',-987654,?@pnDisc)}], 'c_5' +DO Incearca WITH '6. begin ... end; care arunca (fara REF CURSOR) - control', [begin raise_application_error(-20000,'proba s13'); end;], 'c_6' +DO Incearca WITH '7. {call} pe procedura inexistenta', [{call pack_facturare.procedura_inexistenta_s13(1)}], 'c_7' + +*!* Argumentul 11 al lui scrie_factura2 e o EXPRESIE cu virgula in ea: +*!* to_date('20090518121908','YYYYMMDDHH24MISS'). Driverul ODBC construieste blocul anonim din +*!* lista de argumente (vezi testul 7: foloseste DBMS_DESCRIBE), deci virgula dinauntru poate fi +*!* citita ca separator si numarul de argumente iese gresit. +DO Incearca WITH '8. {call cursor_avize} cu expresie ce contine virgula ca argument', [{call pack_facturare.cursor_avize(to_char(sysdate,'YYYYMMDD'),8,?@pnDisc)}], 'c_8' +DO Incearca WITH '9. {call cursor_avize} cu NULL ca argument text', [{call pack_facturare.cursor_avize(NULL,8,?@pnDisc)}], 'c_9' +DO Incearca WITH '10. {call cursor_avize} cu to_date(...) ca argument', [{call pack_facturare.cursor_avize(to_char(to_date('20090518','YYYYMMDD'),'DD'),8,?@pnDisc)}], 'c_10' + +*!* Statement-ul EXACT care cade in flux, dar intr-o sesiune curata: VANZARI_DETALII_TEMP (tabela +*!* temporara de sesiune) e goala, deci procedura arunca FACT-004 la linia 4974 INAINTE sa deschida +*!* REF CURSOR-ul si inainte de orice scriere reala. Daca VFP raporteaza eroarea Oracle -> 1872 +*!* apare doar pe drumul de succes. Daca raporteaza tot 1872 -> e defect de descriere, nu de date. +DO Incearca WITH '11. statement-ul REAL al doc 360, sesiune curata (temp goale)', ; + [{call pack_facturare.scrie_factura2(300.00,57.00,0.00,'',0,NULL,NULL,NULL,NULL,0,to_date('20090518121908','YYYYMMDDHH24MISS'),NULL,'',1,0,?@poX.nid_vanzare)}], 'c_11' + +STRTOFILE('pnDisc dupa apel = ' + TRANSFORM(pnDisc) + ' poX.nid_vanzare = ' + TRANSFORM(poX.nid_vanzare) + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE Incearca + LPARAMETERS tcEticheta, tcSql, tcCursor + LOCAL lnRet, loEx, laE[1], lnI, lnLatime, laF[1], lnF, lcAlte, lnJ + + IF USED(tcCursor) + USE IN (tcCursor) + ENDIF + STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10) + ' SQL=[' + tcSql + ']' + CHR(13) + CHR(10), gcErrLog, 1) + + TRY + lnRet = SQLExec(gnHandle, tcSql, tcCursor) + STRTOFILE(' ret=' + TRANSFORM(lnRet) + CHR(13) + CHR(10), gcErrLog, 1) + IF lnRet >= 0 + FOR lnJ = 0 TO 3 + lcAlte = tcCursor + IIF(lnJ = 0, '', TRANSFORM(lnJ)) + IF USED(lcAlte) + lnF = AFIELDS(laF, lcAlte) + lnLatime = 0 + FOR lnI = 1 TO lnF + lnLatime = lnLatime + laF[lnI, 3] + ENDFOR + STRTOFILE(' cursor [' + lcAlte + ']: ' + TRANSFORM(lnF) + ' coloane, latime rand = ' + ; + TRANSFORM(lnLatime) + ' octeti, ' + TRANSFORM(RECCOUNT(lcAlte)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) + USE IN (lcAlte) + ENDIF + ENDFOR + ELSE + IF AERROR(laE) > 0 + STRTOFILE(' AERROR: ' + TRANSFORM(laE[1]) + ' | ' + TRANSFORM(laE[2]) + ' | ' + TRANSFORM(laE[3]) + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + ENDIF + CATCH TO loEx + STRTOFILE(' EXCEPTIE: ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + ENDTRY +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s13_errtext.prg b/utile/Teste/editare_factura/probe_s13_errtext.prg new file mode 100644 index 0000000..602f290 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s13_errtext.prg @@ -0,0 +1,27 @@ +* probe_s13_errtext.prg +* Ce numar de eroare VFP are textul "Too many columns." - masurat, nu ghicit. +* Comanda ERROR n genereaza eroarea VFP cu numarul n; TRY/CATCH ii citeste textul. +* Nu atinge Oracle, nu atinge nimic pe disc in afara propriului log. + +SET SAFETY OFF +SET TALK OFF + +LOCAL lcLog, lnI, loEx, lcMsg +lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_errtext_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-ERRTEXT' + CHR(13) + CHR(10), lcLog) + +FOR lnI = 1 TO 2500 + lcMsg = '' + TRY + ERROR lnI + CATCH TO loEx + lcMsg = loEx.Message + ENDTRY + IF 'COLUMN' $ UPPER(lcMsg) OR 'TOO MANY' $ UPPER(lcMsg) + STRTOFILE(TRANSFORM(lnI) + ' -> [' + lcMsg + ']' + CHR(13) + CHR(10), lcLog, 1) + ENDIF +ENDFOR + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), lcLog, 1) +QUIT diff --git a/utile/Teste/editare_factura/probe_s13_errtext2.prg b/utile/Teste/editare_factura/probe_s13_errtext2.prg new file mode 100644 index 0000000..53780d2 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s13_errtext2.prg @@ -0,0 +1,33 @@ +* probe_s13_errtext2.prg +* Continuarea sweep-ului de numere de eroare VFP (prima rulare s-a oprit in jurul lui 224). +* Scrie un heartbeat cu numarul curent, ca sa se vada exact unde moare. + +SET SAFETY OFF +SET TALK OFF + +LOCAL lcLog, lcBeat, lnI, loEx, lcMsg, lcBuf +lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_errtext2_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +lcBeat = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_errtext2_beat.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-ERRTEXT2' + CHR(13) + CHR(10), lcLog) + +lcBuf = '' +FOR lnI = 224 TO 2500 + STRTOFILE(TRANSFORM(lnI), lcBeat) + lcMsg = '' + TRY + ERROR lnI + CATCH TO loEx + lcMsg = loEx.Message + ENDTRY + IF 'COLUMN' $ UPPER(lcMsg) OR 'TOO MANY' $ UPPER(lcMsg) + lcBuf = lcBuf + TRANSFORM(lnI) + ' -> [' + lcMsg + ']' + CHR(13) + CHR(10) + ENDIF + IF MOD(lnI, 100) = 0 + STRTOFILE('... ajuns la ' + TRANSFORM(lnI) + CHR(13) + CHR(10) + lcBuf, lcLog, 1) + lcBuf = '' + ENDIF +ENDFOR + +STRTOFILE(lcBuf + 'end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), lcLog, 1) +QUIT diff --git a/utile/Teste/editare_factura/probe_s13_errtext2_beat.txt b/utile/Teste/editare_factura/probe_s13_errtext2_beat.txt new file mode 100644 index 0000000..a42ee12 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s13_errtext2_beat.txt @@ -0,0 +1 @@ +1116 \ No newline at end of file diff --git a/utile/Teste/editare_factura/probe_s13_poison.prg b/utile/Teste/editare_factura/probe_s13_poison.prg new file mode 100644 index 0000000..65b421e --- /dev/null +++ b/utile/Teste/editare_factura/probe_s13_poison.prg @@ -0,0 +1,91 @@ +* probe_s13_poison.prg +* In flux, statement-ul care cade ({call scrie_factura2 ... REF CURSOR OUT}) vine imediat dupa doua +* statemente cu 52 de parametri legati fiecare (INSERT INTO ACT_TEMP ... 52 x "?"), din mecanismul +* de stergere/regenerare S9. Aceeasi procedura, chemata din bloc anonim cu REF CURSOR-ul intr-o +* variabila locala PL/SQL, se executa fara probleme - deci esecul e strict la materializarea +* result set-ului in VFP. +* +* Ipoteza probata aici: un statement cu multi parametri legati executat inainte strica descrierea +* result set-ului pentru urmatorul apel cu REF CURSOR OUT. Totul read-only (select din dual + +* proceduri care doar deschid cursoare). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, p1 +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_poison_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-POISON' + CHR(13) + CHR(10), gcErrLog) + +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +p1 = 1 + +DO Incearca WITH 'T1 baseline: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t1' +DO Incearca WITH 'T2 statement cu 52 parametri legati', CuParametri(52), 'c_t2' +DO Incearca WITH 'T3 dupa 52 parametri: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t3' +DO Incearca WITH 'T4 dupa 52 parametri: select normal', [select * from vact where 1 = 2], 'c_t4' +DO Incearca WITH 'T5 din nou: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t5' +DO Incearca WITH 'T6 statement cu 5 parametri legati', CuParametri(5), 'c_t6' +DO Incearca WITH 'T7 dupa 5 parametri: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t7' + +*!* in flux, conexiunea e in tranzactie MANUALA (Transactions = 2) si a facut deja DML +STRTOFILE('--- trec pe tranzactie manuala (Transactions = 2) ---' + CHR(13) + CHR(10), gcErrLog, 1) +SQLSetProp(gnHandle, 'Transactions', 2) +DO Incearca WITH 'T8 in tranzactie manuala: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t8' +DO Incearca WITH 'T9 DML pe tabela temporara de sesiune', [insert into act_temp (id_act, luna, an, sters) values (?p1, 4, 2009, 0)], 'c_t9' +DO Incearca WITH 'T10 dupa DML, in tranzactie: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t10' +DO Incearca WITH 'T11 dupa DML, in tranzactie: select normal', [select * from vact where 1 = 2], 'c_t11' +SQLROLLBACK(gnHandle) +SQLSetProp(gnHandle, 'Transactions', 1) +STRTOFILE('--- rollback facut, inapoi pe Transactions = 1 ---' + CHR(13) + CHR(10), gcErrLog, 1) +DO Incearca WITH 'T12 dupa rollback: {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_t12' + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +FUNCTION CuParametri + LPARAMETERS tnN + LOCAL lcS, lnI + lcS = 'select 1 as v from dual where ' + FOR lnI = 1 TO tnN + lcS = lcS + '?p1 is not null and ' + ENDFOR + RETURN lcS + '1 = 1' +ENDFUNC + + +PROCEDURE Incearca + LPARAMETERS tcEticheta, tcSql, tcCursor + LOCAL lnRet, loEx, laE[1], lnI, lnLatime, laF[1], lnF + + IF USED(tcCursor) + USE IN (tcCursor) + ENDIF + TRY + lnRet = SQLExec(gnHandle, tcSql, tcCursor) + IF lnRet >= 0 AND USED(tcCursor) + lnF = AFIELDS(laF, tcCursor) + lnLatime = 0 + FOR lnI = 1 TO lnF + lnLatime = lnLatime + laF[lnI, 3] + ENDFOR + STRTOFILE(tcEticheta + ' -> ret=' + TRANSFORM(lnRet) + ' ' + TRANSFORM(lnF) + ' coloane, latime ' + ; + TRANSFORM(lnLatime) + ', ' + TRANSFORM(RECCOUNT(tcCursor)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) + USE IN (tcCursor) + ELSE + STRTOFILE(tcEticheta + ' -> ret=' + TRANSFORM(lnRet) + CHR(13) + CHR(10), gcErrLog, 1) + IF lnRet < 0 AND AERROR(laE) > 0 + STRTOFILE(' AERROR: ' + TRANSFORM(laE[1]) + ' | ' + TRANSFORM(laE[2]) + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + ENDIF + CATCH TO loEx + STRTOFILE(tcEticheta + ' -> EXCEPTIE ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' [' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + ENDTRY +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s13_refcursor.prg b/utile/Teste/editare_factura/probe_s13_refcursor.prg new file mode 100644 index 0000000..be43f97 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s13_refcursor.prg @@ -0,0 +1,86 @@ +* probe_s13_refcursor.prg +* Ce anume nu poate materializa VFP la statement-ul {call pack_facturare.scrie_factura2(...)}: +* rezultatul lui este REF CURSOR-ul OUT V_CURSOR_VERIFICARE (parametrul 17, nedat in apel, legat +* automat de driverul ODBC ca result set). Doua ramuri posibile in pachet (liniile 4877/4881, +* 5113/5126 din PACKAGE BODY): +* a) pack_facturare.cursor_verificare(...) - SELECT cu ~75 coloane si 17 JOIN-uri pe ACT_TEMP +* b) SELECT * FROM ACT_TEMP WHERE 1 = 2 - doar coloanele lui ACT_TEMP +* Probam ambele forme direct prin SQLExec, in aceeasi sesiune, FARA nicio scriere: +* cursor_verificare are un singur parametru, OUT REF CURSOR, deci nu modifica nimic. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_refcursor_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-REFCURSOR' + CHR(13) + CHR(10), gcErrLog) + +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +DO Incearca WITH 'A. select direct din ACT_TEMP', [select * from act_temp where 1 = 2], 'c_a' +DO Incearca WITH 'B. {call} cu REF CURSOR OUT (cursor_verificare)', [{call pack_facturare.cursor_verificare}], 'c_b' +DO Incearca WITH 'C. select cu 300 de coloane din dual', ConstruiesteSelectLarg(300), 'c_c' +DO Incearca WITH 'D. select cu 254 de coloane din dual', ConstruiesteSelectLarg(254), 'c_d' +DO Incearca WITH 'E. select cu 255 de coloane din dual', ConstruiesteSelectLarg(255), 'c_e' +DO Incearca WITH 'F. select cu 256 de coloane din dual', ConstruiesteSelectLarg(256), 'c_f' + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +*============================================================================================== +FUNCTION ConstruiesteSelectLarg + LPARAMETERS tnN + LOCAL lcS, lnI + lcS = 'select ' + FOR lnI = 1 TO tnN + lcS = lcS + IIF(lnI > 1, ',', '') + '1 as c' + TRANSFORM(lnI) + ENDFOR + RETURN lcS + ' from dual' +ENDFUNC + + +PROCEDURE Incearca + LPARAMETERS tcEticheta, tcSql, tcCursor + LOCAL lnRet, loEx, laE[1], lnI, lnLatime, laF[1], lnF + + IF USED(tcCursor) + USE IN (tcCursor) + ENDIF + + STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10) + ; + ' SQL(len=' + TRANSFORM(LEN(tcSql)) + ')=[' + LEFT(tcSql, 400) + IIF(LEN(tcSql) > 400, '...', '') + ']' + CHR(13) + CHR(10), gcErrLog, 1) + + lnRet = -999 + TRY + lnRet = SQLExec(gnHandle, tcSql, tcCursor) + STRTOFILE(' ret=' + TRANSFORM(lnRet) + CHR(13) + CHR(10), gcErrLog, 1) + IF lnRet < 0 + IF AERROR(laE) > 0 + STRTOFILE(' AERROR: ' + TRANSFORM(laE[1]) + ' | ' + TRANSFORM(laE[2]) + ' | ' + TRANSFORM(laE[3]) + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + ELSE + IF USED(tcCursor) + lnF = AFIELDS(laF, tcCursor) + lnLatime = 0 + FOR lnI = 1 TO lnF + lnLatime = lnLatime + laF[lnI, 3] + ENDFOR + STRTOFILE(' cursor creat: ' + TRANSFORM(lnF) + ' coloane, latime rand = ' + TRANSFORM(lnLatime) + ' octeti, ' + ; + TRANSFORM(RECCOUNT(tcCursor)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) + USE IN (tcCursor) + ELSE + STRTOFILE(' (niciun cursor creat)' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + ENDIF + CATCH TO loEx + STRTOFILE(' EXCEPTIE: ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + ENDTRY +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s13_toomanycolumns.prg b/utile/Teste/editare_factura/probe_s13_toomanycolumns.prg new file mode 100644 index 0000000..703c9ac --- /dev/null +++ b/utile/Teste/editare_factura/probe_s13_toomanycolumns.prg @@ -0,0 +1,407 @@ +* probe_s13_toomanycolumns.prg +* Diagnostic pentru "Too many columns." pe documentul 360 (CONTRACT-B, rularea 6 din +* test_s9_8_flux.prg, perioada fortata 2009/4). Repeta EXACT scenariul rularii 6, dar cu +* goExecutor inlocuit de o SUBCLASA a lui oexecutor care logheaza fiecare statement inainte de +* executie si prinde exceptia exact la statement-ul care cade (numar de eroare + mesaj + procedura +* + linie), apoi intoarce -1 in loc sa o propage - ca fluxul sa cada pe ramura normala de eroare +* (do_inchide_tranzactie(2) = ROLLBACK), nu pe CATCH-ul din do_scrie_factura. +* +* Nu modifica niciun fisier de productie. Nu face COMMIT. La final verifica cascada de 6 randuri +* a documentului 360 (VANZARI, VANZARI_DETALII, DOCUMENTE, ACT x2, CTR_RATE_FACTURI). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail +PUBLIC poDate, poSnapshotEditare, goFormReemitere + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_toomanycolumns_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-TMC doc=360 perioada=2009/4' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +LOCAL lcPathVechi, lcPathNou +lcPathVechi = SET("PATH") +lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi +SET PATH TO &lcPathNou + +PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnPass = 0 +gnFail = 0 + +STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) + +DO Probeaza + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +*============================================================================================== +PROCEDURE Probeaza + LOCAL loForm, lnDiscRon, lnDiscVal, lnIdV, lnRuta, llRez, loSpy, loReal + lnIdV = 360 + + DO bat WITH 'intrat in Probeaza' + DO StareCascada WITH 'INAINTE' + DO bat WITH 'dupa StareCascada INAINTE' + + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal) + IF VARTYPE(poDate) <> 'O' + STRTOFILE('EROARE: antetul nu s-a incarcat' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + IncarcaLiniiFacturaEditare(poDate, lnIdV) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + STRTOFILE('EROARE: liniile nu s-au incarcat' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + + DO DescrieCursorFactura + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + loForm = CREATEOBJECT('frm_facturare_articole2') + loForm.ndiscfactron = lnDiscRon + loForm.ndiscfactval = lnDiscVal + loForm.do_calculeaza_totaluri() + poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ; + lnIdV, Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), ; + Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), gnAn, gnLuna) + IF VARTYPE(poSnapshotEditare) <> 'O' + STRTOFILE('EROARE: instantaneul nu s-a creat' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + + SELECT crsfactura + GO TOP + REPLACE cantitate WITH cantitate + 1 IN crsfactura + loForm.do_calculeaza_totaluri() + + lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura') + STRTOFILE('ruta aleasa = ' + TRANSFORM(lnRuta) + CHR(13) + CHR(10), gcErrLog, 1) + + loReal = goExecutor + loSpy = CREATEOBJECT('SpyS13') + loSpy.nHandle = gnHandle + goExecutor = loSpy + + STRTOFILE('--- INCEPE do_scrie_factura, statementele urmeaza in ordine ---' + CHR(13) + CHR(10), gcErrLog, 1) + llRez = loForm.do_scrie_factura() + STRTOFILE('--- do_scrie_factura a intors ' + TRANSFORM(llRez) + ' ---' + CHR(13) + CHR(10), gcErrLog, 1) + + goExecutor = loReal + STRTOFILE('statemente capturate: ' + TRANSFORM(loSpy.nIdx) + ' esecuri: ' + TRANSFORM(loSpy.nEsecuri) + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) + + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + + DO StareCascada WITH 'DUPA' +ENDPROC + + +*============================================================================================== +* DescrieCursorFactura: structura si continutul crsfactura (campurile NULL + opt_facturare, care +* decide branch-ul adauga_rata_factura vs adauga_articol_factura). +*============================================================================================== +PROCEDURE DescrieCursorFactura + LOCAL laF[1], lnF, lnI, lcNule + lnF = AFIELDS(laF, 'crsfactura') + STRTOFILE('--- crsfactura: ' + TRANSFORM(RECCOUNT('crsfactura')) + ' randuri, ' + TRANSFORM(lnF) + ' campuri ---' + CHR(13) + CHR(10), gcErrLog, 1) + SELECT crsfactura + SCAN + lcNule = '' + FOR lnI = 1 TO lnF + IF ISNULL(EVALUATE('crsfactura.' + laF[lnI,1])) + lcNule = lcNule + laF[lnI,1] + ' ' + ENDIF + ENDFOR + STRTOFILE(' rand ' + TRANSFORM(RECNO()) + ': opt_facturare=' + TRANSFORM(crsfactura.opt_facturare) + ; + ' id_rata=' + TRANSFORM(NVL(crsfactura.id_rata,-1)) + ' denumire=[' + TRANSFORM(NVL(crsfactura.denumire,'')) + ']' + ; + ' NULL pe -> ' + IIF(EMPTY(lcNule), '(niciun camp)', lcNule) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + GO TOP IN crsfactura +ENDPROC + + +*============================================================================================== +PROCEDURE StareCascada + LPARAMETERS tcEticheta + LOCAL lnIdFact + lnIdFact = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = 360]) + STRTOFILE(tcEticheta + ' GLOBAL: max_id_vanzare=' + TRANSFORM(Val1([select nvl(max(id_vanzare),0) as v from vanzari])) + ; + ' count_vanzari=' + TRANSFORM(Val1([select count(*) as v from vanzari])) + ; + ' max_numar_act_SSS=' + TRANSFORM(Val1([select nvl(max(numar_act),0) as v from vanzari where serie_act = 'SSS'])) + ; + ' max_numar_act_serie360=' + TRANSFORM(Val1([select nvl(max(numar_act),0) as v from vanzari where nvl(serie_act,'@') = (select nvl(serie_act,'@') from vanzari where id_vanzare = 360)])) + ; + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(tcEticheta + ' CASCADA 360: vanzari.sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from vanzari where id_vanzare = 360])) + ; + ' id_fact=' + TRANSFORM(lnIdFact) + ; + ' vanzari_detalii_vii=' + TRANSFORM(Val1([select count(*) as v from vanzari_detalii where id_vanzare = 360 and sters = 0])) + ; + ' documente.sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from documente where id_doc = ] + TRANSFORM(lnIdFact))) + ; + ' act_vii=' + TRANSFORM(Val1([select count(*) as v from act where id_fact = ] + TRANSFORM(lnIdFact) + [ and sters = 0])) + ; + ' ctr_rate_facturi_vii=' + TRANSFORM(Val1([select count(*) as v from ctr_rate_facturi where id_fact = ] + TRANSFORM(lnIdFact) + [ and sters = 0])) + ; + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*============================================================================================== +*============================================================================================== +* MasoaraResultSets: ruleaza statement-ul care cade cu BatchMode = .F., ca sa vada result set-urile +* unul cate unul (cate coloane are fiecare), si logheaza integral AERROR() daca tot cade. +*============================================================================================== +PROCEDURE MasoaraResultSets + LPARAMETERS tcSql, tcCursor + LOCAL lnR, lnM, lnPas, loEx, laE[1], lnI, lnJ, lcN, laF[1], lnF, lnLat + + STRTOFILE(' *** masurare separata, BatchMode=.F. ***' + CHR(13) + CHR(10) + ; + ' BatchMode initial = ' + TRANSFORM(SQLGetProp(gnHandle, 'BatchMode')) + CHR(13) + CHR(10), gcErrLog, 1) + + *!* diagnostice in ACEEASI stare de sesiune, inainte de statement-ul care cade + PUBLIC pnDummyS13 + pnDummyS13 = 0 + LOCAL laM[1], lnM2 + lnM2 = AMEMBERS(laM, poDate, 0) + STRTOFILE(' poDate: ' + TRANSFORM(lnM2) + ' membri, TYPE(poDate.nid_vanzare)=' + TYPE('poDate.nid_vanzare') + ; + ' valoare=' + TRANSFORM(poDate.nid_vanzare) + CHR(13) + CHR(10), gcErrLog, 1) + DO Diag WITH 'D1 {call cursor_avize} cu ?@poDate.nid_vanzare', [{call pack_facturare.cursor_avize('',8,?@poDate.nid_vanzare)}], 'c_dg1' + DO Diag WITH 'D2 {call cursor_avize} cu ?@pnDummyS13 (PUBLIC)', [{call pack_facturare.cursor_avize('',8,?@pnDummyS13)}], 'c_dg2' + DO Diag WITH 'D3 select * from vact where 1 = 2', [select * from vact where 1 = 2], 'c_dg3' + DO Diag WITH 'D4 {call cursor_verificare}', [{call pack_facturare.cursor_verificare}], 'c_dg4' + + STRTOFILE(' USED(crsact) inainte de apel = ' + TRANSFORM(USED('crsact')) + CHR(13) + CHR(10), gcErrLog, 1) + DO LogCursoare WITH 'crsact', 'inainte de apel' + + *!* Acelasi apel, aceeasi stare de sesiune, dar prin bloc anonim cu REF CURSOR-ul intr-o + *!* variabila LOCALA PL/SQL - deci nu se mai intoarce niciun result set catre VFP. Daca asa + *!* trece, atunci esecul e strict la materializarea REF CURSOR-ului, nu la executia procedurii. + LOCAL lcArg, lnP1, lcBloc + lnP1 = AT('(', tcSql) + lcArg = SUBSTR(tcSql, lnP1 + 1, RAT(')', tcSql) - lnP1 - 1) + lcArg = STRTRAN(lcArg, '?@poDate.nid_vanzare', '?@pnDummyS13') + lcBloc = 'begin declare c pack_facturare.cursor_facturare; begin pack_facturare.scrie_factura2(' + ; + lcArg + ',c); end; end;' + DO Diag WITH 'D5 acelasi apel, REF CURSOR in variabila locala PL/SQL', lcBloc, 'c_real' + STRTOFILE(' pnDummyS13 dupa D5 = ' + TRANSFORM(pnDummyS13) + ' ISNULL=' + TRANSFORM(ISNULL(pnDummyS13)) + CHR(13) + CHR(10), gcErrLog, 1) + *!* ce ramura a luat scrie_factura2 la linia 5112: verifica_note_contabile(1) > 0 -> cursor_verificare + DO Diag WITH 'D6 verifica_note_contabile(1) dupa D5', [select pack_contafin.verifica_note_contabile(1) as v from dual], 'c_ver' + IF USED('c_ver') + USE IN c_ver + ENDIF + IF SQLExec(gnHandle, [select pack_contafin.verifica_note_contabile(1) as v from dual], 'c_ver') >= 0 AND USED('c_ver') + SELECT c_ver + GO TOP + STRTOFILE(' verifica_note_contabile(1) = ' + TRANSFORM(NVL(c_ver.v, -1)) + CHR(13) + CHR(10), gcErrLog, 1) + USE IN c_ver + ENDIF + DO Diag WITH 'D7 {call cursor_verificare} dupa D5', [{call pack_facturare.cursor_verificare}], 'c_dg7' + + SQLSetProp(gnHandle, 'BatchMode', .F.) + lnPas = 0 + TRY + lnR = SQLExec(gnHandle, tcSql, tcCursor) + STRTOFILE(' SQLExec ret=' + TRANSFORM(lnR) + CHR(13) + CHR(10), gcErrLog, 1) + DO LogCursoare WITH tcCursor, 'dupa SQLExec' + DO WHILE lnPas < 10 + lnPas = lnPas + 1 + lnM = SQLMoreResults(gnHandle, tcCursor) + STRTOFILE(' SQLMoreResults #' + TRANSFORM(lnPas) + ' ret=' + TRANSFORM(lnM) + CHR(13) + CHR(10), gcErrLog, 1) + DO LogCursoare WITH tcCursor, 'dupa SQLMoreResults #' + TRANSFORM(lnPas) + IF lnM <> 1 + EXIT + ENDIF + ENDDO + CATCH TO loEx + STRTOFILE(' EXCEPTIE la masurare (pas ' + TRANSFORM(lnPas) + '): ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ; + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + lnI = AERROR(laE) + IF lnI > 0 + FOR lnJ = 1 TO ALEN(laE, 2) + STRTOFILE(' AERROR[1,' + TRANSFORM(lnJ) + '] = ' + TRANSFORM(laE[1, lnJ]) + CHR(13) + CHR(10), gcErrLog, 1) + ENDFOR + ENDIF + DO LogCursoare WITH tcCursor, 'dupa exceptie' + ENDTRY + SQLSetProp(gnHandle, 'BatchMode', .T.) +ENDPROC + + +PROCEDURE Diag + LPARAMETERS tcEticheta, tcSql, tcCursor + LOCAL lnR, loEx + IF USED(tcCursor) + USE IN (tcCursor) + ENDIF + TRY + lnR = SQLExec(gnHandle, tcSql, tcCursor) + STRTOFILE(' ' + tcEticheta + ' -> ret=' + TRANSFORM(lnR) + CHR(13) + CHR(10), gcErrLog, 1) + DO LogCursoare WITH tcCursor, tcEticheta + IF USED(tcCursor) + USE IN (tcCursor) + ENDIF + CATCH TO loEx + STRTOFILE(' ' + tcEticheta + ' -> EXCEPTIE ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' [' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + ENDTRY +ENDPROC + + +PROCEDURE LogCursoare + LPARAMETERS tcCursor, tcMoment + LOCAL lnJ, lcN, laF[1], lnF, lnI, lnLat + FOR lnJ = 0 TO 4 + lcN = tcCursor + IIF(lnJ = 0, '', TRANSFORM(lnJ)) + IF USED(lcN) + lnF = AFIELDS(laF, lcN) + lnLat = 0 + FOR lnI = 1 TO lnF + lnLat = lnLat + laF[lnI, 3] + ENDFOR + STRTOFILE(' [' + tcMoment + '] cursor ' + lcN + ': ' + TRANSFORM(lnF) + ' coloane, latime ' + ; + TRANSFORM(lnLat) + ', ' + TRANSFORM(RECCOUNT(lcN)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + ENDFOR +ENDPROC + + +PROCEDURE bat + LPARAMETERS tcPas + STRTOFILE('BAT ' + TTOC(DATETIME()) + ' ' + m.tcPas + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +FUNCTION Val1 + LPARAMETERS tcSql + LOCAL lnRet + lnRet = -1 + DO bat WITH 'Val1 intra: ' + m.tcSql + IF USED('v_val97') + USE IN v_val97 + ENDIF + IF goExecutor.oExecuta(tcSql, 'v_val97') + SELECT v_val97 + IF RECCOUNT('v_val97') > 0 + GO TOP + lnRet = NVL(v_val97.v, -1) + ENDIF + USE IN v_val97 + ENDIF + DO bat WITH 'Val1 iese: ' + TRANSFORM(lnRet) + RETURN lnRet +ENDFUNC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE NEPRINSA ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) + IF TYPE('gnHandle') = 'N' AND gnHandle > 0 + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + ENDIF + STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC + + +*============================================================================================== +* SpyS13: subclasa a lui oexecutor. Logheaza fiecare statement INAINTE de executie, il executa +* prin DODEFAULT (comportament identic cu al clasei de baza, acelasi PCOUNT), si daca SQLExec +* arunca o exceptie o logheaza integral (ErrorNo/Message/Procedure/LineNo) si intoarce -1 in loc +* sa o propage - fluxul cade atunci pe ramura normala de eroare, care face ROLLBACK. +*============================================================================================== +DEFINE CLASS SpyS13 AS oexecutor + nIdx = 0 + nEsecuri = 0 + + PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect) + LOCAL lnI, lnRet, loEx, lcS, lcC, lnPc + THIS.nIdx = THIS.nIdx + 1 + lnI = THIS.nIdx + lnPc = PCOUNT() + lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '') + lcC = IIF(VARTYPE(m.tcCursor) = 'C', m.tcCursor, '') + + STRTOFILE('#' + TRANSFORM(lnI) + ' pcount=' + TRANSFORM(lnPc) + ' cursor=[' + lcC + ']' + ; + ' vartype=' + VARTYPE(m.tcSql) + ' len=' + TRANSFORM(LEN(lcS)) + ; + ' semne_intrebare=' + TRANSFORM(OCCURS('?', lcS)) + CHR(13) + CHR(10) + ; + ' SQL=[' + lcS + ']' + CHR(13) + CHR(10), gcErrLog, 1) + + IF 'scrie_factura2' $ lcS + DO MasoaraResultSets WITH lcS, lcC + THIS.nEsecuri = THIS.nEsecuri + 1 + THIS.cEroare = 'SpyS13: statement masurat separat, nu se mai executa' + RETURN -1 + ENDIF + + lnRet = -1 + TRY + DO CASE + CASE lnPc <= 1 + lnRet = DODEFAULT(m.tcSql) + CASE lnPc = 2 + lnRet = DODEFAULT(m.tcSql, m.tcCursor) + CASE lnPc = 3 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress) + CASE lnPc = 4 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress) + CASE lnPc = 5 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle) + CASE lnPc = 6 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError) + CASE lnPc = 7 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError) + OTHERWISE + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect) + ENDCASE + STRTOFILE(' -> ret=' + TRANSFORM(lnRet) + IIF(lnRet < 0, ' EROARE=[' + THIS.cEroare + ']', '') + CHR(13) + CHR(10), gcErrLog, 1) + CATCH TO loEx + THIS.nEsecuri = THIS.nEsecuri + 1 + STRTOFILE(' -> EXCEPTIE VFP la statement #' + TRANSFORM(lnI) + ; + ': ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ; + ' Message=[' + TRANSFORM(loEx.Message) + ']' + ; + ' Details=[' + TRANSFORM(loEx.Details) + ']' + ; + ' Procedure=' + TRANSFORM(loEx.Procedure) + ; + ' LineNo=' + TRANSFORM(loEx.Lineno) + ; + ' LineContents=[' + TRANSFORM(loEx.LineContents) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + lnRet = -1 + THIS.cEroare = 'SpyS13: ' + TRANSFORM(loEx.Message) + ENDTRY + + RETURN lnRet + ENDPROC + + FUNCTION oPrelucrareEroare + RETURN 'SpyS13: ' + TRANSFORM(THIS.cEroare) + ENDFUNC +ENDDEFINE diff --git a/utile/Teste/editare_factura/probe_s13_vact.prg b/utile/Teste/editare_factura/probe_s13_vact.prg new file mode 100644 index 0000000..274a948 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s13_vact.prg @@ -0,0 +1,58 @@ +* probe_s13_vact.prg +* Ramura de succes a lui pack_facturare.scrie_factura2 (PACKAGE BODY, liniile 5126-5127) deschide +* REF CURSOR-ul OUT pe [select * from VACT where 1 = 2]. Verificam daca VFP poate materializa acel +* result set - si daca nu, cate coloane vede de fapt. Doar SELECT-uri, nicio scriere. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13_vact_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13-VACT' + CHR(13) + CHR(10), gcErrLog) + +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +DO Incearca WITH 'A. select * from vact where 1 = 2', [select * from vact where 1 = 2], 'c_a' +DO Incearca WITH 'B. select * from vact_tot where 1 = 2', [select * from vact_tot where 1 = 2], 'c_b' +DO Incearca WITH 'C. select * from vact (fara filtru, primul rand)', [select * from vact where rownum <= 1], 'c_c' +DO Incearca WITH 'D. select * from fact_vfacturi where 1 = 2', [select * from fact_vfacturi where 1 = 2], 'c_d' + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE Incearca + LPARAMETERS tcEticheta, tcSql, tcCursor + LOCAL lnRet, loEx, laE[1], lnI, lnLatime, laF[1], lnF + + IF USED(tcCursor) + USE IN (tcCursor) + ENDIF + STRTOFILE('--- ' + tcEticheta + ' ---' + CHR(13) + CHR(10), gcErrLog, 1) + + TRY + lnRet = SQLExec(gnHandle, tcSql, tcCursor) + STRTOFILE(' ret=' + TRANSFORM(lnRet) + CHR(13) + CHR(10), gcErrLog, 1) + IF lnRet >= 0 AND USED(tcCursor) + lnF = AFIELDS(laF, tcCursor) + lnLatime = 0 + FOR lnI = 1 TO lnF + lnLatime = lnLatime + laF[lnI, 3] + ENDFOR + STRTOFILE(' cursor creat: ' + TRANSFORM(lnF) + ' coloane, latime rand = ' + TRANSFORM(lnLatime) + ' octeti' + CHR(13) + CHR(10), gcErrLog, 1) + USE IN (tcCursor) + ENDIF + IF lnRet < 0 AND AERROR(laE) > 0 + STRTOFILE(' AERROR: ' + TRANSFORM(laE[1]) + ' | ' + TRANSFORM(laE[2]) + ' | ' + TRANSFORM(laE[3]) + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + CATCH TO loEx + STRTOFILE(' EXCEPTIE: ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + ENDTRY +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s13b_batchmode_direct.prg b/utile/Teste/editare_factura/probe_s13b_batchmode_direct.prg new file mode 100644 index 0000000..43092b7 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s13b_batchmode_direct.prg @@ -0,0 +1,301 @@ +* probe_s13b_batchmode_direct.prg +* Ultima verificare ceruta de docs/diagnostic_contract_too_many_columns.md (sectiunea Necunoscut): +* statement-ul #15 ({call pack_facturare.scrie_factura2(...)}, ofacturare.vc2:20307-20328) executat +* DIRECT dupa statement-ul #14, cu BatchMode ramas .T. (neschimbat) si FARA diagnosticele D1-D7 +* intercalate - spre deosebire de probe_s13_toomanycolumns.prg, care la #15 devia intai prin +* MasoaraResultSets (D1-D7, apoi comuta pe BatchMode=.F.). +* +* Nu modifica niciun fisier de productie. Nu face COMMIT. La final verifica cascada documentului +* 360 (VANZARI, VANZARI_DETALII, DOCUMENTE, ACT x2, CTR_RATE_FACTURI). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +PUBLIC poDate, poSnapshotEditare, goFormReemitere + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s13b_batchmode_direct_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' MARCA=S13B-DIRECT doc=360 perioada=2009/4' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2009, 4, 0 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +LOCAL lcPathVechi, lcPathNou +lcPathVechi = SET("PATH") +lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi +SET PATH TO &lcPathNou + +PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 + +STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) + +DO Probeaza + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +*============================================================================================== +PROCEDURE Probeaza + LOCAL loForm, lnDiscRon, lnDiscVal, lnIdV, lnRuta, llRez, loSpy, loReal + lnIdV = 360 + + DO StareCascada WITH 'INAINTE' + + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal) + IF VARTYPE(poDate) <> 'O' + STRTOFILE('EROARE: antetul nu s-a incarcat' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + IncarcaLiniiFacturaEditare(poDate, lnIdV) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + STRTOFILE('EROARE: liniile nu s-au incarcat' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + loForm = CREATEOBJECT('frm_facturare_articole2') + loForm.ndiscfactron = lnDiscRon + loForm.ndiscfactval = lnDiscVal + loForm.do_calculeaza_totaluri() + poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ; + lnIdV, Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), ; + Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)), gnAn, gnLuna) + IF VARTYPE(poSnapshotEditare) <> 'O' + STRTOFILE('EROARE: instantaneul nu s-a creat' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + + SELECT crsfactura + GO TOP + REPLACE cantitate WITH cantitate + 1 IN crsfactura + loForm.do_calculeaza_totaluri() + + lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura') + STRTOFILE('ruta aleasa = ' + TRANSFORM(lnRuta) + CHR(13) + CHR(10), gcErrLog, 1) + + loReal = goExecutor + loSpy = CREATEOBJECT('SpyS13Direct') + loSpy.nHandle = gnHandle + goExecutor = loSpy + + STRTOFILE('BatchMode inainte de do_scrie_factura = ' + TRANSFORM(SQLGetProp(gnHandle, 'BatchMode')) + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('--- INCEPE do_scrie_factura, statementele urmeaza in ordine ---' + CHR(13) + CHR(10), gcErrLog, 1) + llRez = loForm.do_scrie_factura() + STRTOFILE('--- do_scrie_factura a intors ' + TRANSFORM(llRez) + ' ---' + CHR(13) + CHR(10), gcErrLog, 1) + + goExecutor = loReal + STRTOFILE('statemente capturate: ' + TRANSFORM(loSpy.nIdx) + ' #15 interceptat=' + TRANSFORM(loSpy.lInterceptat15) + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) + + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + + DO StareCascada WITH 'DUPA' +ENDPROC + + +*============================================================================================== +PROCEDURE StareCascada + LPARAMETERS tcEticheta + LOCAL lnIdFact + lnIdFact = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = 360]) + STRTOFILE(tcEticheta + ' GLOBAL: max_id_vanzare=' + TRANSFORM(Val1([select nvl(max(id_vanzare),0) as v from vanzari])) + ; + ' count_vanzari=' + TRANSFORM(Val1([select count(*) as v from vanzari])) + ; + ' max_numar_act_SSS=' + TRANSFORM(Val1([select nvl(max(numar_act),0) as v from vanzari where serie_act = 'SSS'])) + ; + ' max_numar_act_serie360=' + TRANSFORM(Val1([select nvl(max(numar_act),0) as v from vanzari where nvl(serie_act,'@') = (select nvl(serie_act,'@') from vanzari where id_vanzare = 360)])) + ; + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(tcEticheta + ' CASCADA 360: vanzari.sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from vanzari where id_vanzare = 360])) + ; + ' id_fact=' + TRANSFORM(lnIdFact) + ; + ' vanzari_detalii_vii=' + TRANSFORM(Val1([select count(*) as v from vanzari_detalii where id_vanzare = 360 and sters = 0])) + ; + ' documente.sters=' + TRANSFORM(Val1([select nvl(sters,-9) as v from documente where id_doc = ] + TRANSFORM(lnIdFact))) + ; + ' act_vii=' + TRANSFORM(Val1([select count(*) as v from act where id_fact = ] + TRANSFORM(lnIdFact) + [ and sters = 0])) + ; + ' ctr_rate_facturi_vii=' + TRANSFORM(Val1([select count(*) as v from ctr_rate_facturi where id_fact = ] + TRANSFORM(lnIdFact) + [ and sters = 0])) + ; + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*============================================================================================== +* LogCursoareCumulativ: la BatchMode=.T., un singur SQLExec pe un statement cu mai multe result +* set-uri le materializeaza direct in tcCursor, tcCursor1, tcCursor2, ... (fara SQLMoreResults). +* Numara coloanele PE FIECARE si intoarce totalul cumulat - ipoteza de testat e ca VFP insumeaza +* coloanele tuturor cursoarelor batch-ului, nu doar pe ale celui mai lat. +*============================================================================================== +FUNCTION LogCursoareCumulativ + LPARAMETERS tcCursor, tcMoment + LOCAL lnJ, lcN, laF[1], lnF, lnTotalCampuri + lnTotalCampuri = 0 + FOR lnJ = 0 TO 8 + lcN = tcCursor + IIF(lnJ = 0, '', TRANSFORM(lnJ)) + IF USED(lcN) + lnF = AFIELDS(laF, lcN) + lnTotalCampuri = lnTotalCampuri + lnF + STRTOFILE(' [' + tcMoment + '] cursor ' + lcN + ': ' + TRANSFORM(lnF) + ' coloane, ' + ; + TRANSFORM(RECCOUNT(lcN)) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + ENDFOR + STRTOFILE(' [' + tcMoment + '] TOTAL CUMULAT coloane (toate sub-cursoarele batch-ului) = ' + ; + TRANSFORM(lnTotalCampuri) + CHR(13) + CHR(10), gcErrLog, 1) + RETURN lnTotalCampuri +ENDFUNC + + +PROCEDURE bat + LPARAMETERS tcPas + STRTOFILE('BAT ' + TTOC(DATETIME()) + ' ' + m.tcPas + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +FUNCTION Val1 + LPARAMETERS tcSql + LOCAL lnRet + lnRet = -1 + IF USED('v_val97b') + USE IN v_val97b + ENDIF + IF goExecutor.oExecuta(tcSql, 'v_val97b') + SELECT v_val97b + IF RECCOUNT('v_val97b') > 0 + GO TOP + lnRet = NVL(v_val97b.v, -1) + ENDIF + USE IN v_val97b + ENDIF + RETURN lnRet +ENDFUNC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE NEPRINSA ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) + IF TYPE('gnHandle') = 'N' AND gnHandle > 0 + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + ENDIF + STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC + + +*============================================================================================== +* SpyS13Direct: subclasa a lui oexecutor, identica cu SpyS13 (probe_s13_toomanycolumns.prg) pentru +* toate statementele - DODEFAULT, acelasi PCOUNT. Diferenta e DOAR la statement-ul #15 +* (continut = 'scrie_factura2'): aici NU devia prin diagnostice (D1-D7) si NU schimba BatchMode - +* face SQLExec() direct, cu BatchMode ramas asa cum e (implicit .T.), si prinde exceptia integral. +*============================================================================================== +DEFINE CLASS SpyS13Direct AS oexecutor + nIdx = 0 + lInterceptat15 = .F. + + PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect) + LOCAL lnI, lnRet, loEx, lcS, lcC, lnPc, lnR, laE[1], lnJ, lnTotalCol + THIS.nIdx = THIS.nIdx + 1 + lnI = THIS.nIdx + lnPc = PCOUNT() + lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '') + lcC = IIF(VARTYPE(m.tcCursor) = 'C', m.tcCursor, '') + + STRTOFILE('#' + TRANSFORM(lnI) + ' pcount=' + TRANSFORM(lnPc) + ' cursor=[' + lcC + ']' + ; + ' BatchMode=' + TRANSFORM(SQLGetProp(THIS.nHandle, 'BatchMode')) + CHR(13) + CHR(10) + ; + ' SQL=[' + lcS + ']' + CHR(13) + CHR(10), gcErrLog, 1) + + IF 'scrie_factura2' $ lcS + THIS.lInterceptat15 = .T. + STRTOFILE(' *** statement #15: SQLExec DIRECT, fara D1-D7, BatchMode neschimbat ***' + CHR(13) + CHR(10), gcErrLog, 1) + IF USED(lcC) + USE IN (lcC) + ENDIF + TRY + lnR = SQLExec(THIS.nHandle, m.tcSql, m.tcCursor) + STRTOFILE(' SQLExec ret=' + TRANSFORM(lnR) + CHR(13) + CHR(10), gcErrLog, 1) + IF lnR < 0 + STRTOFILE(' ret<0 FARA exceptie VFP - eroare SQL normala, nu 1872.' + CHR(13) + CHR(10), gcErrLog, 1) + IF AERROR(laE) > 0 + FOR lnJ = 1 TO ALEN(laE, 2) + STRTOFILE(' AERROR[1,' + TRANSFORM(lnJ) + '] = ' + TRANSFORM(laE[1, lnJ]) + CHR(13) + CHR(10), gcErrLog, 1) + ENDFOR + ENDIF + ENDIF + lnTotalCol = LogCursoareCumulativ(lcC, 'dupa SQLExec #15 direct') + STRTOFILE(' NU s-a reprodus 1872 - statement #15 a reusit direct (fara eroare 1872).' + CHR(13) + CHR(10), gcErrLog, 1) + CATCH TO loEx + STRTOFILE(' S-A REPRODUS: EXCEPTIE la statement #15 direct: ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ; + ' Message=[' + TRANSFORM(loEx.Message) + '] Procedure=' + TRANSFORM(loEx.Procedure) + ; + ' LineNo=' + TRANSFORM(loEx.Lineno) + CHR(13) + CHR(10), gcErrLog, 1) + IF AERROR(laE) > 0 + FOR lnJ = 1 TO ALEN(laE, 2) + STRTOFILE(' AERROR[1,' + TRANSFORM(lnJ) + '] = ' + TRANSFORM(laE[1, lnJ]) + CHR(13) + CHR(10), gcErrLog, 1) + ENDFOR + ENDIF + ENDTRY + THIS.cEroare = 'SpyS13Direct: statement #15 masurat direct' + RETURN -1 + ENDIF + + lnRet = -1 + TRY + DO CASE + CASE lnPc <= 1 + lnRet = DODEFAULT(m.tcSql) + CASE lnPc = 2 + lnRet = DODEFAULT(m.tcSql, m.tcCursor) + CASE lnPc = 3 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress) + CASE lnPc = 4 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress) + CASE lnPc = 5 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle) + CASE lnPc = 6 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError) + CASE lnPc = 7 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError) + OTHERWISE + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect) + ENDCASE + STRTOFILE(' -> ret=' + TRANSFORM(lnRet) + IIF(lnRet < 0, ' EROARE=[' + THIS.cEroare + ']', '') + CHR(13) + CHR(10), gcErrLog, 1) + CATCH TO loEx + STRTOFILE(' -> EXCEPTIE VFP la statement #' + TRANSFORM(lnI) + ; + ': ErrorNo=' + TRANSFORM(loEx.ErrorNo) + ' Message=[' + TRANSFORM(loEx.Message) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + lnRet = -1 + THIS.cEroare = 'SpyS13Direct: ' + TRANSFORM(loEx.Message) + ENDTRY + + RETURN lnRet + ENDPROC + + FUNCTION oPrelucrareEroare + RETURN 'SpyS13Direct: ' + TRANSFORM(THIS.cEroare) + ENDFUNC +ENDDEFINE diff --git a/utile/Teste/editare_factura/probe_s8p8_candidati.prg b/utile/Teste/editare_factura/probe_s8p8_candidati.prg new file mode 100644 index 0000000..c4f822b --- /dev/null +++ b/utile/Teste/editare_factura/probe_s8p8_candidati.prg @@ -0,0 +1,123 @@ +* probe_s8p8_candidati.prg +* READ-ONLY. Cauta in MARIUSM_AUTO candidati pentru test_s8_editare_incarcare.prg (pasul 8): +* A) document FARA delegat (id_delegat null/0), tip intre 1 si 4, luna curenta (gnAn/gnLuna) +* B) document de tip AVIZ SUBUNITATI (23) sau AVIZ RETUR SUBUNITATI (41) - singurele doua tipuri +* pe care Ct_clb_politici_preturi ramane prezent la editare (verificat pe cod, ofacturare.vc2 +* ~21580-21660), luna curenta +* Foloseste fact_vfacturi (acelasi view ca IncarcaAntetFacturaEditare), an/luna derivate din data_act. +* Nu scrie nimic - doar SELECT. + +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s8p8_candidati_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO ErrH WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +STRTOFILE('gnAn/gnLuna=' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) + +LOCAL lnSucces + +*!* --- A: document fara delegat, tip 1-4, luna curenta, nesters, ne-eproforma --- +lnSucces = goExecutor.oExecute(; + [select id_vanzare, tip, nvl(id_delegat,0) id_delegat, sters, eproforma, data_act from fact_vfacturi] + ; + [ where tip between 1 and 4 and sters=0 and nvl(eproforma,0)=0 and nvl(id_delegat,0)=0] + ; + [ and extract(year from data_act)*12+extract(month from data_act) = ] + TRANSFORM(gnAn*12+gnLuna) + ; + [ order by id_vanzare desc], 'v_faradeleg') +STRTOFILE('A) fara delegat: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_faradeleg'),RECCOUNT('v_faradeleg'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1) +IF USED('v_faradeleg') + SELECT v_faradeleg + SCAN + STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' sters=' + TRANSFORM(sters) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_faradeleg +ENDIF +goExecutor.oReset() + +*!* --- B: aviz subunitati (23) / retur subunitati (41), luna curenta, nesters, ne-eproforma --- +lnSucces = goExecutor.oExecute(; + [select id_vanzare, tip, nvl(id_delegat,0) id_delegat, sters, eproforma, data_act from fact_vfacturi] + ; + [ where tip in (23,41) and sters=0 and nvl(eproforma,0)=0] + ; + [ and extract(year from data_act)*12+extract(month from data_act) = ] + TRANSFORM(gnAn*12+gnLuna) + ; + [ order by id_vanzare desc], 'v_aviz') +STRTOFILE('B) aviz 23/41 luna curenta: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_aviz'),RECCOUNT('v_aviz'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1) +IF USED('v_aviz') + SELECT v_aviz + SCAN + STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_aviz +ENDIF +goExecutor.oReset() + +*!* --- B2: acelasi, fara restrictia de luna, ca sa vedem daca exista DELOC in schema --- +lnSucces = goExecutor.oExecute(; + [select id_vanzare, tip, sters, eproforma, data_act from fact_vfacturi] + ; + [ where tip in (23,41) and sters=0 and nvl(eproforma,0)=0 order by id_vanzare desc], 'v_aviz_all') +STRTOFILE('B2) aviz 23/41 ORICE luna: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_aviz_all'),RECCOUNT('v_aviz_all'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1) +IF USED('v_aviz_all') + SELECT v_aviz_all + SCAN + STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_aviz_all +ENDIF +goExecutor.oReset() + +*!* --- B3: orice tip de aviz posibil (21,22,23,24,25,26,28,30,41,42,47), orice luna - ca sa stim daca +*!* exista MACAR ceva aviz in schema, chiar daca nu pe 23/41 --- +lnSucces = goExecutor.oExecute(; + [select id_vanzare, tip, sters, eproforma, data_act from fact_vfacturi] + ; + [ where tip in (21,22,23,24,25,26,28,30,41,42,47) and sters=0 and nvl(eproforma,0)=0 order by id_vanzare desc], 'v_aviz_larg') +STRTOFILE('B3) orice tip aviz, orice luna: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_aviz_larg'),RECCOUNT('v_aviz_larg'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1) +IF USED('v_aviz_larg') + SELECT v_aviz_larg + SCAN + STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_aviz_larg +ENDIF +goExecutor.oReset() + +*!* --- C: sanitate - documentele 1113/1055/1048/1130/1071/1072 folosite deja, ce data au --- +lnSucces = goExecutor.oExecute(; + [select id_vanzare, tip, data_act from fact_vfacturi where id_vanzare in (1113,1055,1048,1130,1071,1072) order by id_vanzare], 'v_ref') +STRTOFILE('C) documente existente in suita (referinta data_act): lnSucces=' + TRANSFORM(lnSucces) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1) +IF USED('v_ref') + SELECT v_ref + SCAN + STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_ref +ENDIF +goExecutor.oReset() + +*!* --- D: fara delegat, ORICE tip valid (exclus 44,45,46,51 - garda do_editare_unificata), luna curenta --- +lnSucces = goExecutor.oExecute(; + [select id_vanzare, tip, nvl(id_delegat,0) id_delegat, sters, eproforma, data_act from fact_vfacturi] + ; + [ where tip not in (44,45,46,51) and sters=0 and nvl(eproforma,0)=0 and nvl(id_delegat,0)=0] + ; + [ and extract(year from data_act)*12+extract(month from data_act) = ] + TRANSFORM(gnAn*12+gnLuna) + ; + [ order by id_vanzare desc], 'v_faradeleg2') +STRTOFILE('D) fara delegat, orice tip valid, luna curenta: lnSucces=' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_faradeleg2'),RECCOUNT('v_faradeleg2'),-1)) + ' eroare=' + goExecutor.cEroare + CHR(13)+CHR(10), gcErrLog, 1) +IF USED('v_faradeleg2') + SELECT v_faradeleg2 + SCAN + STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' data_act=' + TTOC(data_act) + CHR(13)+CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_faradeleg2 +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE ErrH + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s8p8_garzi.prg b/utile/Teste/editare_factura/probe_s8p8_garzi.prg new file mode 100644 index 0000000..6831a4c --- /dev/null +++ b/utile/Teste/editare_factura/probe_s8p8_garzi.prg @@ -0,0 +1,82 @@ +* probe_s8p8_garzi.prg +* READ-ONLY. Verifica, pentru candidatii gasiti de probe_s8p8_candidati.prg, garzile REALE ale +* do_editare_unificata (ofacturare_comun.vc2:3890+), enumerate in docs\raport_s8_driver_determinist.md +* X3: nesters, ne-eproforma, tip valid (not in 44,45,46,51), luna documentului = luna curenta +* (gnAn/gnLuna), ReferinteDocumenteNota, EsteInEFactura, DocumentAreUrmasi, IncarcaAntetFacturaEditare. +* Nu scrie in Oracle - doar SELECT + apeluri read-only la functiile de garda. +* Candidati verificati: 1047 (fara delegat, tip=-12), 953 (aviz tip=23, mai 2022 - istoric). + +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s8p8_garzi_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO ErrH WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +STRTOFILE('gnAn/gnLuna=' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) + +DO VerificaGarzi WITH 1047, 'fara delegat, tip=-12 DEVIZE AUTO' +DO VerificaGarzi WITH 953, 'aviz tip=23, istoric mai 2022' +DO VerificaGarzi WITH 1110, 'aviz tip=22, august 2026 (Ct_clb_politici_preturi scos oricum)' + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE VerificaGarzi + LPARAMETERS tnIdVanzare, tcEticheta + LOCAL lnSucces, lnSters, llEProforma, lnTipDoc, pnAn, pnLuna, lnCod, lnIdFact + STRTOFILE(CHR(13)+CHR(10) + '=== ' + TRANSFORM(tnIdVanzare) + ' [' + tcEticheta + '] ===' + CHR(13)+CHR(10), gcErrLog, 1) + + IF USED('crsGarzi') + USE IN crsGarzi + ENDIF + lnSucces = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip from fact_vfacturi where id_vanzare=' + TRANSFORM(m.tnIdVanzare), 'crsGarzi') + goExecutor.oReset() + IF lnSucces < 0 OR !USED('crsGarzi') OR RECCOUNT('crsGarzi') <> 1 + STRTOFILE(' NU S-A GASIT documentul (lnSucces=' + TRANSFORM(lnSucces) + ')' + CHR(13)+CHR(10), gcErrLog, 1) + RETURN + ENDIF + SELECT crsGarzi + lnCod = cod + pnAn = YEAR(data_act) + pnLuna = MONTH(data_act) + lnSters = sters + lnIdFact = id_fact + llEProforma = (eproforma = 1) + lnTipDoc = tip + USE IN crsGarzi + + STRTOFILE(' sters=' + TRANSFORM(lnSters) + ' eproforma=' + TRANSFORM(llEProforma) + ' tip=' + TRANSFORM(lnTipDoc) + ' an/luna=' + TRANSFORM(pnAn) + '/' + TRANSFORM(pnLuna) + CHR(13)+CHR(10), gcErrLog, 1) + STRTOFILE(' gate2 nesters: ' + TRANSFORM(lnSters = 0) + CHR(13)+CHR(10), gcErrLog, 1) + STRTOFILE(' gate5 ne-eproforma: ' + TRANSFORM(!llEProforma) + CHR(13)+CHR(10), gcErrLog, 1) + STRTOFILE(' gate6 tip valid (not in 44,45,46,51): ' + TRANSFORM(!INLIST(lnTipDoc,44,45,46,51)) + CHR(13)+CHR(10), gcErrLog, 1) + STRTOFILE(' gate7 luna curenta (' + TRANSFORM(pnAn*12+pnLuna) + '=' + TRANSFORM(gnAn*12+gnLuna) + '): ' + TRANSFORM((pnAn*12+pnLuna) == (gnAn*12+gnLuna)) + CHR(13)+CHR(10), gcErrLog, 1) + + LOCAL llRef, llEFact, llUrm + llRef = ReferinteDocumenteNota(pnAn, pnLuna, lnCod) + STRTOFILE(' gate8 fara referinte (!ReferinteDocumenteNota): ' + TRANSFORM(!llRef) + CHR(13)+CHR(10), gcErrLog, 1) + llEFact = EsteInEFactura(lnIdFact) + STRTOFILE(' gate9 nu e in eFactura: ' + TRANSFORM(!llEFact) + CHR(13)+CHR(10), gcErrLog, 1) + llUrm = DocumentAreUrmasi(m.tnIdVanzare) + STRTOFILE(' gate10 fara urmasi: ' + TRANSFORM(!llUrm) + CHR(13)+CHR(10), gcErrLog, 1) + + LOCAL poDateT, lnDiscR, lnDiscV + poDateT = IncarcaAntetFacturaEditare(m.tnIdVanzare, @lnDiscR, @lnDiscV) + STRTOFILE(' gate11 IncarcaAntetFacturaEditare reuseste: ' + TRANSFORM(VARTYPE(poDateT) == 'O') + CHR(13)+CHR(10), gcErrLog, 1) + + LOCAL llToateTrec + llToateTrec = (lnSters=0) AND !llEProforma AND !INLIST(lnTipDoc,44,45,46,51) AND ((pnAn*12+pnLuna)==(gnAn*12+gnLuna)) ; + AND !llRef AND !llEFact AND !llUrm AND (VARTYPE(poDateT) == 'O') + STRTOFILE(' ==> TOATE GARZILE TREC (ar trebui sa se deschida): ' + TRANSFORM(llToateTrec) + CHR(13)+CHR(10), gcErrLog, 1) +ENDPROC + +PROCEDURE ErrH + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s9_4_coldoc.prg b/utile/Teste/editare_factura/probe_s9_4_coldoc.prg new file mode 100644 index 0000000..0e78dcf --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_4_coldoc.prg @@ -0,0 +1,33 @@ +* probe_s9_4_coldoc.prg - READ-ONLY: coloanele tabelei DOCUMENTE. +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_coldoc_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + QUIT +ENDIF + +LOCAL lnOk, lcL, lnI +IF goExecutor.oExecuta([select column_name, data_type from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ; + [and table_name = 'DOCUMENTE' order by column_id], 'v_c') + SELECT v_c + STRTOFILE('DOCUMENTE are ' + TRANSFORM(RECCOUNT('v_c')) + ' coloane:' + CHR(13) + CHR(10), gcErrLog, 1) + lcL = '' + SCAN + lcL = lcL + ALLTRIM(column_name) + '(' + ALLTRIM(data_type) + ') ' + ENDSCAN + STRTOFILE(lcL + CHR(13) + CHR(10), gcErrLog, 1) + USE IN v_c +ENDIF + +STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s9_4_coloane.prg b/utile/Teste/editare_factura/probe_s9_4_coloane.prg new file mode 100644 index 0000000..e00b95f --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_4_coloane.prg @@ -0,0 +1,43 @@ +* probe_s9_4_coloane.prg - READ-ONLY: coloanele tabelelor pe care le interogheaza test_s9_4. +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_coloane_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + QUIT +ENDIF + +DO Col WITH 'RUL' +DO Col WITH 'VANZARI_DETALII' +DO Col WITH 'VANZARI_CORESP' +DO Col WITH 'VANZARI' + +STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE Col + LPARAMETERS tcTabela + LOCAL lcL + IF USED('v_c') + USE IN v_c + ENDIF + IF goExecutor.oExecuta([select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ; + [and table_name = '] + tcTabela + [' order by column_id], 'v_c') + SELECT v_c + lcL = '' + SCAN + lcL = lcL + ALLTRIM(column_name) + ' ' + ENDSCAN + STRTOFILE('=== ' + tcTabela + ' (' + TRANSFORM(RECCOUNT('v_c')) + '): ' + lcL + CHR(13) + CHR(10) + CHR(13) + CHR(10), gcErrLog, 1) + USE IN v_c + ENDIF +ENDPROC + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s9_4_documente.prg b/utile/Teste/editare_factura/probe_s9_4_documente.prg new file mode 100644 index 0000000..3f5f1cd --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_4_documente.prg @@ -0,0 +1,66 @@ +* probe_s9_4_documente.prg - READ-ONLY: de ce atarna "select count(*) from documente where id_fact = ?" +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_documente_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE conectare' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +*!* sesiuni blocante inainte de orice altceva +DO Lista WITH 'sesiuni care blocheaza', ; + [select s.sid, s.status, s.osuser, s.machine, s.last_call_et, s.blocking_session, s.event ] + ; + [from v$session s where s.username = 'MARIUSM_AUTO' order by s.sid] + +DO Lista WITH 'lacate pe obiecte', ; + [select l.session_id, o.object_name, l.locked_mode from v$locked_object l, all_objects o ] + ; + [where l.object_id = o.object_id] + +DO Lista WITH 'cate randuri are DOCUMENTE (cu timeout implicit)', [select count(*) as nr from documente] + +DO Lista WITH 'indecsi pe DOCUMENTE', ; + [select index_name, column_name, column_position from all_ind_columns ] + ; + [where table_name = 'DOCUMENTE' and table_owner = 'MARIUSM_AUTO' order by index_name, column_position] + +DO Lista WITH 'DOCUMENTE - ce fel de obiect e', ; + [select owner, object_type from all_objects where object_name = 'DOCUMENTE'] + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE Lista + LPARAMETERS tcTitlu, tcSql + LOCAL lnOk, lnI, lcL, ltT + ltT = DATETIME() + STRTOFILE('--> pornesc: ' + tcTitlu + ' ' + TTOC(ltT) + CHR(13) + CHR(10), gcErrLog, 1) + IF USED('v_dg') + USE IN v_dg + ENDIF + lnOk = goExecutor.oExecuta(tcSql, 'v_dg') + IF !lnOk + STRTOFILE(' EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + SELECT v_dg + STRTOFILE(' ' + TRANSFORM(RECCOUNT('v_dg')) + ' randuri in ' + ; + TRANSFORM(DATETIME() - ltT) + ' sec' + CHR(13) + CHR(10), gcErrLog, 1) + SCAN WHILE RECNO() <= 15 + lcL = '' + FOR lnI = 1 TO FCOUNT('v_dg') + lcL = lcL + ALLTRIM(FIELD(lnI, 'v_dg')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_dg')))) + ' ' + ENDFOR + STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_dg +ENDPROC + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s9_4_fdoc.prg b/utile/Teste/editare_factura/probe_s9_4_fdoc.prg new file mode 100644 index 0000000..904a95c --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_4_fdoc.prg @@ -0,0 +1,62 @@ +* probe_s9_4_fdoc.prg - READ-ONLY: id_fdoc e uniform pe randurile vact_tot ale unui document? +* Extractia din StergeDocumentFacturare ia primul rand (GO top, order by id_act), nu max(). +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_fdoc_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + QUIT +ENDIF + +*!* randurile documentului vechi 1071 (cod 1141096), in ordinea pe care o vede actactan +DO Lista WITH 'vact_tot cod 1141096 (doc vechi 1071), order by id_act - primul rand e cel citit', ; + [select id_act, id_fdoc, id_set, dataireg from ] + gcs + [.vact_tot ] + ; + [where an = 2026 and luna = 8 and cod = 1141096 order by id_act] + +DO Lista WITH 'vact_tot pentru documentul nou 1138', ; + [select a.id_act, a.id_fdoc, a.dataireg from ] + gcs + [.vact_tot a, vanzari v ] + ; + [where v.id_vanzare = 1138 and a.cod = v.cod and a.sters = 0 order by a.id_act] + +*!* cat de des e id_fdoc neuniform in interiorul unui document +DO Lista WITH 'documente cu id_fdoc NEUNIFORM pe perioada activa', ; + [select count(*) as documente_neuniforme from (] + ; + [select cod from ] + gcs + [.vact_tot where sters = 0 and an = 2026 and luna = 8 ] + ; + [group by cod having count(distinct id_fdoc) > 1)] + +DO Lista WITH 'total documente distincte in vact_tot pe perioada activa', ; + [select count(distinct cod) as total from ] + gcs + [.vact_tot where sters = 0 and an = 2026 and luna = 8] + +STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE Lista + LPARAMETERS tcTitlu, tcSql + LOCAL lnOk, lnI, lcL + IF USED('v_q') + USE IN v_q + ENDIF + lnOk = goExecutor.oExecuta(tcSql, 'v_q') + IF !lnOk + STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + SELECT v_q + STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_q')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) + SCAN WHILE RECNO() <= 20 + lcL = '' + FOR lnI = 1 TO FCOUNT('v_q') + lcL = lcL + ALLTRIM(FIELD(lnI, 'v_q')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_q')))) + ' ' + ENDFOR + STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_q +ENDPROC + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s9_4_fidelitate.prg b/utile/Teste/editare_factura/probe_s9_4_fidelitate.prg new file mode 100644 index 0000000..5fb3e43 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_4_fidelitate.prg @@ -0,0 +1,70 @@ +* probe_s9_4_fidelitate.prg - READ-ONLY: ID_FDOC si DATAIREG sunt ajungibile din cursorul pe care +* piciorul de stergere il citeste deja (actactan = select * from vact_tot)? Si ce valori au? +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_fidelitate_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + QUIT +ENDIF +gnIdUtil = 8 + +*!* 1. coloanele view-ului din care se umple actactan +DO Lista WITH 'coloane VACT_TOT care ne intereseaza', ; + [select column_name, data_type from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ; + [and table_name = 'VACT_TOT' and column_name in ('ID_FDOC','DATAIREG','ID_SET','ID_FACT','ID_FACTD','COD','AN','LUNA') ] + ; + [order by column_name] + +*!* 2. exista ID_FDOC pe VANZARI? (alta sursa posibila pentru valoarea documentului vechi) +DO Lista WITH 'cate randuri vact_tot au id_fdoc nenul, pe perioada activa', ; + [select count(*) as total, sum(case when id_fdoc is null then 1 else 0 end) as nule, ] + ; + [sum(case when id_fdoc is not null then 1 else 0 end) as nenule ] + ; + [from ] + gcs + [.vact_tot where sters = 0 and an = 2026 and luna = 8] + +*!* 3. valorile reale pentru documentele de test (exact ce ar citi actactan) +DO Lista WITH 'vact_tot pentru codurile de test (1141095=doc 1070, 1140912=doc 1056)', ; + [select cod, id_set, id_fdoc, id_fact, dataireg from ] + gcs + [.vact_tot ] + ; + [where sters = 0 and an = 2026 and luna = 8 and cod in (1141095, 1140912) order by cod, id_act] + +*!* 4. cate randuri din vact_tot au dataireg diferita de data_act a documentului +DO Lista WITH 'dataireg vs data_act pe perioada activa (cate difera)', ; + [select count(*) as total, ] + ; + [sum(case when trunc(a.dataireg) = trunc(v.data_act) then 1 else 0 end) as egale, ] + ; + [sum(case when trunc(a.dataireg) <> trunc(v.data_act) then 1 else 0 end) as diferite ] + ; + [from ] + gcs + [.vact_tot a, vanzari v ] + ; + [where a.sters = 0 and a.an = 2026 and a.luna = 8 and v.sters = 0 and v.cod = a.cod] + +STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE Lista + LPARAMETERS tcTitlu, tcSql + LOCAL lnOk, lnI, lcL + IF USED('v_f') + USE IN v_f + ENDIF + lnOk = goExecutor.oExecuta(tcSql, 'v_f') + IF !lnOk + STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + SELECT v_f + STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_f')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) + SCAN WHILE RECNO() <= 20 + lcL = '' + FOR lnI = 1 TO FCOUNT('v_f') + lcL = lcL + ALLTRIM(FIELD(lnI, 'v_f')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_f')))) + ' ' + ENDFOR + STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_f +ENDPROC + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s9_4_hang.prg b/utile/Teste/editare_factura/probe_s9_4_hang.prg new file mode 100644 index 0000000..f1351f9 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_4_hang.prg @@ -0,0 +1,67 @@ +* probe_s9_4_hang.prg - READ-ONLY: reproduce secventa INAINTE din Rularea2 pe documentul 1056. +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog, gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_hang_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE conectare' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 + +LOCAL lnIdV, lnIdFact, lcSerie, lnNumar, lnDoc, lnOk +lnIdV = 1056 + +DO U WITH 'antet prin oExecuta' +IF goExecutor.oExecuta([select id_fact, serie_act, numar_act from vanzari where id_vanzare = ] + TRANSFORM(lnIdV), 'v_a') + SELECT v_a + GO TOP + lnIdFact = NVL(id_fact, 0) + lcSerie = ALLTRIM(NVL(serie_act, '')) + lnNumar = NVL(numar_act, 0) + USE IN v_a +ENDIF +DO U WITH 'id_fact=[' + TRANSFORM(lnIdFact) + '] tip=' + VARTYPE(lnIdFact) + ; + ' serie=[' + TRANSFORM(lcSerie) + '] numar=' + TRANSFORM(lnNumar) + +DO U WITH 'SQL construit: ' + [select count(*) as nr from documente where id_fact = ] + TRANSFORM(lnIdFact) + +DO U WITH 'varianta A: oExecuta pe documente' +lnOk = goExecutor.oExecuta([select count(*) as nr from documente where id_fact = ] + TRANSFORM(lnIdFact), 'v_d') +DO U WITH ' oExecuta a intors ' + TRANSFORM(lnOk) + ' eroare=[' + TRANSFORM(goExecutor.cEroare) + ']' +IF USED('v_d') + SELECT v_d + GO TOP + DO U WITH ' nr = ' + TRANSFORM(nr) + USE IN v_d +ENDIF + +DO U WITH 'varianta B: oSelecteaza2Value pe documente (suspectul)' +lnDoc = -1 +goExecutor.oSelecteaza2Value([select count(*) as nr from documente where id_fact = ] + TRANSFORM(lnIdFact), @lnDoc) +DO U WITH ' lnDoc = ' + TRANSFORM(lnDoc) + +DO U WITH 'ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE U + LPARAMETERS tcT + STRTOFILE(TTOC(DATETIME()) + ' ' + m.tcT + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s9_4_nota.prg b/utile/Teste/editare_factura/probe_s9_4_nota.prg new file mode 100644 index 0000000..1ca1058 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_4_nota.prg @@ -0,0 +1,59 @@ +* probe_s9_4_nota.prg - READ-ONLY: s-a creat o nota contabila NOUA la regenerarea doc 1070 -> 1137? +* ID_SET e comun pe perioada, deci identitatea notei e ID_DOC (PK-ul din DOCUMENTE). +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_nota_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + QUIT +ENDIF + +DO Lista WITH 'DOCUMENTE pentru SSS/594 (nota veche + nota noua)', ; + [select id_doc, id_set, sters, nract, serie_act, dataact, dataireg from documente ] + ; + [where nract = 594 and serie_act = 'SSS' order by id_doc] + +DO Lista WITH 'cate valori distincte de ID_SET exista pe perioada activa', ; + [select count(distinct id_set) as seturi, count(*) as randuri from ] + gcs + [.vact_tot ] + ; + [where sters = 0 and an = 2026 and luna = 8] + +DO Lista WITH 'documentul nou 1137 - id_fdoc si dataireg reale scrise', ; + [select a.cod, a.id_fdoc, a.dataireg, v.data_act from ] + gcs + [.vact_tot a, vanzari v ] + ; + [where v.id_vanzare = 1137 and a.cod = v.cod and a.sters = 0] + +DO Lista WITH 'documentul vechi 1070 - stare finala', ; + [select id_vanzare, cod, sters, id_fact from vanzari where id_vanzare in (1070, 1137) order by id_vanzare] + +STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE Lista + LPARAMETERS tcTitlu, tcSql + LOCAL lnOk, lnI, lcL + IF USED('v_n') + USE IN v_n + ENDIF + lnOk = goExecutor.oExecuta(tcSql, 'v_n') + IF !lnOk + STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + SELECT v_n + STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_n')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) + SCAN WHILE RECNO() <= 20 + lcL = '' + FOR lnI = 1 TO FCOUNT('v_n') + lcL = lcL + ALLTRIM(FIELD(lnI, 'v_n')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_n')))) + ' ' + ENDFOR + STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_n +ENDPROC + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s9_4_nuluri.prg b/utile/Teste/editare_factura/probe_s9_4_nuluri.prg new file mode 100644 index 0000000..901d673 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_4_nuluri.prg @@ -0,0 +1,87 @@ +* probe_s9_4_nuluri.prg - READ-ONLY: ce proprietati ale lui poDate raman NULL pe calea de editare +* si care dintre ele pica in expresia de construire a SQL-ului din do_scrie_articole. +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog, poDate +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_nuluri_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + QUIT +ENDIF +gnIdUtil = 8 +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +LOCAL lnR, lnV +poDate = IncarcaAntetFacturaEditare(1070, @lnR, @lnV) +IF VARTYPE(poDate) <> 'O' + STRTOFILE('nu s-a incarcat antetul' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +*!* exact proprietatile folosite in expresia SQL din do_scrie_articole +DO P WITH 'dataireg' +DO P WITH 'id_fdoc' +DO P WITH 'dataact' +DO P WITH 'datascad' +DO P WITH 'serie_act' +DO P WITH 'nract' +DO P WITH 'id_client' +DO P WITH 'id_lucrare' +DO P WITH 'id_sectie' +DO P WITH 'id_venchelt' +DO P WITH 'id_responsabil' +DO P WITH 'explicatia4' +DO P WITH 'listaid' +DO P WITH 'descriere' +DO P WITH 'tip' +DO P WITH 'id_set' +DO P WITH 'zi_curs' +DO P WITH 'id_valuta' +DO P WITH 'in_valuta' +DO P WITH 'tva_incasare' + +*!* care apel concret pica: Alltrim(Str(x)) pe fiecare proprietate numerica suspecta +DO T WITH 'id_fdoc' +DO T WITH 'id_valuta' +DO T WITH 'id_lucrare' +DO T WITH 'id_sectie' +DO T WITH 'id_set' +DO T WITH 'tva_incasare' +DO T WITH 'in_valuta' + +STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE P + LPARAMETERS tcProp + LOCAL lcT, lcV + lcT = TYPE('poDate.' + tcProp) + lcV = '?' + IF ISNULL(EVALUATE('poDate.' + tcProp)) + lcV = '.NULL.' + ELSE + lcV = TRANSFORM(EVALUATE('poDate.' + tcProp)) + ENDIF + STRTOFILE(PADR(tcProp, 18) + ' TYPE=' + lcT + ' valoare=' + lcV + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + +PROCEDURE T + LPARAMETERS tcProp + LOCAL lcRez + lcRez = '<<< A PICAT >>>' + TRY + lcRez = '[' + Alltrim(Str(EVALUATE('poDate.' + tcProp))) + ']' + CATCH TO loE + lcRez = '<<< EROARE ' + TRANSFORM(loE.ErrorNo) + ': ' + loE.Message + ' >>>' + ENDTRY + STRTOFILE('Alltrim(Str(poDate.' + PADR(tcProp, 16) + ')) -> ' + lcRez + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s9_4_parameters.prg b/utile/Teste/editare_factura/probe_s9_4_parameters.prg new file mode 100644 index 0000000..09cfa3f --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_4_parameters.prg @@ -0,0 +1,54 @@ +* probe_s9_4_parameters.prg +* READ-ONLY, fara Oracle: PARAMETERS() vs PCOUNT() vs VARTYPE() intr-o functie cu parametri +* optionali, dupa ce s-a executat un apel imbricat. Decide garda din hunk C (S9-4). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_parameters_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) + +LOCAL lnOut, llR +lnOut = 0 + +*!* cazul 1: apelant care TRANSMITE al 6-lea parametru prin referinta +llR = Tinta(1, 2, 3, 4, 5, @lnOut) +STRTOFILE('CU al 6-lea param: lnOut dupa apel = ' + TRANSFORM(lnOut) + CHR(13) + CHR(10), gcErrLog, 1) + +*!* cazul 2: apelant care NU il transmite +llR = Tinta(1, 2, 3, 4, 5) + +STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +FUNCTION Tinta + LPARAMETERS t1, t2, t3, t4, t5, t6 + LOCAL lnDummy + + STRTOFILE('--- apel Tinta ---' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(' INAINTE de apel imbricat: PARAMETERS()=' + TRANSFORM(PARAMETERS()) + ; + ' PCOUNT()=' + TRANSFORM(PCOUNT()) + ' VARTYPE(m.t6)=' + VARTYPE(m.t6) + CHR(13) + CHR(10), gcErrLog, 1) + + *!* apel imbricat cu 2 parametri - exact situatia din StergeDocumentFacturare (goExecutor, OSCRIE_IN_FISIERE) + lnDummy = Imbricat(10, 20) + + STRTOFILE(' DUPA apel imbricat cu 2 param: PARAMETERS()=' + TRANSFORM(PARAMETERS()) + ; + ' PCOUNT()=' + TRANSFORM(PCOUNT()) + ' VARTYPE(m.t6)=' + VARTYPE(m.t6) + CHR(13) + CHR(10), gcErrLog, 1) + + IF VARTYPE(m.t6) = 'N' + t6 = 4242 + STRTOFILE(' garda VARTYPE: a scris in t6' + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + STRTOFILE(' garda VARTYPE: NU a scris in t6' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + + RETURN .T. +ENDFUNC + + +FUNCTION Imbricat + LPARAMETERS a, b + RETURN a + b +ENDFUNC diff --git a/utile/Teste/editare_factura/probe_s9_4_recensamant.prg b/utile/Teste/editare_factura/probe_s9_4_recensamant.prg new file mode 100644 index 0000000..3751d42 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_4_recensamant.prg @@ -0,0 +1,141 @@ +* probe_s9_4_recensamant.prg +* READ-ONLY: recensamant de candidati eligibili pe paliere + disponibilitatea DATA_IREG. +* Nu scrie nimic in Oracle. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_recensamant_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +DO Ruleaza + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE Ruleaza + LOCAL lcExclusi, lcPer, lcSql, lnOk + lcExclusi = [1047,1048,1055,1113,1130] + STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + ; + ' gcs=' + gcs + CHR(13) + CHR(10), gcErrLog, 1) + + lcPer = [ and extract(year from v.data_act) = ] + TRANSFORM(gnAn) + ; + [ and extract(month from v.data_act) = ] + TRANSFORM(gnLuna) + + *!* --- palier 3 (cel mai larg): STERS=0 in perioada activa, fara niciun filtru de continut --- + DO Listeaza WITH 'P3a toate nesterse in perioada activa', ; + [select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + [ order by v.id_vanzare] + + DO Listeaza WITH 'P3b + randuri reale in vact_tot', ; + [select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + ; + [ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ; + [ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) order by v.id_vanzare] + + DO Listeaza WITH 'P3c + vact_tot SI vrul_tot', ; + [select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + ; + [ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ; + [ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + ; + [ and exists (select 1 from ] + gcs + [.vrul_tot r where r.sters = 0 and r.an = ] + TRANSFORM(gnAn) + ; + [ and r.luna = ] + TRANSFORM(gnLuna) + [ and r.cod = v.cod) order by v.id_vanzare] + + *!* --- paliere 1 si 2: peste P3c / P3b se aplica in VFP filtrul referinte + urmasi --- + DO Filtreaza WITH 'PALIER 1 (strict S9-3: vact+vrul, fara referinte/urmasi)', ; + [select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + ; + [ and v.id_vanzare not in (] + lcExclusi + [)] + ; + [ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ; + [ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + ; + [ and exists (select 1 from ] + gcs + [.vrul_tot r where r.sters = 0 and r.an = ] + TRANSFORM(gnAn) + ; + [ and r.luna = ] + TRANSFORM(gnLuna) + [ and r.cod = v.cod) order by v.id_vanzare] + + DO Filtreaza WITH 'PALIER 2 (fara cerinta vrul_tot)', ; + [select v.id_vanzare, v.cod, v.tip from vanzari v where v.sters = 0] + lcPer + ; + [ and v.id_vanzare not in (] + lcExclusi + [)] + ; + [ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ; + [ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) order by v.id_vanzare] + + *!* --- DATA_IREG: exista pe VANZARI / pe view-ul folosit de IncarcaAntetFacturaEditare? --- + DO Listeaza WITH 'COLOANE %IREG% in all_tab_columns', ; + [select owner, table_name, column_name, data_type from all_tab_columns ] + ; + [where column_name like '%IREG%' and table_name in ('VANZARI','FACT_VFACTURI','VACT_TOT') ] + ; + [order by owner, table_name, column_name] + + DO Listeaza WITH 'toate coloanele FACT_VFACTURI cu DATA in nume', ; + [select owner, table_name, column_name from all_tab_columns ] + ; + [where table_name = 'FACT_VFACTURI' and column_name like 'DATA%' order by owner, column_name] +ENDPROC + + +PROCEDURE Listeaza + LPARAMETERS tcTitlu, tcSql + LOCAL lnOk, lnI, lcLinie + IF USED('v_rec') + USE IN v_rec + ENDIF + lnOk = goExecutor.oExecuta(tcSql, 'v_rec') + IF !lnOk + STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + SELECT v_rec + STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_rec')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) + GO TOP + SCAN WHILE RECNO() <= 12 + lcLinie = '' + FOR lnI = 1 TO FCOUNT('v_rec') + lcLinie = lcLinie + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_rec')))) + ' | ' + ENDFOR + STRTOFILE(' ' + lcLinie + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_rec +ENDPROC + + +PROCEDURE Filtreaza + LPARAMETERS tcTitlu, tcSql + LOCAL lnOk, lnNr, lcLista, lnIdV, lnCod, lnTip + IF USED('v_rec2') + USE IN v_rec2 + ENDIF + lnOk = goExecutor.oExecuta(tcSql, 'v_rec2') + IF !lnOk + STRTOFILE('=== ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + lnNr = 0 + lcLista = '' + SELECT v_rec2 + SCAN + lnIdV = id_vanzare + lnCod = cod + lnTip = tip + IF !ReferinteDocumenteNota(gnAn, gnLuna, lnCod) AND !DocumentAreUrmasi(lnIdV) + lnNr = lnNr + 1 + IF lnNr <= 8 + lcLista = lcLista + TRANSFORM(lnIdV) + '/' + TRANSFORM(lnCod) + '/tip=' + TRANSFORM(lnTip) + ' ' + ENDIF + ENDIF + ENDSCAN + USE IN v_rec2 + STRTOFILE('=== ' + tcTitlu + ': ' + TRANSFORM(lnNr) + ' eligibili' + CHR(13) + CHR(10) + ; + ' ' + lcLista + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s9_4_stare.prg b/utile/Teste/editare_factura/probe_s9_4_stare.prg new file mode 100644 index 0000000..e82126a --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_4_stare.prg @@ -0,0 +1,51 @@ +* probe_s9_4_stare.prg - READ-ONLY: starea documentului 1051 si a eventualelor documente noi. +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_4_stare_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE conectare' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +DO Lista WITH 'doc 1051', [select id_vanzare, cod, tip, sters, id_fact, serie_act, numar_act, dataoras from vanzari where id_vanzare = 1051] +DO Lista WITH 'orice vanzare cu id_vanzare > 1140 (documente noi)', [select id_vanzare, cod, tip, sters, id_fact, numar_act from vanzari where id_vanzare > 1140 order by id_vanzare] +DO Lista WITH 'ultimele 8 vanzari dupa id', [select * from (select id_vanzare, cod, tip, sters, id_fact, numar_act, dataoras from vanzari order by id_vanzare desc) where rownum <= 8] +DO Lista WITH 'rul nesters pe cod 1140907', [select count(*) as nr from rul where sters = 0 and an = 2026 and luna = 8 and cod = 1140907] +DO Lista WITH 'vact_tot nesters pe cod 1140907', [select count(*) as nr from ] + gcs + [.vact_tot where sters = 0 and an = 2026 and luna = 8 and cod = 1140907] + +STRTOFILE('end' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE Lista + LPARAMETERS tcTitlu, tcSql + LOCAL lnOk, lnI, lcL + IF USED('v_st') + USE IN v_st + ENDIF + lnOk = goExecutor.oExecuta(tcSql, 'v_st') + IF !lnOk + STRTOFILE('--- ' + tcTitlu + ': EROARE ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + SELECT v_st + STRTOFILE('--- ' + tcTitlu + ': ' + TRANSFORM(RECCOUNT('v_st')) + ' randuri' + CHR(13) + CHR(10), gcErrLog, 1) + SCAN + lcL = '' + FOR lnI = 1 TO FCOUNT('v_st') + lcL = lcL + ALLTRIM(FIELD(lnI, 'v_st')) + '=' + ALLTRIM(TRANSFORM(EVALUATE(FIELD(lnI, 'v_st')))) + ' ' + ENDFOR + STRTOFILE(' ' + lcL + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_st +ENDPROC + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s9_5_atasamente.prg b/utile/Teste/editare_factura/probe_s9_5_atasamente.prg new file mode 100644 index 0000000..dbb51da --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_5_atasamente.prg @@ -0,0 +1,78 @@ +* probe_s9_5_atasamente.prg - READ-ONLY: structura ATASAMENTE_VANZARI, sursa view-ului +* VATASAMENTE_VANZARI, orice referinta din PL/SQL, si populatia din perioada activa. +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_5_atasamente_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul +PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +IF EMPTY(lcProcExistent) + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" +ELSE + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent +ENDIF + +DO Sectiune WITH 'F. constrangeri pe ATASAMENTE_VANZARI', ; + [select c.constraint_name || ' ' || c.constraint_type as l ] + ; + [from all_constraints c where c.owner = 'MARIUSM_AUTO' and c.table_name = 'ATASAMENTE_VANZARI'] + +DO Sectiune WITH 'G. populatia: total randuri / distincte id_vanzare', ; + [select 'total=' || count(*) || ' documente=' || count(distinct id_vanzare) as l from MARIUSM_AUTO.atasamente_vanzari] + +DO Sectiune WITH 'H. atasamente pe documentele perioadei active (top 20)', ; + [select 'id_vanzare=' || a.id_vanzare || ' nr=' || count(*) as l ] + ; + [from MARIUSM_AUTO.atasamente_vanzari a join MARIUSM_AUTO.vanzari v on v.id_vanzare = a.id_vanzare ] + ; + [where extract(year from v.data_act) = 2026 and extract(month from v.data_act) = 8 ] + ; + [group by a.id_vanzare order by a.id_vanzare] + +DO Sectiune WITH 'I. atasamente pe documentele produse de S9-4 (1137,1138,1139) si sursele lor', ; + [select 'id_vanzare=' || id_vanzare || ' nr=' || count(*) as l from MARIUSM_AUTO.atasamente_vanzari ] + ; + [where id_vanzare in (1070,1071,1072,1137,1138,1139,1051) group by id_vanzare order by id_vanzare] + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE Sectiune + LPARAMETERS tcTitlu, tcSql + LOCAL lcOut, lnN + STRTOFILE(CHR(13) + CHR(10) + '=== ' + tcTitlu + CHR(13) + CHR(10), gcErrLog, 1) + IF USED('v_s') + USE IN v_s + ENDIF + IF goExecutor.oExecuta(tcSql, 'v_s') + SELECT v_s + lnN = RECCOUNT('v_s') + IF lnN = 0 + STRTOFILE(' (zero randuri)' + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + lcOut = '' + SCAN + lcOut = lcOut + ' ' + ALLTRIM(NVL(v_s.l, '')) + CHR(13) + CHR(10) + ENDSCAN + STRTOFILE(lcOut, gcErrLog, 1) + ENDIF + USE IN v_s + ELSE + STRTOFILE(' ESEC interogare: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s9_5_plsql.prg b/utile/Teste/editare_factura/probe_s9_5_plsql.prg new file mode 100644 index 0000000..f5de1ae --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_5_plsql.prg @@ -0,0 +1,73 @@ +* probe_s9_5_plsql.prg - READ-ONLY: sursa PL/SQL din jurul referintelor la ATASAMENTE_VANZARI. +SET SAFETY OFF +SET TALK OFF +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_5_plsql_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +DO Sursa WITH 'PACK_CONTAFIN', 8250, 8345 +DO Sursa WITH 'PACK_FACTURARE', 12800, 12885 + +DO Randuri WITH 'populatia ATASAMENTE_VANZARI, pe coloane cheie', ; + [select 'id_at_vanz=' || id_at_vanz || ' id_vanzare=' || nvl(to_char(id_vanzare),'NULL') || ] + ; + [' cod=' || nvl(to_char(cod),'NULL') || ' tip=' || nvl(to_char(tip),'NULL') || ' sters=' || sters || ] + ; + [' lung=' || nvl(to_char(dbms_lob.getlength(document)),'NULL') as l ] + ; + [from MARIUSM_AUTO.atasamente_vanzari order by id_at_vanz] + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + +PROCEDURE Sursa + LPARAMETERS tcNume, tnDe, tnPana + LOCAL lcOut + STRTOFILE(CHR(13) + CHR(10) + '=== ' + tcNume + ' ' + TRANSFORM(tnDe) + '-' + TRANSFORM(tnPana) + CHR(13) + CHR(10), gcErrLog, 1) + IF USED('v_s') + USE IN v_s + ENDIF + IF goExecutor.oExecuta([select line, rtrim(text) as t from all_source where owner = 'MARIUSM_AUTO' ] + ; + [and name = '] + tcNume + [' and type = 'PACKAGE BODY' and line between ] + ; + TRANSFORM(tnDe) + [ and ] + TRANSFORM(tnPana) + [ order by line], 'v_s') + lcOut = '' + SELECT v_s + SCAN + lcOut = lcOut + PADL(TRANSFORM(v_s.line), 6) + ': ' + CHRTRAN(ALLTRIM(NVL(v_s.t, '')), CHR(10) + CHR(13), '') + CHR(13) + CHR(10) + ENDSCAN + STRTOFILE(lcOut, gcErrLog, 1) + USE IN v_s + ELSE + STRTOFILE(' ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + +PROCEDURE Randuri + LPARAMETERS tcTitlu, tcSql + LOCAL lcOut + STRTOFILE(CHR(13) + CHR(10) + '=== ' + tcTitlu + CHR(13) + CHR(10), gcErrLog, 1) + IF USED('v_r') + USE IN v_r + ENDIF + IF goExecutor.oExecuta(tcSql, 'v_r') + lcOut = '' + SELECT v_r + SCAN + lcOut = lcOut + ' ' + ALLTRIM(NVL(v_r.l, '')) + CHR(13) + CHR(10) + ENDSCAN + STRTOFILE(IIF(EMPTY(lcOut), ' (zero randuri)' + CHR(13) + CHR(10), lcOut), gcErrLog, 1) + USE IN v_r + ELSE + STRTOFILE(' ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/probe_s9_aviz.prg b/utile/Teste/editare_factura/probe_s9_aviz.prg new file mode 100644 index 0000000..d859144 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_aviz.prg @@ -0,0 +1,58 @@ +* probe_s9_aviz.prg +* Repeta doar cautarea candidatului aviz din probe_s9_candidati.prg, cu diagnostic de eroare Oracle +* (coloana gresita suspectata: id_vanzare_sursa in loc de id_vanzare_aviz pe VANZARI_CORESP). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_aviz_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +LOCAL lcSql, lnSucces + +lcSql = [select v.id_vanzare, v.tip, v.cod from vanzari v where v.sters=0 and v.tip=4 ] + ; + [and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ; + [ and v.eproforma=0 and v.id_vanzare in (select id_vanzare_fact from vanzari_coresp where tip=1 and sters=0) ] + ; + [and rownum <= 5] +lnSucces = goExecutor.oExecute(lcSql, 'v_cand_aviz') +STRTOFILE('aviz(fara luna): ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_aviz'),RECCOUNT('v_cand_aviz'),-1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF lnSucces < 0 + STRTOFILE('eroare: ' + goExecutor.oPrelucrareEroare() + CHR(13) + CHR(10), gcErrLog, 1) +ENDIF +IF USED('v_cand_aviz') + SELECT v_cand_aviz + SCAN + STRTOFILE(' aviz cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + CHR(13)+CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_cand_aviz +ENDIF +goExecutor.oReset() + +*!* fara restrictia de luna curenta, doar sa vedem daca exista vreun aviz cu sursa in tot arhivul +lcSql = [select v.id_vanzare, v.tip, v.cod, v.data_act from vanzari v where v.sters=0 and v.tip=4 ] + ; + [and v.eproforma=0 and v.id_vanzare in (select id_vanzare_fact from vanzari_coresp where tip=1 and sters=0) ] + ; + [and rownum <= 10 order by v.data_act desc] +lnSucces = goExecutor.oExecute(lcSql, 'v_cand_aviz2') +STRTOFILE('aviz(orice data): ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_aviz2'),RECCOUNT('v_cand_aviz2'),-1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF lnSucces < 0 + STRTOFILE('eroare: ' + goExecutor.oPrelucrareEroare() + CHR(13) + CHR(10), gcErrLog, 1) +ENDIF +IF USED('v_cand_aviz2') + SELECT v_cand_aviz2 + SCAN + STRTOFILE(' aviz cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + ' data_act=' + TRANSFORM(data_act) + CHR(13)+CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_cand_aviz2 +ENDIF +goExecutor.oReset() + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT diff --git a/utile/Teste/editare_factura/probe_s9_candidati.prg b/utile/Teste/editare_factura/probe_s9_candidati.prg new file mode 100644 index 0000000..7f25227 --- /dev/null +++ b/utile/Teste/editare_factura/probe_s9_candidati.prg @@ -0,0 +1,88 @@ +* probe_s9_candidati.prg +* Cauta, read-only, cate un document editabil de fiecare familie pentru testul S9-1/S9-2: +* aviz (tip=4, cu avize sursa reale), comanda (tip in 3,21,25,28,42,47, cu id_comanda), contract +* (tip in 2,6,26,52, cu id_ctr), ELSE (fara comanda/ctr/aviz sursa). Luna curenta, sters=0, +* fara urmasi, fara eproforma, fara efactura. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_s9_candidati_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +STRTOFILE('gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) + +LOCAL lcSql, lnSucces + +*!* aviz cu avize sursa reale (VANZARI_CORESP TIP=1) +lcSql = [select v.id_vanzare, v.tip, v.cod from vanzari v where v.sters=0 and v.tip=4 ] + ; + [and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ; + [ and v.eproforma=0 and v.id_vanzare in (select id_vanzare_fact from vanzari_coresp where tip=1 and sters=0) ] + ; + [and not exists (select 1 from vanzari_coresp c where c.id_vanzare_sursa=v.id_vanzare and c.sters=0) ] + ; + [and rownum <= 5] +lnSucces = goExecutor.oExecute(lcSql, 'v_cand_aviz') +STRTOFILE('aviz: ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_aviz'),RECCOUNT('v_cand_aviz'),-1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('v_cand_aviz') + SELECT v_cand_aviz + SCAN + STRTOFILE(' aviz cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + CHR(13)+CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_cand_aviz +ENDIF +goExecutor.oReset() + +*!* comanda, cu id_comanda populat +lcSql = [select v.id_vanzare, v.tip, v.cod, v.id_comanda from vanzari v where v.sters=0 and v.tip in (3,21,25,28,42,47) ] + ; + [and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ; + [ and v.eproforma=0 and v.id_comanda is not null and rownum <= 5] +lnSucces = goExecutor.oExecute(lcSql, 'v_cand_cmd') +STRTOFILE('comanda: ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_cmd'),RECCOUNT('v_cand_cmd'),-1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('v_cand_cmd') + SELECT v_cand_cmd + SCAN + STRTOFILE(' comanda cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + ' id_comanda=' + TRANSFORM(id_comanda) + CHR(13)+CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_cand_cmd +ENDIF +goExecutor.oReset() + +*!* contract, cu id_ctr populat +lcSql = [select v.id_vanzare, v.tip, v.cod, v.id_ctr from vanzari v where v.sters=0 and v.tip in (2,6,26,52) ] + ; + [and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ; + [ and v.eproforma=0 and v.id_ctr is not null and rownum <= 5] +lnSucces = goExecutor.oExecute(lcSql, 'v_cand_ctr') +STRTOFILE('contract: ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_ctr'),RECCOUNT('v_cand_ctr'),-1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('v_cand_ctr') + SELECT v_cand_ctr + SCAN + STRTOFILE(' contract cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + ' id_ctr=' + TRANSFORM(id_ctr) + CHR(13)+CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_cand_ctr +ENDIF +goExecutor.oReset() + +*!* ELSE: tip fara comanda/ctr, fara aviz sursa (asteptam listaid = '') +lcSql = [select v.id_vanzare, v.tip, v.cod from vanzari v where v.sters=0 and v.tip not in (3,21,25,28,42,47,4,2,6,26,52,44,45,46,51) ] + ; + [and extract(year from v.data_act)=] + TRANSFORM(gnAn) + [ and extract(month from v.data_act)=] + TRANSFORM(gnLuna) + ; + [ and v.eproforma=0 and v.id_comanda is null and v.id_ctr is null and rownum <= 5] +lnSucces = goExecutor.oExecute(lcSql, 'v_cand_else') +STRTOFILE('else: ' + TRANSFORM(lnSucces) + ' reccount=' + TRANSFORM(IIF(USED('v_cand_else'),RECCOUNT('v_cand_else'),-1)) + CHR(13) + CHR(10), gcErrLog, 1) +IF USED('v_cand_else') + SELECT v_cand_else + SCAN + STRTOFILE(' else cand: id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' cod=' + TRANSFORM(cod) + CHR(13)+CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_cand_else +ENDIF +goExecutor.oReset() + +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT diff --git a/utile/Teste/editare_factura/probe_trace_editare.prg b/utile/Teste/editare_factura/probe_trace_editare.prg new file mode 100644 index 0000000..b08aa85 --- /dev/null +++ b/utile/Teste/editare_factura/probe_trace_editare.prg @@ -0,0 +1,183 @@ +* probe_trace_editare.prg - trace pas cu pas a do_editare_unificata (replica, read-only in afara de +* obiectele in memorie) pe documentele 1055 (PASS) si 1113 (FAIL), ca sa gaseasca unde diverg. +* Diagnostic pentru docs\triaj_s8_regresie_28fail.md. Nu scrie in Oracle. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_trace_editare_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 + +PROCEDURE Traseaza(tcDoc, tcMsg) + STRTOFILE(tcDoc + ': ' + tcMsg + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + +*!* driver minimal: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms si il elibereaza, ca sa nu +*!* blocheze la infinit modalul din proba (acelasi tipar ca driverS8p7 din test_s8_pas7_cablare.prg) +DEFINE CLASS driverTrace AS Custom + lBusy = .F. + lGasit = .F. + PROCEDURE Reseteaza + This.lGasit = .F. + ENDPROC + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + LOCAL lnI, loFrm2 + TRY + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + STRTOFILE('driverTrace: gasit form, WindowType=' + Transform(loFrm2.WindowType) + CHR(13) + CHR(10), gcErrLog, 1) + loFrm2.Release() + EXIT + ENDIF + ENDFOR + CATCH TO loExcTrace + STRTOFILE('driverTrace EROARE ' + Transform(loExcTrace.ErrorNo) + ' ' + loExcTrace.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE + +PUBLIC goDriverTrace +goDriverTrace = Createobject('driverTrace') +_SCREEN.AddObject('tmrTrace', 'Timer') +_SCREEN.tmrTrace.Interval = 150 +Bindevent(_SCREEN.tmrTrace, 'Timer', goDriverTrace, 'Executa') +_SCREEN.tmrTrace.Enabled = .T. + +PROCEDURE VerificaTrace + LPARAMETERS tnIdVanzare + LOCAL lcDoc, lnSucces, lcSchema, lcSelect, lcOrder, lcFiltru + lcDoc = Transform(tnIdVanzare) + + IF Used('crsfacturi') + Use In crsfacturi + ENDIF + lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + + lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + + lcOrder = [data_act,numar_act] + lcFiltru = [id_vanzare = ] + lcDoc + gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) + DO Traseaza WITH lcDoc, 'crsfacturi Reccount=' + Transform(Reccount('crsfacturi')) + + LOCAL lnSters, llEProforma, lnTipDoc, loForm, pnDiscountRon, pnDiscountValuta + Private pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzare, poDate + Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzare + Select crsfacturi + lnIdVanzare = id_vanzare + lnCod = cod + pnAn = Year(data_act) + pnLuna = Month(data_act) + lnSters = sters + lnIdFact = id_fact + llEProforma = (eproforma = 1) + lnTipDoc = tip + DO Traseaza WITH lcDoc, 'garzi: sters=' + Transform(lnSters) + ' eproforma=' + Transform(llEProforma) + ' tip=' + Transform(lnTipDoc) + ; + ' luna_ok=' + Transform((pnAn*12+pnLuna)==(gnAn*12+gnLuna)) + ' referinte=' + Transform(ReferinteDocumenteNota(pnAn,pnLuna,lnCod)) + ; + ' efactura=' + Transform(EsteInEFactura(lnIdFact)) + ' urmasi=' + Transform(DocumentAreUrmasi(lnIdVanzare)) + + poDate = IncarcaAntetFacturaEditare(lnIdVanzare, @pnDiscountRon, @pnDiscountValuta) + DO Traseaza WITH lcDoc, 'IncarcaAntetFacturaEditare Vartype=' + Vartype(poDate) + IF Vartype(poDate) <> 'O' + DO Traseaza WITH lcDoc, 'ABANDON: poDate nu e obiect' + RETURN + ENDIF + DO Traseaza WITH lcDoc, 'poDate.tip=' + Transform(poDate.tip) + ' poDate.incasat=' + Transform(poDate.incasat) + ' poDate.lEditare=' + Transform(poDate.lEditare) + ' poDate.ntip_incasare=' + Transform(poDate.ntip_incasare) + + IncarcaLiniiFacturaEditare(poDate, lnIdVanzare) + DO Traseaza WITH lcDoc, 'IncarcaLiniiFacturaEditare terminat' + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF Used('jtva_coloane') + Use In jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ELSE + Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ENDIF + DO Traseaza WITH lcDoc, 'jtva_coloane pregatit' + + loForm = Createobject('frm_facturare_articole2') + DO Traseaza WITH lcDoc, 'Createobject Vartype=' + Vartype(loForm) + IF Vartype(loForm) <> 'O' + DO Traseaza WITH lcDoc, 'ABANDON: loForm nu e obiect' + RETURN + ENDIF + DO Traseaza WITH lcDoc, 'loForm.WindowType=' + Transform(loForm.WindowType) + ' Visible=' + Transform(loForm.Visible) + loForm.ndiscfactron = pnDiscountRon + loForm.ndiscfactval = pnDiscountValuta + loForm.do_calculeaza_totaluri() + DO Traseaza WITH lcDoc, 'do_calculeaza_totaluri terminat, ntotalron=' + Transform(loForm.ntotalron) + + DO Traseaza WITH lcDoc, 'inainte de Show(), FormCount=' + Transform(_SCREEN.FormCount) + goDriverTrace.Reseteaza() + loForm.Show() + DO Traseaza WITH lcDoc, 'DUPA Show() - a revenit, lGasit=' + Transform(goDriverTrace.lGasit) + ' gcMockUltimMesaj=[' + gcMockUltimMesaj + ']' + TRY + loForm.Release() + CATCH + ENDTRY +ENDPROC + +DO VerificaTrace WITH 1055 +DO VerificaTrace WITH 1113 + +_SCREEN.tmrTrace.Enabled = .F. +TRY + _SCREEN.RemoveObject('tmrTrace') +CATCH +ENDTRY + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT diff --git a/utile/Teste/editare_factura/probe_triaj_incasare.prg b/utile/Teste/editare_factura/probe_triaj_incasare.prg new file mode 100644 index 0000000..fd4f86e --- /dev/null +++ b/utile/Teste/editare_factura/probe_triaj_incasare.prg @@ -0,0 +1,42 @@ +* probe_triaj_incasare.prg - diagnostic read-only, triaj regresie 28 FAIL (docs\triaj_s8_regresie_28fail.md) +* Interogheaza campurile relevante pentru bugul din actualizeaza_tipincasare / seteaza_mod_incasare +* pe cele 4 documente vechi (1113,1055,1048,1130) + cele 2 noi (1071,1072), sa gaseasca ce le diferentiaza. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\probe_triaj_incasare_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +LOCAL lnSucces, lcSql +lcSql = [select id_vanzare, tip, eproforma, sters, in_valuta, incasat, tip_incasare, ] + ; + [nr_incasare, serie_chit from fact_vfacturi where id_vanzare in (1113,1055,1048,1130,1071,1072) order by id_vanzare] +lnSucces = goExecutor.oExecute(lcSql, 'crsProbe') +goExecutor.oReset() +IF lnSucces < 0 + STRTOFILE('EROARE query: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +SELECT crsProbe +SCAN + STRTOFILE(TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' eproforma=' + TRANSFORM(eproforma) + ; + ' sters=' + TRANSFORM(sters) + ' in_valuta=' + TRANSFORM(in_valuta) + ' incasat=' + TRANSFORM(Nvl(incasat,-1)) + ; + ' tip_incasare=' + TRANSFORM(Nvl(tip_incasare,-1)) + ; + ' nr_incasare=' + TRANSFORM(Nvl(nr_incasare,-1)) + ; + ' serie_chit=[' + TRANSFORM(Nvl(serie_chit,'')) + ']' + CHR(13) + CHR(10), gcErrLog, 1) +ENDSCAN +USE IN crsProbe + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT diff --git a/utile/Teste/editare_factura/s9_6_snapshot_dupa.txt b/utile/Teste/editare_factura/s9_6_snapshot_dupa.txt new file mode 100644 index 0000000..a7e8e5d --- /dev/null +++ b/utile/Teste/editare_factura/s9_6_snapshot_dupa.txt @@ -0,0 +1,54 @@ +===== B1: randuri DOCUMENTE scrise prin ramura NOT MATCHED, DUPA aplicare (8010204..8010208) ===== +===== comparate cu randurile scrise prin INSERT-ul vechi, INAINTE de aplicare (8010196..8010203) ===== + + ID_DOC DATAORA ID_UTIL STERS DATAORAS ID_UTILS TVA_INCASARE SERIE_ACT NRACT DATAACT ID_PART ID_CTR CONT ACON ID_VALUTA ID_SUCURSALA IP_ANI IP_LUNAI IP_SOLDI ID_SET DATAIREG TIP_SAFT +---------- ------------------- ---------- ---------- ------------------- ---------- ------------ ---------- ---------- ---------- ---------- ---------- ---- ---- ---------- ------------ ---------- ---------- ---------- ---------- ---------- ---------- + 8010196 03.09.2026 06:37:00 8 0 0 0 SSS 594 26.08.2026 25021 26.08.2026 + 8010197 03.09.2026 06:40:14 8 0 0 0 SSS 44 26.08.2026 25021 26.08.2026 + 8010198 03.09.2026 06:40:14 8 0 0 0 SSS 595 26.08.2026 25021 26.08.2026 + 8010199 03.09.2026 06:41:53 8 0 0 0 SSS 596 26.08.2026 25021 26.08.2026 + 8010200 03.09.2026 06:41:53 8 0 0 0 66 26.08.2026 25021 26.08.2026 + 8010201 03.09.2026 07:18:04 8 0 0 0 SSS 600 26.08.2026 25021 26.08.2026 + 8010202 03.09.2026 07:23:29 8 0 0 0 SSS 45 26.08.2026 25021 26.08.2026 + 8010203 03.09.2026 07:23:29 8 0 0 0 SSS 601 26.08.2026 25021 26.08.2026 + 8010204 03.09.2026 08:37:25 8 1 03.09.2026 08:41:30 8 0 SSS 602 26.08.2026 25021 26.08.2026 + 8010205 03.09.2026 08:37:25 8 1 03.09.2026 08:41:11 8 0 67 26.08.2026 25021 26.08.2026 + 8010206 03.09.2026 08:41:11 8 1 03.09.2026 08:41:30 8 0 67 26.08.2026 25021 26.08.2026 + 8010207 03.09.2026 08:41:30 8 1 03.09.2026 08:41:46 8 0 67 26.08.2026 25021 26.08.2026 + 8010208 03.09.2026 08:41:46 8 1 03.09.2026 08:41:47 8 0 67 26.08.2026 25021 26.08.2026 + 8017983 03.09.2026 08:41:30 8 0 03.09.2026 08:41:47 8 0 SSS 602 26.08.2026 25021 26.08.2026 + +14 rows selected. + +===== coloane care difera intre lotul INAINTE si lotul DUPA (asteptat: niciuna, in afara de id_doc/dataora/nract) ===== + +COLOANA VALORI_DISTINCTE +-------- ---------------- +ID_UTIL 1 +STERS 1 +ID_UTILS 2 +ID_SET 1 +DATAIREG 1 + +5 rows selected. + +===== totaluri DOCUMENTE dupa toate probele ===== + + TOTAL STERS1 STERS0 MAX_ID_DOC +---------- ---------- ---------- ---------- + 37564 370 37194 8017983 + +1 row selected. + +===== igiena: id_doc duplicat (trebuie gol) ===== + +no rows selected + +===== marcaj VERSIUNE ===== + +SCRIPT_FINAL TIP_SCRIPT DATA_SCRIP SEQ_SCRIPT +---------------------------------------------------------------------------------------------------- -------------------------------------------------- ---------- ---------- +wip13_2026_09_03_01_COMUN_PACK_CONTAFIN.sql COMUN_PACK_CONTAFIN 03.09.2026 1 + +1 row selected. + diff --git a/utile/Teste/editare_factura/s9_6_snapshot_inainte.txt b/utile/Teste/editare_factura/s9_6_snapshot_inainte.txt new file mode 100644 index 0000000..030bde5 --- /dev/null +++ b/utile/Teste/editare_factura/s9_6_snapshot_inainte.txt @@ -0,0 +1,38 @@ +===== SNAPSHOT DOCUMENTE, INAINTE DE APLICAREA S9-6 ===== + +MOMENTUL +------------------- +03.09.2026 08:28:34 + +1 row selected. + +===== totaluri ===== + + TOTAL STERS1 STERS0 MAX_ID_DOC +---------- ---------- ---------- ---------- + 37557 363 37194 8010203 + +1 row selected. + +===== ultimele 15 randuri scrise (dataora desc) ===== + + ID_DOC DATAORA ID_UTIL STERS DATAORAS ID_UTILS TVA_INCASARE SERIE_ACT NRACT DATAACT ID_PART ID_CTR CONT ACON ID_VALUTA ID_SUCURSALA IP_ANI IP_LUNAI IP_SOLDI ID_SET DATAIREG TIP_SAFT +---------- -------------------- ---------- ---------- -------------------- ---------- ------------ ---------- ---------- ---------- ---------- ---------- ---- ---- ---------- ------------ ---------- ---------- ---------- ---------- ---------- ---------- + 8010203 03.09.2026 07:23:29 8 0 0 0 SSS 601 26.08.2026 25021 26.08.2026 + 8010202 03.09.2026 07:23:29 8 0 0 0 SSS 45 26.08.2026 25021 26.08.2026 + 8010201 03.09.2026 07:18:04 8 0 0 0 SSS 600 26.08.2026 25021 26.08.2026 + 8010200 03.09.2026 06:41:53 8 0 0 0 66 26.08.2026 25021 26.08.2026 + 8010199 03.09.2026 06:41:53 8 0 0 0 SSS 596 26.08.2026 25021 26.08.2026 + 8010198 03.09.2026 06:40:14 8 0 0 0 SSS 595 26.08.2026 25021 26.08.2026 + 8010197 03.09.2026 06:40:14 8 0 0 0 SSS 44 26.08.2026 25021 26.08.2026 + 8010196 03.09.2026 06:37:00 8 0 0 0 SSS 594 26.08.2026 25021 26.08.2026 + 8010181 02.09.2026 06:43:33 8 0 0 1 SSS 691 31.08.2026 25000 31.08.2026 + 8010180 02.09.2026 06:43:30 8 0 0 1 SSS 690 31.08.2026 25000 31.08.2026 + 8010179 02.09.2026 06:09:51 8 0 0 1 SSS 689 31.08.2026 25000 31.08.2026 + 8010178 02.09.2026 06:09:48 8 0 0 1 SSS 688 31.08.2026 25000 31.08.2026 + 8010177 02.09.2026 05:50:46 8 0 0 1 SSS 687 31.08.2026 25000 31.08.2026 + 8010176 02.09.2026 05:50:43 8 0 0 1 SSS 686 31.08.2026 25000 31.08.2026 + 8010175 01.09.2026 21:58:18 8 0 0 1 SSS 684 31.08.2026 25000 31.08.2026 + +15 rows selected. + diff --git a/utile/Teste/editare_factura/s9_7_snapshot_dupa.txt b/utile/Teste/editare_factura/s9_7_snapshot_dupa.txt new file mode 100644 index 0000000..002f74e --- /dev/null +++ b/utile/Teste/editare_factura/s9_7_snapshot_dupa.txt @@ -0,0 +1,61 @@ +===== SNAPSHOT DOCUMENTE, DUPA S9-7 (rularea 1, control negativ A) ===== + +MOMENTUL +------------------- +03.09.2026 10:25:18 +===== totaluri ===== + + TOTAL STERS1 STERS0 MAX_ID_DOC +---------- ---------- ---------- ---------- + 37566 372 37194 8017983 +===== ultimele 15 randuri scrise (dataora_raw desc) ===== + + ID_DOC DATAORA_FMT ID_UTIL STERS DATAORAS_FMT ID_UTILS TVA_INCASARE SERIE_ACT NRACT DATAACT_FM ID_PART ID_CTR CONT ACON ID_VALUTA ID_SUCURSALA IP_ANI IP_LUNAI IP_SOLDI ID_SET DATAIREG_F +---------- ------------------- ---------- ---------- ------------------- ---------- ------------ ---------- ---------- ---------- ---------- ---------- ---- ---- ---------- ------------ ---------- ---------- ---------- ---------- ---------- + TIP_SAFT DATAORA_R +---------- --------- + 8010211 03.09.2026 10:21:30 8 0 0 0 SSS 608 26.08.2026 25021 26.08.2026 + 03-SEP-26 + + 8010210 03.09.2026 10:16:52 8 0 0 0 SSS 604 26.08.2026 25021 26.08.2026 + 03-SEP-26 + + 8010209 03.09.2026 08:41:47 8 0 0 0 67 26.08.2026 25021 26.08.2026 + 03-SEP-26 + + 8010208 03.09.2026 08:41:46 8 1 03.09.2026 08:41:47 8 0 67 26.08.2026 25021 26.08.2026 + 03-SEP-26 + + 8017983 03.09.2026 08:41:30 8 0 03.09.2026 08:41:47 8 0 SSS 602 26.08.2026 25021 26.08.2026 + 03-SEP-26 + + 8010207 03.09.2026 08:41:30 8 1 03.09.2026 08:41:46 8 0 67 26.08.2026 25021 26.08.2026 + 03-SEP-26 + + 8010206 03.09.2026 08:41:11 8 1 03.09.2026 08:41:30 8 0 67 26.08.2026 25021 26.08.2026 + 03-SEP-26 + + 8010204 03.09.2026 08:37:25 8 1 03.09.2026 08:41:30 8 0 SSS 602 26.08.2026 25021 26.08.2026 + 03-SEP-26 + + 8010205 03.09.2026 08:37:25 8 1 03.09.2026 08:41:11 8 0 67 26.08.2026 25021 26.08.2026 + 03-SEP-26 + + 8010202 03.09.2026 07:23:29 8 0 0 0 SSS 45 26.08.2026 25021 26.08.2026 + 03-SEP-26 + + 8010203 03.09.2026 07:23:29 8 0 0 0 SSS 601 26.08.2026 25021 26.08.2026 + 03-SEP-26 + + 8010201 03.09.2026 07:18:04 8 0 0 0 SSS 600 26.08.2026 25021 26.08.2026 + 03-SEP-26 + + 8010199 03.09.2026 06:41:53 8 0 0 0 SSS 596 26.08.2026 25021 26.08.2026 + 03-SEP-26 + + 8010200 03.09.2026 06:41:53 8 0 0 0 66 26.08.2026 25021 26.08.2026 + 03-SEP-26 + + 8010197 03.09.2026 06:40:14 8 0 0 0 SSS 44 26.08.2026 25021 26.08.2026 + 03-SEP-26 + diff --git a/utile/Teste/editare_factura/test_id_part_rez.prg b/utile/Teste/editare_factura/test_id_part_rez.prg new file mode 100644 index 0000000..824c388 --- /dev/null +++ b/utile/Teste/editare_factura/test_id_part_rez.prg @@ -0,0 +1,233 @@ +* test_id_part_rez.prg +* Proba tintita pentru reparatia sectiunii 3.3 din docs\propunere_comparatie_coloane_crsfactura.md: +* id_part_rez / id_lucrare_rez trebuie sa fie refacute la editare din rulajul original (RUL), nu sa +* ramana NULL. Sursa propusa in document (VANZARI_DETALII) NU are aceste coloane - se probeaza si +* asta, plus faptul ca VVANZARI_ARTICOLE nu le expune, deci valoarea gasita in crsfactura nu poate +* veni din alta parte. Nimic nu se scrie in Oracle: doar SELECT si incarcarea in cursoare. +* +* Caz 1 (doc 872, rezervare reala): RUL are un rand cu id_part_rez = 742 si id_lucrare_rez NULL. +* Caz 2 (doc 951, rezervare absenta scrisa ca 0): randul RUL are 0 pe ambele; 0 trebuie pastrat ca 0, +* nu convertit in NULL si nici NULL convertit in 0. +* Caz 3 (premisele): VANZARI_DETALII fara coloane, VVANZARI_ARTICOLE fara coloane, RUL cu ambele. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail +PUBLIC poDate + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_id_part_rez_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnPass = 0 +gnFail = 0 + +DO Premise +DO CazDocument WITH 872, 742, .T. +DO CazDocument WITH 951, 0, .F. + +STRTOFILE(CHR(13) + CHR(10) + 'REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +*============================================================================================== +* Premise: nici tabela propusa in document, nici view-ul sursa nu au coloanele; RUL le are. +*============================================================================================== +PROCEDURE Premise + LOCAL lcSql + STRTOFILE(CHR(13) + CHR(10) + '--- PREMISE ---' + CHR(13) + CHR(10), gcErrLog, 1) + + lcSql = [select count(*) as nr from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ; + [and table_name = 'VANZARI_DETALII' and column_name in ('ID_PART_REZ','ID_LUCRARE_REZ')] + DO AssertaSql WITH 'VANZARI_DETALII NU are coloanele (varianta (a) din propunere e imposibila)', lcSql, 0 + + lcSql = [select count(*) as nr from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ; + [and table_name = 'VVANZARI_ARTICOLE' and column_name in ('ID_PART_REZ','ID_LUCRARE_REZ')] + DO AssertaSql WITH 'VVANZARI_ARTICOLE NU expune coloanele', lcSql, 0 + + lcSql = [select count(*) as nr from all_tab_columns where owner = 'MARIUSM_AUTO' ] + ; + [and table_name = 'RUL' and column_name in ('ID_PART_REZ','ID_LUCRARE_REZ')] + DO AssertaSql WITH 'RUL are ambele coloane (singura sursa la editare)', lcSql, 2 +ENDPROC + + +*============================================================================================== +* CazDocument: incarca documentul si compara crsfactura cu RUL, rand cu rand. +* tnIdV - id_vanzare +* tnPartAstept - valoarea id_part_rez asteptata pe cel putin o linie +* tlLucrNull - .T. daca id_lucrare_rez din RUL e NULL pe acea linie +*============================================================================================== +PROCEDURE CazDocument + LPARAMETERS tnIdV, tnPartAstept, tlLucrNull + LOCAL lcSql, lnDiscRon, lnDiscVal, lnPotriviri, lnPart, lnLucr, lnNule, lnStrict, lcPref + + lcPref = 'D' + TRANSFORM(tnIdV) + ' ' + STRTOFILE(CHR(13) + CHR(10) + '--- CAZ document ' + TRANSFORM(tnIdV) + ' ---' + CHR(13) + CHR(10), gcErrLog, 1) + + *!* sursa independenta: randurile RUL ale documentului, exact ca in productie + IF USED('crs_rul_astept') + USE IN crs_rul_astept + ENDIF + lcSql = [select r.id_articol, r.id_gestiune, Nvl(r.cont,' ') as cont, r.pret, ] + ; + [Nvl(r.serie,' ') as serie, r.cante as cantitate, r.pretv, r.id_tip_rulaj, ] + ; + [r.id_part_rez, r.id_lucrare_rez ] + ; + [from rul r, vanzari v ] + ; + [where v.id_vanzare = ] + ALLTRIM(STR(tnIdV)) + ; + [ and r.cod = v.cod and r.sters = 0 and r.cante <> 0 ] + ; + [order by r.id_tip_rulaj desc, r.id_rul] + IF !goExecutor.oExecuta(lcSql, 'crs_rul_astept') + DO Asserta WITH lcPref + 'randurile RUL s-au citit', .F., 'oExecuta a esuat' + RETURN + ENDIF + goExecutor.oReset() + DO Asserta WITH lcPref + 'documentul are randuri RUL', RECCOUNT('crs_rul_astept') > 0, TRANSFORM(RECCOUNT('crs_rul_astept')) + + *!* incarcarea reala + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal) + DO Asserta WITH lcPref + 'antetul s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate) + IF VARTYPE(poDate) <> 'O' + RETURN + ENDIF + + IncarcaLiniiFacturaEditare(poDate, tnIdV) + DO Asserta WITH lcPref + 'crsfactura are linii', ; + USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1)) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + RETURN + ENDIF + + *!* comparatia rand cu rand, pe aceeasi cheie ca productia + lnPotriviri = 0 + lnPart = 0 + lnLucr = 0 + lnNule = 0 + lnStrict = 0 + SELECT crsfactura + SCAN FOR gestionabil = 1 + SELECT crs_rul_astept + LOCATE FOR id_articol = crsfactura.id_articol AND id_gestiune = crsfactura.id_gestiune ; + AND ALLTRIM(cont) == ALLTRIM(crsfactura.Cont) AND pret = crsfactura.pret_achizitie ; + AND ALLTRIM(serie) == ALLTRIM(NVL(crsfactura.serie,[])) AND cantitate = crsfactura.cantitate + IF FOUND() + lnPotriviri = lnPotriviri + 1 + *!* pretv_orig populat din acelasi rand = dovada ca potrivirea chiar a avut loc + IF crsfactura.pretv_orig = NVL(crs_rul_astept.pretv, -987654) + lnStrict = lnStrict + 1 + ENDIF + IF ISNULL(crs_rul_astept.id_part_rez) = ISNULL(crsfactura.id_part_rez) ; + AND NVL(crs_rul_astept.id_part_rez, -1) = NVL(crsfactura.id_part_rez, -1) + lnPart = lnPart + 1 + ENDIF + IF ISNULL(crs_rul_astept.id_lucrare_rez) = ISNULL(crsfactura.id_lucrare_rez) ; + AND NVL(crs_rul_astept.id_lucrare_rez, -1) = NVL(crsfactura.id_lucrare_rez, -1) + lnLucr = lnLucr + 1 + ENDIF + STRTOFILE(' id_temp=' + TRANSFORM(crsfactura.id_temp) + ; + ' art=' + TRANSFORM(NVL(crsfactura.id_articol,-1)) + ; + ' cant=' + TRANSFORM(crsfactura.cantitate) + ; + ' pretv_orig=' + TRANSFORM(crsfactura.pretv_orig) + ; + ' id_part_rez=' + IIF(ISNULL(crsfactura.id_part_rez), 'NULL', TRANSFORM(crsfactura.id_part_rez)) + ; + ' id_lucrare_rez=' + IIF(ISNULL(crsfactura.id_lucrare_rez), 'NULL', TRANSFORM(crsfactura.id_lucrare_rez)) + ; + ' potrivit=da' + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + *!* fara potrivire in RUL nu exista sursa: valoarea trebuie sa ramana NULL + IF ISNULL(crsfactura.id_part_rez) AND ISNULL(crsfactura.id_lucrare_rez) + lnNule = lnNule + 1 + ENDIF + STRTOFILE(' id_temp=' + TRANSFORM(crsfactura.id_temp) + ; + ' art=' + TRANSFORM(NVL(crsfactura.id_articol,-1)) + ; + ' cant=' + TRANSFORM(crsfactura.cantitate) + ; + ' id_part_rez=' + IIF(ISNULL(crsfactura.id_part_rez), 'NULL', TRANSFORM(crsfactura.id_part_rez)) + ; + ' id_lucrare_rez=' + IIF(ISNULL(crsfactura.id_lucrare_rez), 'NULL', TRANSFORM(crsfactura.id_lucrare_rez)) + ; + ' potrivit=nu' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + SELECT crsfactura + ENDSCAN + + DO Asserta WITH lcPref + 'exista cel putin o linie potrivita in RUL (proba nu e vida)', ; + lnPotriviri > 0, TRANSFORM(lnPotriviri) + DO Asserta WITH lcPref + 'pretv_orig e cel din RUL pe toate liniile potrivite', ; + lnStrict = lnPotriviri AND lnPotriviri > 0, TRANSFORM(lnStrict) + '/' + TRANSFORM(lnPotriviri) + DO Asserta WITH lcPref + 'id_part_rez identic cu RUL pe toate liniile potrivite (NULL ramane NULL)', ; + lnPart = lnPotriviri AND lnPotriviri > 0, TRANSFORM(lnPart) + '/' + TRANSFORM(lnPotriviri) + DO Asserta WITH lcPref + 'id_lucrare_rez identic cu RUL pe toate liniile potrivite (NULL ramane NULL)', ; + lnLucr = lnPotriviri AND lnPotriviri > 0, TRANSFORM(lnLucr) + '/' + TRANSFORM(lnPotriviri) + + *!* valoarea concreta asteptata pe document, ca sa nu treaca o comparatie NULL = NULL + SELECT crsfactura + LOCATE FOR gestionabil = 1 AND !ISNULL(id_part_rez) AND id_part_rez = tnPartAstept + DO Asserta WITH lcPref + 'exista o linie cu id_part_rez = ' + TRANSFORM(tnPartAstept), ; + FOUND(), IIF(FOUND(), 'gasita', 'lipseste') + IF FOUND() + IF tlLucrNull + DO Asserta WITH lcPref + 'pe acea linie id_lucrare_rez a ramas NULL', ; + ISNULL(crsfactura.id_lucrare_rez), IIF(ISNULL(crsfactura.id_lucrare_rez), 'NULL', TRANSFORM(crsfactura.id_lucrare_rez)) + ELSE + DO Asserta WITH lcPref + 'pe acea linie id_lucrare_rez nu e NULL', ; + !ISNULL(crsfactura.id_lucrare_rez), IIF(ISNULL(crsfactura.id_lucrare_rez), 'NULL', TRANSFORM(crsfactura.id_lucrare_rez)) + ENDIF + ENDIF + + STRTOFILE(' (linii fara potrivire RUL, ramase NULL pe ambele: ' + TRANSFORM(lnNule) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + + USE IN crs_rul_astept + IF USED('crsfactura') + USE IN crsfactura + ENDIF +ENDPROC + + +*============================================================================================== +PROCEDURE AssertaSql + LPARAMETERS tcNume, tcSql, tnAsteptat + LOCAL lnGasit + lnGasit = -1 + IF goExecutor.oExecuta(tcSql, 'crs_assert_sql') + lnGasit = NVL(crs_assert_sql.nr, -1) + USE IN crs_assert_sql + ENDIF + goExecutor.oReset() + DO Asserta WITH tcNume, lnGasit = tnAsteptat, TRANSFORM(lnGasit) + ' (asteptat ' + TRANSFORM(tnAsteptat) + ')' +ENDPROC + + +PROCEDURE Asserta + LPARAMETERS tcNume, tlConditie, tcDetaliu + IF tlConditie + gnPass = gnPass + 1 + STRTOFILE(' OK ' + tcNume + ' [' + tcDetaliu + ']' + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE(' FAIL ' + tcNume + ' [' + tcDetaliu + ']' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s10_cablare_vfp.prg b/utile/Teste/editare_factura/test_s10_cablare_vfp.prg new file mode 100644 index 0000000..6820262 --- /dev/null +++ b/utile/Teste/editare_factura/test_s10_cablare_vfp.prg @@ -0,0 +1,334 @@ +* test_s10_cablare_vfp.prg +* Proba de cablare S10 (docs\raport_s10_cablare_vfp.md) - LIMITA semnalata explicit in +* docs\propunere_s10_proc_tvav.md §11.0: test_s10_proc_tvav.prg dovedeste ca pachetul Oracle +* (CASE-ul din PACK_FACTURARE.adauga_articol_factura) respecta flag-ul/parametrul nou, dar apeleaza +* pack_facturare DIRECT - nu dovedeste ca frm_facturare_articole2.do_scrie_articole (ofacturare.vc2, +* diff-ul din propunere §8) chiar APRINDE pack_facturare.nregenerare_editare si chiar TRIMITE al +* 28-lea argument. Aceasta proba umple exact acel gol. +* +* Metoda: mock pe goExecutor care CAPTUREAZA lcSql-ul trimis prin oExecute()/oExecuta(), FARA sa +* execute nimic in Oracle (tiparul S4e-5, verificare pe sirul SQL construit, nu pe rezultatul +* Oracle). Documentul se incarca REAL (IncarcaAntetFacturaEditare + IncarcaLiniiFacturaEditare, +* tiparul test_s9_8_flux.prg) - CITIRE, cu goExecutor REAL, inainte de orice mock; abia dupa +* incarcare se inlocuieste goExecutor cu mock-ul, inainte de a chema loForm.do_scrie_articole(). +* Rezultat: ZERO scriere reala, nici in Oracle, nici in VANZARI_DETALII_TEMP - captura e strict pe +* text, nu pe efect. +* +* Parametru tnCaz: +* 1 = flag=0 (plRegenerareEditare NEDECLARAT - RELEASE explicit inainte, ca sa fie sigur Type()='U', +* exact starea unei prime emiteri, fara nicio regenerare in curs). Asterturi: +* - lcSql contine "pack_facturare.nregenerare_editare := 0" +* - fiecare apel adauga_articol_factura din text are 28 argumente (parametrul nou se trimite +* oricum, necondiționat - Oracle il ignora fara flag, cf. §11.0/§7.3 din propunere) +* 2 = flag=1 (plRegenerareEditare = .T., PRIVATE, cu poSnapshotEditare minimal construit ca sa +* treaca garda din StergeDocumentFacturare - an/luna = perioada activa, id_fact=0 ca sa sara +* peste ForteazaIdFactReemitere). Asterturi: +* - lcSql contine "pack_facturare.nregenerare_editare := 1" +* - fiecare apel adauga_articol_factura din text are 28 argumente +* - ORDINEA: "initializeaza_date_factura" apare INAINTEA lui "nregenerare_editare := 1" in +* acelasi sir - daca ordinea ar fi inversa, reset-ul din initializeaza_date_factura (aplicat +* pe Oracle, verificat la runtime in docs\raport_s10_aplicare_oracle.md §4.1) ar sterge +* flag-ul tacit, exact defectul pe care insertia din propunere §8.1 il evita prin ancorare +* DUPA capatul apelului la initializeaza_date_factura. +* +* Document folosit: 630 (CONTRACT-A din test_s9_8_flux.prg rularea 5 - driver deja validat pe el). +* Cursorul crsfactura e curatat local (explicatie/serie/lot golite, opt_facturare fortat la 0 pe +* toate randurile) DOAR in memorie, ca sa garanteze ca (a) textul capturat n-are ")" accidental +* intr-un camp text si (b) toate randurile cad pe branch-ul adauga_articol_factura, nu pe +* adauga_rata_factura (poArt.opt_facturare in (1,2)) - fara asta proba n-ar mai testa ce trebuie. +* Documentul real din baza NU e atins - toate modificarile sunt pe cursorul local incarcat in RAM. +* +* Tranzactia: do_scrie_articole() (ofacturare.vc2:19842) deschide Transactions=2 pe gnHandle +* (conexiunea REALA - SQLSetprop, nu goExecutor) si NU o inchide pe ramura de succes (o lasa +* deschisa pentru do_scrie_factura, care nu se apeleaza aici) - ROLLBACK explicit dupa fiecare caz, +* direct pe gnHandle, indiferent de rezultat. +LPARAMETERS tnCaz + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail +PUBLIC poDate + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s10_cablare_vfp_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' caz=' + TRANSFORM(tnCaz) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +LOCAL lcPathVechi, lcPathNou +lcPathVechi = SET("PATH") +lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi +SET PATH TO &lcPathNou + +PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnPass = 0 +gnFail = 0 + +LOCAL lnCaz +lnCaz = VAL(TRANSFORM(tnCaz)) +DO CASE +CASE lnCaz = 1 + DO CazFlag WITH .F. +CASE lnCaz = 2 + DO CazFlag WITH .T. +OTHERWISE + STRTOFILE('EROARE: tnCaz trebuie sa fie 1 (flag=0) / 2 (flag=1)' + CHR(13) + CHR(10), gcErrLog, 1) +ENDCASE + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*============================================================================================== +* CazFlag: incarca REAL doc 630, curata local crsfactura, apeleaza loForm.do_scrie_articole() cu +* goExecutor MOCKAT (nicio scriere reala), verifica textul capturat. +*============================================================================================== +PROCEDURE CazFlag + LPARAMETERS tlFlagPornit + LOCAL loForm, loMock, loExecutorReal, lnIdV, lcPrefix + lnIdV = 630 + lcPrefix = IIF(m.tlFlagPornit, 'FLAG1', 'FLAG0') + + DO asserteaza WITH 'PRECONDITIE documentul ' + TRANSFORM(lnIdV) + ' e viu (STERS=0)', ; + Val1([select count(*) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV) + [ and sters = 0]) = 1, ; + TRANSFORM(Val1([select count(*) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV) + [ and sters = 0])) + + LOCAL lnDiscRon, lnDiscVal + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal) + DO asserteaza WITH lcPrefix + '-0a antetul documentului ' + TRANSFORM(lnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate) + IF VARTYPE(poDate) <> 'O' + RETURN + ENDIF + + IncarcaLiniiFacturaEditare(poDate, lnIdV) + DO asserteaza WITH lcPrefix + '-0b liniile documentului ' + TRANSFORM(lnIdV) + ' s-au incarcat', ; + USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1)) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + RETURN + ENDIF + + *!* curatare LOCALA (doar cursorul din RAM): (a) fara ")" accidental in text, (b) toate randurile + *!* pe branch-ul adauga_articol_factura, (c) fara NULL pe niciun camp NUMERIC folosit NEprotejat + *!* (fara Nvl()/Iif(Isnull())) in constructia lcSql din do_scrie_articole (ofacturare.vc2:19978- + *!* 20001) - un NULL real pe orice document istoric prabuseste tot sirul concatenat la NULL + *!* (VFP propaga NULL prin "+"), descoperit la runtime: PCOUNT()=1 dar VARTYPE(tcSql)='X' (NULL) + SELECT crsfactura + REPLACE ALL ; + id_temp WITH NVL(id_temp,0), id_articol WITH NVL(id_articol,0), ; + pret_achizitie WITH NVL(pret_achizitie,0), cu_tva WITH NVL(cu_tva,0), tip_valuta WITH NVL(tip_valuta,0), ; + pretftva WITH NVL(pretftva,0), vpretftva WITH NVL(vpretftva,0), ; + pretctva WITH NVL(pretctva,0), vpretctva WITH NVL(vpretctva,0), ; + id_valuta WITH NVL(id_valuta,0), gestionabil WITH NVL(gestionabil,0), cantitate WITH NVL(cantitate,0), ; + discountftva WITH NVL(discountftva,0), vdiscountftva WITH NVL(vdiscountftva,0), ; + discountctva WITH NVL(discountctva,0), vdiscountctva WITH NVL(vdiscountctva,0), ; + Curs WITH NVL(Curs,1), multiplicator WITH NVL(multiplicator,1), id_jtva_coloana WITH NVL(id_jtva_coloana,0), ; + pretv_orig WITH NVL(pretv_orig,0), ; + explicatie WITH 'test-s10-cablare', serie WITH '', lot WITH '', opt_facturare WITH 0 ; + IN crsfactura + *!* REPLACE ALL lasa pointerul pe EOF - Scan (folosit de do_scrie_articole) porneste de la + *!* POZITIA CURENTA, nu de la Top - fara acest GO TOP, bucla de articole rula 0 iteratii + GO TOP IN crsfactura + LOCAL lnRandurAsteptate + lnRandurAsteptate = RECCOUNT('crsfactura') + + loForm = CREATEOBJECT('frm_facturare_articole2') + + IF m.tlFlagPornit + PRIVATE plRegenerareEditare + PUBLIC poSnapshotEditare + plRegenerareEditare = .T. + poSnapshotEditare = CREATEOBJECT('Empty') + AddProperty(poSnapshotEditare, 'id_vanzare', m.lnIdV) + AddProperty(poSnapshotEditare, 'cod', 1) + AddProperty(poSnapshotEditare, 'an', gnAn) + AddProperty(poSnapshotEditare, 'luna', gnLuna) + AddProperty(poSnapshotEditare, 'id_fact', 0) + ELSE + IF TYPE('plRegenerareEditare') <> 'U' + RELEASE plRegenerareEditare + ENDIF + ENDIF + + *!* dupa acest punct: NICIO citire/scriere reala in Oracle - totul trece prin mock + loExecutorReal = goExecutor + loMock = CREATEOBJECT('MockGoExecutorS10Cablare') + goExecutor = loMock + + LOCAL llReturn + llReturn = loForm.do_scrie_articole() + + *!* ROLLBACK explicit pe conexiunea REALA - do_scrie_articole nu inchide tranzactia pe succes + *!* (o lasa deschisa pentru do_scrie_factura, care nu se apeleaza aici) + goExecutor = loExecutorReal + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + + DO asserteaza WITH lcPrefix + '-1 do_scrie_articole() a intors .T. (nicio eroare in constructia sirului)', llReturn, TRANSFORM(llReturn) + STRTOFILE(lcPrefix + ' apeluri capturate de mock: ' + TRANSFORM(loMock.nApeluri) + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(lcPrefix + ' --- lcSql capturat ---' + CHR(13) + CHR(10) + loMock.cSqlCapturat + CHR(13) + CHR(10), gcErrLog, 1) + + LOCAL lcAsteptat + lcAsteptat = 'pack_facturare.nregenerare_editare := ' + IIF(m.tlFlagPornit, '1', '0') + ';' + DO asserteaza WITH lcPrefix + '-2 lcSql contine [' + lcAsteptat + ']', ; + lcAsteptat $ loMock.cSqlCapturat, IIF(lcAsteptat $ loMock.cSqlCapturat, 'gasit', 'LIPSA') + + IF m.tlFlagPornit + LOCAL lnPozInit, lnPozFlag + lnPozInit = AT('initializeaza_date_factura', loMock.cSqlCapturat) + lnPozFlag = AT('nregenerare_editare := 1', loMock.cSqlCapturat) + DO asserteaza WITH lcPrefix + '-3 ORDINE: initializeaza_date_factura (pozitia ' + TRANSFORM(lnPozInit) + ; + ') apare INAINTEA nregenerare_editare := 1 (pozitia ' + TRANSFORM(lnPozFlag) + ')', ; + lnPozInit > 0 AND lnPozFlag > 0 AND lnPozInit < lnPozFlag, ; + TRANSFORM(lnPozInit) + ' vs ' + TRANSFORM(lnPozFlag) + ENDIF + + *!* AT() cu al treilea parametru (nr. de ordine al aparitiei) - gaseste direct a n-a aparitie, + *!* fara iterare manuala pe substring-uri + LOCAL lnNrApeluriAdauga, lnN, lnPozGasit, lnPozInceputArg, lnPozSfarsitRel, lcSegmentArg, lnVirgule + lnNrApeluriAdauga = 0 + lnN = 0 + DO WHILE .T. + lnN = lnN + 1 + lnPozGasit = AT('adauga_articol_factura(', loMock.cSqlCapturat, lnN) + IF lnPozGasit = 0 + EXIT + ENDIF + lnNrApeluriAdauga = lnNrApeluriAdauga + 1 + lnPozInceputArg = lnPozGasit + LEN('adauga_articol_factura(') + lnPozSfarsitRel = AT(');', SUBSTR(loMock.cSqlCapturat, lnPozInceputArg)) + lcSegmentArg = SUBSTR(loMock.cSqlCapturat, lnPozInceputArg, lnPozSfarsitRel - 1) + lnVirgule = OCCURS(',', lcSegmentArg) + DO asserteaza WITH lcPrefix + '-4.' + TRANSFORM(lnNrApeluriAdauga) + ' apelul #' + TRANSFORM(lnNrApeluriAdauga) + ; + ' la adauga_articol_factura are 28 argumente (27 virgule)', lnVirgule = 27, TRANSFORM(lnVirgule) + ' virgule -> ' + TRANSFORM(lnVirgule + 1) + ' argumente' + ENDDO + DO asserteaza WITH lcPrefix + '-5 numarul de apeluri adauga_articol_factura = numarul de randuri din crsfactura (' + TRANSFORM(lnRandurAsteptate) + ')', ; + lnNrApeluriAdauga = lnRandurAsteptate, TRANSFORM(lnNrApeluriAdauga) + ' vs ' + TRANSFORM(lnRandurAsteptate) + + IF m.tlFlagPornit + IF TYPE('poSnapshotEditare') <> 'U' + RELEASE poSnapshotEditare + ENDIF + ENDIF + IF TYPE('plRegenerareEditare') <> 'U' + RELEASE plRegenerareEditare + ENDIF +ENDPROC + + +*============================================================================================== +FUNCTION Val1 + LPARAMETERS tcSql + LOCAL lnRet + lnRet = -1 + IF USED('v_val10c') + USE IN v_val10c + ENDIF + IF goExecutor.oExecuta(tcSql, 'v_val10c') + SELECT v_val10c + IF RECCOUNT('v_val10c') > 0 + GO TOP + lnRet = NVL(v_val10c.v, -1) + ENDIF + USE IN v_val10c + ELSE + STRTOFILE('EROARE Val1: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + RETURN lnRet +ENDFUNC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) + *!* daca a ramas o tranzactie manuala deschisa dupa o eroare in mijlocul CazFlag, o inchidem + *!* aici - nu lasam conexiunea agatata pe Transactions=2 + IF TYPE('gnHandle') = 'N' AND gnHandle > 0 + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + ENDIF + gnFail = gnFail + 1 + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC + + +*============================================================================================== +* MockGoExecutorS10Cablare: captureaza fiecare lcSql trimis prin oExecute()/oExecuta(), fara sa +* execute NIMIC in Oracle. oExecuta cu alias de cursor creeaza un cursor GOL (0 randuri) cu acel +* nume - StergeDocumentFacturare (ofacturare_rutare_scriere.prg:344) citeste doar Reccount() pe +* cursoarele intoarse, niciodata continutul lor, deci 0 randuri il duce corect pe ramura +* "sterge_factura" (fara nota contabila de reversat) - ramura simpla, un singur oExecuta in plus, +* tot mockat. +*============================================================================================== +DEFINE CLASS MockGoExecutorS10Cablare AS Custom + cSqlCapturat = '' + nApeluri = 0 + cEroare = '' + + FUNCTION oExecute(tcSql) + THIS.nApeluri = THIS.nApeluri + 1 + LOCAL lcDiagCrs + IF USED('crsfactura') + lcDiagCrs = ' [DIAG crsfactura: RECNO=' + TRANSFORM(RECNO('crsfactura')) + ' RECCOUNT=' + TRANSFORM(RECCOUNT('crsfactura')) + ' EOF=' + TRANSFORM(EOF('crsfactura')) + ' ALIAS()=' + ALIAS() + ']' + ELSE + lcDiagCrs = ' [DIAG crsfactura: NEUSED]' + ENDIF + THIS.cSqlCapturat = THIS.cSqlCapturat + '>>>APEL ' + TRANSFORM(THIS.nApeluri) + ' (oExecute) VARTYPE(tcSql)=' + VARTYPE(m.tcSql) + lcDiagCrs + CHR(13) + CHR(10) + TRANSFORM(m.tcSql) + CHR(13) + CHR(10) + RETURN 1 + ENDFUNC + + FUNCTION oExecuta(tcSql, tcCursor) + THIS.nApeluri = THIS.nApeluri + 1 + THIS.cSqlCapturat = THIS.cSqlCapturat + '>>>APEL ' + TRANSFORM(THIS.nApeluri) + ' (oExecuta)' + CHR(13) + CHR(10) + TRANSFORM(m.tcSql) + CHR(13) + CHR(10) + IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor) + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + CREATE CURSOR (m.tcCursor) (xdummy I) + ENDIF + RETURN .T. + ENDFUNC + + FUNCTION oPrelucrareEroare() + RETURN 'MockGoExecutorS10Cablare: ' + THIS.cEroare + ENDFUNC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s10_proc_tvav.prg b/utile/Teste/editare_factura/test_s10_proc_tvav.prg new file mode 100644 index 0000000..e697f85 --- /dev/null +++ b/utile/Teste/editare_factura/test_s10_proc_tvav.prg @@ -0,0 +1,421 @@ +* test_s10_proc_tvav.prg +* Control negativ S10 (docs\propunere_s10_proc_tvav.md §10), PE COD NEMODIFICAT: dovedeste ca +* PACK_FACTURARE.adauga_articol_factura re-deriva PROC_TVAV, silentios, pe ramura contract SI pe +* ramura ELSE - inainte de a scrie diff-ul din runda 2. +* +* PROIECTARE REVIZUITA (fata de prima incercare din aceasta sesiune): apel DIRECT la +* pack_facturare.adauga_articol_factura, cu parametrii exact ca linia reala 1604 (doc 1055), nu +* prin tot lantul do_scrie_factura()/scrie_factura2 - acela a picat cu o eroare Oracle NELEGATA de +* S10 ("SQL statement parameter is required for non-prepared SQLEXEC() calls", pe scrie_factura2 +* pentru documente CONTRACT reale - vezi §11 din propunere). Apelul direct testeaza EXACT +* mecanismul in discutie (CASE-ul din adauga_articol_factura), scrie doar in +* VANZARI_DETALII_TEMP (niciodata in VANZARI/VANZARI_DETALII/DOCUMENTE - zero risc, zero SSS ars, +* nimic de reparat la un document real) si e complet reversibil. +* +* EXTINDERE (aplicare Oracle, dupa scrierea diff-ului din §7 - vezi docs\raport_s10_aplicare_oracle.md): +* cazurile 3 si 4 folosesc parametrul nou V_PROC_TVAV_TEMP (pozitia 28) si flag-ul de pachet +* pack_facturare.nregenerare_editare, ca sa dovedeasca proba ceruta de decizia 3: cu flag=1 si +* V_PROC_TVAV_TEMP trimis, cota scrisa trebuie sa fie cea SALVATA, nu cea derivata. Cazurile 1/2 +* raman NESCHIMBATE LA COD (apel cu 27 argumente, flag-ul niciodata atins) - proba de "neschimbat" +* e ca produc EXACT ACELASI TIPAR de PASS/FAIL dupa diff ca inainte (CTR-2/ELSE-2 continua sa PICE, +* adica tot re-deriva - flag-ul implicit 0 inseamna "override-ul nu se aplica", nu "comportament +* corect"), nu ca ar incepe sa treaca. +* +* Parametru tnCaz: +* 1 = CONTRACT - parametrii liniei reale 1604 (doc 1055: id_articol 4294507173, id_pol 41, +* pret 101.13, id_valuta 3, id_jtva_coloana 37, proc_tvav SALVAT 1.21), trimisi la +* adauga_articol_factura (27 argumente, flag neatins - ramane 0) cu V_ID_CTR = 61 +* (CONTRACTE.OPT_FACTURARE NULL -> branch-ul principal, nu portita NO_DATA_FOUND). Setup: +* CRM_POLITICI_PRET_ART (id_pol_art 1593, acelasi articol/politica ca linia reala, azi +* PROC_TVAV NULL) -> 1.09; CTR_ARTICOLE nou care leaga contractul 61 de politica 1593 +* (pret_unitar=0, ca sa nu amestece si divergenta de PRET - izolat strict pe PROC_TVAV). +* INAINTE si DUPA diff: TREBUIE sa PICE la fel (CTR-2), tot re-deriva - flag=0 nu schimba +* nimic pentru apelantii de azi. +* 2 = ELSE - parametrii liniei reale 481 (doc 287: id_jtva_coloana 1 "RO19B", proc_tvav +* SALVAT 1.19), trimisi cu pack_facturare.ntip := 1 (tip simplu, nu comanda/aviz/restaurant/ +* contract - cade pe ELSE). Setup: JTVA_COLOANE.COTA_TVA (id 1) 19 -> 9 (simuleaza o +* schimbare legala de cota intre emiterea documentului si o eventuala regenerare). INAINTE si +* DUPA diff: TREBUIE sa PICE la fel (ELSE-2). +* 3 = CONTRACT + FLAG - acelasi setup ca 1, dar apel cu 28 argumente: +* pack_facturare.nregenerare_editare := 1 inainte de apel, V_PROC_TVAV_TEMP = cota salvata +* (1.21). Cere pachetul deja recompilat cu diff-ul din §7 (altfel pica cu "wrong number of +* arguments"). TREBUIE sa TREACA: cota scrisa = cea salvata, nu cea noua din politica. +* 4 = ELSE + FLAG - acelasi setup ca 2, apel cu 28 argumente, flag=1, V_PROC_TVAV_TEMP = cota +* salvata (1.19). TREBUIE sa TREACA: cota scrisa = cea salvata, nu cea noua din JTVA_COLOANE. +* +* Cazurile 1/2: asertul central e "PROC_TVAV in TEMP = cel salvat pe linia reala" - PICA mereu (si +* inainte, si dupa diff, cat timp flag-ul ramane 0): Oracle re-deriva din politica/JTVA_COLOANE +* curente, nu primeste si nu respecta o valoare salvata pe calea normala (fara flag). Asertul de +* control CTR-3/ELSE-3 (valoarea noua chiar a ajuns in TEMP) confirma ca testul masoara ceva real +* si inainte, si dupa - proba ca diff-ul n-a schimbat comportamentul implicit. Setup-ul de schema e +* revertit necondiționat la finalul fiecarui caz. Cazurile 3/4 reseteaza flag-ul la 0 imediat dupa +* citirea rezultatului, in ACELASI bloc/sesiune, ca sa nu ramana agatat pentru vreun apel urmator +* din aceeasi conexiune. +LPARAMETERS tnCaz + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s10_proc_tvav_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' caz=' + TRANSFORM(tnCaz) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +gnPass = 0 +gnFail = 0 + +LOCAL lnCaz +lnCaz = VAL(TRANSFORM(tnCaz)) +DO CASE +CASE lnCaz = 1 + DO CazContract +CASE lnCaz = 2 + DO CazElse +CASE lnCaz = 3 + DO CazContractFlag +CASE lnCaz = 4 + DO CazElseFlag +OTHERWISE + STRTOFILE('EROARE: tnCaz trebuie sa fie 1 (CONTRACT) / 2 (ELSE) / 3 (CONTRACT+FLAG) / 4 (ELSE+FLAG)' + CHR(13) + CHR(10), gcErrLog, 1) +ENDCASE + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*============================================================================================== +* CazContract: parametrii liniei reale 1604 (doc 1055), trimisi cu V_ID_CTR=61 (OPT_FACTURARE +* NULL - branch-ul principal, nu NO_DATA_FOUND). +*============================================================================================== +PROCEDURE CazContract + LOCAL lnIdPolArt, lnIdCtr, lnProcTvavVechi, lnIdCtrArtNou, lnProcTvavSalvat, lnProcTvavTemp + LOCAL llOk + + lnIdPolArt = 1593 + lnIdCtr = 61 + + lnProcTvavSalvat = Val1([select proc_tvav as v from vanzari_detalii where id_vanzare_det = 1604]) + DO asserteaza WITH 'PRECONDITIE linia reala 1604 are proc_tvav salvat = 1.21', lnProcTvavSalvat = 1.21, TRANSFORM(lnProcTvavSalvat) + + lnProcTvavVechi = Val1([select proc_tvav as v from crm_politici_pret_art where id_pol_art = ] + TRANSFORM(lnIdPolArt)) + STRTOFILE('SETUP inainte: crm_politici_pret_art.proc_tvav (id_pol_art=' + TRANSFORM(lnIdPolArt) + ') = ' + TRANSFORM(lnProcTvavVechi) + CHR(13) + CHR(10), gcErrLog, 1) + + DO asserteaza WITH 'PRECONDITIE contractul 61 are OPT_FACTURARE care cade pe branch-ul principal (NVL(...,3)=3)', ; + Val1([select nvl(opt_facturare,3) as v from contracte where id_ctr = ] + TRANSFORM(lnIdCtr)) = 3, ; + TRANSFORM(Val1([select nvl(opt_facturare,3) as v from contracte where id_ctr = ] + TRANSFORM(lnIdCtr))) + + llOk = goExecutor.oExecuta([update crm_politici_pret_art set proc_tvav = 1.09 where id_pol_art = ] + TRANSFORM(lnIdPolArt)) + DO asserteaza WITH 'SETUP update politica reusit', llOk, TRANSFORM(llOk) + IF !llOk + RETURN + ENDIF + + lnIdCtrArtNou = Val1([select seq_ctr_articole.nextval as v from dual]) + llOk = goExecutor.oExecuta([insert into ctr_articole (id_ctr_art, id_ctr, id_pol_art, pret_unitar) values (] + ; + TRANSFORM(lnIdCtrArtNou) + [, ] + TRANSFORM(lnIdCtr) + [, ] + TRANSFORM(lnIdPolArt) + [, 0)]) + DO asserteaza WITH 'SETUP insert ctr_articole reusit (id_ctr_art=' + TRANSFORM(lnIdCtrArtNou) + ')', llOk, TRANSFORM(llOk) + IF !llOk + DO CazContractRevert WITH lnIdPolArt, lnProcTvavVechi, -1 + RETURN + ENDIF + + *!* apel DIRECT, 27 argumente, ca la ofacturare.vc2:19977-19999 - flag NEATINS (implicit 0 pe + *!* pachet, sau ce a ramas de la un caz anterior din aceeasi sesiune - de aceea CazContractFlag/ + *!* CazElseFlag reseteaza flag-ul la 0 imediat dupa citire). CITIREA rezultatului trebuie sa fie + *!* in ACELASI apel/tranzactie: VANZARI_DETALII_TEMP e GLOBAL TEMPORARY TABLE cu + *!* DURATION=SYS$TRANSACTION (verificat pe USER_TABLES) - randul dispare la primul COMMIT, iar + *!* goExecutor face auto-commit dupa fiecare oExecuta separat (Transactions <> 2, nicio + *!* tranzactie manuala deschisa aici). Un al doilea apel SELECT separat vedea mereu 0 randuri. + *!* Solutia: SELECT ... INTO ?@pnRezultatCtr (bind OUT, PRIVATE - vezi tiparul ?@poDate.nid_vanzare + *!* din ofacturare.vc2) IN ACELASI bloc PL/SQL, inainte de commit-ul acelui apel. + PRIVATE pnRezultatCtr + pnRezultatCtr = -999 + LOCAL lcSqlApel + lcSqlApel = [begin pack_facturare.ntip := 2; pack_facturare.adauga_articol_factura(] + ; + [999001, 4294507173, '', '', 41, NULL, 0, NULL, NULL, ] + ; + [101.13, 3, 0, 1, 1, 0, 'XXXX', 1, 1, 37, NULL, NULL, 101.13, NULL, ] + TRANSFORM(lnIdCtr) + [, 8, NULL, NULL); ] + ; + [select proc_tvav into ?@pnRezultatCtr from vanzari_detalii_temp where id_temp = 999001; end;] + *!* oExecute (spre deosebire de oExecuta) intoarce direct codul numeric (lnSucces < 0 = eroare) + LOCAL lnSuccesApel + lnSuccesApel = goExecutor.oExecute(lcSqlApel) + llOk = (lnSuccesApel >= 0) + STRTOFILE('goExecutor.cEroare dupa apel: [' + NVL(goExecutor.cEroare,'') + ']' + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'CTR-1 apelul la adauga_articol_factura a reusit (fara exceptie Oracle)', llOk, TRANSFORM(lnSuccesApel) + + IF llOk + lnProcTvavTemp = NVL(pnRezultatCtr, -1) + STRTOFILE('CTR proc_tvav in VANZARI_DETALII_TEMP: ' + TRANSFORM(lnProcTvavTemp) + ; + ' (salvat_pe_document=' + TRANSFORM(lnProcTvavSalvat) + ', politica_noua=1.09)' + CHR(13) + CHR(10), gcErrLog, 1) + + *!* ASERTUL CENTRAL - flag ramane 0 (neatins) - TREBUIE sa PICE la fel INAINTE si DUPA diff + *!* (dovada ca diff-ul nu schimba comportamentul implicit pentru apelantii de azi) + DO asserteaza WITH 'CTR-2 PROC_TVAV = cel salvat pe document (decizia 3, flag implicit 0 - trebuie sa PICE, neschimbat fata de azi)', ; + lnProcTvavTemp = lnProcTvavSalvat, TRANSFORM(lnProcTvavSalvat) + ' -> ' + TRANSFORM(lnProcTvavTemp) + DO asserteaza WITH 'CTR-3 (control ca testul masoara ceva) cota noua a politicii chiar a ajuns in TEMP', ; + lnProcTvavTemp = 1.09, TRANSFORM(lnProcTvavTemp) + ENDIF + + DO CazContractRevert WITH lnIdPolArt, lnProcTvavVechi, lnIdCtrArtNou +ENDPROC + + +PROCEDURE CazContractRevert + LPARAMETERS tnIdPolArt, tnProcTvavVechi, tnIdCtrArtNou + LOCAL llOk1, llOk2 + + llOk2 = .T. + IF tnIdCtrArtNou <> -1 + llOk2 = goExecutor.oExecuta([delete from ctr_articole where id_ctr_art = ] + TRANSFORM(tnIdCtrArtNou)) + ENDIF + llOk1 = goExecutor.oExecuta([update crm_politici_pret_art set proc_tvav = ] + ; + IIF(ISNULL(tnProcTvavVechi) OR tnProcTvavVechi = -1, [NULL], TRANSFORM(tnProcTvavVechi)) + [ where id_pol_art = ] + TRANSFORM(tnIdPolArt)) + STRTOFILE('REVERT: delete ctr_articole=' + TRANSFORM(llOk2) + ' update politica=' + TRANSFORM(llOk1) + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'CTR-9 revert setup (politica + ctr_articole) reusit', llOk1 AND llOk2, TRANSFORM(llOk1) + '/' + TRANSFORM(llOk2) + + LOCAL lnVerif + lnVerif = Val1([select proc_tvav as v from crm_politici_pret_art where id_pol_art = ] + TRANSFORM(tnIdPolArt)) + STRTOFILE('REVERT verificat: proc_tvav acum = ' + TRANSFORM(lnVerif) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*============================================================================================== +* CazElse: parametrii liniei reale 481 (doc 287), trimisi cu pack_facturare.ntip := 1 (cade pe +* ELSE - nu e in nicio lista comanda/aviz/restaurant/contract). +*============================================================================================== +PROCEDURE CazElse + LOCAL lnCotaVeche, lnProcTvavSalvat, lnProcTvavTemp, llOk + + lnProcTvavSalvat = Val1([select proc_tvav as v from vanzari_detalii where id_vanzare_det = 481]) + DO asserteaza WITH 'PRECONDITIE linia reala 481 are proc_tvav salvat = 1.19', lnProcTvavSalvat = 1.19, TRANSFORM(lnProcTvavSalvat) + + lnCotaVeche = Val1([select cota_tva as v from jtva_coloane where id_jtva_coloana = 1]) + STRTOFILE('SETUP inainte: jtva_coloane.cota_tva (id=1) = ' + TRANSFORM(lnCotaVeche) + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'PRECONDITIE cota_tva porneste de la 19', lnCotaVeche = 19, TRANSFORM(lnCotaVeche) + + llOk = goExecutor.oExecuta([update jtva_coloane set cota_tva = 9 where id_jtva_coloana = 1]) + DO asserteaza WITH 'SETUP update jtva_coloane reusit', llOk, TRANSFORM(llOk) + IF !llOk + RETURN + ENDIF + + *!* apel DIRECT, 27 argumente (V_ID_JTVA_COLOANA=1, restul dupa vanzari_detalii), ntip=1 + *!* (tip simplu -> ELSE); V_ID_ARTICOL 691698485 ca in linia reala - flag NEATINS. Citire in + *!* ACELASI apel/tranzactie - vezi comentariul din CazContract (VANZARI_DETALII_TEMP e GTT + *!* DURATION=SYS$TRANSACTION, disparea la commit-ul automat al urmatorului oExecuta separat) + PRIVATE pnRezultatElse + pnRezultatElse = -999 + LOCAL lcSqlApel2, lnSuccesApel2 + lcSqlApel2 = [begin pack_facturare.ntip := 1; pack_facturare.adauga_articol_factura(] + ; + [999002, 691698485, '', '', NULL, NULL, 0, NULL, NULL, ] + ; + [100, 1, 0, 1, 1, 0, 'XXXX', 1, 1, 1, NULL, NULL, 100, NULL, NULL, 8, NULL, NULL); ] + ; + [select proc_tvav into ?@pnRezultatElse from vanzari_detalii_temp where id_temp = 999002; end;] + lnSuccesApel2 = goExecutor.oExecute(lcSqlApel2) + llOk = (lnSuccesApel2 >= 0) + STRTOFILE('goExecutor.cEroare dupa apel: [' + NVL(goExecutor.cEroare,'') + ']' + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'ELSE-1 apelul la adauga_articol_factura a reusit (fara exceptie Oracle)', llOk, TRANSFORM(lnSuccesApel2) + + IF llOk + lnProcTvavTemp = NVL(pnRezultatElse, -1) + STRTOFILE('ELSE proc_tvav in VANZARI_DETALII_TEMP: ' + TRANSFORM(lnProcTvavTemp) + ; + ' (salvat_pe_document=' + TRANSFORM(lnProcTvavSalvat) + ', cota_noua_asteptata=1.09)' + CHR(13) + CHR(10), gcErrLog, 1) + + DO asserteaza WITH 'ELSE-2 PROC_TVAV = cel salvat pe document (decizia 3, flag implicit 0 - trebuie sa PICE, neschimbat fata de azi)', ; + lnProcTvavTemp = lnProcTvavSalvat, TRANSFORM(lnProcTvavSalvat) + ' -> ' + TRANSFORM(lnProcTvavTemp) + DO asserteaza WITH 'ELSE-3 (control ca testul masoara ceva) cota noua din JTVA_COLOANE chiar a ajuns in TEMP', ; + lnProcTvavTemp = 1.09, TRANSFORM(lnProcTvavTemp) + ENDIF + + DO CazElseRevert WITH lnCotaVeche +ENDPROC + + +PROCEDURE CazElseRevert + LPARAMETERS tnCotaVeche + LOCAL llOk + + llOk = goExecutor.oExecuta([update jtva_coloane set cota_tva = ] + TRANSFORM(tnCotaVeche) + [ where id_jtva_coloana = 1]) + STRTOFILE('REVERT: update jtva_coloane=' + TRANSFORM(llOk) + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'ELSE-9 revert setup (jtva_coloane) reusit', llOk, TRANSFORM(llOk) + + LOCAL lnVerif + lnVerif = Val1([select cota_tva as v from jtva_coloane where id_jtva_coloana = 1]) + STRTOFILE('REVERT verificat: cota_tva acum = ' + TRANSFORM(lnVerif) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*============================================================================================== +* CazContractFlag: acelasi setup ca CazContract, dar apel cu 28 argumente - flag=1, +* V_PROC_TVAV_TEMP = cota salvata (1.21). Cere parametrul nou pe pachet (dupa diff-ul din §7). +*============================================================================================== +PROCEDURE CazContractFlag + LOCAL lnIdPolArt, lnIdCtr, lnProcTvavVechi, lnIdCtrArtNou, lnProcTvavSalvat, lnProcTvavTemp + LOCAL llOk + + lnIdPolArt = 1593 + lnIdCtr = 61 + + lnProcTvavSalvat = Val1([select proc_tvav as v from vanzari_detalii where id_vanzare_det = 1604]) + DO asserteaza WITH 'PRECONDITIE linia reala 1604 are proc_tvav salvat = 1.21', lnProcTvavSalvat = 1.21, TRANSFORM(lnProcTvavSalvat) + + lnProcTvavVechi = Val1([select proc_tvav as v from crm_politici_pret_art where id_pol_art = ] + TRANSFORM(lnIdPolArt)) + STRTOFILE('SETUP inainte: crm_politici_pret_art.proc_tvav (id_pol_art=' + TRANSFORM(lnIdPolArt) + ') = ' + TRANSFORM(lnProcTvavVechi) + CHR(13) + CHR(10), gcErrLog, 1) + + llOk = goExecutor.oExecuta([update crm_politici_pret_art set proc_tvav = 1.09 where id_pol_art = ] + TRANSFORM(lnIdPolArt)) + DO asserteaza WITH 'SETUP update politica reusit', llOk, TRANSFORM(llOk) + IF !llOk + RETURN + ENDIF + + lnIdCtrArtNou = Val1([select seq_ctr_articole.nextval as v from dual]) + llOk = goExecutor.oExecuta([insert into ctr_articole (id_ctr_art, id_ctr, id_pol_art, pret_unitar) values (] + ; + TRANSFORM(lnIdCtrArtNou) + [, ] + TRANSFORM(lnIdCtr) + [, ] + TRANSFORM(lnIdPolArt) + [, 0)]) + DO asserteaza WITH 'SETUP insert ctr_articole reusit (id_ctr_art=' + TRANSFORM(lnIdCtrArtNou) + ')', llOk, TRANSFORM(llOk) + IF !llOk + DO CazContractRevert WITH lnIdPolArt, lnProcTvavVechi, -1 + RETURN + ENDIF + + *!* apel cu 28 argumente: flag pornit inainte de apel, V_PROC_TVAV_TEMP = cota salvata pe + *!* document. Flag resetat la 0 IN ACELASI bloc, dupa citirea rezultatului, ca sa nu ramana + *!* agatat pentru vreun apel urmator din aceeasi sesiune (goExecutor.oExecute e o singura + *!* conexiune reutilizata pe tot testul). + PRIVATE pnRezultatCtrFlag + pnRezultatCtrFlag = -999 + LOCAL lcSqlApel + lcSqlApel = [begin pack_facturare.nregenerare_editare := 1; pack_facturare.ntip := 2; ] + ; + [pack_facturare.adauga_articol_factura(] + ; + [999003, 4294507173, '', '', 41, NULL, 0, NULL, NULL, ] + ; + [101.13, 3, 0, 1, 1, 0, 'XXXX', 1, 1, 37, NULL, NULL, 101.13, NULL, ] + TRANSFORM(lnIdCtr) + [, 8, NULL, NULL, ] + ; + ALLTRIM(STR(lnProcTvavSalvat,18,4)) + [); ] + ; + [select proc_tvav into ?@pnRezultatCtrFlag from vanzari_detalii_temp where id_temp = 999003; ] + ; + [pack_facturare.nregenerare_editare := 0; end;] + LOCAL lnSuccesApel + lnSuccesApel = goExecutor.oExecute(lcSqlApel) + llOk = (lnSuccesApel >= 0) + STRTOFILE('goExecutor.cEroare dupa apel: [' + NVL(goExecutor.cEroare,'') + ']' + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'CTRF-1 apelul (28 arg, flag=1) la adauga_articol_factura a reusit (fara exceptie Oracle)', llOk, TRANSFORM(lnSuccesApel) + + IF llOk + lnProcTvavTemp = NVL(pnRezultatCtrFlag, -1) + STRTOFILE('CTRF proc_tvav in VANZARI_DETALII_TEMP: ' + TRANSFORM(lnProcTvavTemp) + ; + ' (salvat_pe_document=' + TRANSFORM(lnProcTvavSalvat) + ', politica_noua=1.09)' + CHR(13) + CHR(10), gcErrLog, 1) + + *!* ASERTUL CENTRAL - cu flag=1 SI V_PROC_TVAV_TEMP trimis, TREBUIE sa TREACA: cota + *!* pastrata = cea salvata, nu cea noua din politica + DO asserteaza WITH 'CTRF-2 PROC_TVAV = cel salvat pe document (decizia 3, flag=1 - pastrat)', ; + lnProcTvavTemp = lnProcTvavSalvat, TRANSFORM(lnProcTvavSalvat) + ' -> ' + TRANSFORM(lnProcTvavTemp) + DO asserteaza WITH 'CTRF-3 (control) cota pastrata NU e cea noua a politicii (1.09)', ; + lnProcTvavTemp <> 1.09, TRANSFORM(lnProcTvavTemp) + ENDIF + + DO CazContractRevert WITH lnIdPolArt, lnProcTvavVechi, lnIdCtrArtNou +ENDPROC + + +*============================================================================================== +* CazElseFlag: acelasi setup ca CazElse, dar apel cu 28 argumente - flag=1, V_PROC_TVAV_TEMP = +* cota salvata (1.19). +*============================================================================================== +PROCEDURE CazElseFlag + LOCAL lnCotaVeche, lnProcTvavSalvat, lnProcTvavTemp, llOk + + lnProcTvavSalvat = Val1([select proc_tvav as v from vanzari_detalii where id_vanzare_det = 481]) + DO asserteaza WITH 'PRECONDITIE linia reala 481 are proc_tvav salvat = 1.19', lnProcTvavSalvat = 1.19, TRANSFORM(lnProcTvavSalvat) + + lnCotaVeche = Val1([select cota_tva as v from jtva_coloane where id_jtva_coloana = 1]) + STRTOFILE('SETUP inainte: jtva_coloane.cota_tva (id=1) = ' + TRANSFORM(lnCotaVeche) + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'PRECONDITIE cota_tva porneste de la 19', lnCotaVeche = 19, TRANSFORM(lnCotaVeche) + + llOk = goExecutor.oExecuta([update jtva_coloane set cota_tva = 9 where id_jtva_coloana = 1]) + DO asserteaza WITH 'SETUP update jtva_coloane reusit', llOk, TRANSFORM(llOk) + IF !llOk + RETURN + ENDIF + + PRIVATE pnRezultatElseFlag + pnRezultatElseFlag = -999 + LOCAL lcSqlApel2, lnSuccesApel2 + lcSqlApel2 = [begin pack_facturare.nregenerare_editare := 1; pack_facturare.ntip := 1; ] + ; + [pack_facturare.adauga_articol_factura(] + ; + [999004, 691698485, '', '', NULL, NULL, 0, NULL, NULL, ] + ; + [100, 1, 0, 1, 1, 0, 'XXXX', 1, 1, 1, NULL, NULL, 100, NULL, NULL, 8, NULL, NULL, ] + ; + ALLTRIM(STR(lnProcTvavSalvat,18,4)) + [); ] + ; + [select proc_tvav into ?@pnRezultatElseFlag from vanzari_detalii_temp where id_temp = 999004; ] + ; + [pack_facturare.nregenerare_editare := 0; end;] + lnSuccesApel2 = goExecutor.oExecute(lcSqlApel2) + llOk = (lnSuccesApel2 >= 0) + STRTOFILE('goExecutor.cEroare dupa apel: [' + NVL(goExecutor.cEroare,'') + ']' + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'ELSEF-1 apelul (28 arg, flag=1) la adauga_articol_factura a reusit (fara exceptie Oracle)', llOk, TRANSFORM(lnSuccesApel2) + + IF llOk + lnProcTvavTemp = NVL(pnRezultatElseFlag, -1) + STRTOFILE('ELSEF proc_tvav in VANZARI_DETALII_TEMP: ' + TRANSFORM(lnProcTvavTemp) + ; + ' (salvat_pe_document=' + TRANSFORM(lnProcTvavSalvat) + ', cota_noua_asteptata=1.09)' + CHR(13) + CHR(10), gcErrLog, 1) + + DO asserteaza WITH 'ELSEF-2 PROC_TVAV = cel salvat pe document (decizia 3, flag=1 - pastrat)', ; + lnProcTvavTemp = lnProcTvavSalvat, TRANSFORM(lnProcTvavSalvat) + ' -> ' + TRANSFORM(lnProcTvavTemp) + DO asserteaza WITH 'ELSEF-3 (control) cota pastrata NU e cea noua din JTVA_COLOANE (1.09)', ; + lnProcTvavTemp <> 1.09, TRANSFORM(lnProcTvavTemp) + ENDIF + + DO CazElseRevert WITH lnCotaVeche +ENDPROC + + +*============================================================================================== +FUNCTION Val1 + LPARAMETERS tcSql + LOCAL lnRet + lnRet = -1 + IF USED('v_val10') + USE IN v_val10 + ENDIF + IF goExecutor.oExecuta(tcSql, 'v_val10') + SELECT v_val10 + IF RECCOUNT('v_val10') > 0 + GO TOP + lnRet = NVL(v_val10.v, -1) + ENDIF + USE IN v_val10 + ELSE + STRTOFILE('EROARE Val1: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + RETURN lnRet +ENDFUNC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) + gnFail = gnFail + 1 + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC diff --git a/utile/Teste/editare_factura/test_s11_izolare_camp_1472.prg b/utile/Teste/editare_factura/test_s11_izolare_camp_1472.prg new file mode 100644 index 0000000..4eed862 --- /dev/null +++ b/utile/Teste/editare_factura/test_s11_izolare_camp_1472.prg @@ -0,0 +1,259 @@ +* test_s11_izolare_camp_1472.prg +* Proba S11 (docs\raport_s11_cauza_1472_camp.md): izoleaza EXACT campul/campurile NULL din poArt +* care duc lcSql la NULL in frm_facturare_articole2.do_scrie_articole (ofacturare.vc2:19977-20001). +* Tipar identic cu test_s10_cablare_vfp.prg (mock pe goExecutor, NIMIC scris in Oracle): doc 630 +* incarcat REAL (IncarcaAntetFacturaEditare + IncarcaLiniiFacturaEditare, citire, goExecutor real), +* apoi goExecutor inlocuit cu mock INAINTE de do_scrie_articole(). Fara curatare/REPLACE ALL pe +* crsfactura la Pasul 1 - vrem NULL-urile REALE, nu ascunse. +* +* Pasul 1: enumera (AFIELDS) toate campurile din crsfactura, logheaza VARTYPE/ISNULL pe fiecare, +* pe fiecare rand. +* Pasul 2: apeleaza do_scrie_articole() cu mock, capteaza lcSql brut per apel, verifica VARTYPE. +* Pasul 3 (cauzalitate, sens 1): pe cursorul curatat DOAR pe campul/campurile gasite NULL la pasul 1 +* SI nepazite in cod (candidatii: id_articol, id_jtva_coloana - singurele doua campuri din +* lista nepazita 19978-20000 care sunt si NULL-capabile in structura crsfactura, cf. +* creeaza_facturacrs, ofacturare_comun.prg:1801-1811), reruleaza - asteptam VARTYPE='C'. +* Pasul 4 (cauzalitate, sens 2): reintroduce NULL pe UN SINGUR camp cauzal, reruleaza - asteptam +* VARTYPE='X' din nou. +LPARAMETERS tnCaz + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail +PUBLIC poDate + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s11_izolare_camp_1472_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +LOCAL lcPathVechi, lcPathNou +lcPathVechi = SET("PATH") +lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi +SET PATH TO &lcPathNou + +PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnPass = 0 +gnFail = 0 + +PUBLIC gcSqlUltim, gcVartypeUltim +gcSqlUltim = '' +gcVartypeUltim = '' + +DO Izoleaza + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*============================================================================================== +PROCEDURE Izoleaza + LOCAL lnIdV + lnIdV = 630 + + LOCAL lnDiscRon, lnDiscVal + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal) + DO asserteaza WITH '0a antetul documentului ' + TRANSFORM(lnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate) + IF VARTYPE(poDate) <> 'O' + RETURN + ENDIF + + IncarcaLiniiFacturaEditare(poDate, lnIdV) + DO asserteaza WITH '0b liniile documentului ' + TRANSFORM(lnIdV) + ' s-au incarcat', ; + USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1)) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + RETURN + ENDIF + + *!* curatare LOCALA (doar in RAM) doar pe ce trebuie ca sa nu strice testul de baza: + *!* fara ")" accidental in text, toate randurile pe branch-ul adauga_articol_factura + SELECT crsfactura + REPLACE ALL explicatie WITH 'test-s11-izolare', serie WITH '', lot WITH '', opt_facturare WITH 0 IN crsfactura + GO TOP IN crsfactura + + *!* PASUL 1: enumerare EFECTIVA (AFIELDS), nu lista ghicita - toate campurile, toate randurile + LOCAL laFields[1], lnFields, lnI, lnRand + lnFields = AFIELDS(laFields, 'crsfactura') + STRTOFILE('--- PASUL 1: campuri NULL in crsfactura, pe fiecare rand (' + TRANSFORM(RECCOUNT('crsfactura')) + ' randuri) ---' + CHR(13) + CHR(10), gcErrLog, 1) + SELECT crsfactura + SCAN + lnRand = RECNO('crsfactura') + LOCAL lcNuleRand + lcNuleRand = '' + FOR lnI = 1 TO lnFields + IF ISNULL(EVALUATE('crsfactura.' + laFields[lnI,1])) + lcNuleRand = lcNuleRand + laFields[lnI,1] + '(' + laFields[lnI,2] + ') ' + ENDIF + ENDFOR + IF EMPTY(lcNuleRand) + STRTOFILE(' rand ' + TRANSFORM(lnRand) + ': niciun camp NULL' + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + STRTOFILE(' rand ' + TRANSFORM(lnRand) + ': NULL pe -> ' + lcNuleRand + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + ENDSCAN + GO TOP IN crsfactura + + *!* PASUL 2: rulare BRUTA (fara nicio curatare pe campuri numerice) - reproduce defectul + DO RuleazaCuMock WITH 'PAS2-brut' + DO asserteaza WITH 'PAS2 lcSql BRUT (fara curatare) e NULL (VARTYPE X) - reproduce defectul', gcVartypeUltim = 'X', gcVartypeUltim + + *!* PASUL 3: cauzalitate sens 1 - NVL DOAR pe candidatii NULL-capabili si nepaziti in cod + *!* (id_articol: ofacturare.vc2:19979; id_jtva_coloana: ofacturare.vc2:19994) - singurii doi + *!* campuri din lista nepazita 19978-20000 care sunt NULL-capabili in structura crsfactura + *!* (ofacturare_comun.prg:1801-1811 - restul candidatilor nepaziti in SQL nu sunt marcati NULL + *!* in CREATE CURSOR, deci nu pot ajunge NULL pe acest traseu, indiferent de sursa Oracle). + SELECT crsfactura + REPLACE ALL id_articol WITH NVL(id_articol,0), id_jtva_coloana WITH NVL(id_jtva_coloana,0) IN crsfactura + GO TOP IN crsfactura + DO RuleazaCuMock WITH 'PAS3-curat-id_articol-id_jtva_coloana' + DO asserteaza WITH 'PAS3 dupa NVL DOAR pe id_articol+id_jtva_coloana, lcSql devine text (VARTYPE C)', gcVartypeUltim = 'C', gcVartypeUltim + + *!* PASUL 4: cauzalitate sens 2 - reintroduce NULL pe UN SINGUR camp (id_articol) pe primul rand + SELECT crsfactura + GO TOP IN crsfactura + REPLACE id_articol WITH .NULL. IN crsfactura + DO RuleazaCuMock WITH 'PAS4-regresie-doar-id_articol-null' + DO asserteaza WITH 'PAS4 cu id_articol NULL pe un rand (restul curat), lcSql redevine NULL (VARTYPE X)', gcVartypeUltim = 'X', gcVartypeUltim + + *!* PASUL 5: control - NULL DOAR pe id_jtva_coloana (id_articol curat), separat de id_articol + SELECT crsfactura + GO TOP IN crsfactura + REPLACE ALL id_articol WITH NVL(id_articol,0) IN crsfactura + GO TOP IN crsfactura + REPLACE id_jtva_coloana WITH .NULL. IN crsfactura + DO RuleazaCuMock WITH 'PAS5-regresie-doar-id_jtva_coloana-null' + DO asserteaza WITH 'PAS5 cu id_jtva_coloana NULL pe un rand (restul curat), lcSql redevine NULL (VARTYPE X)', gcVartypeUltim = 'X', gcVartypeUltim +ENDPROC + + +*============================================================================================== +* RuleazaCuMock: apeleaza do_scrie_articole() cu goExecutor mockat, intoarce lcSql-ul (sau +* diagnosticul VARTYPE) al APELULUI cu PCOUNT()=1 (adauga_articol_factura din Scan), plus +* rollback pe conexiunea REALA dupa fiecare rulare (tranzactia ramane deschisa pe succes). +*============================================================================================== +PROCEDURE RuleazaCuMock + LPARAMETERS tcPrefix + LOCAL loForm, loMock, loExecutorReal, llReturn + + loForm = CREATEOBJECT('frm_facturare_articole2') + + IF TYPE('plRegenerareEditare') <> 'U' + RELEASE plRegenerareEditare + ENDIF + + loExecutorReal = goExecutor + loMock = CREATEOBJECT('MockGoExecutorS11Izolare') + goExecutor = loMock + + llReturn = loForm.do_scrie_articole() + + goExecutor = loExecutorReal + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + + gcSqlUltim = loMock.cSqlArticolCapturat + gcVartypeUltim = loMock.cVartypeArticol + + STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ' VARTYPE(tcSql pe apelul articol)=' + gcVartypeUltim + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(tcPrefix + ' --- lcSql capturat (apelul articol) ---' + CHR(13) + CHR(10) + TRANSFORM(gcSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1) + + RELEASE loForm +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) + IF TYPE('gnHandle') = 'N' AND gnHandle > 0 + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + ENDIF + gnFail = gnFail + 1 + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC + + +*============================================================================================== +* MockGoExecutorS11Izolare: captureaza, pe FIECARE apel oExecute, PCOUNT()/VARTYPE(tcSql); retine +* separat apelul cu PCOUNT()=1 (semnatura do_scrie_articole pentru adauga_articol_factura, spre +* deosebire de apelul antetului care are 0 parametri suplimentari observabili din tcSql insusi - +* de fapt toate apelurile din do_scrie_articole trec 1 parametru; distingem prin continut: apelul +* articolului contine 'adauga_articol_factura' SAU e chiar cel NULL de pe randul cu bug-ul cautat - +* pastram DOAR ultimul apel (cel mai relevant, cel din Scan) pentru comparatie inainte/dupa. +*============================================================================================== +DEFINE CLASS MockGoExecutorS11Izolare AS Custom + cSqlArticolCapturat = '' + cVartypeArticol = '' + nApeluri = 0 + cEroare = '' + + FUNCTION oExecute(tcSql) + THIS.nApeluri = THIS.nApeluri + 1 + LOCAL lcVartype + lcVartype = VARTYPE(m.tcSql) + *!* pastram ultimul apel care contine (in forma text) sau ar putea contine (NULL) linia de + *!* articol - primele doua apeluri din do_scrie_articole sunt garantat antetul (nu contin + *!* 'adauga_articol_factura'); din al treilea apel incolo, retinem fiecare, ultimul castiga + IF THIS.nApeluri >= 3 + THIS.cSqlArticolCapturat = TRANSFORM(m.tcSql) + THIS.cVartypeArticol = m.lcVartype + ENDIF + RETURN 1 + ENDFUNC + + FUNCTION oExecuta(tcSql, tcCursor) + THIS.nApeluri = THIS.nApeluri + 1 + IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor) + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + CREATE CURSOR (m.tcCursor) (xdummy I) + ENDIF + RETURN .T. + ENDFUNC + + FUNCTION oPrelucrareEroare() + RETURN 'MockGoExecutorS11Izolare: ' + THIS.cEroare + ENDFUNC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s11_reparatie_1472.prg b/utile/Teste/editare_factura/test_s11_reparatie_1472.prg new file mode 100644 index 0000000..05beee9 --- /dev/null +++ b/utile/Teste/editare_factura/test_s11_reparatie_1472.prg @@ -0,0 +1,225 @@ +* test_s11_reparatie_1472.prg +* Proba reparatiei S11 (docs\raport_s11_reparatie_1472.md): confirma ca garda Nvl(...,[NULL]) +* aplicata pe poArt.id_articol (ofacturare.vc2:19979) si poArt.id_jtva_coloana (ofacturare.vc2:19994, +* in frm_facturare_articole2.do_scrie_articole) repara EROAREA 1472 pe documentul 630, fara sa +* schimbe lcSql-ul pe randuri fara NULL pe aceste doua campuri (neregresie). +* +* Tipar identic cu test_s11_izolare_camp_1472.prg: mock pe goExecutor, NIMIC scris in Oracle, +* document 630 incarcat REAL (IncarcaAntetFacturaEditare + IncarcaLiniiFacturaEditare), goExecutor +* inlocuit cu mock DOAR dupa incarcare, inaintea do_scrie_articole(). +* +* PAS1 (regresia care conta): doc 630 BRUT (id_articol ramane NULL, ca in Oracle) - inainte de +* reparatie VARTYPE(lcSql)='X' (control negativ, citat din +* docs\raport_s11_cauza_1472_camp.md §4 PAS2-brut, nu s-a rerulat). Asteptam acum VARTYPE='C'. +* PAS2 (neregresie, comparatie caracter-cu-caracter): acelasi scenariu ca PAS3 din +* test_s11_izolare_camp_1472.prg (id_articol/id_jtva_coloana normalizate cu NVL(...,0), ca sa +* nu mai fie NULL) - garda noua e un no-op pe valori ne-NULL, deci lcSql trebuie sa fie +* IDENTIC, caracter cu caracter, cu sirul deja capturat inainte de reparatie +* (docs\raport_s11_cauza_1472_camp.md §4 PAS3, citat mai jos ca literal). +LPARAMETERS tnCaz + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail +PUBLIC poDate + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s11_reparatie_1472_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +LOCAL lcPathVechi, lcPathNou +lcPathVechi = SET("PATH") +lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi +SET PATH TO &lcPathNou + +PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnPass = 0 +gnFail = 0 + +PUBLIC gcSqlUltim, gcVartypeUltim +gcSqlUltim = '' +gcVartypeUltim = '' + +DO ProbaReparatie + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*============================================================================================== +PROCEDURE ProbaReparatie + LOCAL lnIdV + lnIdV = 630 + + LOCAL lnDiscRon, lnDiscVal + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal) + DO asserteaza WITH '0a antetul documentului ' + TRANSFORM(lnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate) + IF VARTYPE(poDate) <> 'O' + RETURN + ENDIF + + IncarcaLiniiFacturaEditare(poDate, lnIdV) + DO asserteaza WITH '0b liniile documentului ' + TRANSFORM(lnIdV) + ' s-au incarcat', ; + USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1)) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + RETURN + ENDIF + + *!* curatare LOCALA (doar in RAM), identica cu test_s11_izolare_camp_1472.prg + SELECT crsfactura + REPLACE ALL explicatie WITH 'test-s11-izolare', serie WITH '', lot WITH '', opt_facturare WITH 0 IN crsfactura + GO TOP IN crsfactura + + *!* PAS1: doc 630 BRUT (id_articol ramane NULL) - proba REGRESIEI CARE CONTA + DO RuleazaCuMock WITH 'PAS1-brut-postfix' + DO asserteaza WITH 'PAS1 lcSql BRUT (id_articol NULL, ca in Oracle) e text valid dupa reparatie (VARTYPE C)', gcVartypeUltim = 'C', gcVartypeUltim + IF gcVartypeUltim = 'C' + DO asserteaza WITH 'PAS1 lcSql contine apelul adauga_articol_factura', 'pack_facturare.adauga_articol_factura(' $ gcSqlUltim, gcSqlUltim + ENDIF + + *!* PAS2: neregresie - acelasi scenariu ca PAS3 din test_s11_izolare_camp_1472.prg (id_articol, + *!* id_jtva_coloana normalizate cu NVL(...,0)); garda e no-op pe valori ne-NULL, deci lcSql + *!* trebuie sa fie IDENTIC caracter-cu-caracter cu sirul capturat INAINTE de reparatie + *!* (docs\raport_s11_cauza_1472_camp.md §4 PAS3, citat literal, nu recalculat). + SELECT crsfactura + GO TOP IN crsfactura + REPLACE ALL id_articol WITH NVL(id_articol,0), id_jtva_coloana WITH NVL(id_jtva_coloana,0) IN crsfactura + GO TOP IN crsfactura + DO RuleazaCuMock WITH 'PAS2-neregresie-normalizat' + + LOCAL lcAsteptatDinRaportInainteDeReparatie + lcAsteptatDinRaportInainteDeReparatie = "begin pack_facturare.adauga_articol_factura(905,0,'','test-s11-izolare',NULL,0,0.0000,NULL,NULL,100.00,0,0,0,1.000,0.00,'',0.000000,1,0,0,0,0.0000,0,134,8,NULL,'',1.1900); end;" + + DO asserteaza WITH 'PAS2 lcSql (dupa reparatie, valori ne-NULL) e IDENTIC caracter-cu-caracter cu sirul din raportul dinainte de reparatie', ; + ALLTRIM(gcSqlUltim) == ALLTRIM(lcAsteptatDinRaportInainteDeReparatie), 'CAPTURAT: ' + TRANSFORM(gcSqlUltim) + + STRTOFILE('PAS2 --- sirul asteptat (din raport, dinainte de reparatie) ---' + CHR(13) + CHR(10) + lcAsteptatDinRaportInainteDeReparatie + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('PAS2 --- sirul capturat (dupa reparatie) ---' + CHR(13) + CHR(10) + TRANSFORM(gcSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*============================================================================================== +* RuleazaCuMock: apeleaza do_scrie_articole() cu goExecutor mockat, intoarce lcSql-ul (sau +* diagnosticul VARTYPE) al APELULUI cu PCOUNT()=1 (adauga_articol_factura din Scan), plus +* rollback pe conexiunea REALA dupa fiecare rulare (tranzactia ramane deschisa pe succes). +*============================================================================================== +PROCEDURE RuleazaCuMock + LPARAMETERS tcPrefix + LOCAL loForm, loMock, loExecutorReal, llReturn + + loForm = CREATEOBJECT('frm_facturare_articole2') + + IF TYPE('plRegenerareEditare') <> 'U' + RELEASE plRegenerareEditare + ENDIF + + loExecutorReal = goExecutor + loMock = CREATEOBJECT('MockGoExecutorS11Reparatie') + goExecutor = loMock + + llReturn = loForm.do_scrie_articole() + + goExecutor = loExecutorReal + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + + gcSqlUltim = loMock.cSqlArticolCapturat + gcVartypeUltim = loMock.cVartypeArticol + + STRTOFILE(tcPrefix + ' do_scrie_articole()=' + TRANSFORM(llReturn) + ' VARTYPE(tcSql pe apelul articol)=' + gcVartypeUltim + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE(tcPrefix + ' --- lcSql capturat (apelul articol) ---' + CHR(13) + CHR(10) + TRANSFORM(gcSqlUltim) + CHR(13) + CHR(10), gcErrLog, 1) + + RELEASE loForm +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) + IF TYPE('gnHandle') = 'N' AND gnHandle > 0 + SQLROLLBACK(gnHandle) + SQLSetProp(gnHandle, 'Transactions', 1) + ENDIF + gnFail = gnFail + 1 + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC + + +*============================================================================================== +* MockGoExecutorS11Reparatie: identic cu MockGoExecutorS11Izolare (test_s11_izolare_camp_1472.prg), +* clasa distincta doar ca sa nu se coliziona cu cea din fisierul de izolare pe acelasi SET PROCEDURE. +*============================================================================================== +DEFINE CLASS MockGoExecutorS11Reparatie AS Custom + cSqlArticolCapturat = '' + cVartypeArticol = '' + nApeluri = 0 + cEroare = '' + + FUNCTION oExecute(tcSql) + THIS.nApeluri = THIS.nApeluri + 1 + LOCAL lcVartype + lcVartype = VARTYPE(m.tcSql) + IF THIS.nApeluri >= 3 + THIS.cSqlArticolCapturat = TRANSFORM(m.tcSql) + THIS.cVartypeArticol = m.lcVartype + ENDIF + RETURN 1 + ENDFUNC + + FUNCTION oExecuta(tcSql, tcCursor) + THIS.nApeluri = THIS.nApeluri + 1 + IF VARTYPE(m.tcCursor) = 'C' AND !EMPTY(m.tcCursor) + IF USED(m.tcCursor) + USE IN (m.tcCursor) + ENDIF + CREATE CURSOR (m.tcCursor) (xdummy I) + ENDIF + RETURN .T. + ENDFUNC + + FUNCTION oPrelucrareEroare() + RETURN 'MockGoExecutorS11Reparatie: ' + THIS.cEroare + ENDFUNC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s14_grid_coloane_modif.prg b/utile/Teste/editare_factura/test_s14_grid_coloane_modif.prg new file mode 100644 index 0000000..d4b52ba --- /dev/null +++ b/utile/Teste/editare_factura/test_s14_grid_coloane_modif.prg @@ -0,0 +1,106 @@ +* test_s14_grid_coloane_modif.prg +* Verifica headless coloanele noi de audit-modificare (id_utilm/utilm/dataoram) in cursorul +* crsfacturi construit exact ca oproceduri_facturare.vizualizare_facturi (S14, decizia 65). +* Nu deschide niciun formular - doar gencursor + afisare(), citire pe structura si valori. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s14_grid_coloane_modif_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +PUBLIC gnPass, gnFail +gnPass = 0 +gnFail = 0 + +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +*!* --- exact lcSchema/lcSelect din oproceduri_facturare.prg:340-362, dupa S14 --- +LOCAL lcSchema, lcSelect, lcOrder, lcFiltru +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),id_utilm I,utilm c(30),dataoram t,delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,id_utilm,utilm,dataoram,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +lcOrder = [data_act,numar_act] +lcFiltru = [rownum <= 10 and sters = 0] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +DO asserteaza WITH 'crsfacturi incarcat (rownum>0)', Used('crsfacturi') AND Reccount('crsfacturi') > 0, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') + +IF Used('crsfacturi') + Select crsfacturi + DO asserteaza WITH 'camp id_utilm exista, tip N', Type('crsfacturi.id_utilm') = 'N', Type('crsfacturi.id_utilm') + DO asserteaza WITH 'camp utilm exista, tip C', Type('crsfacturi.utilm') = 'C', Type('crsfacturi.utilm') + DO asserteaza WITH 'camp dataoram exista, tip T', Type('crsfacturi.dataoram') = 'T', Type('crsfacturi.dataoram') + + LOCAL lnConIdUtilm + lnConIdUtilm = 0 + Select crsfacturi + Scan + IF !Isnull(id_utilm) AND id_utilm != 0 + lnConIdUtilm = m.lnConIdUtilm + 1 + ENDIF + Endscan + IF m.lnConIdUtilm = 0 + STRTOFILE('ATENTIE: zero randuri cu id_utilm completat in esantion (rownum<=10) - absenta din date, nu dovada de defect' + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + STRTOFILE('gasit ' + TRANSFORM(m.lnConIdUtilm) + ' rand(uri) cu id_utilm completat' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + Use In crsfacturi +ENDIF + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + +PROCEDURE asserteaza + LPARAMETERS tcEticheta, tlConditie, tcDetaliu + IF m.tlConditie + gnPass = m.gnPass + 1 + STRTOFILE('PASS: ' + m.tcEticheta + ' (' + Transform(m.tcDetaliu) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = m.gnFail + 1 + STRTOFILE('FAIL: ' + m.tcEticheta + ' (' + Transform(m.tcDetaliu) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLine + STRTOFILE('EROARE ' + TRANSFORM(m.tnError) + ': ' + m.tcMessage + ' in ' + m.tcProgram + ' linia ' + TRANSFORM(m.tnLine) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC diff --git a/utile/Teste/editare_factura/test_s14_neregresie_emitere_noua.prg b/utile/Teste/editare_factura/test_s14_neregresie_emitere_noua.prg new file mode 100644 index 0000000..9bfd2bc --- /dev/null +++ b/utile/Teste/editare_factura/test_s14_neregresie_emitere_noua.prg @@ -0,0 +1,786 @@ +* test_s14_neregresie_emitere_noua.prg +* VIZIBIL (grid): proba de neregresie S14 pe calea de EMITERE NOUA (nu editare). +* Secventa: D0 = emitere noua (v1, frm_facturare_articole, tip 1) -> reemitere HEADLESS a lui D0 +* (v2, frm_facturare_articole2.do_scrie_factura() apelat direct, ca in test_s9_4_regenerare.prg +* Rularea2) -> D2 = a doua emitere noua (v1, ACELASI proces VFP, fara restart). D1 = documentul +* nascut din reemiterea lui D0. +* +* Risc verificat: pack_facturare.nid_util_fortat/ddataora_fortata sunt variabile de sesiune +* Oracle (PACK_FACTURARE), nu VFP - fortate la reemiterea D0->D1 si curatate simetric in +* do_scrie_factura (ofacturare.vc2, v2). Daca CurataAuditCreareFortat ar lipsi sau ar fi ocolita, +* D2 (scris prin v1, care NU are deloc cod S14 - do_scrie_articole/do_scrie_factura proprii, alta +* zona a fisierului) ar mosteni tacut ID_UTIL/DATAORA fortate de reemiterea anterioara, fiindca +* INSERT-ul din scrie_in_vanzari e comun ambelor forme. +* +* Variabilele de pachet nu sunt selectabile direct din SQL (stare PL/SQL, nu date de tabel) - +* verificarea lor "sunt NULL la final" se face prin efectul observabil: DATAORA lui D2 trebuie sa +* fie proaspata (acum), nu cea transportata la D1 (data crearii lui D0, cu minute in urma). +* +* v1 (D0, D2): traseul si ocolirea din test_s6_1_lista_preturi.prg (incarca_cursor_articole + +* do_adauga_articol(.T.) direct, apoi but_termin1.Click() - FRM_ALTE_DATE condus de driver+timer, +* tehnica identica, copiata din acel fisier). +* v2 (D1): traseul din test_s9_4_regenerare.prg Rularea2 (IncarcaAntetFacturaEditare + +* IncarcaLiniiFacturaEditare + CreeazaSnapshotEditare, o cantitate modificata forteaza ruta 1 = +* regenerare, do_scrie_factura() apelat direct - fara Show(), fara buton, fara modal). +* +* Rulare: powershell -ExecutionPolicy Bypass -File test_s14_neregresie_emitere_noua.ps1 (timeout >= 400s) +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out\test_s14_neregresie_emitere_noua.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167; +* gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat +PUBLIC goDriverS14P4, gcClaseVazute, gcSyncDir, gcUILog, gnCantitateAleasa +PUBLIC gcUltimaSerie, gnUltimulNract + +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out\test_s14_neregresie_emitere_noua.log" +IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out") + MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\out" +ENDIF +gcUILog = gcLog +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\uisync_s14p4\" +IF !DIRECTORY(gcSyncDir) + MD (gcSyncDir) +ENDIF +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog) +gnPass = 0 +gnFail = 0 +gnErr = 0 +gcCaz = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +gcClaseVazute = ";" +gcNumere = "" +gnCantitateAleasa = 2 +gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg" + +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE +DO HarnessInit + +*-- poDate & co. se declara SI se initializeaza la nivelul programului principal: metodele din .vcx +*-- le vad numai daca variabila exista deja pe stiva de sub ele (capcana platita la S8). +PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, poSnapshotEditare +poDate = NULL +poGeneratorNumere = NULL +poDateGestiuneDest = NULL +poSnapshotEditare = NULL + +ON ERROR DO S14P4Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + *-- stub_verificare PRIMUL: "Do Form verificare" (ofacturare.vc2:14404 / :20126) rezolva la stub + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + + 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 S14P4Log WITH 'EROARE: conectare Oracle esuata' + DO S14P4Final + ENDIF + SQLSETPROP(gnHandle, "QueryTimeOut", 45) + DO S14P4Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg" ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg" ADDITIVE + SET PROCEDURE TO (gcMock) ADDITIVE + + IF !actualizeaza_optiuni_program() + DO S14P4Log WITH 'EROARE: actualizeaza_optiuni_program()' + DO S14P4Final + ENDIF + gnScadereStoc = 0 + gnFactSeturi = 0 + gnIdSucursala = 167 + goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]) + gnIdUtil = 8 + goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) + DO S14P4Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ; + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ; + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + PUBLIC gdZiCurs + gdZiCurs = DataCursValid() + DO S14P4Log WITH ' zi_curs folosita pentru toate documentele: ' + DTOC(gdZiCurs) + + *-- driver + timer: FRM_ALTE_DATE (v1, .Show(1) neconditionat la inainte_de_do_termin) si + *-- formele modale MESSAGEBOX_FORM nu trec prin functia amessagebox - mock-ul nu le acopera. + *-- Tehnica validata la S5c/S6-1/S6-5. + goDriverS14P4 = CREATEOBJECT('driverS14P4') + _SCREEN.AddObject('tmrS14P4', 'Timer') + _SCREEN.tmrS14P4.Interval = 200 + BINDEVENT(_SCREEN.tmrS14P4, 'Timer', goDriverS14P4, 'Executa') + _SCREEN.tmrS14P4.Enabled = .T. + + DO HarnessStep WITH 0, 'env gata', 8 + + DO S14P4Log WITH CHR(13) + CHR(10) + '===== ALEGEREA A DOUA ARTICOLE (comune D0 si D2) =====' + IF !AlegeArticole() + DO Assert WITH .F., 'alegerea celor doua articole a esuat - vezi log' + DO S14P4Final + ENDIF + + LOCAL lnIdV0, lnIdV1, lnIdV2, lcSer0, lnNr0, lcSer2, lnNr2 + LOCAL lnIdUtil0, ldDataora0, lnIdUtilm0, ldDataoram0, llUtilmNul0, llDataoramNul0 + LOCAL lnIdUtil1, ldDataora1, lnIdUtilm1, ldDataoram1, llUtilmNul1, llDataoramNul1 + LOCAL lnIdUtil2, ldDataora2, lnIdUtilm2, ldDataoram2, llUtilmNul2, llDataoramNul2 + STORE 0 TO lnIdV0, lnIdV1, lnIdV2, lnNr0, lnNr2 + STORE '' TO lcSer0, lcSer2 + + DO S14P4Log WITH CHR(13) + CHR(10) + '===== D0: EMITERE NOUA (v1, frm_facturare_articole) =====' + lnIdV0 = EmiteDocNou() + lcSer0 = gcUltimaSerie + lnNr0 = gnUltimulNract + DO Assert WITH lnIdV0 > 0, 'D0 s-a scris (baza pentru reemitere), id_vanzare=' + TRANSFORM(lnIdV0) + IF lnIdV0 <= 0 + DO S14P4Final + ENDIF + IF !CitesteAuditVanzare(lnIdV0, @lnIdUtil0, @ldDataora0, @lnIdUtilm0, @ldDataoram0, @llUtilmNul0, @llDataoramNul0) + DO Assert WITH .F., 'D0: citirea auditului (ID_UTIL/DATAORA) a esuat' + DO S14P4Final + ENDIF + DO S14P4Log WITH ' D0 id_vanzare=' + TRANSFORM(lnIdV0) + ' serie=' + lcSer0 + ' nr=' + TRANSFORM(lnNr0) + ; + ' id_util=' + TRANSFORM(lnIdUtil0) + ' dataora=' + TTOC(ldDataora0) + ; + ' id_utilm_null=' + TRANSFORM(llUtilmNul0) + ' dataoram_null=' + TRANSFORM(llDataoramNul0) + DO Assert WITH llUtilmNul0 AND llDataoramNul0, 'D0 (document nou, fara editare): ID_UTILM/DATAORAM NULL' + DO HarnessStep WITH 1, 'D0 emis', 8 + + DO S14P4Log WITH CHR(13) + CHR(10) + '===== D1: REEMITERE HEADLESS a lui D0 (v2, do_scrie_factura direct) =====' + lnIdV1 = ReemiteDocument(lnIdV0) + DO Assert WITH lnIdV1 > 0, 'D1 s-a scris (reemiterea lui D0), id_vanzare=' + TRANSFORM(lnIdV1) + IF lnIdV1 <= 0 + DO S14P4Final + ENDIF + IF !CitesteAuditVanzare(lnIdV1, @lnIdUtil1, @ldDataora1, @lnIdUtilm1, @ldDataoram1, @llUtilmNul1, @llDataoramNul1) + DO Assert WITH .F., 'D1: citirea auditului (ID_UTIL/DATAORA) a esuat' + DO S14P4Final + ENDIF + DO S14P4Log WITH ' D1 id_vanzare=' + TRANSFORM(lnIdV1) + ' id_util=' + TRANSFORM(lnIdUtil1) + ' dataora=' + TTOC(ldDataora1) + ; + ' id_utilm=' + TRANSFORM(lnIdUtilm1) + ' dataoram=' + TTOC(ldDataoram1) + gcCaz = '[D1 reemitere - context, mecanismul S14 e deja probat in raport_s14_vfp_transport.md] ' + DO Assert WITH lnIdUtil1 = lnIdUtil0, 'D1 pastreaza ID_UTIL-ul creatiei lui D0, e=' + TRANSFORM(lnIdUtil1) + ' vs ' + TRANSFORM(lnIdUtil0) + DO Assert WITH TTOC(ldDataora1) == TTOC(ldDataora0), 'D1 pastreaza DATAORA creatiei lui D0, e=[' + TTOC(ldDataora1) + '] vs [' + TTOC(ldDataora0) + ']' + DO Assert WITH !llUtilmNul1 AND !llDataoramNul1, 'D1 are perechea de modificare completata (ID_UTILM/DATAORAM)' + gcCaz = '' + DO HarnessStep WITH 2, 'D1 reemis', 8 + + DO S14P4Log WITH CHR(13) + CHR(10) + '===== D2: A DOUA EMITERE NOUA (v1), IN ACEEASI SESIUNE, IMEDIAT DUPA REEMITERE =====' + lnIdV2 = EmiteDocNou() + lcSer2 = gcUltimaSerie + lnNr2 = gnUltimulNract + DO Assert WITH lnIdV2 > 0, 'D2 s-a scris (emitere noua dupa reemitere), id_vanzare=' + TRANSFORM(lnIdV2) + IF lnIdV2 <= 0 + DO S14P4Final + ENDIF + IF !CitesteAuditVanzare(lnIdV2, @lnIdUtil2, @ldDataora2, @lnIdUtilm2, @ldDataoram2, @llUtilmNul2, @llDataoramNul2) + DO Assert WITH .F., 'D2: citirea auditului (ID_UTIL/DATAORA) a esuat' + DO S14P4Final + ENDIF + DO S14P4Log WITH ' D2 id_vanzare=' + TRANSFORM(lnIdV2) + ' serie=' + lcSer2 + ' nr=' + TRANSFORM(lnNr2) + ; + ' id_util=' + TRANSFORM(lnIdUtil2) + ' dataora=' + TTOC(ldDataora2) + ; + ' id_utilm_null=' + TRANSFORM(llUtilmNul2) + ' dataoram_null=' + TRANSFORM(llDataoramNul2) + + *-- discriminatorul de "acum" foloseste DOAR timpul Oracle (ldDataoram1, SYSDATE la reemitere, + *-- cateva secunde inaintea lui D2) - un DATETIME() din VFP ar compara cu ceasul clientului, + *-- care poate fi decalat fata de serverul Oracle (masurat: ~3 ore, nu e o scurgere reala) + gcCaz = '[S14-P4 NEREGRESIE emitere noua dupa reemitere] ' + DO Assert WITH lnIdUtil2 = gnIdUtil, 'S14-P4-1 D2.ID_UTIL = utilizatorul curent (' + TRANSFORM(gnIdUtil) + '), e=' + TRANSFORM(lnIdUtil2) + DO Assert WITH ldDataora2 >= ldDataoram1, ; + 'S14-P4-2a D2.DATAORA e ulterioara momentului reemiterii (SYSDATE Oracle, nu ceasul clientului), D2=[' + TTOC(ldDataora2) + '] >= reemitere=[' + TTOC(ldDataoram1) + ']' + DO Assert WITH TTOC(ldDataora2) <> TTOC(ldDataora0), ; + 'S14-P4-2b D2.DATAORA NU e transportata de la D0/D1 (fortarea nu a scapat pe calea v1), D2=[' + TTOC(ldDataora2) + '] D0/D1=[' + TTOC(ldDataora0) + ']' + DO Assert WITH llUtilmNul2, 'S14-P4-3 D2.ID_UTILM = NULL (nu e reemitere)' + DO Assert WITH llDataoramNul2, 'S14-P4-4 D2.DATAORAM = NULL (nu e reemitere)' + gcCaz = '' + + DO S14P4Log WITH CHR(13) + CHR(10) + '===== SECVENTA reemitere -> emitere noua: ' + ; + IIF(lnIdUtil2 = gnIdUtil AND TTOC(ldDataora2) <> TTOC(ldDataora0) AND llUtilmNul2 AND llDataoramNul2, 'PASS', 'FAIL') + ' =====' + DO HarnessStep WITH 3, 'D2 emis si verificat', 8 + + DO S14P4Final + +CATCH TO loExc + DO S14P4Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ; + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO S14P4Final +ENDTRY + +QUIT + +*================================================================================== +* Alegerea celor doua articole comune D0/D2: sonda cu incarca_cursor_articole (traseul real de pe +* v1), apoi TOP 2 negestionabile cu pret>0 si cota prezenta in jtva_coloane. Rezultat: crsAleseS14P4. +FUNCTION AlegeArticole + LOCAL loRez, lcStrategie + poDate = CREATEOBJECT("oDateFactura", 25000, 1) + poDate.id_client = 463 + poDate.id_delegat = 256 + poDate.zi_curs = gdZiCurs + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + + loRez = incarca_cursor_articole(1, .F., poGeneratorNumere) + DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'sonda: incarca_cursor_articole(1) a adus articole' + IF !USED('crsarticole') OR RECCOUNT('crsarticole') = 0 + DO Goleste + RETURN .F. + ENDIF + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + DO Inchide WITH 'crsCandS14P4' + SELECT TOP 30 a.* FROM crsarticole a INNER JOIN jtva_coloane j ; + ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(NVL(a.proc_tvav,0), 2) ; + WHERE NVL(a.gestionabil,0) = 0 AND NVL(a.pret,0) > 0 ; + ORDER BY a.id_articol INTO CURSOR crsCandS14P4 READWRITE + lcStrategie = 'negestionabile cu cota in jtva_coloane' + IF RECCOUNT('crsCandS14P4') < 2 + DO Inchide WITH 'crsCandS14P4' + SELECT TOP 30 a.* FROM crsarticole a INNER JOIN jtva_coloane j ; + ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(NVL(a.proc_tvav,0), 2) ; + WHERE NVL(a.pret,0) > 0 ; + ORDER BY a.id_articol INTO CURSOR crsCandS14P4 READWRITE + lcStrategie = 'orice cu cota in jtva_coloane (gestionabile incluse)' + ENDIF + IF RECCOUNT('crsCandS14P4') < 2 + DO Inchide WITH 'crsCandS14P4' + SELECT TOP 30 * FROM crsarticole ORDER BY id_articol INTO CURSOR crsCandS14P4 READWRITE + lcStrategie = 'primele din lista (nicio potrivire de cota)' + ENDIF + + DO Inchide WITH 'crsAleseS14P4' + SELECT * FROM crsCandS14P4 WHERE .F. INTO CURSOR crsAleseS14P4 READWRITE + LOCAL lnUltimulId, loRowS14P4 + lnUltimulId = -1 + SELECT crsCandS14P4 + SCAN + IF id_articol <> lnUltimulId + SCATTER MEMO NAME loRowS14P4 + INSERT INTO crsAleseS14P4 FROM NAME loRowS14P4 + lnUltimulId = id_articol + ENDIF + IF RECCOUNT('crsAleseS14P4') >= 2 + EXIT + ENDIF + ENDSCAN + DO Inchide WITH 'crsCandS14P4' + DO Assert WITH RECCOUNT('crsAleseS14P4') = 2, 'doua articole DISTINCTE alese, e=' + TRANSFORM(RECCOUNT('crsAleseS14P4')) + DO S14P4Log WITH ' strategie: ' + lcStrategie + SELECT crsAleseS14P4 + SCAN + DO S14P4Log WITH ' ales: id_articol=' + TRANSFORM(id_articol) + ' [' + ALLTRIM(TRANSFORM(denumire)) + ; + '] pret=' + TRANSFORM(pret) + ' proc_tvav=' + TRANSFORM(proc_tvav) + ' gestionabil=' + TRANSFORM(NVL(gestionabil,0)) + ENDSCAN + + DO Inchide WITH 'crsarticole' + DO Goleste + RETURN (RECCOUNT('crsAleseS14P4') = 2) +ENDFUNC + +*================================================================================== +* Emitere noua reala prin v1 (frm_facturare_articole), tip 1 - traseul si ocolirea din +* test_s6_1_lista_preturi.prg (EmiteV1): incarca_cursor_articole() inainte de formular, candidatii +* restransi la crsAleseS14P4, do_adauga_articol(.T.) direct, but_termin1.Click() (FRM_ALTE_DATE +* condus de driver+timer). +FUNCTION EmiteDocNou + LOCAL lnIdVz, lcSerie, lnNract, oform, loRez, lnI, lnFact + lnIdVz = 0 + lcSerie = '' + lnNract = 0 + gcUltimaSerie = '' + gnUltimulNract = 0 + gcCaz = '[emitere-noua] ' + + DO CuratieCrs + poDate = CREATEOBJECT("oDateFactura", 25000, 1) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + poDate.nIdTipDoc = 5 + poDate.id_client = 463 + poDate.id_delegat = 256 + poDate.zi_curs = gdZiCurs + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + DO Assert WITH poDate.rezultat_serii = 3, 'rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii) + IF poDate.rezultat_serii <> 3 + DO Goleste + RETURN 0 + ENDIF + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + DO S14P4Log WITH ' nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ; + ' nract=' + TRANSFORM(poDate.nract) + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + loRez = incarca_cursor_articole(1, .F., poGeneratorNumere) + DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'incarca_cursor_articole a adus articole' + IF !((loRez.nSucces >= 0) AND loRez.lArticole) + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (fara articole);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Goleste + RETURN 0 + ENDIF + + USE IN crsarticole + SELECT * FROM crsAleseS14P4 INTO CURSOR crsarticole READWRITE + DO Assert WITH RECCOUNT('crsarticole') = 2, 'cele doua articole alese gasite in crsarticole, e=' + TRANSFORM(RECCOUNT('crsarticole')) + + oform = CREATEOBJECT('frm_facturare_articole') + IF VARTYPE(oform) <> 'O' + DO Assert WITH .F., 'Createobject frm_facturare_articole' + DO Goleste + RETURN 0 + ENDIF + oform.WindowType = 0 + oform.Show() + DOEVENTS FORCE + + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + DO Assert WITH LOWER(ALLTRIM(oform.but_urmator1.cAction)) == 'do_urmator', 'butonul Adauga duce la do_urmator' + DO Assert WITH oform.but_urmator1.Visible, 'butonul Adauga e VIZIBIL pentru tip 1' + + FOR lnI = 1 TO RECCOUNT('crsarticole') + SELECT crsarticole + GO lnI + oform.do_adauga_articol(.T.) + ENDFOR + DOEVENTS FORCE + + lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) + DO Assert WITH lnFact = 2, 'crsfactura are exact 2 linii dupa adaugare, e=' + TRANSFORM(lnFact) + IF lnFact = 0 + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (fara linii);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Elibereaza WITH oform + DO Goleste + RETURN 0 + ENDIF + + DO SeteazaCantitati WITH 'crsfactura' + + oform.do_calculeaza_totaluri() + DOEVENTS FORCE + + lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act)) + lnNract = poDate.nract + + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + DO S14P4Log WITH ' [pas] but_termin1.Click' + oform.but_termin1.Click() + DOEVENTS FORCE + DO S14P4Log WITH ' but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + DO S14P4Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + + lnIdVz = NVL(poDate.nid_vanzare, 0) + DO Assert WITH lnIdVz > 0, 'documentul exista (poDate.nid_vanzare, parametru OUT), e=' + TRANSFORM(lnIdVz) + + IF lnIdVz > 0 + gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ';' + ELSE + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (nescris);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + lcSerie = '' + lnNract = 0 + ENDIF + + DO Elibereaza WITH oform + DO Goleste + gcUltimaSerie = lcSerie + gnUltimulNract = lnNract + RETURN lnIdVz +ENDFUNC + +*================================================================================== +* Reemiterea headless a unui document existent prin v2 (frm_facturare_articole2), traseul din +* test_s9_4_regenerare.prg Rularea2: incarca antet+linii, modifica o cantitate (forteaza ruta 1 = +* regenerare), do_scrie_factura() apelat direct - fara Show(), fara buton, fara modal. +FUNCTION ReemiteDocument + LPARAMETERS tnIdVechi + LOCAL lnCod, lnAn, lnLuna, lnIdFactVechi, lnDiscRon, lnDiscVal, loForm, llRez, lnIdVNou, lnRuta + + gcCaz = '[reemitere] ' + lnCod = 0 + lnAn = 0 + lnLuna = 0 + lnIdFactVechi = 0 + IF USED('crsAntetS14P4') + USE IN crsAntetS14P4 + ENDIF + IF goExecutor.oExecuta([select cod, id_fact, extract(year from data_act) an, extract(month from data_act) luna ] + ; + [from vanzari where id_vanzare = ] + TRANSFORM(NVL(tnIdVechi,0)), 'crsAntetS14P4') + IF RECCOUNT('crsAntetS14P4') > 0 + SELECT crsAntetS14P4 + GO TOP + lnCod = NVL(cod, 0) + lnIdFactVechi = NVL(id_fact, 0) + lnAn = NVL(an, 0) + lnLuna = NVL(luna, 0) + ENDIF + USE IN crsAntetS14P4 + ENDIF + DO Assert WITH lnCod > 0 AND lnAn > 0 AND lnLuna > 0, 'antetul lui D0 s-a citit (cod/an/luna), cod=' + TRANSFORM(lnCod) + IF lnCod <= 0 + RETURN 0 + ENDIF + + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(tnIdVechi, @lnDiscRon, @lnDiscVal) + DO Assert WITH VARTYPE(poDate) = 'O', 'antetul lui D0 s-a incarcat pentru editare' + IF VARTYPE(poDate) <> 'O' + RETURN 0 + ENDIF + + IncarcaLiniiFacturaEditare(poDate, tnIdVechi) + DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') > 0, 'liniile lui D0 s-au incarcat in crsfactura' + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + RETURN 0 + ENDIF + + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', 'Createobject frm_facturare_articole2 (fara Show)' + IF VARTYPE(loForm) <> 'O' + RETURN 0 + ENDIF + loForm.ndiscfactron = lnDiscRon + loForm.ndiscfactval = lnDiscVal + loForm.do_calculeaza_totaluri() + + poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, tnIdVechi, lnIdFactVechi, lnCod, lnAn, lnLuna) + DO Assert WITH VARTYPE(poSnapshotEditare) = 'O', 'instantaneul de editare s-a creat' + IF VARTYPE(poSnapshotEditare) <> 'O' + TRY + loForm.Release() + CATCH + ENDTRY + RETURN 0 + ENDIF + + *-- modificare de cantitate: singura schimbare care forteaza ruta 1 (regenerare) + SELECT crsfactura + GO TOP + REPLACE cantitate WITH cantitate + 1 IN crsfactura + loForm.do_calculeaza_totaluri() + + lnRuta = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura') + DO Assert WITH lnRuta = 1, 'ruta aleasa pentru modificarea de cantitate este 1 (regenerare), e=' + TRANSFORM(lnRuta) + IF lnRuta <> 1 + TRY + loForm.Release() + CATCH + ENDTRY + RETURN 0 + ENDIF + + llRez = loForm.do_scrie_factura() + DO Assert WITH llRez, 'do_scrie_factura() a intors .T. pentru reemitere' + + lnIdVNou = 0 + IF llRez + lnIdVNou = NVL(poDate.nid_vanzare, 0) + ENDIF + DO Assert WITH lnIdVNou > 0, 'poDate.nid_vanzare (OUT) a iesit cu id-ul documentului nou, e=' + TRANSFORM(lnIdVNou) + + TRY + loForm.Release() + CATCH + ENDTRY + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crsarticole_doc' + DO Inchide WITH 'crsarticole_editare' + DO Inchide WITH 'snap_linii_editare' + DO Inchide WITH 'jtva_coloane' + poSnapshotEditare = NULL + DO Goleste + gcCaz = '' + RETURN lnIdVNou +ENDFUNC + +*================================================================================== +* Citeste ID_UTIL/DATAORA/ID_UTILM/DATAORAM pentru un id_vanzare, plus flag-uri NULL distincte +* (0/{} nu s-ar distinge de o valoare reala lipsa). +FUNCTION CitesteAuditVanzare + LPARAMETERS tnIdVanzare, tnIdUtil, tdDataora, tnIdUtilm, tdDataoram, tlUtilmNul, tlDataoramNul + tnIdUtil = 0 + tdDataora = {} + tnIdUtilm = 0 + tdDataoram = {} + tlUtilmNul = .F. + tlDataoramNul = .F. + LOCAL llOk + llOk = .F. + IF USED('crsAuditS14P4') + USE IN crsAuditS14P4 + ENDIF + IF goExecutor.oExecuta([select id_util, dataora, id_utilm, dataoram, ] + ; + [case when id_utilm is null then 1 else 0 end as utilmnul, ] + ; + [case when dataoram is null then 1 else 0 end as dataoramnul ] + ; + [from vanzari where id_vanzare = ] + TRANSFORM(NVL(tnIdVanzare,0)), 'crsAuditS14P4') + IF RECCOUNT('crsAuditS14P4') > 0 + SELECT crsAuditS14P4 + GO TOP + tnIdUtil = NVL(id_util, 0) + tdDataora = NVL(dataora, {}) + tnIdUtilm = NVL(id_utilm, 0) + tdDataoram = NVL(dataoram, {}) + tlUtilmNul = (utilmnul = 1) + tlDataoramNul = (dataoramnul = 1) + llOk = (tnIdUtil > 0) + ENDIF + USE IN crsAuditS14P4 + ENDIF + RETURN llOk +ENDFUNC + +*================================================================================== +* Seteaza cantitatea (zeroita de do_initializeaza_articol pentru tip 1) pe toate liniile din +* crsfactura si recalculeaza linia, ca la S5c/S6-1. +PROCEDURE SeteazaCantitati + LPARAMETERS tcAlias + LOCAL loArt + SELECT (tcAlias) + SCAN + REPLACE cantitate WITH gnCantitateAleasa + SCATTER NAME loArt MEMO + loArt = calculeaza_totaluri(loArt) + GATHER NAME loArt MEMO + ENDSCAN +ENDPROC + +PROCEDURE Elibereaza + LPARAMETERS toForm + IF TYPE('toForm') = 'O' AND !ISNULL(toForm) + TRY + toForm.Release() + CATCH + ENDTRY + ENDIF + DO CuratieCrs +ENDPROC + +PROCEDURE Goleste + poDate = NULL + poGeneratorNumere = NULL + poDateGestiuneDest = NULL +ENDPROC + +PROCEDURE CuratieCrs + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticoleSel' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'jtva_coloane' +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +* ultima zi din luna deschisa acoperita de VCURS pentru EURO - cursor_preturi refuza o zi fara curs +FUNCTION DataCursValid + LOCAL ldRez, lcSql, lnQ, lcUltima + ldRez = DATE(gnAn, gnLuna, 1) + lcUltima = TRANSFORM(gnAn) + PADL(TRANSFORM(gnLuna), 2, '0') + '01' + IF USED('crscurszi') + USE IN crscurszi + ENDIF + lcSql = [select to_char(max(data),'YYYYMMDD') as d from vcurs ] + ; + [where upper(nume_val) = 'EURO' and data <= last_day(to_date('] + lcUltima + [','YYYYMMDD'))] + lnQ = goExecutor.oExecute(lcSql, 'crscurszi') + IF lnQ >= 0 AND USED('crscurszi') AND RECCOUNT('crscurszi') > 0 + GO TOP IN crscurszi + IF !ISNULL(crscurszi.d) AND LEN(ALLTRIM(crscurszi.d)) = 8 + ldRez = CTOD(SUBSTR(crscurszi.d,7,2) + '/' + SUBSTR(crscurszi.d,5,2) + '/' + SUBSTR(crscurszi.d,1,4)) + ENDIF + ELSE + DO S14P4Log WITH ' DataCursValid ESEC: ' + goExecutor.oPrelucrareEroare() + ENDIF + IF USED('crscurszi') + USE IN crscurszi + ENDIF + RETURN ldRez +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO S14P4Log WITH 'PASS: ' + gcCaz + tcMsg + ELSE + gnFail = gnFail + 1 + DO S14P4Log WITH 'FAIL: ' + gcCaz + tcMsg + ENDIF +ENDPROC + +PROCEDURE S14P4Log + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE S14P4Err + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnErr = gnErr + 1 + DO S14P4Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE S14P4Final + LOCAL lnI + IF TYPE('_SCREEN.tmrS14P4') = 'O' + _SCREEN.tmrS14P4.Enabled = .F. + TRY + _SCREEN.RemoveObject('tmrS14P4') + CATCH + ENDTRY + ENDIF + *-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (rulare atarnata), + *-- deci se inchid explicit inainte + FOR lnI = _SCREEN.FormCount TO 1 STEP -1 + TRY + _SCREEN.Forms(lnI).Release() + CATCH + ENDTRY + ENDFOR + *-- registrul numerelor SSS direct din baza: singura sursa care spune care numar e SCRIS si + *-- care e ARS (alocat si nescris) + TRY + IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ; + [where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 750 order by numar_act], 'crsNrSSS') >= 0 + DO S14P4Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-750):' + SELECT crsNrSSS + SCAN + DO S14P4Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ENDSCAN + USE IN crsNrSSS + ENDIF + CATCH + ENDTRY + DO S14P4Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere + DO S14P4Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr) + DO S14P4Log WITH 'END ' + TTOC(DATETIME()) + DO HarnessDone WITH 'done' + QUIT +ENDPROC + +*================================================================================== +* driverS14P4: apasa automat pe formele modale care nu trec prin functia amessagebox - +* MESSAGEBOX_FORM (cmdYes/cmdOk) si FRM_ALTE_DATE de pe v1 (do_termin, NU Release). +DEFINE CLASS driverS14P4 AS Custom + nUltimAlteDate = 0 + lBusy = .F. + + PROCEDURE Executa + IF This.lBusy + RETURN + ENDIF + This.lBusy = .T. + IF TYPE('_SCREEN.tmrS14P4') = 'O' + _SCREEN.tmrS14P4.Enabled = .F. + ENDIF + TRY + LOCAL lnI, loMsgForm, loAlteDate, lcClasa + loMsgForm = NULL + loAlteDate = NULL + FOR lnI = 1 TO _SCREEN.FormCount + lcClasa = UPPER(_SCREEN.Forms(lnI).Class) + IF 'MESSAGEBOX_FORM' $ lcClasa + loMsgForm = _SCREEN.Forms(lnI) + ENDIF + IF lcClasa == 'FRM_ALTE_DATE' + loAlteDate = _SCREEN.Forms(lnI) + ENDIF + IF !(lcClasa $ gcClaseVazute) + gcClaseVazute = gcClaseVazute + lcClasa + ';' + DO S14P4Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' + ENDIF + ENDFOR + IF !ISNULL(loMsgForm) + TRY + LOCAL lcTextMsg + lcTextMsg = '' + TRY + lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value)) + CATCH + ENDTRY + DO S14P4Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']' + DO CASE + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) + DO S14P4Log WITH ' [driver msg] apas cmgBotones.cmdYes' + loMsgForm.cmgBotones.cmdYes.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) + DO S14P4Log WITH ' [driver msg] apas cmgBotones.cmdOk' + loMsgForm.cmgBotones.cmdOk.Click() + ENDCASE + CATCH TO loExcMsg + DO S14P4Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message + ENDTRY + ELSE + IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1) + This.nUltimAlteDate = SECONDS() + TRY + DO S14P4Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ; + TRANSFORM(NVL(poDate.id_delegat, 0)) + ')' + loAlteDate.do_termin() + CATCH TO loExcAD + DO S14P4Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message + ENDTRY + ENDIF + ENDIF + CATCH TO loExcTop + DO S14P4Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message + FINALLY + IF TYPE('_SCREEN.tmrS14P4') = 'O' + _SCREEN.tmrS14P4.Enabled = .T. + ENDIF + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s14_neregresie_emitere_noua.ps1 b/utile/Teste/editare_factura/test_s14_neregresie_emitere_noua.ps1 new file mode 100644 index 0000000..64ec016 --- /dev/null +++ b/utile/Teste/editare_factura/test_s14_neregresie_emitere_noua.ps1 @@ -0,0 +1,16 @@ +# test_s14_neregresie_emitere_noua.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru +# test_s14_neregresie_emitere_noua.prg (S14, proba 4: neregresie pe calea de emitere noua). +# Rulare VIZIBILA (vfp9 -A, fereastra impinsa off-screen de harness), NU -A -T: sub -A -T +# coloanele de grid nu se materializeaza si FRM_ALTE_DATE (Show(1)) ar bloca rularea. +# Rulare: powershell -ExecutionPolicy Bypass -File test_s14_neregresie_emitere_noua.ps1 (timeout >= 400s) +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +Get-ChildItem -Path $Teste -Filter '*.FXP' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue +Get-ChildItem -Path $Teste -Filter '*.fxp' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_s14_neregresie_emitere_noua.prg') ` + -Steps @('env_gata','d0_emis','d1_reemis','d2_emis_si_verificat') ` + -StepTimeoutSec 150 ` + -ReadyTimeoutSec 180 ` + -SyncDir (Join-Path $Teste 'uisync_s14p4') ` + -ShotsDir (Join-Path $Teste 'screenshots_s14p4') diff --git a/utile/Teste/editare_factura/test_s5_al_doilea_intrare.prg b/utile/Teste/editare_factura/test_s5_al_doilea_intrare.prg index 86636e7..ae8f8a8 100644 --- a/utile/Teste/editare_factura/test_s5_al_doilea_intrare.prg +++ b/utile/Teste/editare_factura/test_s5_al_doilea_intrare.prg @@ -55,7 +55,7 @@ ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE -DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1) QUIT diff --git a/utile/Teste/editare_factura/test_s5_discount_valuta.prg b/utile/Teste/editare_factura/test_s5_discount_valuta.prg index 1e54b59..c779fe6 100644 --- a/utile/Teste/editare_factura/test_s5_discount_valuta.prg +++ b/utile/Teste/editare_factura/test_s5_discount_valuta.prg @@ -49,7 +49,7 @@ ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() *-- mock amessagebox incarcat PRIMUL, inaintea lantului real (la nume duplicat castiga primul gasit) SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE -DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1) QUIT diff --git a/utile/Teste/editare_factura/test_s5_rollback_real.prg b/utile/Teste/editare_factura/test_s5_rollback_real.prg index 9de11a5..ac4203b 100644 --- a/utile/Teste/editare_factura/test_s5_rollback_real.prg +++ b/utile/Teste/editare_factura/test_s5_rollback_real.prg @@ -60,7 +60,7 @@ ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE -DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1) QUIT diff --git a/utile/Teste/editare_factura/test_s5_scriere_reala.prg b/utile/Teste/editare_factura/test_s5_scriere_reala.prg index 65bfa77..6013cc7 100644 --- a/utile/Teste/editare_factura/test_s5_scriere_reala.prg +++ b/utile/Teste/editare_factura/test_s5_scriere_reala.prg @@ -47,7 +47,7 @@ ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() *-- mock amessagebox incarcat PRIMUL, inaintea lantului real (la nume duplicat castiga primul gasit) SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE -DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1) QUIT diff --git a/utile/Teste/editare_factura/test_s5_validari_articole.prg b/utile/Teste/editare_factura/test_s5_validari_articole.prg index e02bf69..8e57a03 100644 --- a/utile/Teste/editare_factura/test_s5_validari_articole.prg +++ b/utile/Teste/editare_factura/test_s5_validari_articole.prg @@ -43,7 +43,7 @@ ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() *!* fisierul cautat PRIMUL, deci trebuie deschis inaintea lantului din test_init_env_auto SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE -DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1) QUIT diff --git a/utile/Teste/editare_factura/test_s7_rotunjire.prg b/utile/Teste/editare_factura/test_s7_rotunjire.prg index bf2712e..8199da4 100644 --- a/utile/Teste/editare_factura/test_s7_rotunjire.prg +++ b/utile/Teste/editare_factura/test_s7_rotunjire.prg @@ -34,7 +34,7 @@ ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE -DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1) QUIT diff --git a/utile/Teste/editare_factura/test_s7_urmasi.prg b/utile/Teste/editare_factura/test_s7_urmasi.prg new file mode 100644 index 0000000..78375c3 --- /dev/null +++ b/utile/Teste/editare_factura/test_s7_urmasi.prg @@ -0,0 +1,130 @@ +* test_s7_urmasi.prg +* Verifica DocumentAreUrmasi (ofacturare_editare.prg), functie noua S7: interogare read-only +* pe VANZARI_CORESP, aceeasi conditie citita de pack_facturare.sterge_factura, dar mai devreme. +* Documente reale, gasite prin interogare (nu inventate): un aviz cu factura emisa din el +* (id_vanzare_aviz dintr-un rand TIP=1), un aviz fara nicio corespondenta, si o factura cu +* retur emis pe ea (id_vanzare_aviz dintr-un rand TIP=3). Nu scrie in Oracle - doar SELECT. +* Verifica de asemenea ca Createobject('frm_facturi') compileaza clasa dupa adaugarea metodei +* noi do_editare_unificata (fara Show() - doar proba de compilare/instantiere). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s7_urmasi_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 + +*!* --- control direct pe DocumentAreUrmasi, fara formular --- +*!* id_vanzare=664: aviz cu factura emisa din el (vanzari_coresp.tip=1) -> are urmasi +DO asserteaza WITH 'DocumentAreUrmasi(664) = .T. (aviz cu factura emisa)', DocumentAreUrmasi(664), TRANSFORM(DocumentAreUrmasi(664)) + +*!* id_vanzare=1061: aviz fara nicio corespondenta in vanzari_coresp -> fara urmasi +DO asserteaza WITH 'DocumentAreUrmasi(1061) = .F. (aviz fara corespondenta)', !DocumentAreUrmasi(1061), TRANSFORM(DocumentAreUrmasi(1061)) + +*!* id_vanzare=622: factura cu retur emis pe ea (vanzari_coresp.tip=3) -> are urmasi +DO asserteaza WITH 'DocumentAreUrmasi(622) = .T. (factura cu retur emis)', DocumentAreUrmasi(622), TRANSFORM(DocumentAreUrmasi(622)) + +DO asserteaza WITH 'DocumentAreUrmasi(0) = .F. (id inexistent)', !DocumentAreUrmasi(0), TRANSFORM(DocumentAreUrmasi(0)) + +*!* --- proba de traseu real: crsfacturi construit exact ca in oproceduri_facturare.vizualizare_facturi, +*!* filtrat pe cele 3 documente reale de mai sus (nu pe luna curenta - ele pot fi din alta luna) --- +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +lcOrder = [data_act,numar_act] +lcFiltru = [id_vanzare in (664, 622, 1061)] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +DO asserteaza WITH 'crsfacturi incarcat cu cele 3 documente reale (rownum=3)', Used('crsfacturi') AND Reccount('crsfacturi') = 3, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') + +LOCAL loFrm +loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') +DO asserteaza WITH 'Newobject(frm_facturi) reuseste dupa adaugarea metodei noi, cu crsfacturi real deschis', Vartype(m.loFrm) == 'O', Vartype(m.loFrm) +IF Vartype(m.loFrm) == 'O' + DO asserteaza WITH 'frm_facturi.ClassLibrary e fisierul editat (nu alt produs)', Upper(loFrm.ClassLibrary) == Upper('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx'), loFrm.ClassLibrary + DO asserteaza WITH 'metoda noua do_editare_unificata exista pe obiect (PEMSTATUS)', Pemstatus(m.loFrm, 'do_editare_unificata', 5), '' + + *!* id_vanzare=664: aviz cu urmasi -> proba ca traseul complet (garzile) ruleaza fara eroare VFP + Select crsfacturi + Locate For id_vanzare = 664 + IF Found() + loFrm.do_editare_unificata() + STRTOFILE('do_editare_unificata(664): lactiv3=' + Transform(loFrm.lactiv3) + ' mesaj mock=[' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'do_editare_unificata(664) ruleaza fara eroare VFP necaptata (mock a primit un mesaj sau lactiv3=.F.)', !Empty(gcMockUltimMesaj) OR !loFrm.lactiv3, gcMockUltimMesaj + ENDIF +ENDIF + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s8_base_triaj.prg b/utile/Teste/editare_factura/test_s8_base_triaj.prg new file mode 100644 index 0000000..fdafa6b --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_base_triaj.prg @@ -0,0 +1,540 @@ +* test_s8_pas7_cablare.prg +* Verifica pasul 7 din docs\propunere_s8_incarcare.md §6: cablarea celei de-a treia optiuni de +* meniu si corpul real al lui frm_facturi.do_editare_unificata (COMUN\clase\ofacturare_comun.vc2). +* Traseul REAL: Newobject('frm_facturi') + .do_editare_unificata() (nu Createobject direct pe +* frm_facturare_articole2 - asta ar proba doar codul formularului, nu rutarea). +* Documente reale, in luna curenta a calendarului (gnAn/gnLuna), care trec toate garzile +* (nesters, ne-eproforma, tip valid, fara referinte, fara urmasi, ne-eFactura), gasite prin +* interogare read-only pe MARIUSM_AUTO: +* 1113 - sursa COMANDA (tip=3, id_comanda=2479) +* 1055 - sursa CONTRACT (tip=2, id_ctr=234) +* 1048 - factura SIMPLA, lista de preturi (tip=1, fara comanda/ctr) +* 1130 - VALUTA (tip=5, in_valuta=1) +* Nu scrie in Oracle - doar SELECT; verifica ca formularul deschis nici el nu scrie +* (G8: dataoras/id_utils neschimbate pe VANZARI/VANZARI_DETALII). +* +* frm_facturare_articole2 (ofacturare.vc2:15894) nu suprascrie WindowType, iar _frm_base il +* seteaza pe 1 = modal - .Show() blocheaza pana la inchiderea ferestrei, headless nu are cine +* sa o inchida in mod normal. Solutie: driverS8p7 (Custom, BINDEVENT pe un Timer de pe _SCREEN, +* acelasi tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg) - un modal inca pompeaza +* mesaje Windows, deci timerul tot mai ruleaza in interiorul lui .Show(); cand gaseste forma +* deschisa ii citeste prezenta/eticheta lui Ct_clb_altele (din colectia Objects, nu PEMSTATUS - +* RemoveObject scoate din Objects dar PEMSTATUS ramane .T., vezi memoria pemstatus-dupa- +* removeobject) si o elibereaza, ceea ce incheie .Show() si intoarce controlul in +* do_editare_unificata, apoi in acest test. Nu modifica NIMIC in codul de productie. +* +* Extindere S8 (blocarea grupurilor B si C la editare, docs\raport_s8_grup_bc.md): driverS8p7 +* citeste in plus, din Objects, starea needitabila a controalelor clb_fdoc.cboFdoc, Ct_clb_altele, +* Ct_clb_nume_client, Ct_clb_valuta, Clb_zi_curs, ct_contabilitate.Ct_clb_gestiune_init, +* Ct_clb_politici_preturi, but_incarca_articole, but_cursuri, ct_incasare, chk_incasare - fiecare +* verificat doar daca e prezent (unele sunt scoase de Init in functie de tip/gnScadereStoc, +* independent de lEditare). Proba de neregresie pe document nou (VerificaDocumentNou) NU trece +* prin factureaza()/poGeneratorNumere (interzis, arde numere) - construieste poDate manual cu +* Createobject('oDateFactura',0,0) (Init nu ruleaza, ramane pe defaults, lEditare=.F. ca la orice +* document nou) si instantiaza formularul direct cu Newobject, FARA .Show() (Init ruleaza oricum +* la construire; fara Show() nu exista blocaj modal, deci nu e nevoie de driver aici). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_base_triaj_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 + +*!* --- driver care inchide fereastra modala frm_facturare_articole2, vezi antetul fisierului --- +PUBLIC goDriverS8p7 +goDriverS8p7 = Createobject('driverS8p7') +_SCREEN.AddObject('tmrS8p7', 'Timer') +_SCREEN.tmrS8p7.Interval = 150 +Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa') +_SCREEN.tmrS8p7.Enabled = .T. + +*!* --- verificare statica: corpul do_editare_unificata nu contine nicio referinta la alocarea +*!* de numere (factureaza/poGeneratorNumere/creeaza_cursor_serii) --- +LOCAL lcSrc, lcTail, lnStart, lnEnd, lcMetoda +lcSrc = FILETOSTR('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vc2') +lnStart = AT('PROCEDURE do_editare_unificata' + CHR(13) + CHR(10), lcSrc) +DO asserteaza WITH 'static: metoda do_editare_unificata gasita in sursa', lnStart > 0, TRANSFORM(lnStart) +IF lnStart > 0 + lcTail = SUBSTR(lcSrc, lnStart) + lnEnd = AT('ENDPROC', lcTail) + lcMetoda = UPPER(SUBSTR(lcTail, 1, lnEnd + 6)) + DO asserteaza WITH 'static G2: fara FACTUREAZA( in do_editare_unificata', 'FACTUREAZA(' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara POGENERATORNUMERE in do_editare_unificata', 'POGENERATORNUMERE' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara CREEAZA_CURSOR_SERII in do_editare_unificata', 'CREEAZA_CURSOR_SERII' $ lcMetoda = .F., '' +ENDIF + +*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe cele 4 documente --- +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +LOCAL lcSchema, lcSelect, lcOrder, lcFiltru +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +lcOrder = [data_act,numar_act] +lcFiltru = [id_vanzare in (1113, 1055, 1048, 1130)] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +DO asserteaza WITH 'crsfacturi incarcat cu cele 4 documente reale (rownum=4)', Used('crsfacturi') AND Reccount('crsfacturi') = 4, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') + +*!* Ct_clb_altele (infirmare §3.2, vezi raport): document CU sursa -> prezent, etichetat din +*!* poDate.tip; factura SIMPLA -> absent, identic cu introducerea unei facturi noi (G10). +DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda' +DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract' +DO VerificaEditare WITH 1048, 'factura simpla', .F., '' +DO VerificaEditare WITH 1130, 'valuta', .F., '' + +_SCREEN.tmrS8p7.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrS8p7') +Catch +Endtry + +*!* --- S8 grupurile B/C: neregresie pe document NOU (docs\raport_s8_grup_bc.md) --- +DO VerificaDocumentNou + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +PROCEDURE VerificaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tlCtClbAsteptat, tcCtClbEtichetaAsteptata + + LOCAL lcPrefix, lnSucces, loFrm, lnI, llGasitForm + LOCAL lcSnapPlajeA, lcSnapPlajeB, lcSnapDetA, lcSnapDetB + LOCAL ltDataorasVanzareA, lnIdUtilsVanzareA + lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + *!* --- G2: snapshot generator de numere, INAINTE --- + IF Used('v_plaje_a') + Use In v_plaje_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_a') + Use In v_plaje_a + + *!* --- G8: snapshot dataoras/id_utils, INAINTE --- + IF Used('v_g8a') + Use In v_g8a + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor G8 antet Oracle a reusit', lnSucces >= 0 AND Used('v_g8a') AND Reccount('v_g8a') = 1, Transform(lnSucces) + ltDataorasVanzareA = v_g8a.dataoras + lnIdUtilsVanzareA = Nvl(v_g8a.id_utils, 0) + Use In v_g8a + + IF Used('v_g8d_a') + Use In v_g8d_a + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_a') + goExecutor.oReset() + lcSnapDetA = CursorToSnapshot('v_g8d_a') + Use In v_g8d_a + + *!* --- codul testat: traseul real, prin frm_facturi.do_editare_unificata --- + *!* Init-ul clasei presupune crsfacturi ca zona curenta (la fel ca in test_s7_urmasi.prg) - + *!* interogarile martor de mai sus au schimbat zona curenta intre timp, se restaureaza aici + Select crsfacturi + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm) + IF Vartype(m.loFrm) <> 'O' + RETURN + ENDIF + + Select crsfacturi + Locate For id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found()) + IF !Found() + loFrm.Release() + RETURN + ENDIF + + *!* --- driverS8p7 gaseste si inchide formularul unificat (FARA but_termin1.Click()), vezi + *!* antetul fisierului; .do_editare_unificata() nu revine decat dupa ce fereastra s-a inchis --- + goDriverS8p7.Reseteaza() + loFrm.do_editare_unificata() + + DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit) + + *!* --- Ct_clb_altele: prezenta citita din colectia Objects a formularului, cat timp era deschis + *!* (infirmarea §3.2 - vezi raport) --- + DO asserteaza WITH lcPrefix + ': Ct_clb_altele prezenta = ' + Iif(m.tlCtClbAsteptat, 'prezent', 'absent'), ; + goDriverS8p7.lCtClbPrezent == m.tlCtClbAsteptat, Transform(goDriverS8p7.lCtClbPrezent) + IF m.tlCtClbAsteptat + DO asserteaza WITH lcPrefix + ': Ct_clb_altele eticheta = [' + m.tcCtClbEtichetaAsteptata + ']', ; + Upper(goDriverS8p7.cCtClbEticheta) == Upper(m.tcCtClbEtichetaAsteptata), goDriverS8p7.cCtClbEticheta + ENDIF + *!* --- grupul B si C (S8, decizia 25): needitabile la editare, verificate doar cand controlul + *!* mai exista (unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare) --- + DO VerificaBlocajGrupBC WITH m.lcPrefix + + *!* --- G5: totalul afisat de do_calculeaza_totaluri (chemat inainte de Show, in do_editare_unificata) + *!* ramane egal cu totalul deja scris in VANZARI - prinde o reevaluare tacita a cursului/preturilor --- + Select crsfacturi + IF Nvl(crsfacturi.in_valuta, 0) = 1 + DO asserteaza WITH lcPrefix + ' G5: total afisat (valuta) = VANZARI.totval', ; + Round(goDriverS8p7.nTotalVal, 2) == Round(Nvl(crsfacturi.totval, 0), 2), Transform(goDriverS8p7.nTotalVal) + ' vs ' + Transform(crsfacturi.totval) + ELSE + DO asserteaza WITH lcPrefix + ' G5: total afisat (lei) = VANZARI.total_cu_tva', ; + Round(goDriverS8p7.nTotalRon, 2) == Round(Nvl(crsfacturi.total_cu_tva, 0), 2), Transform(goDriverS8p7.nTotalRon) + ' vs ' + Transform(crsfacturi.total_cu_tva) + ENDIF + + loFrm.Release() + + *!* --- G9: niciun dialog modal la deschidere --- + DO asserteaza WITH lcPrefix + ' G9: niciun amessagebox la deschidere', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- G2: snapshot generator de numere, DUPA - identic caracter cu caracter --- + IF Used('v_plaje_b') + Use In v_plaje_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_b') + Use In v_plaje_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' + + *!* --- G8: dataoras/id_utils neschimbate pe VANZARI si VANZARI_DETALII --- + IF Used('v_g8a2') + Use In v_g8a2 + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a2') + goExecutor.oReset() + *!* Nvl pe TTOC: dataoras e NULL pe documentele de test - NULL == NULL da .NULL. in VFP (nu .T.), + *!* fals negativ fara el + DO asserteaza WITH lcPrefix + ' G8: VANZARI.dataoras neschimbat', ; + Nvl(Ttoc(v_g8a2.dataoras), 'NULL') == Nvl(Ttoc(m.ltDataorasVanzareA), 'NULL'), Nvl(Ttoc(v_g8a2.dataoras), 'NULL') + DO asserteaza WITH lcPrefix + ' G8: VANZARI.id_utils neschimbat', Nvl(v_g8a2.id_utils, 0) == m.lnIdUtilsVanzareA, Transform(Nvl(v_g8a2.id_utils, 0)) + Use In v_g8a2 + + IF Used('v_g8d_b') + Use In v_g8d_b + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_b') + goExecutor.oReset() + lcSnapDetB = CursorToSnapshot('v_g8d_b') + Use In v_g8d_b + DO asserteaza WITH lcPrefix + ' G8: VANZARI_DETALII dataoras/id_utils identice (nicio scriere)', m.lcSnapDetA == m.lcSnapDetB, '' + + *!* --- G11 partial: fara nicio scriere pe VANZARI_DETALII (G8), nu s-a putut genera nicio miscare + *!* de stoc noua pe acest document; nu masoara direct un tabel de stoc - proba indirecta, partiala --- + DO asserteaza WITH lcPrefix + ' G11 partial (derivat din G8): nicio scriere pe VANZARI_DETALII => stoc agregat neschimbat pe acest document', m.lcSnapDetA == m.lcSnapDetB, '' +ENDPROC + + +*!* S8 - blocarea grupurilor B si C la editare (docs\raport_s8_grup_bc.md). Citeste starea deja +*!* capturata de goDriverS8p7 (formularul e inchis pana aici) si asearta doar cand controlul e +*!* prezent - unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare. +PROCEDURE VerificaBlocajGrupBC + LPARAMETERS tcPrefix + + IF goDriverS8p7.lCtClbPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_altele (sursa) needitabil', !goDriverS8p7.lCtClbAlteleActiv, Transform(goDriverS8p7.lCtClbAlteleActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: clb_fdoc.cboFdoc (tip document) needitabil', ; + goDriverS8p7.lClbFdocPrezent AND !goDriverS8p7.lClbFdocActiv, Transform(goDriverS8p7.lClbFdocActiv) + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_nume_client (client) needitabil', ; + goDriverS8p7.lCtClbNumeClientPrezent AND !goDriverS8p7.lCtClbNumeClientActiv, Transform(goDriverS8p7.lCtClbNumeClientActiv) + IF goDriverS8p7.lCtClbValutaPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_valuta needitabil', !goDriverS8p7.lCtClbValutaActiv, Transform(goDriverS8p7.lCtClbValutaActiv) + ENDIF + IF goDriverS8p7.lClbZiCursPrezent + DO asserteaza WITH tcPrefix + ' grupB: Clb_zi_curs needitabil', !goDriverS8p7.lClbZiCursActiv, Transform(goDriverS8p7.lClbZiCursActiv) + ENDIF + IF goDriverS8p7.lCtClbGestiuneInitPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_gestiune_init (gestiune sursa) needitabil', !goDriverS8p7.lCtClbGestiuneInitActiv, Transform(goDriverS8p7.lCtClbGestiuneInitActiv) + ENDIF + IF goDriverS8p7.lCtClbPolPreturiPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_politici_preturi needitabil', !goDriverS8p7.lCtClbPolPreturiActiv, Transform(goDriverS8p7.lCtClbPolPreturiActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: but_incarca_articole needitabil (G2: evita poGeneratorNumere.verifica_numar)', ; + goDriverS8p7.lButIncarcaArticolePrezent AND !goDriverS8p7.lButIncarcaArticoleActiv, Transform(goDriverS8p7.lButIncarcaArticoleActiv) + DO asserteaza WITH tcPrefix + ' grupB: but_cursuri needitabil', ; + goDriverS8p7.lButCursuriPrezent AND !goDriverS8p7.lButCursuriActiv, Transform(goDriverS8p7.lButCursuriActiv) + IF goDriverS8p7.lCtIncasarePrezent + DO asserteaza WITH tcPrefix + ' grupC: ct_incasare needitabil', !goDriverS8p7.lCtIncasareActiv, Transform(goDriverS8p7.lCtIncasareActiv) + DO asserteaza WITH tcPrefix + ' grupC: chk_incasare needitabil', goDriverS8p7.lChkIncasarePrezent AND !goDriverS8p7.lChkIncasareActiv, Transform(goDriverS8p7.lChkIncasareActiv) + ENDIF +ENDPROC + + +*!* S8 - neregresie: pe document NOU, grupurile B/C raman editabile (docs\raport_s8_grup_bc.md). +*!* NU trece prin factureaza()/poGeneratorNumere (interzis - arde numere din plaje reale). poDate +*!* construit manual cu Createobject('oDateFactura',0,0): Init-ul clasei NU ruleaza (tnIdSet=0), +*!* deci ramane pe defaults din PropValue - inclusiv lEditare=.F., exact ca la orice document nou +*!* (vezi si test_s8_pas3_garda_alte_date.prg, acelasi tipar). tip=3 (comanda) e ales ca sa +*!* pastreze Ct_clb_altele si Ct_clb_nume_client prezente (paralel cu documentul 1113 de mai sus); +*!* nu are cursul din zi (citeste_cursuri_zi nu se cheama pentru tip=3), deci fara SELECT Oracle. +*!* Instantiat direct cu Newobject, FARA .Show() - Init ruleaza oricum la construire, iar fara +*!* Show() nu exista blocajul modal (WindowType=1 conteaza doar cand se cheama .Show()), deci nu e +*!* nevoie de driverS8p7 aici. +PROCEDURE VerificaDocumentNou + PRIVATE poDate + LOCAL loForm + + poDate = Createobject('oDateFactura', 0, 0) + poDate.tip = 3 + poDate.id_client = 0 + poDate.incasat = 0 + + loForm = Newobject('frm_facturare_articole2', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx') + DO asserteaza WITH 'document nou: Newobject(frm_facturare_articole2) reuseste (fara Show, fara factureaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + + DO asserteaza WITH 'document nou: poDate.lEditare = .F. (stare naturala, nesetata de nimeni)', !poDate.lEditare, Transform(poDate.lEditare) + + IF loForm.do_exista_obiect('Ct_clb_altele') + DO asserteaza WITH 'document nou grupB: Ct_clb_altele ramane editabil', loForm.Ct_clb_altele.lactiv, Transform(loForm.Ct_clb_altele.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: clb_fdoc.cboFdoc ramane editabil', loForm.clb_fdoc.cboFdoc.Enabled, Transform(loForm.clb_fdoc.cboFdoc.Enabled) + DO asserteaza WITH 'document nou grupB: Ct_clb_nume_client ramane editabil', loForm.Ct_clb_nume_client.lactiv, Transform(loForm.Ct_clb_nume_client.lactiv) + IF loForm.do_exista_obiect('Ct_clb_valuta') + DO asserteaza WITH 'document nou grupB: Ct_clb_valuta ramane editabil', loForm.Ct_clb_valuta.lactiv, Transform(loForm.Ct_clb_valuta.lactiv) + ENDIF + IF loForm.do_exista_obiect('Clb_zi_curs') + DO asserteaza WITH 'document nou grupB: Clb_zi_curs ramane editabil', !loForm.Clb_zi_curs.text_simplu1.ReadOnly, Transform(loForm.Clb_zi_curs.text_simplu1.ReadOnly) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_gestiune_init', loForm.ct_contabilitate) + DO asserteaza WITH 'document nou grupB: Ct_clb_gestiune_init ramane editabil', loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv, Transform(loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_politici_preturi') + DO asserteaza WITH 'document nou grupB: Ct_clb_politici_preturi ramane editabil', loForm.Ct_clb_politici_preturi.lactiv, Transform(loForm.Ct_clb_politici_preturi.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: but_incarca_articole ramane editabil', loForm.but_incarca_articole.Enabled, Transform(loForm.but_incarca_articole.Enabled) + DO asserteaza WITH 'document nou grupB: but_cursuri ramane editabil', loForm.but_cursuri.Enabled, Transform(loForm.but_cursuri.Enabled) + IF loForm.do_exista_obiect('ct_incasare') + DO asserteaza WITH 'document nou grupC: ct_incasare ramane editabil', loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH 'document nou grupC: chk_incasare ramane editabil', loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + ENDIF + + loForm.Release() +ENDPROC + + +PROCEDURE CursorToSnapshot + LPARAMETERS tcAlias + + LOCAL lcResult, lnI + lcResult = '' + SELECT (m.tcAlias) + SCAN + FOR lnI = 1 TO FCOUNT() + lcResult = lcResult + Transform(Evaluate(Field(m.lnI))) + '|' + ENDFOR + lcResult = lcResult + Chr(10) + ENDSCAN + RETURN m.lcResult +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*!* driverS8p7: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms in timp ce .Show() e blocat pe +*!* modal (un modal tot pompeaza mesaje Windows, deci timerul de pe _SCREEN tot ruleaza - acelasi +*!* tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg, folosit acolo pentru MESSAGEBOX_FORM). +*!* Citeste Ct_clb_altele din Objects (nu PEMSTATUS - RemoveObject scoate din Objects, PEMSTATUS +*!* ramane .T.) inainte sa elibereze forma, ceea ce incheie .Show() si reda controlul apelantului. +DEFINE CLASS driverS8p7 AS Custom + lBusy = .F. + lGasit = .F. + lCtClbPrezent = .F. + lCtClbAlteleActiv = .F. + cCtClbEticheta = '' + nTotalRon = 0 + nTotalVal = 0 + + *!* grupul B si C (S8, docs\raport_s8_grup_bc.md) - Prezent = mai exista in Objects (nu a fost + *!* scos de Init dupa tip/gnScadereStoc), Activ = NU e blocat (Enabled / lactiv / !ReadOnly, dupa + *!* mecanismul folosit de fiecare control) + lClbFdocPrezent = .F. + lClbFdocActiv = .F. + lCtClbNumeClientPrezent = .F. + lCtClbNumeClientActiv = .F. + lCtClbValutaPrezent = .F. + lCtClbValutaActiv = .F. + lClbZiCursPrezent = .F. + lClbZiCursActiv = .F. + lCtClbGestiuneInitPrezent = .F. + lCtClbGestiuneInitActiv = .F. + lCtClbPolPreturiPrezent = .F. + lCtClbPolPreturiActiv = .F. + lButIncarcaArticolePrezent = .F. + lButIncarcaArticoleActiv = .F. + lButCursuriPrezent = .F. + lButCursuriActiv = .F. + lCtIncasarePrezent = .F. + lCtIncasareActiv = .F. + lChkIncasarePrezent = .F. + lChkIncasareActiv = .F. + + PROCEDURE Reseteaza + This.lGasit = .F. + This.lCtClbPrezent = .F. + This.lCtClbAlteleActiv = .F. + This.cCtClbEticheta = '' + This.nTotalRon = 0 + This.nTotalVal = 0 + This.lClbFdocPrezent = .F. + This.lClbFdocActiv = .F. + This.lCtClbNumeClientPrezent = .F. + This.lCtClbNumeClientActiv = .F. + This.lCtClbValutaPrezent = .F. + This.lCtClbValutaActiv = .F. + This.lClbZiCursPrezent = .F. + This.lClbZiCursActiv = .F. + This.lCtClbGestiuneInitPrezent = .F. + This.lCtClbGestiuneInitActiv = .F. + This.lCtClbPolPreturiPrezent = .F. + This.lCtClbPolPreturiActiv = .F. + This.lButIncarcaArticolePrezent = .F. + This.lButIncarcaArticoleActiv = .F. + This.lButCursuriPrezent = .F. + This.lButCursuriActiv = .F. + This.lCtIncasarePrezent = .F. + This.lCtIncasareActiv = .F. + This.lChkIncasarePrezent = .F. + This.lChkIncasareActiv = .F. + ENDPROC + + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + TRY + LOCAL lnI, lnJ, lnJ2, loFrm2, loObj, loObj2 + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + This.nTotalRon = Nvl(loFrm2.ntotalron, 0) + This.nTotalVal = Nvl(loFrm2.ntotalval, 0) + FOR lnJ = 1 TO loFrm2.Objects.Count + loObj = loFrm2.Objects(m.lnJ) + DO CASE + CASE Upper(loObj.Name) == 'CT_CLB_ALTELE' + This.lCtClbPrezent = .T. + This.lCtClbAlteleActiv = loObj.lactiv + This.cCtClbEticheta = Alltrim(loObj.clb_tx_cautare.lb_SIMPLU1.Caption) + CASE Upper(loObj.Name) == 'CLB_FDOC' + This.lClbFdocPrezent = .T. + This.lClbFdocActiv = loObj.cboFdoc.Enabled + CASE Upper(loObj.Name) == 'CT_CLB_NUME_CLIENT' + This.lCtClbNumeClientPrezent = .T. + This.lCtClbNumeClientActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CT_CLB_VALUTA' + This.lCtClbValutaPrezent = .T. + This.lCtClbValutaActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CLB_ZI_CURS' + This.lClbZiCursPrezent = .T. + This.lClbZiCursActiv = !loObj.text_simplu1.ReadOnly + CASE Upper(loObj.Name) == 'CT_CLB_POLITICI_PRETURI' + This.lCtClbPolPreturiPrezent = .T. + This.lCtClbPolPreturiActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'BUT_INCARCA_ARTICOLE' + This.lButIncarcaArticolePrezent = .T. + This.lButIncarcaArticoleActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'BUT_CURSURI' + This.lButCursuriPrezent = .T. + This.lButCursuriActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_INCASARE' + This.lCtIncasarePrezent = .T. + This.lCtIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CHK_INCASARE' + This.lChkIncasarePrezent = .T. + This.lChkIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_CONTABILITATE' + FOR lnJ2 = 1 TO loObj.Objects.Count + loObj2 = loObj.Objects(m.lnJ2) + IF Upper(loObj2.Name) == 'CT_CLB_GESTIUNE_INIT' + This.lCtClbGestiuneInitPrezent = .T. + This.lCtClbGestiuneInitActiv = loObj2.lactiv + ENDIF + ENDFOR + ENDCASE + ENDFOR + loFrm2.Release() + EXIT + ENDIF + ENDFOR + CATCH TO loExcS8p7 + STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s8_editare_incarcare.prg b/utile/Teste/editare_factura/test_s8_editare_incarcare.prg new file mode 100644 index 0000000..b4cf729 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_editare_incarcare.prg @@ -0,0 +1,922 @@ +* test_s8_editare_incarcare.prg +* Suita COMPLETA a pasului 8 (docs\propunere_s8_incarcare.md §5.1): G1-G11 intr-o singura rulare, +* traseul REAL Newobject('frm_facturi') + .do_editare_unificata() (nu Createobject direct pe +* frm_facturare_articole2 - proba doar codul, nu rutarea, cf. handoff §4.0a). +* +* NU inlocuieste test_s8_pas7_cablare.prg (ramane pe loc, neatins) - o completeaza cu: +* - un al treilea tip de sursa (1047, DEVIZE AUTO, fara delegat) +* - un document AVIZ pozitiv (1110, tip=22) si unul NEGATIV/istoric (953, tip=23, respins de garda +* "luna curenta") - Ct_clb_politici_preturi ramane totusi neexercitat, vezi raportul (motivat mai jos) +* - G3/G4/G4b (linii) verificate si pe traseul COMPLET, nu doar pe IncarcaLiniiFacturaEditare izolat +* - R1: curatenie de aliasuri + jurnal AUSED() intre cazuri (lectia din triaj_s8_regresie_28fail.md) +* - R2: diagnostic care distinge, cand formularul NU se deschide, intre iesire CU mesaj de garda, +* iesire silentioasa CONFIRMATA prin IncarcaAntetFacturaEditare (ofacturare_editare.prg:83-86) si +* iesire silentioasa NEEXPLICATA de acea cale (candidat: cursa driverului/Timer) +* +* Documente reale, gasite prin interogare read-only pe MARIUSM_AUTO (probe_s8p8_candidati.prg, +* probe_s8p8_garzi.prg - pastrate ca dovada in acest director): +* 1113 - sursa COMANDA (tip=3) [reluat din pas7, stabil 133/0 x3] +* 1055 - sursa CONTRACT (tip=2) [reluat din pas7] +* 1048 - factura SIMPLA, lista de preturi (tip=1) [reluat din pas7] +* 1130 - VALUTA (tip=5) [reluat din pas7] +* 1047 - DEVIZE AUTO (tip=-12), FARA DELEGAT (id_delegat=0/NULL) - singurul document din toata +* schema care trece toate garzile do_editare_unificata SI nu are delegat (interogarea D din +* probe_s8p8_candidati_log.txt: 0 rezultate pe tip 1-4 fara delegat, 1 rezultat pe orice tip +* valid - exact acesta). Deja folosit, izolat, in test_s8_pas6_linii.prg. +* 1110 - AVIZ DIN LISTA DE PRETURI (tip=22), luna curenta, toate garzile trec (probe_s8p8_garzi). +* CORECTAT fata de prima trecere a acestei suite (vezi docs\raport_s8_pas8_suita.md §2/§10): +* la editare, IncarcaAntetFacturaEditare (ofacturare_editare.prg:94) seteaza intotdeauna +* nIdTipDoc = nIdTipDocFactura pentru documente ne-proforma, deci llAviz = (poDate.nIdTipDoc +* = poDate.nIdTipDocAvizExpeditie) e mereu .F. la editare, indiferent de poDate.tip - ramura +* "aviz" a Do Case-ului din Init (ofacturare.vc2 ~21030) nu se activeaza NICIODATA la editare. +* Toate documentele editate, aviz sau nu, trec prin ramura "factura" (~21148+), care scoate +* Ct_clb_politici_preturi NECONDITIONAT pentru orice tip. Deci controlul lipseste la editare +* pe toate tipurile, nu doar pe 22 - exercita restul traseului de aviz (G1-G9,G11). +* 953 - AVIZ SUBUNITATI (tip=23), mai 2022 (istoric) - caz NEGATIV. Premiza initiala ("tip 23/41 +* pastreaza Ct_clb_politici_preturi la editare") s-a dovedit FALSA (vezi 1110 mai sus - acea +* ramura nu se activeaza deloc la editare). Documentul ramane util ca proba a garzii "luna +* curenta": probe_s8p8_garzi_log.txt arata ca 953 cade pe ea (documentul e din mai 2022, +* sesiunea de test ruleaza in luna contabila curenta august 2026) - respins CU mesaj, nu +* silentios, fara sa deschida formularul si fara sa consume niciun numar (G2). +* +* Nu scrie in Oracle - doar SELECT; verifica ca formularul deschis nici el nu scrie (G8). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_editare_incarcare_log.txt' +STRTOFILE('start ' + Transform(Datetime()) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +*!* gnScadereStoc: neinitializat de test_init_env_auto_roafacturare.prg. Documentele tip 1-5 nu-l +*!* citesc (cad in ramura OTHERWISE a Do Case-ului din Init, care nu-l testeaza), dar 1110 (tip=22) +*!* intra pe ramura "CASE gnScadereStoc=0 AND poDate.tip=22" - fara variabila declarata, VFP arunca +*!* "Variable GNSCADERESTOC is not found". Precedent: creeaza_documente_s8.prg (acelasi director) +*!* seteaza explicit gnScadereStoc=0 ca parte a mediului de test, nu a codului de productie. +PUBLIC gnScadereStoc +gnScadereStoc = 0 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 + +*!* --- driver care inchide fereastra modala frm_facturare_articole2 (acelasi tipar validat in +*!* test_s8_pas7_cablare.prg / driverS8p7 - Timer legat de _SCREEN prin Bindevent, viu in interiorul +*!* Show()-ului modal, care citeste formularul din colectia Objects si il elibereaza) --- +PUBLIC goDriverS8p7 +goDriverS8p7 = Createobject('driverS8p7') +_SCREEN.AddObject('tmrS8p8', 'Timer') +_SCREEN.tmrS8p8.Interval = 150 +Bindevent(_SCREEN.tmrS8p8, 'Timer', goDriverS8p7, 'Executa') +_SCREEN.tmrS8p8.Enabled = .T. + +*!* --- verificare statica G2: corpul do_editare_unificata nu contine nicio referinta la alocarea +*!* de numere (factureaza/poGeneratorNumere/creeaza_cursor_serii) --- +LOCAL lcSrc, lcTail, lnStart, lnEnd, lcMetoda +lcSrc = FILETOSTR('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vc2') +lnStart = AT('PROCEDURE do_editare_unificata' + CHR(13) + CHR(10), lcSrc) +DO asserteaza WITH 'static: metoda do_editare_unificata gasita in sursa', lnStart > 0, TRANSFORM(lnStart) +IF lnStart > 0 + lcTail = SUBSTR(lcSrc, lnStart) + lnEnd = AT('ENDPROC', lcTail) + lcMetoda = UPPER(SUBSTR(lcTail, 1, lnEnd + 6)) + DO asserteaza WITH 'static G2: fara FACTUREAZA( in do_editare_unificata', 'FACTUREAZA(' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara POGENERATORNUMERE in do_editare_unificata', 'POGENERATORNUMERE' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara CREEAZA_CURSOR_SERII in do_editare_unificata', 'CREEAZA_CURSOR_SERII' $ lcMetoda = .F., '' +ENDIF + +*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe toate documentele de test --- +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +LOCAL lcSchema, lcSelect, lcOrder, lcFiltru +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +lcOrder = [data_act,numar_act] +lcFiltru = [id_vanzare in (1113, 1055, 1048, 1130, 1047, 1110, 953)] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +DO asserteaza WITH 'crsfacturi incarcat cu cele 7 documente reale (rownum=7)', Used('crsfacturi') AND Reccount('crsfacturi') = 7, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') + +*!* ===================================================================================== +*!* Cazurile POZITIVE - documentul trebuie sa se deschida (G1-G9, G11, plus G3/G4/G4b pe linii) +*!* Ct_clb_altele (infirmare §3.2 din propunerea S8): document CU sursa comanda/contract -> prezent, +*!* etichetat; factura simpla/valuta/aviz(tip22)/devize(tip-12) editate (nu copiate) -> absent, G10. +*!* ===================================================================================== +DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda', .T. +DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract', .T. +DO VerificaEditare WITH 1048, 'factura simpla', .F., '', .T. +DO VerificaEditare WITH 1130, 'valuta', .F., '', .T. +*!* 1047/1110: nici tip=-12 (DEVIZE AUTO), nici tip=22 (aviz lista preturi) nu se incadreaza in +*!* Inlist(poDate.tip,1,5,10,48,49) - unicul grup pe care Init il scoate la editare (llCopiere=.F.) +*!* in ramura "factura" (llAviz e mereu .F. la editare, cf. IncarcaAntetFacturaEditare:94, care +*!* seteaza mereu nIdTipDocFactura pentru documente ne-proforma - ramura de aviz din Do Case NU se +*!* activeaza niciodata la editare, indiferent de poDate.tip). Deci Ct_clb_altele RAMANE prezent, +*!* dar FARA eticheta schimbata (niciun Case din Do Case-ul "gnScadereStoc=0" nu acopera 22/-12) - +*!* verificat pe rulare (test_s8_p8_candidati/garzi + prima trecere a acestei suite). Nu se +*!* verifica eticheta exacta (ramane design-time, neschimbata de do_schimba_explicatia). +DO VerificaEditare WITH 1047, 'DEVIZE AUTO, fara delegat', .T., '', .T. +DO VerificaEditare WITH 1110, 'aviz din lista de preturi (tip=22)', .T., '', .F. + +*!* ===================================================================================== +*!* Cazul NEGATIV - 953, aviz istoric (tip=23), respins de garda "luna curenta" +*!* ===================================================================================== +DO VerificaEditareRespinsa WITH 953, 'aviz istoric tip=23, respins - luna curenta', 'luna curenta' + +*!* --- S8 incasarea la editare (D1/D3/D4) - foloseste Show() real, deci trebuie sa ruleze inainte +*!* de teardown-ul lui tmrS8p8 de mai jos. 1071: tip_incasare=11 (chitanta) -> mod 2. +*!* 1072: tip_incasare=2 (bon fiscal) -> mod 3, cazul in care hardcodarea veche "mod 2" ar fi mintit. +DO VerificaIncasareLaEditare WITH 1071, 'chitanta, tip_incasare=11', 119, 44, 11, 2 +DO VerificaIncasareLaEditare WITH 1072, 'bon fiscal, tip_incasare=2', 119, 66, 2, 3 + +_SCREEN.tmrS8p8.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrS8p8') +Catch +Endtry + +*!* --- S8 grupurile B/C: neregresie pe document NOU --- +DO VerificaDocumentNou + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + Transform(Datetime()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*!* ===================================================================================== +*!* R1: curatenie intre cazuri - inchide aliasurile care raman deschise dupa +*!* IncarcaLiniiFacturaEditare/do_calculeaza_totaluri/Init-ul formularului (gasite la X2, +*!* docs\raport_s8_driver_determinist.md): CRSGESTIUNI, JTVA_COLOANE(_TEMP), SAFT_TAXTABLE, +*!* CRSCURSURI. Nu produc FAIL azi (X2: Select crsfacturi/crsfactura restaureaza mereu zona +*!* corecta), dar cresc numarul de work area-uri intre cazuri - se inchid explicit aici ca sa nu +*!* se acumuleze pe 8 cazuri (limita VFP de work areas e departe, dar igiena conteaza pe R1). +*!* ===================================================================================== +PROCEDURE CurataAliasuriReziduale + LOCAL laAlias(1), lnI, lcA + laAlias(1) = 'CRSGESTIUNI' + DIMENSION laAlias(9) + laAlias(2) = 'JTVA_COLOANE' + laAlias(3) = 'JTVA_COLOANE_TEMP' + laAlias(4) = 'SAFT_TAXTABLE' + laAlias(5) = 'CRSCURSURI' + laAlias(6) = 'CRSARTICOLE_DOC' + laAlias(7) = 'CRSARTICOLE_EDITARE' + laAlias(8) = 'V_ANTET_EDITARE' + laAlias(9) = 'CRSFACTURA' + FOR lnI = 1 TO ALEN(laAlias) + lcA = laAlias(lnI) + IF Used(m.lcA) + Use In (m.lcA) + ENDIF + ENDFOR +ENDPROC + + +*!* R1: jurnal AUSED() - numarul de work area-uri deschise, ca sa se vada ca starea de start e +*!* aceeasi la fiecare caz (semnalul de scurgere din triaj: 16 -> 16 -> 17 -> 17, in crestere) +PROCEDURE LogAUsed + LPARAMETERS tcEticheta + LOCAL lnN, laAliasuri(1), lnI, lcLista + lnN = AUSED(laAliasuri) + lcLista = '' + FOR lnI = 1 TO m.lnN + lcLista = lcLista + laAliasuri(m.lnI,1) + ' ' + ENDFOR + STRTOFILE('AUSED ' + m.tcEticheta + ' = ' + TRANSFORM(m.lnN) + ' [' + m.lcLista + ']' + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +PROCEDURE VerificaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tlCtClbAsteptat, tcCtClbEtichetaAsteptata, tlVerificaLinii + + LOCAL lcPrefix, lnSucces, loFrm, lnI, llGasitForm + LOCAL lcSnapPlajeA, lcSnapPlajeB, lcSnapDetA, lcSnapDetB + LOCAL ltDataorasVanzareA, lnIdUtilsVanzareA + lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + *!* --- R1: curatenie + jurnal AUSED INAINTE de caz --- + DO CurataAliasuriReziduale + DO LogAUsed WITH lcPrefix + ' INAINTE' + + *!* --- G2: snapshot generator de numere, INAINTE --- + IF Used('v_plaje_a') + Use In v_plaje_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_a') + Use In v_plaje_a + + *!* --- G8: snapshot dataoras/id_utils, INAINTE --- + IF Used('v_g8a') + Use In v_g8a + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor G8 antet Oracle a reusit', lnSucces >= 0 AND Used('v_g8a') AND Reccount('v_g8a') = 1, Transform(lnSucces) + ltDataorasVanzareA = v_g8a.dataoras + lnIdUtilsVanzareA = Nvl(v_g8a.id_utils, 0) + Use In v_g8a + + IF Used('v_g8d_a') + Use In v_g8d_a + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_a') + goExecutor.oReset() + lcSnapDetA = CursorToSnapshot('v_g8d_a') + Use In v_g8d_a + + *!* --- martor G3/G4/G4b: interogare INDEPENDENTA pe VANZARI_DETALII+NOM_ARTICOLE, INAINTE de + *!* codul testat (acelasi tipar ca test_s8_pas6_linii.prg, dar aici pe traseul COMPLET) --- + LOCAL lnMartorLinii + lnMartorLinii = 0 + IF m.tlVerificaLinii + IF Used('v_g4pre') + Use In v_g4pre + ENDIF + lnSucces = goExecutor.oExecute([select count(*) as nr from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ and sters = 0], 'v_g4pre') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor G3 Oracle a reusit', lnSucces >= 0 AND Used('v_g4pre'), Transform(lnSucces) + lnMartorLinii = Nvl(v_g4pre.nr, 0) + Use In v_g4pre + + IF Used('v_g4') + Use In v_g4 + ENDIF + lnSucces = goExecutor.oExecute([select vd.id_vanzare_det, vd.cantitate, vd.taxcode, vd.lot, vd.serie, ] + ; + [na.in_stoc from vanzari_detalii vd left join nom_articole na on na.id_articol = vd.id_articol ] + ; + [where vd.id_vanzare = ] + Transform(m.tnIdVanzare) + [ and vd.sters = 0 order by vd.id_vanzare_det], 'v_g4') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor G4/G4b Oracle a reusit', lnSucces >= 0 AND Used('v_g4'), Transform(lnSucces) + ENDIF + + *!* --- R2 diagnostic PRE: IncarcaAntetFacturaEditare, apel direct izolat - baseline. Daca + *!* traseul complet de mai jos nu deschide formularul, aceasta valoare arata daca poarta + *!* silentioasa (cale 11, ofacturare_editare.prg:83-86) era deja activa INAINTE de orice + *!* interferenta a traseului complet (frm_facturi/driver) --- + LOCAL poDateDiagPre, lnDiscRPre, lnDiscVPre + poDateDiagPre = IncarcaAntetFacturaEditare(m.tnIdVanzare, @lnDiscRPre, @lnDiscVPre) + DO asserteaza WITH lcPrefix + ': diagnostic - IncarcaAntetFacturaEditare (apel direct, izolat) reuseste', Vartype(poDateDiagPre) == 'O', Vartype(poDateDiagPre) + IF Used('v_antet_editare') + Use In v_antet_editare + ENDIF + + *!* --- G1/G6/G7: poDateDiagPre e chiar obiectul pe care do_editare_unificata il va construi mai + *!* jos (aceeasi functie, acelasi id_vanzare, fara nicio scriere intre timp) - comparat cu randul + *!* deja incarcat in crsfacturi (acelasi SELECT ca fact_vfacturi, martor independent) --- + IF Vartype(poDateDiagPre) == 'O' + Select crsfacturi + Locate For id_vanzare = m.tnIdVanzare + IF Found() + DO asserteaza WITH lcPrefix + ' G1: serie_act = VANZARI', Alltrim(Nvl(poDateDiagPre.serie_act,'')) == Alltrim(Nvl(crsfacturi.serie_act,'')), poDateDiagPre.serie_act + DO asserteaza WITH lcPrefix + ' G1: nract = VANZARI', poDateDiagPre.nract == Nvl(crsfacturi.numar_act,0), Transform(poDateDiagPre.nract) + DO asserteaza WITH lcPrefix + ' G1: dataact = VANZARI', poDateDiagPre.dataact == crsfacturi.data_act, Dtoc(poDateDiagPre.dataact) + DO asserteaza WITH lcPrefix + ' G1: datascad = VANZARI (sau ambele NULL)', Iif(Isnull(crsfacturi.data_scad), Isnull(poDateDiagPre.datascad), poDateDiagPre.datascad == crsfacturi.data_scad), Transform(poDateDiagPre.datascad) + DO asserteaza WITH lcPrefix + ' G6: discount_evidentiat = VANZARI', poDateDiagPre.discount_evidentiat == Nvl(crsfacturi.discount_evidentiat,0), Transform(poDateDiagPre.discount_evidentiat) + IF poDateDiagPre.in_valuta = 0 + DO asserteaza WITH lcPrefix + ' G6: discount (lei) = VANZARI', Round(lnDiscRPre,2) == Round(Nvl(crsfacturi.discount,0),2), Transform(lnDiscRPre) + ENDIF + DO asserteaza WITH lcPrefix + ' G7: id_delegat = VANZARI (sau ambele NULL - cazul "fara delegat")', ; + Iif(Isnull(crsfacturi.id_delegat), Isnull(poDateDiagPre.id_delegat), Nvl(poDateDiagPre.id_delegat,0) == Nvl(crsfacturi.id_delegat,0)), Transform(Nvl(poDateDiagPre.id_delegat,-1)) + DO asserteaza WITH lcPrefix + ' G7: nume_delegat = VANZARI', Alltrim(Nvl(poDateDiagPre.nume_delegat,'')) == Alltrim(Nvl(crsfacturi.delegat,'')), poDateDiagPre.nume_delegat + DO asserteaza WITH lcPrefix + ' G7: adresa_facturare = VANZARI', Alltrim(Nvl(poDateDiagPre.adresa_facturare,'')) == Alltrim(Nvl(crsfacturi.adresa_facturare,'')), poDateDiagPre.adresa_facturare + DO asserteaza WITH lcPrefix + ' G7: listare_detaliata = VANZARI', poDateDiagPre.nListareDetaliata == Nvl(crsfacturi.listare_detaliata,0), Transform(poDateDiagPre.nListareDetaliata) + DO asserteaza WITH lcPrefix + ' G7: efactura = VANZARI', poDateDiagPre.eFactura == Nvl(crsfacturi.efactura,0), Transform(poDateDiagPre.eFactura) + DO asserteaza WITH lcPrefix + ' G7: id_ruta = VANZARI (sau ambele NULL)', Iif(Isnull(crsfacturi.id_ruta), Isnull(poDateDiagPre.id_ruta), poDateDiagPre.id_ruta == crsfacturi.id_ruta), Transform(poDateDiagPre.id_ruta) + ENDIF + ENDIF + + *!* --- codul testat: traseul real, prin frm_facturi.do_editare_unificata --- + *!* Init-ul clasei presupune crsfacturi ca zona curenta (la fel ca in test_s7_urmasi.prg) - + *!* interogarile martor de mai sus au schimbat zona curenta intre timp, se restaureaza aici + Select crsfacturi + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm) + IF Vartype(m.loFrm) <> 'O' + RETURN + ENDIF + + Select crsfacturi + Locate For id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found()) + IF !Found() + loFrm.Release() + RETURN + ENDIF + + *!* --- driverS8p7 gaseste si inchide formularul unificat (FARA but_termin1.Click()) --- + goDriverS8p7.Reseteaza() + loFrm.do_editare_unificata() + + IF !goDriverS8p7.lGasit + *!* --- R2: iesirea a esuat - distinge CU MESAJ (garda explicita) de SILENTIOASA, si in acest + *!* caz distinge daca poarta 11 (IncarcaAntetFacturaEditare->NULL) e cauza confirmata --- + DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', .F., 'NU s-a deschis' + IF !Empty(gcMockUltimMesaj) + DO asserteaza WITH lcPrefix + ' diagnostic: iesire CU MESAJ de garda (nu silentioasa) - mesaj=[' + gcMockUltimMesaj + ']', .F., gcMockUltimMesaj + ELSE + LOCAL poDateDiagPost, lnDiscRPost, lnDiscVPost + poDateDiagPost = IncarcaAntetFacturaEditare(m.tnIdVanzare, @lnDiscRPost, @lnDiscVPost) + IF Vartype(poDateDiagPost) <> 'O' + DO asserteaza WITH lcPrefix + ' diagnostic: iesire silentioasa CONFIRMATA - cale 11 (ofacturare_editare.prg:83-86), IncarcaAntetFacturaEditare revine .NULL. si la apel direct chiar acum', .F., 'confirmat cale 11' + ELSE + DO asserteaza WITH lcPrefix + ' diagnostic: iesire silentioasa NEEXPLICATA de cale 11 (IncarcaAntetFacturaEditare reuseste izolat chiar acum) - candidat: cale 3 (glLunaInchisa) sau cursa driverului/Timer', .F., 'neexplicat, nu e cale 11' + ENDIF + IF Used('v_antet_editare') + Use In v_antet_editare + ENDIF + ENDIF + Try + loFrm.Release() + Catch + Endtry + DO CurataAliasuriReziduale + DO LogAUsed WITH lcPrefix + ' DUPA (esec deschidere)' + RETURN + ENDIF + + DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit) + + *!* --- Ct_clb_altele: prezenta citita din colectia Objects a formularului, cat timp era deschis --- + DO asserteaza WITH lcPrefix + ': Ct_clb_altele prezenta = ' + Iif(m.tlCtClbAsteptat, 'prezent', 'absent'), ; + goDriverS8p7.lCtClbPrezent == m.tlCtClbAsteptat, Transform(goDriverS8p7.lCtClbPrezent) + IF m.tlCtClbAsteptat AND !Empty(m.tcCtClbEtichetaAsteptata) + DO asserteaza WITH lcPrefix + ': Ct_clb_altele eticheta = [' + m.tcCtClbEtichetaAsteptata + ']', ; + Upper(goDriverS8p7.cCtClbEticheta) == Upper(m.tcCtClbEtichetaAsteptata), goDriverS8p7.cCtClbEticheta + ENDIF + *!* --- grupul B si C (S8, decizia 25): needitabile la editare --- + DO VerificaBlocajGrupBC WITH m.lcPrefix + + *!* --- G5: totalul afisat = totalul deja scris in VANZARI --- + Select crsfacturi + IF Nvl(crsfacturi.in_valuta, 0) = 1 + DO asserteaza WITH lcPrefix + ' G5: total afisat (valuta) = VANZARI.totval', ; + Round(goDriverS8p7.nTotalVal, 2) == Round(Nvl(crsfacturi.totval, 0), 2), Transform(goDriverS8p7.nTotalVal) + ' vs ' + Transform(crsfacturi.totval) + ELSE + DO asserteaza WITH lcPrefix + ' G5: total afisat (lei) = VANZARI.total_cu_tva', ; + Round(goDriverS8p7.nTotalRon, 2) == Round(Nvl(crsfacturi.total_cu_tva, 0), 2), Transform(goDriverS8p7.nTotalRon) + ' vs ' + Transform(crsfacturi.total_cu_tva) + ENDIF + + *!* --- G3/G4/G4b: crsfactura ramane deschis dupa ce driverul a eliberat formularul (nu e + *!* proprietate a obiectului, e o zona de lucru globala populata inaintea Createobject) --- + IF m.tlVerificaLinii + DO asserteaza WITH lcPrefix + ' G3: crsfactura a ramas deschis dupa inchiderea formularului', Used('crsfactura'), Transform(Used('crsfactura')) + IF Used('crsfactura') AND Used('v_g4') + DO asserteaza WITH lcPrefix + ' G3: Reccount(crsfactura)=' + Transform(Reccount('crsfactura')) + ' = martor(' + Transform(m.lnMartorLinii) + ')', ; + Reccount('crsfactura') == m.lnMartorLinii, Transform(Reccount('crsfactura')) + + LOCAL lnDetTemp, llGasitLinie + Select v_g4 + Scan + lnDetTemp = v_g4.id_vanzare_det + Select crsfactura + Locate For id_temp = m.lnDetTemp + llGasitLinie = Found() + DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ': gasit in crsfactura', m.llGasitLinie, Transform(m.llGasitLinie) + IF m.llGasitLinie + DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ' G4: cantitate', Round(crsfactura.cantitate,4) == Round(v_g4.cantitate,4), Transform(crsfactura.cantitate) + DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ' G4: taxcode', Nvl(crsfactura.taxcode,0) == Nvl(v_g4.taxcode,0), Transform(Nvl(crsfactura.taxcode,0)) + DO asserteaza WITH lcPrefix + ' det=' + Transform(m.lnDetTemp) + ' G4b: gestionabil = in_stoc curent(' + Transform(Nvl(v_g4.in_stoc,0)) + ')', ; + crsfactura.gestionabil == Iif(Nvl(v_g4.in_stoc,0) <> 0, 1, 0), Transform(crsfactura.gestionabil) + ENDIF + Select v_g4 + Endscan + ENDIF + IF Used('v_g4') + Use In v_g4 + ENDIF + ENDIF + + loFrm.Release() + + *!* --- G9: niciun dialog modal la deschidere --- + DO asserteaza WITH lcPrefix + ' G9: niciun amessagebox la deschidere', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- G2: snapshot generator de numere, DUPA - identic caracter cu caracter --- + IF Used('v_plaje_b') + Use In v_plaje_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_b') + Use In v_plaje_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' + + *!* --- G8: dataoras/id_utils neschimbate pe VANZARI si VANZARI_DETALII --- + IF Used('v_g8a2') + Use In v_g8a2 + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a2') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ' G8: VANZARI.dataoras neschimbat', ; + Nvl(Ttoc(v_g8a2.dataoras), 'NULL') == Nvl(Ttoc(m.ltDataorasVanzareA), 'NULL'), Nvl(Ttoc(v_g8a2.dataoras), 'NULL') + DO asserteaza WITH lcPrefix + ' G8: VANZARI.id_utils neschimbat', Nvl(v_g8a2.id_utils, 0) == m.lnIdUtilsVanzareA, Transform(Nvl(v_g8a2.id_utils, 0)) + Use In v_g8a2 + + IF Used('v_g8d_b') + Use In v_g8d_b + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_b') + goExecutor.oReset() + lcSnapDetB = CursorToSnapshot('v_g8d_b') + Use In v_g8d_b + DO asserteaza WITH lcPrefix + ' G8: VANZARI_DETALII dataoras/id_utils identice (nicio scriere)', m.lcSnapDetA == m.lcSnapDetB, '' + + *!* --- G11 partial: fara nicio scriere pe VANZARI_DETALII (G8), nu s-a putut genera nicio miscare + *!* de stoc noua pe acest document; proba indirecta, partiala (forma completa a G11 cere S9/reemitere) --- + DO asserteaza WITH lcPrefix + ' G11 partial (derivat din G8): nicio scriere pe VANZARI_DETALII => stoc agregat neschimbat pe acest document', m.lcSnapDetA == m.lcSnapDetB, '' + + *!* --- R1: curatenie + jurnal AUSED DUPA caz --- + DO CurataAliasuriReziduale + DO LogAUsed WITH lcPrefix + ' DUPA' +ENDPROC + + +*!* Caz NEGATIV: documentul e respins de o garda CU MESAJ a do_editare_unificata (aici, "luna +*!* curenta") - formularul nu trebuie sa se deschida, trebuie sa apara mesajul asteptat, si G2 +*!* (niciun numar alocat) trebuie sa ramana curat chiar si pe calea de refuz. +PROCEDURE VerificaEditareRespinsa + LPARAMETERS tnIdVanzare, tcEticheta, tcMesajContine + + LOCAL lcPrefix, lnSucces, loFrm, lcSnapPlajeA, lcSnapPlajeB + lcPrefix = Transform(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + DO CurataAliasuriReziduale + DO LogAUsed WITH lcPrefix + ' INAINTE' + + IF Used('v_plaje_resp_a') + Use In v_plaje_resp_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_resp_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_resp_a') + Use In v_plaje_resp_a + + Select crsfacturi + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm) + IF Vartype(m.loFrm) <> 'O' + RETURN + ENDIF + + Select crsfacturi + Locate For id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found()) + IF !Found() + loFrm.Release() + RETURN + ENDIF + + goDriverS8p7.Reseteaza() + loFrm.do_editare_unificata() + + DO asserteaza WITH lcPrefix + ': formularul NU s-a deschis (garda a respins documentul)', !goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit) + DO asserteaza WITH lcPrefix + ': a aparut un mesaj de garda (refuz explicat, nu iesire silentioasa)', !Empty(gcMockUltimMesaj), gcMockUltimMesaj + DO asserteaza WITH lcPrefix + ': mesajul contine [' + m.tcMesajContine + ']', m.tcMesajContine $ Lower(gcMockUltimMesaj), gcMockUltimMesaj + + Try + loFrm.Release() + Catch + Endtry + + IF Used('v_plaje_resp_b') + Use In v_plaje_resp_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_resp_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_resp_b') + Use In v_plaje_resp_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (refuz, dar tot fara numar ars)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' + + DO CurataAliasuriReziduale + DO LogAUsed WITH lcPrefix + ' DUPA' +ENDPROC + + +*!* S8 - blocarea grupurilor B si C la editare. Citeste starea deja capturata de goDriverS8p7 +*!* (formularul e inchis pana aici) si asearta doar cand controlul e prezent. +PROCEDURE VerificaBlocajGrupBC + LPARAMETERS tcPrefix + + IF goDriverS8p7.lCtClbPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_altele (sursa) needitabil', !goDriverS8p7.lCtClbAlteleActiv, Transform(goDriverS8p7.lCtClbAlteleActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: clb_fdoc.cboFdoc (tip document) needitabil', ; + goDriverS8p7.lClbFdocPrezent AND !goDriverS8p7.lClbFdocActiv, Transform(goDriverS8p7.lClbFdocActiv) + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_nume_client (client) needitabil', ; + goDriverS8p7.lCtClbNumeClientPrezent AND !goDriverS8p7.lCtClbNumeClientActiv, Transform(goDriverS8p7.lCtClbNumeClientActiv) + IF goDriverS8p7.lCtClbValutaPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_valuta needitabil', !goDriverS8p7.lCtClbValutaActiv, Transform(goDriverS8p7.lCtClbValutaActiv) + ENDIF + IF goDriverS8p7.lClbZiCursPrezent + DO asserteaza WITH tcPrefix + ' grupB: Clb_zi_curs needitabil', !goDriverS8p7.lClbZiCursActiv, Transform(goDriverS8p7.lClbZiCursActiv) + ENDIF + IF goDriverS8p7.lCtClbGestiuneInitPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_gestiune_init (gestiune sursa) needitabil', !goDriverS8p7.lCtClbGestiuneInitActiv, Transform(goDriverS8p7.lCtClbGestiuneInitActiv) + ENDIF + IF goDriverS8p7.lCtClbPolPreturiPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_politici_preturi needitabil', !goDriverS8p7.lCtClbPolPreturiActiv, Transform(goDriverS8p7.lCtClbPolPreturiActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: but_incarca_articole needitabil (G2: evita poGeneratorNumere.verifica_numar)', ; + goDriverS8p7.lButIncarcaArticolePrezent AND !goDriverS8p7.lButIncarcaArticoleActiv, Transform(goDriverS8p7.lButIncarcaArticoleActiv) + DO asserteaza WITH tcPrefix + ' grupB: but_cursuri needitabil', ; + goDriverS8p7.lButCursuriPrezent AND !goDriverS8p7.lButCursuriActiv, Transform(goDriverS8p7.lButCursuriActiv) + IF goDriverS8p7.lCtIncasarePrezent + DO asserteaza WITH tcPrefix + ' grupC: ct_incasare needitabil', !goDriverS8p7.lCtIncasareActiv, Transform(goDriverS8p7.lCtIncasareActiv) + DO asserteaza WITH tcPrefix + ' grupC: chk_incasare needitabil', goDriverS8p7.lChkIncasarePrezent AND !goDriverS8p7.lChkIncasareActiv, Transform(goDriverS8p7.lChkIncasareActiv) + ENDIF +ENDPROC + + +*!* S8 - neregresie: pe document NOU, grupurile B/C raman editabile (acelasi tipar validat in +*!* test_s8_pas7_cablare.prg). NU trece prin factureaza()/poGeneratorNumere. +PROCEDURE VerificaDocumentNou + PRIVATE poDate + LOCAL loForm + + poDate = Createobject('oDateFactura', 0, 0) + poDate.tip = 3 + poDate.id_client = 0 + poDate.incasat = 0 + + *!* Init-ul lui frm_facturare_articole2 presupune 'crsfactura' deja deschis (in productie, + *!* creeaza_facturacrs('crsfactura') ruleaza in factureaza() inainte de Createobject, pentru + *!* orice document, nou sau editat). R1 (curatenie de aliasuri intre cazuri) inchide crsfactura + *!* dupa fiecare caz anterior - fara acest bloc, acest test ar depinde tacit de un leftover + *!* (exact cum facea, neintentionat, test_s8_pas7_cablare.prg). + IF !Used('crsfactura') + creeaza_facturacrs('crsfactura') + ENDIF + + loForm = Newobject('frm_facturare_articole2', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx') + DO asserteaza WITH 'document nou: Newobject(frm_facturare_articole2) reuseste (fara Show, fara factureaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + + DO asserteaza WITH 'document nou: poDate.lEditare = .F. (stare naturala, nesetata de nimeni)', !poDate.lEditare, Transform(poDate.lEditare) + + IF loForm.do_exista_obiect('Ct_clb_altele') + DO asserteaza WITH 'document nou grupB: Ct_clb_altele ramane editabil', loForm.Ct_clb_altele.lactiv, Transform(loForm.Ct_clb_altele.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: clb_fdoc.cboFdoc ramane editabil', loForm.clb_fdoc.cboFdoc.Enabled, Transform(loForm.clb_fdoc.cboFdoc.Enabled) + DO asserteaza WITH 'document nou grupB: Ct_clb_nume_client ramane editabil', loForm.Ct_clb_nume_client.lactiv, Transform(loForm.Ct_clb_nume_client.lactiv) + IF loForm.do_exista_obiect('Ct_clb_valuta') + DO asserteaza WITH 'document nou grupB: Ct_clb_valuta ramane editabil', loForm.Ct_clb_valuta.lactiv, Transform(loForm.Ct_clb_valuta.lactiv) + ENDIF + IF loForm.do_exista_obiect('Clb_zi_curs') + DO asserteaza WITH 'document nou grupB: Clb_zi_curs ramane editabil', !loForm.Clb_zi_curs.text_simplu1.ReadOnly, Transform(loForm.Clb_zi_curs.text_simplu1.ReadOnly) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_gestiune_init', loForm.ct_contabilitate) + DO asserteaza WITH 'document nou grupB: Ct_clb_gestiune_init ramane editabil', loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv, Transform(loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_politici_preturi') + DO asserteaza WITH 'document nou grupB: Ct_clb_politici_preturi ramane editabil', loForm.Ct_clb_politici_preturi.lactiv, Transform(loForm.Ct_clb_politici_preturi.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: but_incarca_articole ramane editabil', loForm.but_incarca_articole.Enabled, Transform(loForm.but_incarca_articole.Enabled) + *!* but_cursuri.Enabled = Used('crscursuri') AND Reccount('crscursuri')>0 (ofacturare.vc2:20918), + *!* iar citeste_cursuri_zi() ruleaza in Init doar pentru Inlist(poDate.tip,1,22,5,29,7,10,45) + *!* (:20899) - tip=3 (comanda) NU e in acea lista, deci but_cursuri e NATURAL needitabil pe un + *!* document nou de acest tip, indiferent de lEditare. Prima trecere a acestei suite astepta + *!* .T. aici (copiat din test_s8_pas7_cablare.prg) si a picat: R1 (curatenie de aliasuri intre + *!* cazuri) a inchis 'crscursuri' ramas din cazul anterior, care mascase adevaratul comportament - + *!* asertiunea veche trecea din intamplare, nu din cauza codului. Corectata aici la valoarea reala. + DO asserteaza WITH 'document nou grupB: but_cursuri needitabil natural (tip=3 nu incarca crscursuri in Init, independent de lEditare)', !loForm.but_cursuri.Enabled, Transform(loForm.but_cursuri.Enabled) + IF loForm.do_exista_obiect('ct_incasare') + DO asserteaza WITH 'document nou grupC: ct_incasare ramane editabil', loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH 'document nou grupC: chk_incasare ramane editabil', loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + ENDIF + + loForm.Release() +ENDPROC + + +*!* S8 - incasarea la editare (D1/D3/D4). Replica dovedita a corpului do_editare_unificata pana la +*!* Createobject (acelasi tipar validat in test_s8_pas7_cablare.prg). +PROCEDURE VerificaIncasareLaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tnIncasatAsteptat, tnNrIncasareAsteptat, tnTipIncasareAsteptat, tnModAsteptat + + LOCAL lcPrefix, lnSucces, loForm, pnDiscountRon, pnDiscountValuta + LOCAL lnSters, llEProforma, lnTipDoc, lcSnapPlajeA, lcSnapPlajeB + PRIVATE pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP, poDate + Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP + lcPrefix = Transform(m.tnIdVanzare) + ' [incasare ' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + DO CurataAliasuriReziduale + DO LogAUsed WITH lcPrefix + ' INAINTE' + + IF Used('v_plaje_inc_a') + Use In v_plaje_inc_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_inc_a') + Use In v_plaje_inc_a + + lnSucces = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip,incasat from fact_vfacturi where id_vanzare=' + Transform(m.tnIdVanzare), 'crsIncUnic') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': documentul a putut fi reincarcat', lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1, Transform(lnSucces) + IF !(lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1) + RETURN + ENDIF + SELECT crsIncUnic + lnIdVanzareP = id_vanzare + lnCod = cod + pnAn = Year(data_act) + pnLuna = Month(data_act) + lnSters = sters + lnIdFact = id_fact + llEProforma = (eproforma = 1) + lnTipDoc = tip + Use In crsIncUnic + + DO asserteaza WITH lcPrefix + ': garzile do_editare_unificata trecute (nesters/neproforma/tip valid/luna curenta)', ; + lnSters = 0 AND !llEProforma AND !Inlist(lnTipDoc,44,45,46,51) AND (pnAn*12+pnLuna) == (gnAn*12+gnLuna), '' + DO asserteaza WITH lcPrefix + ': fara referinte (incasari/plati)', !ReferinteDocumenteNota(pnAn, pnLuna, lnCod), '' + DO asserteaza WITH lcPrefix + ': nu e in eFactura', !EsteInEFactura(lnIdFact), '' + DO asserteaza WITH lcPrefix + ': fara urmasi', !DocumentAreUrmasi(lnIdVanzareP), '' + + poDate = IncarcaAntetFacturaEditare(lnIdVanzareP, @pnDiscountRon, @pnDiscountValuta) + DO asserteaza WITH lcPrefix + ': IncarcaAntetFacturaEditare reuseste', Vartype(m.poDate) == 'O', Vartype(m.poDate) + IF Vartype(m.poDate) <> 'O' + RETURN + ENDIF + + IncarcaLiniiFacturaEditare(poDate, lnIdVanzareP) + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF Used('jtva_coloane') + Use In jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ELSE + Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ENDIF + + loForm = Createobject('frm_facturare_articole2') + DO asserteaza WITH lcPrefix + ': formularul se deschide fara eroare (defectul 5 latent nu se activeaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + DO asserteaza WITH lcPrefix + ': G9 niciun amessagebox la Createobject/Init', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- asertiunile care prind regresia D1/D3/D4 --- + DO asserteaza WITH lcPrefix + ': poDate.incasat = valoarea din baza (NU suprascrisa cu totalctva)', ; + Round(Nvl(poDate.incasat,-1),2) == Round(m.tnIncasatAsteptat,2), Transform(Nvl(poDate.incasat,-1)) + DO asserteaza WITH lcPrefix + ': poDate.nr_incasare nu a fost zeroit', ; + Nvl(poDate.nr_incasare,-1) == m.tnNrIncasareAsteptat, Transform(Nvl(poDate.nr_incasare,-1)) + DO asserteaza WITH lcPrefix + ': poDate.ntip_incasare incarcat corect', ; + Nvl(poDate.ntip_incasare,-1) == m.tnTipIncasareAsteptat, Transform(Nvl(poDate.ntip_incasare,-1)) + DO asserteaza WITH lcPrefix + ': modul afisat (opt_incasat.Value) corespunde tip_incasare', ; + loForm.ct_incasare.opt_incasat.Value == m.tnModAsteptat - 1, Transform(loForm.ct_incasare.opt_incasat.Value) + DO asserteaza WITH lcPrefix + ': chk_incasare.Value = 1 (document incasat)', loForm.chk_incasare.Value == 1, Transform(loForm.chk_incasare.Value) + DO asserteaza WITH lcPrefix + ': grupC ct_incasare needitabil', !loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH lcPrefix + ': grupC chk_incasare needitabil', !loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + + loForm.ndiscfactron = pnDiscountRon + loForm.ndiscfactval = pnDiscountValuta + loForm.do_calculeaza_totaluri() + + *!* nemodal: eliberarea din Timer, in interiorul propriului Show() modal, blocheaza VFP in Release() + loForm.WindowType = 0 + goDriverS8p7.Reseteaza() + loForm.Show() + DO asserteaza WITH lcPrefix + ': niciun amessagebox pe parcursul Show()', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + Try + loForm.Release() + Catch + Endtry + + IF Used('v_plaje_inc_b') + Use In v_plaje_inc_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_inc_b') + Use In v_plaje_inc_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' + + DO CurataAliasuriReziduale + DO LogAUsed WITH lcPrefix + ' DUPA' +ENDPROC + + +PROCEDURE CursorToSnapshot + LPARAMETERS tcAlias + + LOCAL lcResult, lnI + lcResult = '' + SELECT (m.tcAlias) + SCAN + FOR lnI = 1 TO FCOUNT() + lcResult = lcResult + Transform(Evaluate(Field(m.lnI))) + '|' + ENDFOR + lcResult = lcResult + Chr(10) + ENDSCAN + RETURN m.lcResult +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*!* driverS8p7: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms in timp ce .Show() e blocat pe +*!* modal (acelasi tipar ca test_s8_pas7_cablare.prg). Citeste Ct_clb_altele din Objects (nu +*!* PEMSTATUS) inainte sa elibereze forma, ceea ce incheie .Show() si reda controlul apelantului. +DEFINE CLASS driverS8p7 AS Custom + lBusy = .F. + lGasit = .F. + lCtClbPrezent = .F. + lCtClbAlteleActiv = .F. + cCtClbEticheta = '' + nTotalRon = 0 + nTotalVal = 0 + + lClbFdocPrezent = .F. + lClbFdocActiv = .F. + lCtClbNumeClientPrezent = .F. + lCtClbNumeClientActiv = .F. + lCtClbValutaPrezent = .F. + lCtClbValutaActiv = .F. + lClbZiCursPrezent = .F. + lClbZiCursActiv = .F. + lCtClbGestiuneInitPrezent = .F. + lCtClbGestiuneInitActiv = .F. + lCtClbPolPreturiPrezent = .F. + lCtClbPolPreturiActiv = .F. + lButIncarcaArticolePrezent = .F. + lButIncarcaArticoleActiv = .F. + lButCursuriPrezent = .F. + lButCursuriActiv = .F. + lCtIncasarePrezent = .F. + lCtIncasareActiv = .F. + lChkIncasarePrezent = .F. + lChkIncasareActiv = .F. + + PROCEDURE Reseteaza + This.lGasit = .F. + This.lCtClbPrezent = .F. + This.lCtClbAlteleActiv = .F. + This.cCtClbEticheta = '' + This.nTotalRon = 0 + This.nTotalVal = 0 + This.lClbFdocPrezent = .F. + This.lClbFdocActiv = .F. + This.lCtClbNumeClientPrezent = .F. + This.lCtClbNumeClientActiv = .F. + This.lCtClbValutaPrezent = .F. + This.lCtClbValutaActiv = .F. + This.lClbZiCursPrezent = .F. + This.lClbZiCursActiv = .F. + This.lCtClbGestiuneInitPrezent = .F. + This.lCtClbGestiuneInitActiv = .F. + This.lCtClbPolPreturiPrezent = .F. + This.lCtClbPolPreturiActiv = .F. + This.lButIncarcaArticolePrezent = .F. + This.lButIncarcaArticoleActiv = .F. + This.lButCursuriPrezent = .F. + This.lButCursuriActiv = .F. + This.lCtIncasarePrezent = .F. + This.lCtIncasareActiv = .F. + This.lChkIncasarePrezent = .F. + This.lChkIncasareActiv = .F. + ENDPROC + + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + TRY + LOCAL lnI, lnJ, lnJ2, loFrm2, loObj, loObj2 + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + This.nTotalRon = Nvl(loFrm2.ntotalron, 0) + This.nTotalVal = Nvl(loFrm2.ntotalval, 0) + FOR lnJ = 1 TO loFrm2.Objects.Count + loObj = loFrm2.Objects(m.lnJ) + DO CASE + CASE Upper(loObj.Name) == 'CT_CLB_ALTELE' + This.lCtClbPrezent = .T. + This.lCtClbAlteleActiv = loObj.lactiv + This.cCtClbEticheta = Alltrim(loObj.clb_tx_cautare.lb_SIMPLU1.Caption) + CASE Upper(loObj.Name) == 'CLB_FDOC' + This.lClbFdocPrezent = .T. + This.lClbFdocActiv = loObj.cboFdoc.Enabled + CASE Upper(loObj.Name) == 'CT_CLB_NUME_CLIENT' + This.lCtClbNumeClientPrezent = .T. + This.lCtClbNumeClientActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CT_CLB_VALUTA' + This.lCtClbValutaPrezent = .T. + This.lCtClbValutaActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CLB_ZI_CURS' + This.lClbZiCursPrezent = .T. + This.lClbZiCursActiv = !loObj.text_simplu1.ReadOnly + CASE Upper(loObj.Name) == 'CT_CLB_POLITICI_PRETURI' + This.lCtClbPolPreturiPrezent = .T. + This.lCtClbPolPreturiActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'BUT_INCARCA_ARTICOLE' + This.lButIncarcaArticolePrezent = .T. + This.lButIncarcaArticoleActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'BUT_CURSURI' + This.lButCursuriPrezent = .T. + This.lButCursuriActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_INCASARE' + This.lCtIncasarePrezent = .T. + This.lCtIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CHK_INCASARE' + This.lChkIncasarePrezent = .T. + This.lChkIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_CONTABILITATE' + FOR lnJ2 = 1 TO loObj.Objects.Count + loObj2 = loObj.Objects(m.lnJ2) + IF Upper(loObj2.Name) == 'CT_CLB_GESTIUNE_INIT' + This.lCtClbGestiuneInitPrezent = .T. + This.lCtClbGestiuneInitActiv = loObj2.lactiv + ENDIF + ENDFOR + ENDCASE + ENDFOR + loFrm2.Release() + EXIT + ENDIF + ENDFOR + CATCH TO loExcS8p7 + STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s8_matrice_surse.prg b/utile/Teste/editare_factura/test_s8_matrice_surse.prg index 2802ede..36774fd 100644 --- a/utile/Teste/editare_factura/test_s8_matrice_surse.prg +++ b/utile/Teste/editare_factura/test_s8_matrice_surse.prg @@ -50,7 +50,7 @@ ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() *-- mock amessagebox incarcat PRIMUL, inaintea lantului real (la nume duplicat castiga primul gasit) SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg ADDITIVE -DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1) QUIT diff --git a/utile/Teste/editare_factura/test_s8_pas1_aplica.prg b/utile/Teste/editare_factura/test_s8_pas1_aplica.prg new file mode 100644 index 0000000..0db865e --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_pas1_aplica.prg @@ -0,0 +1,154 @@ +* test_s8_pas1_aplica.prg +* S8 pas 1 (planul #13) - aplica CREATE OR REPLACE VIEW VVANZARI_ARTICOLE (extensie) pe +* MARIUSM_AUTO, apoi verifica in aceeasi rulare: coloanele noi (30 in loc de 23, cele vechi +* neschimbate ca pozitie/tip), randurile pe id_vanzare de control - IDENTICE cu inainte +* (1047->2, 1050->4, 1040->1, 1055->2, 1125->4) - si continut real (nu NULL) pe coloanele noi +* pentru un document cu contract+valuta (1040) si un document cu pretd real (894). +* Scrie in Oracle (CREATE OR REPLACE VIEW, comanda idempotenta) - fara DROP, fara atingere de +* date. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_pas1_aplica_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lcOut, lcSql, llOk +lcOut = '' + +*!* --- 1. aplica CREATE OR REPLACE VIEW --- +lcSql = [create or replace view vvanzari_articole as ] + ; + [select vd.id_vanzare, vd.id_vanzare_det, vd.id_articol, vd.cantitate, vd.pret, vd.pret_cu_tva, vd.proc_tvav, ] + ; + [vd.discount_unitar, vd.id_gestiune, vd.cont, vd.id_valuta, vd.id_jtva_coloana, vd.serie, vd.explicatie, ] + ; + [vd.taxcode, vd.lot, vd.sters, vd.id_vanzare_set, vd.pret_achizitie, na.denumire, na.codmat, ng.nume_gestiune, ] + ; + [nv.nume_val, vd.id_pol, vd.id_ctr, vd.diferenta, vd.pretd, vd.id_valutad, vc.curs, vc.multiplicator ] + ; + [from vanzari_detalii vd ] + ; + [left join nom_articole na on na.id_articol = vd.id_articol ] + ; + [left join nom_gestiuni ng on ng.id_gestiune = vd.id_gestiune ] + ; + [left join nom_valute nv on nv.id_valuta = vd.id_valuta ] + ; + [left join vanzari_cursuri vc on vc.id_vanzare = vd.id_vanzare and vc.id_valuta = vd.id_valuta] + +llOk = goExecutor.oExecuta(m.lcSql) +lcOut = lcOut + '--- CREATE OR REPLACE VIEW ---' + CHR(13) + CHR(10) +lcOut = lcOut + 'rezultat: ' + TRANSFORM(m.llOk) + CHR(13) + CHR(10) +IF !m.llOk + lcOut = lcOut + 'EROARE: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +IF !m.llOk + STRTOFILE('OPRIT dupa eroare la CREATE OR REPLACE - nu se mai verifica.' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +*!* --- 2. marcheaza versiunea (registru intern Oracle, separat de docs\scripturi_oracle_13.md) --- +*!* "exec ..." e sintaxa SQL*Plus, nu SQL valid - prin goExecutor blocheaza rularea headless; +*!* forma corecta aici e blocul PL/SQL anonim +llOk = goExecutor.oExecuta([begin pack_migrare.UpdateVersiune('wip13_2026_09_02_01_COMUN_VVANZARI_ARTICOLE_EXT'); end;]) +lcOut = lcOut + '--- UpdateVersiune ---' + CHR(13) + CHR(10) + 'rezultat: ' + TRANSFORM(m.llOk) + CHR(13) + CHR(10) +IF !m.llOk + lcOut = lcOut + 'EROARE: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 3. coloanele DUPA - trebuie 30, primele 23 neschimbate ca pozitie/tip --- +lcSql = [select column_id, column_name, data_type, data_length, data_precision, data_scale ] + ; + [from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VVANZARI_ARTICOLE' order by column_id] +IF Used('crscols') + Use In crscols +ENDIF +IF goExecutor.oExecute(m.lcSql, [crscols]) < 0 + lcOut = lcOut + 'EROARE coloane dupa: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- coloane DUPA (' + TRANSFORM(RECCOUNT('crscols')) + ', asteptat 30) ---' + CHR(13) + CHR(10) + SELECT crscols + SCAN + lcOut = lcOut + TRANSFORM(column_id) + '. ' + ALLTRIM(column_name) + ' ' + ALLTRIM(data_type) + ; + IIF(NVL(data_precision,0) > 0, '(' + TRANSFORM(data_precision) + ',' + TRANSFORM(NVL(data_scale,0)) + ')', ; + IIF(NVL(data_length,0) > 0 AND ALLTRIM(data_type) $ 'VARCHAR2,CHAR', '(' + TRANSFORM(data_length) + ')', '')) + CHR(13) + CHR(10) + ENDSCAN + USE IN crscols +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 4. randuri DUPA pe cele 5 id_vanzare de control - trebuie identice cu INAINTE --- +lcSql = [select id_vanzare, count(*) as nr from vvanzari_articole where id_vanzare in (1050,1047,1055,1040,1125) and sters = 0 group by id_vanzare order by id_vanzare] +IF Used('crscnt') + Use In crscnt +ENDIF +IF goExecutor.oExecute(m.lcSql, [crscnt]) < 0 + lcOut = lcOut + 'EROARE numarare dupa: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- randuri sters=0 pe id_vanzare de control (DUPA) - asteptat 1040->1,1047->2,1050->4,1055->2,1125->4 ---' + CHR(13) + CHR(10) + SELECT crscnt + SCAN + lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' -> ' + TRANSFORM(nr) + ' randuri' + CHR(13) + CHR(10) + ENDSCAN + USE IN crscnt +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 5. continut real pe coloanele noi: 1040 (contract + valuta), 894 (pretd real) --- +lcSql = [select id_vanzare, id_vanzare_det, id_pol, id_ctr, diferenta, pretd, id_valutad, curs, multiplicator ] + ; + [from vvanzari_articole where id_vanzare in (1040,894) and sters = 0 order by id_vanzare, id_vanzare_det] +IF Used('crscheck') + Use In crscheck +ENDIF +IF goExecutor.oExecute(m.lcSql, [crscheck]) < 0 + lcOut = lcOut + 'EROARE continut nou: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- continut coloane noi, 1040 (contract+valuta) si 894 (pretd real) ---' + CHR(13) + CHR(10) + SELECT crscheck + SCAN + lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' det=' + TRANSFORM(id_vanzare_det) + ; + ' id_pol=' + TRANSFORM(NVL(id_pol,-1)) + ' id_ctr=' + TRANSFORM(NVL(id_ctr,-1)) + ; + ' diferenta=' + TRANSFORM(NVL(diferenta,-1)) + ' pretd=' + TRANSFORM(NVL(pretd,-1)) + ; + ' id_valutad=' + TRANSFORM(NVL(id_valutad,-1)) + ' curs=' + TRANSFORM(NVL(curs,-1)) + ; + ' multiplicator=' + TRANSFORM(NVL(multiplicator,-1)) + CHR(13) + CHR(10) + ENDSCAN + USE IN crscheck +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 6. proba directa a consumatorului real IncarcaArticoleFactura (select v.*) - nu trebuie sa pice --- +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +IncarcaArticoleFactura(1050) +lcOut = lcOut + CHR(13) + CHR(10) + '--- IncarcaArticoleFactura(1050) dupa extindere ---' + CHR(13) + CHR(10) +lcOut = lcOut + 'Reccount(tvd) = ' + TRANSFORM(RECCOUNT('tvd')) + ' (asteptat 4)' + CHR(13) + CHR(10) +lcOut = lcOut + 'Fcount(tvd) = ' + TRANSFORM(FCOUNT('tvd')) + CHR(13) + CHR(10) +lcOut = lcOut + 'are id_pol: ' + TRANSFORM(TYPE('tvd.id_pol') <> 'U') + ', are curs: ' + TRANSFORM(TYPE('tvd.curs') <> 'U') + CHR(13) + CHR(10) +IF Used('tvd') + Use In tvd +ENDIF +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s8_pas1_cardinalitate.prg b/utile/Teste/editare_factura/test_s8_pas1_cardinalitate.prg new file mode 100644 index 0000000..3c53708 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_pas1_cardinalitate.prg @@ -0,0 +1,115 @@ +* test_s8_pas1_cardinalitate.prg +* S8 pas 1 - continuare investigare read-only: verifica daca (id_vanzare, id_valuta) e unic in +* VANZARI_CURSURI (altfel un join pe aceasta cheie ar multiplica randurile view-ului), cauta un +* exemplu cu pretd nenul, si numara randurile INAINTE pe cateva id_vanzare suplimentare +* (1055, 1040, 1125) care vor fi folosite ca proba de continut real (contract / valuta). +* Nu scrie nimic in Oracle. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_pas1_cardinalitate_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lcOut, lcSql +lcOut = '' + +*!* --- 1. dubluri pe (id_vanzare, id_valuta) in VANZARI_CURSURI - risc de multiplicare la join --- +lcSql = [select max(nr) as maxnr, count(*) as grupuri from (select id_vanzare, id_valuta, count(*) as nr from vanzari_cursuri group by id_vanzare, id_valuta having count(*) > 1)] +IF Used('crsdup') + Use In crsdup +ENDIF +IF goExecutor.oExecute(m.lcSql, [crsdup]) < 0 + lcOut = lcOut + 'EROARE dubluri: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + '--- dubluri (id_vanzare,id_valuta) in VANZARI_CURSURI ---' + CHR(13) + CHR(10) + lcOut = lcOut + 'grupuri cu >1 rand: ' + TRANSFORM(NVL(crsdup.grupuri,0)) + ', max randuri intr-un grup: ' + TRANSFORM(NVL(crsdup.maxnr,0)) + CHR(13) + CHR(10) + USE IN crsdup +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 2. exemplu cu pretd nenul --- +lcSql = [select * from (select id_vanzare, id_vanzare_det, id_valutad, pretd from vanzari_detalii where nvl(pretd,0) <> 0 and sters = 0 order by id_vanzare_det desc) where rownum <= 5] +IF Used('crspretd') + Use In crspretd +ENDIF +IF goExecutor.oExecute(m.lcSql, [crspretd]) < 0 + lcOut = lcOut + 'EROARE pretd nenul: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- exemple cu pretd <> 0 (max 5) ---' + CHR(13) + CHR(10) + IF RECCOUNT('crspretd') = 0 + lcOut = lcOut + '(niciun rand cu pretd <> 0 in toata VANZARI_DETALII)' + CHR(13) + CHR(10) + ELSE + SELECT crspretd + SCAN + lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' det=' + TRANSFORM(id_vanzare_det) + ' id_valutad=' + TRANSFORM(NVL(id_valutad,-1)) + ' pretd=' + TRANSFORM(pretd) + CHR(13) + CHR(10) + ENDSCAN + ENDIF + USE IN crspretd +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 3. randuri INAINTE pe id_vanzare suplimentare (1055 contract, 1040 contract, 1125 valuta) --- +lcSql = [select id_vanzare, count(*) as nr from vvanzari_articole where id_vanzare in (1055,1040,1125) and sters = 0 group by id_vanzare order by id_vanzare] +IF Used('crscnt2') + Use In crscnt2 +ENDIF +IF goExecutor.oExecute(m.lcSql, [crscnt2]) < 0 + lcOut = lcOut + 'EROARE numarare suplimentara: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- randuri sters=0 pe id_vanzare 1055/1040/1125 (INAINTE) ---' + CHR(13) + CHR(10) + SELECT crscnt2 + SCAN + lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' -> ' + TRANSFORM(nr) + ' randuri' + CHR(13) + CHR(10) + ENDSCAN + USE IN crscnt2 +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 4. VANZARI_CURSURI pentru id_vanzare 1055/1040/1125, ca sa vedem daca exista randuri de curs pentru ele --- +lcSql = [select id_vanzare, id_valuta, curs, multiplicator from vanzari_cursuri where id_vanzare in (1055,1040,1125) order by id_vanzare] +IF Used('crscurex') + Use In crscurex +ENDIF +IF goExecutor.oExecute(m.lcSql, [crscurex]) < 0 + lcOut = lcOut + 'EROARE vanzari_cursuri exemple: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- VANZARI_CURSURI pentru 1055/1040/1125 ---' + CHR(13) + CHR(10) + IF RECCOUNT('crscurex') = 0 + lcOut = lcOut + '(niciun rand)' + CHR(13) + CHR(10) + ELSE + SELECT crscurex + SCAN + lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' id_valuta=' + TRANSFORM(id_valuta) + ' curs=' + TRANSFORM(curs) + ' multiplicator=' + TRANSFORM(multiplicator) + CHR(13) + CHR(10) + ENDSCAN + ENDIF + USE IN crscurex +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s8_pas1_cursuri.prg b/utile/Teste/editare_factura/test_s8_pas1_cursuri.prg new file mode 100644 index 0000000..a7eb206 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_pas1_cursuri.prg @@ -0,0 +1,135 @@ +* test_s8_pas1_cursuri.prg +* S8 pas 1 - continuare investigare read-only: CURS/MULTIPLICATOR nu exista direct pe +* VANZARI_DETALII (confirmat de test_s8_pas1_ddl_view.prg). Aici se verifica VANZARI_CURSURI: +* structura, cheia de join catre o linie de vanzare, si daca join-ul ar multiplica randurile +* view-ului (risc de cardinalitate). Nu scrie nimic in Oracle. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_pas1_cursuri_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lcOut, lcSql +lcOut = '' + +*!* --- 1. exista tabela VANZARI_CURSURI? coloanele ei --- +lcSql = [select column_id, column_name, data_type from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_CURSURI' order by column_id] +IF Used('crscur') + Use In crscur +ENDIF +IF goExecutor.oExecute(m.lcSql, [crscur]) < 0 + lcOut = lcOut + 'EROARE VANZARI_CURSURI: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + '--- VANZARI_CURSURI, coloane (' + TRANSFORM(RECCOUNT('crscur')) + ') ---' + CHR(13) + CHR(10) + IF RECCOUNT('crscur') = 0 + lcOut = lcOut + '(tabela nu exista sau owner gresit)' + CHR(13) + CHR(10) + ELSE + SELECT crscur + SCAN + lcOut = lcOut + TRANSFORM(column_id) + '. ' + ALLTRIM(column_name) + ' ' + ALLTRIM(data_type) + CHR(13) + CHR(10) + ENDSCAN + ENDIF + USE IN crscur +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 2. VANZARI, coloane CURS/MULTIPLICATOR pe antet (ca sa comparam cu ce s-ar citi pe linie) --- +lcSql = [select column_id, column_name, data_type from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI' ] + ; + [and (column_name like '%CURS%' or column_name like '%MULTIPLIC%') order by column_id] +IF Used('crsvcurs') + Use In crsvcurs +ENDIF +IF goExecutor.oExecute(m.lcSql, [crsvcurs]) < 0 + lcOut = lcOut + 'EROARE VANZARI curs: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- VANZARI (antet), coloane CURS/MULTIPLICATOR (' + TRANSFORM(RECCOUNT('crsvcurs')) + ') ---' + CHR(13) + CHR(10) + SELECT crsvcurs + SCAN + lcOut = lcOut + TRANSFORM(column_id) + '. ' + ALLTRIM(column_name) + ' ' + ALLTRIM(data_type) + CHR(13) + CHR(10) + ENDSCAN + USE IN crsvcurs +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 3. mostre de valori din VANZARI_DETALII pentru documentele 1050/1047 - PRETD, ID_VALUTAD, ID_CTR, ID_POL, DIFERENTA --- +lcSql = [select id_vanzare, id_vanzare_det, id_pol, id_ctr, diferenta, pretd, id_valutad from vanzari_detalii where id_vanzare in (1050,1047) order by id_vanzare, id_vanzare_det] +IF Used('crsval') + Use In crsval +ENDIF +IF goExecutor.oExecute(m.lcSql, [crsval]) < 0 + lcOut = lcOut + 'EROARE mostre 1050/1047: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- VANZARI_DETALII, mostre 1050/1047 ---' + CHR(13) + CHR(10) + SELECT crsval + SCAN + lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' det=' + TRANSFORM(id_vanzare_det) + ; + ' id_pol=' + TRANSFORM(NVL(id_pol,-1)) + ' id_ctr=' + TRANSFORM(NVL(id_ctr,-1)) + ; + ' diferenta=' + TRANSFORM(NVL(diferenta,-1)) + ' pretd=' + TRANSFORM(NVL(pretd,-1)) + ; + ' id_valutad=' + TRANSFORM(NVL(id_valutad,-1)) + CHR(13) + CHR(10) + ENDSCAN + USE IN crsval +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 4. cauta un document cu id_ctr populat si unul cu id_valutad populat (in afara de 1050/1047), ca proba de continut real --- +lcSql = [select * from (select id_vanzare, id_vanzare_det, id_ctr, id_pol from vanzari_detalii where id_ctr is not null and sters = 0 order by id_vanzare_det desc) where rownum <= 3] +IF Used('crsctr') + Use In crsctr +ENDIF +IF goExecutor.oExecute(m.lcSql, [crsctr]) < 0 + lcOut = lcOut + 'EROARE cautare id_ctr: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- exemple cu id_ctr populat (max 3) ---' + CHR(13) + CHR(10) + SELECT crsctr + SCAN + lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' det=' + TRANSFORM(id_vanzare_det) + ' id_ctr=' + TRANSFORM(id_ctr) + ' id_pol=' + TRANSFORM(NVL(id_pol,-1)) + CHR(13) + CHR(10) + ENDSCAN + USE IN crsctr +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +lcSql = [select * from (select id_vanzare, id_vanzare_det, id_valutad, pretd from vanzari_detalii where id_valutad is not null and sters = 0 order by id_vanzare_det desc) where rownum <= 3] +IF Used('crsval2') + Use In crsval2 +ENDIF +IF goExecutor.oExecute(m.lcSql, [crsval2]) < 0 + lcOut = lcOut + 'EROARE cautare id_valutad: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- exemple cu id_valutad populat (max 3) ---' + CHR(13) + CHR(10) + SELECT crsval2 + SCAN + lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' det=' + TRANSFORM(id_vanzare_det) + ' id_valutad=' + TRANSFORM(id_valutad) + ' pretd=' + TRANSFORM(NVL(pretd,-1)) + CHR(13) + CHR(10) + ENDSCAN + USE IN crsval2 +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s8_pas1_ddl_view.prg b/utile/Teste/editare_factura/test_s8_pas1_ddl_view.prg new file mode 100644 index 0000000..aa9d33b --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_pas1_ddl_view.prg @@ -0,0 +1,114 @@ +* test_s8_pas1_ddl_view.prg +* S8 pas 1 (planul #13) - investigare read-only, INAINTE de a scrie CREATE OR REPLACE VIEW pe +* VVANZARI_ARTICOLE: (1) lista reala de coloane a view-ului de pe DB, in ordine, (2) numarul de +* randuri pe id_vanzare 1050/1047 (baza de neregresie), (3) coloanele cerute de propunere pe +* VANZARI_DETALII (exista? sunt populate?). Nu scrie nimic in Oracle. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_pas1_ddl_view_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lcOut +lcOut = '' + +*!* --- 1. coloanele reale ale VVANZARI_ARTICOLE, in ordine, de pe DB --- +LOCAL lcSql +lcSql = [select column_id, column_name, data_type, data_length, data_precision, data_scale ] + ; + [from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VVANZARI_ARTICOLE' order by column_id] +IF Used('crscols') + Use In crscols +ENDIF +IF goExecutor.oExecute(m.lcSql, [crscols]) < 0 + lcOut = lcOut + 'EROARE coloane view: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + '--- VVANZARI_ARTICOLE, coloane pe DB (owner MARIUSM_AUTO), ' + TRANSFORM(RECCOUNT('crscols')) + ' coloane ---' + CHR(13) + CHR(10) + SELECT crscols + SCAN + lcOut = lcOut + TRANSFORM(column_id) + '. ' + ALLTRIM(column_name) + ' ' + ALLTRIM(data_type) + ; + IIF(NVL(data_precision,0) > 0, '(' + TRANSFORM(data_precision) + ',' + TRANSFORM(NVL(data_scale,0)) + ')', ; + IIF(NVL(data_length,0) > 0 AND ALLTRIM(data_type) $ 'VARCHAR2,CHAR', '(' + TRANSFORM(data_length) + ')', '')) + CHR(13) + CHR(10) + ENDSCAN + USE IN crscols +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 2. numarul de randuri pe id_vanzare 1050/1047 - baza de neregresie INAINTE --- +lcSql = [select id_vanzare, count(*) as nr from vvanzari_articole where id_vanzare in (1050,1047) and sters = 0 group by id_vanzare order by id_vanzare] +IF Used('crscnt') + Use In crscnt +ENDIF +IF goExecutor.oExecute(m.lcSql, [crscnt]) < 0 + lcOut = lcOut + 'EROARE numarare: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- randuri sters=0 pe id_vanzare 1050/1047 (INAINTE) ---' + CHR(13) + CHR(10) + SELECT crscnt + SCAN + lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' -> ' + TRANSFORM(nr) + ' randuri' + CHR(13) + CHR(10) + ENDSCAN + USE IN crscnt +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 3. coloanele cerute din VANZARI_DETALII (existenta) --- +lcSql = [select column_id, column_name, data_type from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_DETALII' ] + ; + [and column_name in ('ID_POL','ID_CTR','DIFERENTA','PRETD','ID_VALUTAD','CURS','MULTIPLICATOR','DISCOUNT_UNITAR_VAL') order by column_id] +IF Used('crscols2') + Use In crscols2 +ENDIF +IF goExecutor.oExecute(m.lcSql, [crscols2]) < 0 + lcOut = lcOut + 'EROARE coloane vanzari_detalii: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- VANZARI_DETALII, coloanele cerute care EXISTA ---' + CHR(13) + CHR(10) + SELECT crscols2 + SCAN + lcOut = lcOut + TRANSFORM(column_id) + '. ' + ALLTRIM(column_name) + ' ' + ALLTRIM(data_type) + CHR(13) + CHR(10) + ENDSCAN + USE IN crscols2 +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 4. toate coloanele tabelei VANZARI_DETALII, ca sa vedem si CURS/MULTIPLICATOR daca exista sub alt nume --- +lcSql = [select column_id, column_name, data_type from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_DETALII' order by column_id] +IF Used('crscols3') + Use In crscols3 +ENDIF +IF goExecutor.oExecute(m.lcSql, [crscols3]) < 0 + lcOut = lcOut + 'EROARE toate coloane vanzari_detalii: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- VANZARI_DETALII, TOATE coloanele (' + TRANSFORM(RECCOUNT('crscols3')) + ') ---' + CHR(13) + CHR(10) + SELECT crscols3 + SCAN + lcOut = lcOut + TRANSFORM(column_id) + '. ' + ALLTRIM(column_name) + ' ' + ALLTRIM(data_type) + CHR(13) + CHR(10) + ENDSCAN + USE IN crscols3 +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s8_pas1_ddltext.prg b/utile/Teste/editare_factura/test_s8_pas1_ddltext.prg new file mode 100644 index 0000000..8e70958 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_pas1_ddltext.prg @@ -0,0 +1,47 @@ +* test_s8_pas1_ddltext.prg +* S8 pas 1 - incearca sa extraga TEXTUL viu al VVANZARI_ARTICOLE (all_views.text, LONG) prin +* goExecutor, ca sa se confirme join-urile exacte (alias na/ng/nv) inainte de a scrie +* CREATE OR REPLACE. Doar citire. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_pas1_ddltext_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lcOut, lcSql +lcOut = '' + +lcSql = [select text from all_views where owner = 'MARIUSM_AUTO' and view_name = 'VVANZARI_ARTICOLE'] +IF Used('crstxt') + Use In crstxt +ENDIF +IF goExecutor.oExecute(m.lcSql, [crstxt]) < 0 + lcOut = lcOut + 'EROARE text view: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + '--- all_views.text pentru VVANZARI_ARTICOLE (lungime=' + TRANSFORM(LEN(NVL(crstxt.text,''))) + ') ---' + CHR(13) + CHR(10) + lcOut = lcOut + NVL(crstxt.text,'(NULL)') + CHR(13) + CHR(10) + USE IN crstxt +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s8_pas1_versiune.prg b/utile/Teste/editare_factura/test_s8_pas1_versiune.prg new file mode 100644 index 0000000..c23eafc --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_pas1_versiune.prg @@ -0,0 +1,38 @@ +* test_s8_pas1_versiune.prg +* S8 pas 1 - test izolat, doar marcajul de versiune (pack_migrare.UpdateVersiune), ca sa nu +* mai blocheze scriptul principal daca sintaxa "exec" nu e valida prin goExecutor (nu e SQL*Plus). +* Incearca bloc PL/SQL anonim. QUIT la final indiferent de rezultat. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_pas1_versiune_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL llOk +STRTOFILE('incepe UpdateVersiune' + CHR(13) + CHR(10), gcErrLog, 1) +llOk = goExecutor.oExecuta([begin pack_migrare.UpdateVersiune('wip13_2026_09_02_01_COMUN_VVANZARI_ARTICOLE_EXT'); end;]) +STRTOFILE('rezultat: ' + TRANSFORM(m.llOk) + CHR(13) + CHR(10), gcErrLog, 1) +IF !m.llOk + STRTOFILE('EROARE: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) +ENDIF +goExecutor.oReset() + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s8_pas1_versiune_check.prg b/utile/Teste/editare_factura/test_s8_pas1_versiune_check.prg new file mode 100644 index 0000000..4e43ef2 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_pas1_versiune_check.prg @@ -0,0 +1,47 @@ +* test_s8_pas1_versiune_check.prg +* S8 pas 1 - confirma in tabela VERSIUNE (sursa de adevar, nu raportul) ca marcajul scriptului +* a fost scris. Doar SELECT. QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_pas1_versiune_check_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lcOut, lcSql +lcOut = '' +lcSql = [select script_final, tip_script, data_script, seq_script from versiune where script_final like '%VVANZARI_ARTICOLE_EXT%' order by data_script] +IF Used('crsv') + Use In crsv +ENDIF +IF goExecutor.oExecute(m.lcSql, [crsv]) < 0 + lcOut = lcOut + 'EROARE: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + '--- VERSIUNE, marcaje VVANZARI_ARTICOLE_EXT (' + TRANSFORM(RECCOUNT('crsv')) + ') ---' + CHR(13) + CHR(10) + SELECT crsv + SCAN + lcOut = lcOut + ALLTRIM(script_final) + ' | ' + ALLTRIM(NVL(tip_script,'')) + ' | ' + TRANSFORM(data_script) + ' | seq=' + TRANSFORM(NVL(seq_script,-1)) + CHR(13) + CHR(10) + ENDSCAN + USE IN crsv +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s8_pas3_garda_alte_date.prg b/utile/Teste/editare_factura/test_s8_pas3_garda_alte_date.prg new file mode 100644 index 0000000..8775f48 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_pas3_garda_alte_date.prg @@ -0,0 +1,125 @@ +* test_s8_pas3_garda_alte_date.prg +* Verifica garda poDate.lEditare in frm_alte_date.Init (ferestre_cere_date.vc2), care sare +* lookup-ul "ultimul delegat/ultima masina" cand documentul e deschis in editare (S8 pas 3). +* goExecutor e inlocuit temporar cu un mock in jurul apelului: pack_facturare.cauta_date_ +* ultima_factura ramane blocat indefinit in acest mediu de test (deja semnalat in +* creeaza_documente_s8.prg, motiv pentru care acel script evita complet Init-ul formularului) - +* mock-ul evita atarnarea si masoara direct daca blocul a fost intrat, fara sa scrie in Oracle. +* Doua cazuri pe acelasi poDate de start (id_delegat/id_masina = .NULL., tip=0 - ocoleste +* ramura casa/opt_incasat, care nu face parte din garda testata): +* A. lEditare = .T. -> blocul nu se intra: id_delegat/id_masina raman .NULL., mock neapelat +* B. lEditare = .F. -> blocul se intra ca azi: id_delegat/id_masina devin 0, mock apelat o data + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_pas3_garda_alte_date_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_comun.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 + +*!* poDate declarat/initializat la nivel de program - altfel e invizibil in frm_alte_date.Init (.vcx) +PRIVATE poDate +LOCAL loExecutorReal, loMockExecutor +loExecutorReal = goExecutor +loMockExecutor = Createobject('mock_executor_lookup') + +*!* --- cazul A: editare - blocul (deci si lookup-ul) NU trebuie sa se intre --- +poDate = Createobject('oDateFactura', 0, 0) +poDate.lEditare = .T. +poDate.id_client = 1 +poDate.tip = 0 +DO asserteaza WITH 'inainte de Init: id_delegat = NULL (stare de start)', Isnull(poDate.id_delegat), Transform(poDate.id_delegat) +DO asserteaza WITH 'inainte de Init: id_masina = NULL (stare de start)', Isnull(poDate.id_masina), Transform(poDate.id_masina) + +goExecutor = loMockExecutor +LOCAL loFrmA +loFrmA = Newobject('frm_alte_date', 'D:\ROA\ROAFACTURARE\COMUN\clase\ferestre_cere_date.vcx') +goExecutor = loExecutorReal +DO asserteaza WITH 'A. Newobject(frm_alte_date) reuseste cu lEditare=.T.', Vartype(m.loFrmA) == 'O', Vartype(m.loFrmA) +IF Vartype(m.loFrmA) == 'O' + DO asserteaza WITH 'A. lEditare=.T.: id_delegat ramane NULL dupa Init (blocul nu s-a intrat)', Isnull(poDate.id_delegat), Transform(poDate.id_delegat) + DO asserteaza WITH 'A. lEditare=.T.: id_masina ramane NULL dupa Init (blocul nu s-a intrat)', Isnull(poDate.id_masina), Transform(poDate.id_masina) + DO asserteaza WITH 'A. lEditare=.T.: lookup-ul (goExecutor.oExecute) NU a fost apelat', loMockExecutor.nApeluri = 0, Transform(loMockExecutor.nApeluri) + loFrmA.Release() +ENDIF + +*!* --- cazul B: document nou (neregresie) - blocul trebuie sa se intre ca azi --- +loMockExecutor = Createobject('mock_executor_lookup') +poDate = Createobject('oDateFactura', 0, 0) +poDate.lEditare = .F. +poDate.id_client = 1 +poDate.tip = 0 +DO asserteaza WITH 'inainte de Init (cazul B): id_delegat = NULL (stare de start)', Isnull(poDate.id_delegat), Transform(poDate.id_delegat) +DO asserteaza WITH 'inainte de Init (cazul B): id_masina = NULL (stare de start)', Isnull(poDate.id_masina), Transform(poDate.id_masina) + +goExecutor = loMockExecutor +LOCAL loFrmB +loFrmB = Newobject('frm_alte_date', 'D:\ROA\ROAFACTURARE\COMUN\clase\ferestre_cere_date.vcx') +goExecutor = loExecutorReal +DO asserteaza WITH 'B. Newobject(frm_alte_date) reuseste cu lEditare=.F.', Vartype(m.loFrmB) == 'O', Vartype(m.loFrmB) +IF Vartype(m.loFrmB) == 'O' + DO asserteaza WITH 'B. lEditare=.F.: id_delegat devine numeric dupa Init (blocul s-a intrat ca azi)', Vartype(poDate.id_delegat) == 'N', Transform(poDate.id_delegat) + DO asserteaza WITH 'B. lEditare=.F.: id_masina devine numeric dupa Init (blocul s-a intrat ca azi)', Vartype(poDate.id_masina) == 'N', Transform(poDate.id_masina) + DO asserteaza WITH 'B. lEditare=.F.: lookup-ul (goExecutor.oExecute) a fost apelat o data', loMockExecutor.nApeluri = 1, Transform(loMockExecutor.nApeluri) + loFrmB.Release() +ENDIF + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + m.tcValoare + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +DEFINE CLASS mock_executor_lookup AS Custom + nApeluri = 0 + cUltimulSql = '' + + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor + This.nApeluri = This.nApeluri + 1 + This.cUltimulSql = tcSql + RETURN 1 + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s8_pas5_antet.prg b/utile/Teste/editare_factura/test_s8_pas5_antet.prg new file mode 100644 index 0000000..c35ff33 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_pas5_antet.prg @@ -0,0 +1,244 @@ +* test_s8_pas5_antet.prg +* Verifica IncarcaAntetFacturaEditare/IncarcaListaAvizeSursa (ofacturare_editare.prg), pasul 5 din +* docs\propunere_s8_incarcare.md: incarcarea ANTETULUI unui document existent intr-un oDateFactura nou. +* Documente reale, gasite prin interogare read-only (nu inventate) pe MARIUSM_AUTO: +* 280 - sursa CONTRACT (id_ctr=20), lei +* 575 - document SIMPLU (fara comanda/ctr), discount<>0 +* 627 - VALUTA (EURO), cu id_facturare/listare_detaliata populate +* 665 - emis din avizul 664 (VANZARI_CORESP.TIP=1) - proba cListaSursaAvize +* 142 - sursa COMANDA (id_comanda=31), cu DATA_SCAD NULL - caz limita pe G1 +* Fiecare document e verificat impotriva unei interogari INDEPENDENTE pe FACT_VFACTURI (nu impotriva +* codului testat) pentru G1/G6/G7. G2 se verifica prin snapshot pe VPLAJE_NUMERE (urmval), inainte/dupa +* toate apelurile - niciun numar nu trebuie ars, functia nu atinge poGeneratorNumere. Nu scrie in +* Oracle - doar SELECT. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_pas5_antet_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 + +*!* PRIVATE + initializare la nivel de program - poDate declarat Local in Init nu e vizibil in .vcx, +*!* dar aici testam direct functia, fara formular; Private e doar disciplina consecventa cu restul suitei +PRIVATE poDate +poDate = .NULL. + +*!* --- G2: snapshot VPLAJE_NUMERE INAINTE de orice apel --- +LOCAL lcPlajeInainte, lcPlajeDupa +lcPlajeInainte = SnapshotPlaje() +DO asserteaza WITH 'snapshot VPLAJE_NUMERE initial nu e gol', !EMPTY(lcPlajeInainte), lcPlajeInainte + +*!* ========================================================================= +*!* Caz 1: id_vanzare=280, sursa CONTRACT (id_ctr=20), lei +*!* ========================================================================= +LOCAL lnDiscRon, lnDiscVal +poDate = IncarcaAntetFacturaEditare(280, @lnDiscRon, @lnDiscVal) +DO asserteaza WITH '280: IncarcaAntetFacturaEditare intoarce obiect', VARTYPE(poDate) == 'O', VARTYPE(poDate) +IF VARTYPE(poDate) == 'O' + DO asserteaza WITH '280: lEditare=.T.', poDate.lEditare, TRANSFORM(poDate.lEditare) + DO asserteaza WITH '280: zi_curs = dataact (cursul zilei documentului)', poDate.zi_curs == poDate.dataact, TRANSFORM(poDate.zi_curs) + + *!* martor independent - interogare separata pe fact_vfacturi, NU cea din codul testat + LOCAL lnSuccesM + IF USED('v_martor') + USE IN v_martor + ENDIF + lnSuccesM = goExecutor.oExecute([select tip, eproforma, serie_act, numar_act, data_act, data_scad, discount, ] + ; + [discount_evidentiat, delegat, id_delegat, nrinmat, id_masina, nume_agent, id_agent, adresa_facturare, ] + ; + [id_facturare, dataora_exp, listare_detaliata, tip_saft, efactura, id_ruta, in_valuta, id_part, client, ] + ; + [id_comanda, id_ctr from fact_vfacturi where id_vanzare = 280], [v_martor]) + goExecutor.oReset() + DO asserteaza WITH '280: martor Oracle a reusit', lnSuccesM >= 0 AND USED('v_martor') AND RECCOUNT('v_martor') = 1, TRANSFORM(lnSuccesM) + + SELECT v_martor + *!* G1 + DO asserteaza WITH '280 G1 serie_act = VANZARI [' + ALLTRIM(NVL(serie_act,'')) + ']', ALLTRIM(NVL(poDate.serie_act,'')) == ALLTRIM(NVL(serie_act,'')), ALLTRIM(NVL(poDate.serie_act,'')) + DO asserteaza WITH '280 G1 nract=' + TRANSFORM(numar_act) + ' = VANZARI', poDate.nract == numar_act, TRANSFORM(poDate.nract) + DO asserteaza WITH '280 G1 dataact=' + DTOC(data_act) + ' = VANZARI', poDate.dataact == data_act, DTOC(poDate.dataact) + DO asserteaza WITH '280 G1 datascad=' + DTOC(data_scad) + ' = VANZARI', poDate.datascad == data_scad, DTOC(poDate.datascad) + *!* G6 + DO asserteaza WITH '280 G6 discount lei=' + TRANSFORM(discount) + ' = calculat (in_valuta=0)', lnDiscRon == NVL(discount,0), TRANSFORM(lnDiscRon) + DO asserteaza WITH '280 G6 discount_evidentiat=' + TRANSFORM(discount_evidentiat) + ' = VANZARI', poDate.discount_evidentiat == NVL(discount_evidentiat,0), TRANSFORM(poDate.discount_evidentiat) + *!* G7 + DO asserteaza WITH '280 G7 id_delegat=' + TRANSFORM(NVL(id_delegat,-1)) + ' = VANZARI', poDate.id_delegat == id_delegat, TRANSFORM(poDate.id_delegat) + DO asserteaza WITH '280 G7 nume_delegat=[' + ALLTRIM(NVL(delegat,'')) + '] = VANZARI', ALLTRIM(NVL(poDate.nume_delegat,'')) == ALLTRIM(NVL(delegat,'')), ALLTRIM(NVL(poDate.nume_delegat,'')) + DO asserteaza WITH '280 G7 adresa_facturare = VANZARI', ALLTRIM(NVL(poDate.adresa_facturare,'')) == ALLTRIM(NVL(adresa_facturare,'')), ALLTRIM(NVL(poDate.adresa_facturare,'')) + DO asserteaza WITH '280 G7 dataora_exp = VANZARI', poDate.dataora_exp == dataora_exp, TRANSFORM(poDate.dataora_exp) + DO asserteaza WITH '280 G7 listare_detaliata=' + TRANSFORM(NVL(listare_detaliata,-1)) + ' = VANZARI', poDate.nListareDetaliata == NVL(listare_detaliata,0), TRANSFORM(poDate.nListareDetaliata) + DO asserteaza WITH '280 G7 id_ruta = VANZARI (ambele NULL, camp gol pe acest document)', ISNULL(poDate.id_ruta) == ISNULL(id_ruta), TRANSFORM(poDate.id_ruta) + DO asserteaza WITH '280 G7 efactura = VANZARI', poDate.eFactura == NVL(efactura,0), TRANSFORM(poDate.eFactura) + *!* alte campuri de antet + DO asserteaza WITH '280 tip=' + TRANSFORM(tip) + ' = VANZARI', poDate.tip == tip, TRANSFORM(poDate.tip) + DO asserteaza WITH '280 eProforma derivat=0 (nu e proforma)', poDate.eProforma == NVL(eproforma,0), TRANSFORM(poDate.eProforma) + DO asserteaza WITH '280 id_client = VANZARI', poDate.id_client == id_part, TRANSFORM(poDate.id_client) + DO asserteaza WITH '280 cListaSursa = id_ctr (' + TRANSFORM(id_ctr) + ')', ALLTRIM(poDate.cListaSursa) == ALLTRIM(STR(id_ctr)), poDate.cListaSursa + USE IN v_martor +ENDIF + +*!* ========================================================================= +*!* Caz 2: id_vanzare=575, document SIMPLU, discount<>0 +*!* ========================================================================= +poDate = IncarcaAntetFacturaEditare(575, @lnDiscRon, @lnDiscVal) +DO asserteaza WITH '575: IncarcaAntetFacturaEditare intoarce obiect', VARTYPE(poDate) == 'O', VARTYPE(poDate) +IF VARTYPE(poDate) == 'O' + IF USED('v_martor') + USE IN v_martor + ENDIF + lnSuccesM = goExecutor.oExecute([select tip, eproforma, serie_act, numar_act, data_act, data_scad, discount, ] + ; + [discount_evidentiat, delegat, id_delegat, bidelegat, cnpdelegat, nrinmat, id_masina, id_agent, ] + ; + [nvl(text_aditional,'-') as ta, tip_saft, efactura, id_ruta, id_part, id_comanda, id_ctr ] + ; + [from fact_vfacturi where id_vanzare = 575], [v_martor]) + goExecutor.oReset() + DO asserteaza WITH '575: martor Oracle a reusit', lnSuccesM >= 0 AND USED('v_martor') AND RECCOUNT('v_martor') = 1, TRANSFORM(lnSuccesM) + + SELECT v_martor + DO asserteaza WITH '575 G1 nract=' + TRANSFORM(numar_act) + ' = VANZARI', poDate.nract == numar_act, TRANSFORM(poDate.nract) + DO asserteaza WITH '575 G1 dataact = VANZARI', poDate.dataact == data_act, DTOC(poDate.dataact) + DO asserteaza WITH '575 G6 discount lei=' + TRANSFORM(discount) + ' (nenul, camp important)', lnDiscRon == NVL(discount,0) AND lnDiscRon <> 0, TRANSFORM(lnDiscRon) + DO asserteaza WITH '575 G6 discount valuta=0 (document in lei)', lnDiscVal == 0, TRANSFORM(lnDiscVal) + DO asserteaza WITH '575 G6 discount_evidentiat = VANZARI', poDate.discount_evidentiat == NVL(discount_evidentiat,0), TRANSFORM(poDate.discount_evidentiat) + DO asserteaza WITH '575 G7 CNPdelegat=[' + ALLTRIM(NVL(cnpdelegat,'')) + '] = VANZARI (nenul, camp important)', ALLTRIM(NVL(poDate.CNPdelegat,'')) == ALLTRIM(NVL(cnpdelegat,'')) AND !EMPTY(poDate.CNPdelegat), poDate.CNPdelegat + DO asserteaza WITH '575 G7 tip_saft: gol pe document (-1/NULL) - ramane implicitul clasei 380 (nesuprascris cu gunoi)', poDate.tip_saft == 380, TRANSFORM(poDate.tip_saft) + DO asserteaza WITH '575 cListaSursa gol (fara comanda/contract)', EMPTY(poDate.cListaSursa), poDate.cListaSursa + DO asserteaza WITH '575 cListaSursaAvize gol (fara VANZARI_CORESP tip=1 pentru acest id)', EMPTY(poDate.cListaSursaAvize), poDate.cListaSursaAvize + USE IN v_martor +ENDIF + +*!* ========================================================================= +*!* Caz 3: id_vanzare=627, VALUTA (EURO), id_facturare/listare_detaliata populate +*!* ========================================================================= +poDate = IncarcaAntetFacturaEditare(627, @lnDiscRon, @lnDiscVal) +DO asserteaza WITH '627: IncarcaAntetFacturaEditare intoarce obiect', VARTYPE(poDate) == 'O', VARTYPE(poDate) +IF VARTYPE(poDate) == 'O' + IF USED('v_martor') + USE IN v_martor + ENDIF + lnSuccesM = goExecutor.oExecute([select in_valuta, id_valuta, nume_val, curs, multiplicator, discount, ] + ; + [id_facturare, adresa_facturare, listare_detaliata, id_masina, nrinmat, id_delegat, delegat ] + ; + [from fact_vfacturi where id_vanzare = 627], [v_martor]) + goExecutor.oReset() + DO asserteaza WITH '627: martor Oracle a reusit', lnSuccesM >= 0 AND USED('v_martor') AND RECCOUNT('v_martor') = 1, TRANSFORM(lnSuccesM) + + SELECT v_martor + DO asserteaza WITH '627 in_valuta=1 = VANZARI', poDate.in_valuta == in_valuta, TRANSFORM(poDate.in_valuta) + DO asserteaza WITH '627 id_valuta = VANZARI', poDate.id_valuta == id_valuta, TRANSFORM(poDate.id_valuta) + DO asserteaza WITH '627 nume_valuta=[' + ALLTRIM(NVL(nume_val,'')) + '] = VANZARI', ALLTRIM(NVL(poDate.nume_valuta,'')) == ALLTRIM(NVL(nume_val,'')), poDate.nume_valuta + DO asserteaza WITH '627 Curs=' + TRANSFORM(curs) + ' = VANZARI', poDate.Curs == curs, TRANSFORM(poDate.Curs) + DO asserteaza WITH '627 multiplicator = VANZARI', poDate.multiplicator == multiplicator, TRANSFORM(poDate.multiplicator) + DO asserteaza WITH '627 G6 discount valuta = discount brut (document in valuta, discount=0 pe acest caz)', lnDiscVal == NVL(discount,0), TRANSFORM(lnDiscVal) + DO asserteaza WITH '627 G6 discount lei = valuta*curs/multiplicator (0*4.5/1=0)', lnDiscRon == ROUND(NVL(discount,0) * curs / multiplicator, gnPPretV), TRANSFORM(lnDiscRon) + DO asserteaza WITH '627 G7 id_facturare=' + TRANSFORM(NVL(id_facturare,-1)) + ' = VANZARI (nenul, camp important)', poDate.id_facturare == id_facturare AND !EMPTY(NVL(poDate.id_facturare,0)), TRANSFORM(poDate.id_facturare) + DO asserteaza WITH '627 G7 listare_detaliata=1 = VANZARI (nenul)', poDate.nListareDetaliata == listare_detaliata AND poDate.nListareDetaliata = 1, TRANSFORM(poDate.nListareDetaliata) + DO asserteaza WITH '627 G7 nrinmat=[' + ALLTRIM(NVL(nrinmat,'')) + '] = VANZARI (nenul)', ALLTRIM(NVL(poDate.nrinmat,'')) == ALLTRIM(NVL(nrinmat,'')) AND !EMPTY(poDate.nrinmat), poDate.nrinmat + USE IN v_martor +ENDIF + +*!* ========================================================================= +*!* Caz 4: id_vanzare=665, emis din avizul 664 - proba cListaSursaAvize +*!* ========================================================================= +poDate = IncarcaAntetFacturaEditare(665, @lnDiscRon, @lnDiscVal) +DO asserteaza WITH '665: IncarcaAntetFacturaEditare intoarce obiect', VARTYPE(poDate) == 'O', VARTYPE(poDate) +IF VARTYPE(poDate) == 'O' + DO asserteaza WITH '665 cListaSursaAvize = 664 (VANZARI_CORESP.TIP=1)', ALLTRIM(poDate.cListaSursaAvize) == '664', poDate.cListaSursaAvize +ENDIF + +*!* ========================================================================= +*!* Caz 5: id_vanzare=142, sursa COMANDA (id_comanda=31), DATA_SCAD NULL - caz limita G1 +*!* ========================================================================= +poDate = IncarcaAntetFacturaEditare(142, @lnDiscRon, @lnDiscVal) +DO asserteaza WITH '142: IncarcaAntetFacturaEditare intoarce obiect', VARTYPE(poDate) == 'O', VARTYPE(poDate) +IF VARTYPE(poDate) == 'O' + DO asserteaza WITH '142 G1 datascad ramane NULL (nu se inventeaza o valoare)', ISNULL(poDate.datascad), TRANSFORM(poDate.datascad) + DO asserteaza WITH '142 cListaSursa = id_comanda (31)', ALLTRIM(poDate.cListaSursa) == '31', poDate.cListaSursa + + IF USED('v_martor') + USE IN v_martor + ENDIF + lnSuccesM = goExecutor.oExecute([select id_agent, nume_agent from fact_vfacturi where id_vanzare = 142], [v_martor]) + goExecutor.oReset() + IF lnSuccesM >= 0 AND USED('v_martor') AND RECCOUNT('v_martor') = 1 + SELECT v_martor + DO asserteaza WITH '142 G7 id_agent=' + TRANSFORM(NVL(id_agent,-1)) + ' = VANZARI (nenul, camp important)', poDate.id_agent == id_agent AND !EMPTY(NVL(poDate.id_agent,0)), TRANSFORM(poDate.id_agent) + DO asserteaza WITH '142 G7 nume_agent=[' + ALLTRIM(NVL(nume_agent,'')) + '] = VANZARI (nenul)', ALLTRIM(NVL(poDate.nume_agent,'')) == ALLTRIM(NVL(nume_agent,'')) AND !EMPTY(poDate.nume_agent), poDate.nume_agent + USE IN v_martor + ENDIF +ENDIF + +*!* ========================================================================= +*!* Caz 6: id inexistent -> .NULL., fara efecte secundare +*!* ========================================================================= +poDate = IncarcaAntetFacturaEditare(999999999, @lnDiscRon, @lnDiscVal) +DO asserteaza WITH '999999999: IncarcaAntetFacturaEditare intoarce .NULL.', ISNULL(poDate), TRANSFORM(VARTYPE(poDate)) +DO asserteaza WITH '999999999: gcMockUltimMesaj ramane gol (id inexistent nu e eroare Oracle)', EMPTY(gcMockUltimMesaj), gcMockUltimMesaj + +*!* --- G2: snapshot VPLAJE_NUMERE DUPA toate apelurile - trebuie identic --- +lcPlajeDupa = SnapshotPlaje() +DO asserteaza WITH 'G2: VPLAJE_NUMERE neschimbat dupa 6 apeluri (niciun numar ars)', lcPlajeInainte == lcPlajeDupa, IIF(lcPlajeInainte==lcPlajeDupa,'identic','DIFERIT') + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +PROCEDURE SnapshotPlaje + LOCAL lcSql, lnSucces, lcSnap + lcSnap = '' + IF USED('v_plaje_snap') + USE IN v_plaje_snap + ENDIF + lcSql = [select id_plaja, urmval from vplaje_numere where NVL(id_sucursala,-99) = ] + TRANSFORM(NVL(gnIdSucursala,-99)) + [ order by id_plaja] + lnSucces = goExecutor.oExecute(lcSql,[v_plaje_snap]) + goExecutor.oReset() + IF lnSucces >= 0 AND USED('v_plaje_snap') + SELECT v_plaje_snap + SCAN + lcSnap = lcSnap + TRANSFORM(id_plaja) + '=' + ALLTRIM(NVL(urmval,'-')) + ';' + ENDSCAN + USE IN v_plaje_snap + ENDIF + RETURN lcSnap +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s8_pas6_linii.prg b/utile/Teste/editare_factura/test_s8_pas6_linii.prg new file mode 100644 index 0000000..5f548ed --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_pas6_linii.prg @@ -0,0 +1,187 @@ +* test_s8_pas6_linii.prg +* Verifica IncarcaLiniiFacturaEditare (ofacturare_editare.prg), pasul 6 din +* docs\propunere_s8_incarcare.md: incarcarea LINIILOR unui document existent direct in crsfactura. +* Documente reale, gasite prin interogare read-only (nu inventate) pe MARIUSM_AUTO: +* 627 - VALUTA (EURO, curs=4.50), 4 linii +* 1050 - lei, 4 linii +* 1047 - lei, 2 linii (materiale/manopera, fara id_articol pe una) +* 1040 - lei, 1 linie, id_ctr=235 +* 894 - lei, 2 linii, una cu pretd=100/id_valutad=2 (achizitie in valuta) +* 1049 - lei, 3 linii active + 1 linie STEARSA (sters=1) - caz limita G3 +* Fiecare linie e verificata impotriva unei interogari INDEPENDENTE pe VANZARI_DETALII/NOM_ARTICOLE +* (nu impotriva codului testat). Nu scrie in Oracle - doar SELECT. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_pas6_linii_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 + +PRIVATE poDate +poDate = .NULL. + +DO VerificaDocument WITH 627, 'valuta EURO' +DO VerificaDocument WITH 1050, 'lei' +DO VerificaDocument WITH 1047, 'lei, materiale/manopera' +DO VerificaDocument WITH 1040, 'lei, id_ctr' +DO VerificaDocument WITH 894, 'lei, pretd/id_valutad pe o linie' +DO VerificaDocument WITH 1049, 'lei, 1 linie stearsa + 3 active' + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +PROCEDURE VerificaDocument + LPARAMETERS tnIdVanzare, tcEticheta + + LOCAL lcSql, lnSucces, lnMartorActive, lcPrefix, lnDiscRon, lnDiscVal + lcPrefix = TRANSFORM(tnIdVanzare) + ' [' + tcEticheta + ']' + + *!* --- martor G3: numar de linii nesterse, interogare independenta --- + IF USED('v_g3') + USE IN v_g3 + ENDIF + lnSucces = goExecutor.oExecute([select count(*) as nr from vanzari_detalii where id_vanzare = ] + ; + TRANSFORM(m.tnIdVanzare) + [ and sters = 0], [v_g3]) + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor G3 Oracle a reusit', lnSucces >= 0 AND USED('v_g3'), TRANSFORM(lnSucces) + lnMartorActive = v_g3.nr + USE IN v_g3 + + *!* --- antetul (prerechizita productiei - pasul 5) --- + poDate = IncarcaAntetFacturaEditare(m.tnIdVanzare, @lnDiscRon, @lnDiscVal) + DO asserteaza WITH lcPrefix + ': antetul s-a incarcat', VARTYPE(poDate) == 'O', VARTYPE(poDate) + IF VARTYPE(poDate) <> 'O' + RETURN + ENDIF + + *!* --- codul testat --- + IF USED('crsfactura') + USE IN crsfactura + ENDIF + IncarcaLiniiFacturaEditare(poDate, m.tnIdVanzare) + DO asserteaza WITH lcPrefix + ': crsfactura s-a deschis', USED('crsfactura'), TRANSFORM(USED('crsfactura')) + IF !USED('crsfactura') + RETURN + ENDIF + + *!* --- G3 --- + DO asserteaza WITH lcPrefix + ' G3: RECCOUNT(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + ' = martor(' + TRANSFORM(lnMartorActive) + ')', ; + RECCOUNT('crsfactura') == m.lnMartorActive, TRANSFORM(RECCOUNT('crsfactura')) + + *!* --- martor G4/G4b: interogare independenta pe VANZARI_DETALII + NOM_ARTICOLE --- + IF USED('v_g4') + USE IN v_g4 + ENDIF + lcSql = [select vd.id_vanzare_det, vd.id_articol, vd.cantitate, vd.pret, vd.discount_unitar, vd.pret_cu_tva, ] + ; + [vd.proc_tvav, vd.lot, vd.serie, vd.explicatie, vd.taxcode, vd.id_gestiune, vd.id_pol, vd.pretd, vd.id_valutad, ] + ; + [na.in_stoc from vanzari_detalii vd left join nom_articole na on na.id_articol = vd.id_articol ] + ; + [where vd.id_vanzare = ] + TRANSFORM(m.tnIdVanzare) + [ and vd.sters = 0 order by vd.id_vanzare_det] + lnSucces = goExecutor.oExecute(lcSql, [v_g4]) + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor G4 Oracle a reusit', lnSucces >= 0 AND USED('v_g4'), TRANSFORM(lnSucces) + IF !USED('v_g4') + RETURN + ENDIF + + LOCAL lnCursUse, lnMultUse, llValuta, lnDetTemp, llGasit, lnPretRon, lnDiscRonLinie, lnPretAsteptat, lnDiscAsteptat + llValuta = (poDate.in_valuta = 1) + lnCursUse = IIF(m.llValuta, poDate.Curs, 1) + lnMultUse = IIF(m.llValuta, poDate.multiplicator, 1) + + SELECT v_g4 + SCAN + lnDetTemp = v_g4.id_vanzare_det + SELECT crsfactura + LOCATE FOR id_temp = m.lnDetTemp + llGasit = FOUND() + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ': gasit in crsfactura', m.llGasit, TRANSFORM(m.llGasit) + IF !m.llGasit + SELECT v_g4 + LOOP + ENDIF + + *!* G4 - campuri directe + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ': cantitate', ROUND(crsfactura.cantitate,4) == ROUND(v_g4.cantitate,4), TRANSFORM(crsfactura.cantitate) + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ': taxcode', NVL(crsfactura.taxcode,0) == NVL(v_g4.taxcode,0), TRANSFORM(NVL(crsfactura.taxcode,0)) + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ': lot', ALLTRIM(NVL(crsfactura.lot,'')) == ALLTRIM(NVL(v_g4.lot,'')), crsfactura.lot + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ': serie', ALLTRIM(NVL(crsfactura.serie,'')) == ALLTRIM(NVL(v_g4.serie,'')), crsfactura.serie + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ': explicatie', ALLTRIM(NVL(crsfactura.explicatie,'')) == ALLTRIM(NVL(v_g4.explicatie,'')), crsfactura.explicatie + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ': proc_tvav', crsfactura.proc_tvav == v_g4.proc_tvav, TRANSFORM(crsfactura.proc_tvav) + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ': id_pol', NVL(crsfactura.id_pol,-1) == NVL(v_g4.id_pol,-1), TRANSFORM(NVL(crsfactura.id_pol,-1)) + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ': pretd', NVL(crsfactura.pretd,-1) == NVL(v_g4.pretd,-1), TRANSFORM(NVL(crsfactura.pretd,-1)) + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ': id_valuta_d', NVL(crsfactura.id_valuta_d,-1) == NVL(v_g4.id_valutad,-1), TRANSFORM(NVL(crsfactura.id_valuta_d,-1)) + + *!* G4b - gestionabil din NOMENCLATORUL CURENT, nu din id_gestiune al documentului + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ' G4b: gestionabil=in_stoc curent(' + TRANSFORM(NVL(v_g4.in_stoc,0)) + ')', ; + crsfactura.gestionabil == IIF(NVL(v_g4.in_stoc,0) <> 0, 1, 0), TRANSFORM(crsfactura.gestionabil) + + *!* G4 - pret/discount, convertite in lei ca discountul de antet (IncarcaAntetFacturaEditare) + lnPretRon = IIF(m.llValuta, ROUND(v_g4.pret * m.lnCursUse / m.lnMultUse, gnPPretV), v_g4.pret) + lnDiscRonLinie = IIF(m.llValuta, ROUND(v_g4.discount_unitar * m.lnCursUse / m.lnMultUse, gnPPretV), v_g4.discount_unitar) + IF v_g4.pret_cu_tva = 1 + lnPretAsteptat = ROUND(m.lnPretRon, gnPPretV) + lnDiscAsteptat = ROUND(m.lnDiscRonLinie, gnPPretV) + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ' G4: pretctva rotunjit', crsfactura.pretctva == m.lnPretAsteptat, TRANSFORM(crsfactura.pretctva) + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ' G4: discountctva rotunjit', crsfactura.discountctva == m.lnDiscAsteptat, TRANSFORM(crsfactura.discountctva) + ELSE + lnPretAsteptat = ROUND(m.lnPretRon, gnPPretV) + lnDiscAsteptat = ROUND(m.lnDiscRonLinie, gnPPretV) + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ' G4: pretftva rotunjit', crsfactura.pretftva == m.lnPretAsteptat, TRANSFORM(crsfactura.pretftva) + DO asserteaza WITH lcPrefix + ' det=' + TRANSFORM(m.lnDetTemp) + ' G4: discountftva rotunjit', crsfactura.discountftva == m.lnDiscAsteptat, TRANSFORM(crsfactura.discountftva) + ENDIF + + SELECT v_g4 + ENDSCAN + USE IN v_g4 + + *!* --- G9: niciun dialog modal la incarcare --- + DO asserteaza WITH lcPrefix + ' G9: niciun amessagebox in tot fluxul (antet+linii)', EMPTY(gcMockUltimMesaj), gcMockUltimMesaj + + USE IN crsfactura +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s8_pas7_cablare.prg b/utile/Teste/editare_factura/test_s8_pas7_cablare.prg new file mode 100644 index 0000000..3b2b8c1 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_pas7_cablare.prg @@ -0,0 +1,659 @@ +* test_s8_pas7_cablare.prg +* Verifica pasul 7 din docs\propunere_s8_incarcare.md §6: cablarea celei de-a treia optiuni de +* meniu si corpul real al lui frm_facturi.do_editare_unificata (COMUN\clase\ofacturare_comun.vc2). +* Traseul REAL: Newobject('frm_facturi') + .do_editare_unificata() (nu Createobject direct pe +* frm_facturare_articole2 - asta ar proba doar codul formularului, nu rutarea). +* Documente reale, in luna curenta a calendarului (gnAn/gnLuna), care trec toate garzile +* (nesters, ne-eproforma, tip valid, fara referinte, fara urmasi, ne-eFactura), gasite prin +* interogare read-only pe MARIUSM_AUTO: +* 1113 - sursa COMANDA (tip=3, id_comanda=2479) +* 1055 - sursa CONTRACT (tip=2, id_ctr=234) +* 1048 - factura SIMPLA, lista de preturi (tip=1, fara comanda/ctr) +* 1130 - VALUTA (tip=5, in_valuta=1) +* Nu scrie in Oracle - doar SELECT; verifica ca formularul deschis nici el nu scrie +* (G8: dataoras/id_utils neschimbate pe VANZARI/VANZARI_DETALII). +* +* frm_facturare_articole2 (ofacturare.vc2:15894) nu suprascrie WindowType, iar _frm_base il +* seteaza pe 1 = modal - .Show() blocheaza pana la inchiderea ferestrei, headless nu are cine +* sa o inchida in mod normal. Solutie: driverS8p7 (Custom, BINDEVENT pe un Timer de pe _SCREEN, +* acelasi tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg) - un modal inca pompeaza +* mesaje Windows, deci timerul tot mai ruleaza in interiorul lui .Show(); cand gaseste forma +* deschisa ii citeste prezenta/eticheta lui Ct_clb_altele (din colectia Objects, nu PEMSTATUS - +* RemoveObject scoate din Objects dar PEMSTATUS ramane .T., vezi memoria pemstatus-dupa- +* removeobject) si o elibereaza, ceea ce incheie .Show() si intoarce controlul in +* do_editare_unificata, apoi in acest test. Nu modifica NIMIC in codul de productie. +* +* Extindere S8 (blocarea grupurilor B si C la editare, docs\raport_s8_grup_bc.md): driverS8p7 +* citeste in plus, din Objects, starea needitabila a controalelor clb_fdoc.cboFdoc, Ct_clb_altele, +* Ct_clb_nume_client, Ct_clb_valuta, Clb_zi_curs, ct_contabilitate.Ct_clb_gestiune_init, +* Ct_clb_politici_preturi, but_incarca_articole, but_cursuri, ct_incasare, chk_incasare - fiecare +* verificat doar daca e prezent (unele sunt scoase de Init in functie de tip/gnScadereStoc, +* independent de lEditare). Proba de neregresie pe document nou (VerificaDocumentNou) NU trece +* prin factureaza()/poGeneratorNumere (interzis, arde numere) - construieste poDate manual cu +* Createobject('oDateFactura',0,0) (Init nu ruleaza, ramane pe defaults, lEditare=.F. ca la orice +* document nou) si instantiaza formularul direct cu Newobject, FARA .Show() (Init ruleaza oricum +* la construire; fara Show() nu exista blocaj modal, deci nu e nevoie de driver aici). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_pas7_cablare_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 + +*!* --- driver care inchide fereastra modala frm_facturare_articole2, vezi antetul fisierului --- +PUBLIC goDriverS8p7 +goDriverS8p7 = Createobject('driverS8p7') +_SCREEN.AddObject('tmrS8p7', 'Timer') +_SCREEN.tmrS8p7.Interval = 150 +Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa') +_SCREEN.tmrS8p7.Enabled = .T. + +*!* --- verificare statica: corpul do_editare_unificata nu contine nicio referinta la alocarea +*!* de numere (factureaza/poGeneratorNumere/creeaza_cursor_serii) --- +LOCAL lcSrc, lcTail, lnStart, lnEnd, lcMetoda +lcSrc = FILETOSTR('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vc2') +lnStart = AT('PROCEDURE do_editare_unificata' + CHR(13) + CHR(10), lcSrc) +DO asserteaza WITH 'static: metoda do_editare_unificata gasita in sursa', lnStart > 0, TRANSFORM(lnStart) +IF lnStart > 0 + lcTail = SUBSTR(lcSrc, lnStart) + lnEnd = AT('ENDPROC', lcTail) + lcMetoda = UPPER(SUBSTR(lcTail, 1, lnEnd + 6)) + DO asserteaza WITH 'static G2: fara FACTUREAZA( in do_editare_unificata', 'FACTUREAZA(' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara POGENERATORNUMERE in do_editare_unificata', 'POGENERATORNUMERE' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara CREEAZA_CURSOR_SERII in do_editare_unificata', 'CREEAZA_CURSOR_SERII' $ lcMetoda = .F., '' +ENDIF + +*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe cele 4 documente --- +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +LOCAL lcSchema, lcSelect, lcOrder, lcFiltru +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +lcOrder = [data_act,numar_act] +lcFiltru = [id_vanzare in (1113, 1055, 1048, 1130)] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +DO asserteaza WITH 'crsfacturi incarcat cu cele 4 documente reale (rownum=4)', Used('crsfacturi') AND Reccount('crsfacturi') = 4, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') + +*!* Ct_clb_altele (infirmare §3.2, vezi raport): document CU sursa -> prezent, etichetat din +*!* poDate.tip; factura SIMPLA -> absent, identic cu introducerea unei facturi noi (G10). +DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda' +DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract' +DO VerificaEditare WITH 1048, 'factura simpla', .F., '' +DO VerificaEditare WITH 1130, 'valuta', .F., '' + +*!* --- S8 incasarea la editare (D1/D3/D4, docs\propunere_s8_incasare_la_editare.md) - foloseste +*!* Show() real, deci trebuie sa ruleze inainte de teardown-ul lui tmrS8p7 de mai jos. +*!* 1071: tip_incasare=11 (chitanta) -> mod 2. 1072: tip_incasare=2 (bon fiscal) -> mod 3, +*!* cazul in care hardcodarea veche "mod 2" ar fi aratat gresit. +DO VerificaIncasareLaEditare WITH 1071, 'chitanta, tip_incasare=11', 119, 44, 11, 2 +DO VerificaIncasareLaEditare WITH 1072, 'bon fiscal, tip_incasare=2', 119, 66, 2, 3 + +_SCREEN.tmrS8p7.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrS8p7') +Catch +Endtry + +*!* --- S8 grupurile B/C: neregresie pe document NOU (docs\raport_s8_grup_bc.md) --- +DO VerificaDocumentNou + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +PROCEDURE VerificaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tlCtClbAsteptat, tcCtClbEtichetaAsteptata + + LOCAL lcPrefix, lnSucces, loFrm, lnI, llGasitForm + LOCAL lcSnapPlajeA, lcSnapPlajeB, lcSnapDetA, lcSnapDetB + LOCAL ltDataorasVanzareA, lnIdUtilsVanzareA + lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + *!* --- G2: snapshot generator de numere, INAINTE --- + IF Used('v_plaje_a') + Use In v_plaje_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_a') + Use In v_plaje_a + + *!* --- G8: snapshot dataoras/id_utils, INAINTE --- + IF Used('v_g8a') + Use In v_g8a + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor G8 antet Oracle a reusit', lnSucces >= 0 AND Used('v_g8a') AND Reccount('v_g8a') = 1, Transform(lnSucces) + ltDataorasVanzareA = v_g8a.dataoras + lnIdUtilsVanzareA = Nvl(v_g8a.id_utils, 0) + Use In v_g8a + + IF Used('v_g8d_a') + Use In v_g8d_a + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_a') + goExecutor.oReset() + lcSnapDetA = CursorToSnapshot('v_g8d_a') + Use In v_g8d_a + + *!* --- codul testat: traseul real, prin frm_facturi.do_editare_unificata --- + *!* Init-ul clasei presupune crsfacturi ca zona curenta (la fel ca in test_s7_urmasi.prg) - + *!* interogarile martor de mai sus au schimbat zona curenta intre timp, se restaureaza aici + Select crsfacturi + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm) + IF Vartype(m.loFrm) <> 'O' + RETURN + ENDIF + + Select crsfacturi + Locate For id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found()) + IF !Found() + loFrm.Release() + RETURN + ENDIF + + *!* --- driverS8p7 gaseste si inchide formularul unificat (FARA but_termin1.Click()), vezi + *!* antetul fisierului; .do_editare_unificata() nu revine decat dupa ce fereastra s-a inchis --- + goDriverS8p7.Reseteaza() + loFrm.do_editare_unificata() + + DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit) + + *!* --- Ct_clb_altele: prezenta citita din colectia Objects a formularului, cat timp era deschis + *!* (infirmarea §3.2 - vezi raport) --- + DO asserteaza WITH lcPrefix + ': Ct_clb_altele prezenta = ' + Iif(m.tlCtClbAsteptat, 'prezent', 'absent'), ; + goDriverS8p7.lCtClbPrezent == m.tlCtClbAsteptat, Transform(goDriverS8p7.lCtClbPrezent) + IF m.tlCtClbAsteptat + DO asserteaza WITH lcPrefix + ': Ct_clb_altele eticheta = [' + m.tcCtClbEtichetaAsteptata + ']', ; + Upper(goDriverS8p7.cCtClbEticheta) == Upper(m.tcCtClbEtichetaAsteptata), goDriverS8p7.cCtClbEticheta + ENDIF + *!* --- grupul B si C (S8, decizia 25): needitabile la editare, verificate doar cand controlul + *!* mai exista (unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare) --- + DO VerificaBlocajGrupBC WITH m.lcPrefix + + *!* --- G5: totalul afisat de do_calculeaza_totaluri (chemat inainte de Show, in do_editare_unificata) + *!* ramane egal cu totalul deja scris in VANZARI - prinde o reevaluare tacita a cursului/preturilor --- + Select crsfacturi + IF Nvl(crsfacturi.in_valuta, 0) = 1 + DO asserteaza WITH lcPrefix + ' G5: total afisat (valuta) = VANZARI.totval', ; + Round(goDriverS8p7.nTotalVal, 2) == Round(Nvl(crsfacturi.totval, 0), 2), Transform(goDriverS8p7.nTotalVal) + ' vs ' + Transform(crsfacturi.totval) + ELSE + DO asserteaza WITH lcPrefix + ' G5: total afisat (lei) = VANZARI.total_cu_tva', ; + Round(goDriverS8p7.nTotalRon, 2) == Round(Nvl(crsfacturi.total_cu_tva, 0), 2), Transform(goDriverS8p7.nTotalRon) + ' vs ' + Transform(crsfacturi.total_cu_tva) + ENDIF + + loFrm.Release() + + *!* --- G9: niciun dialog modal la deschidere --- + DO asserteaza WITH lcPrefix + ' G9: niciun amessagebox la deschidere', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- G2: snapshot generator de numere, DUPA - identic caracter cu caracter --- + IF Used('v_plaje_b') + Use In v_plaje_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_b') + Use In v_plaje_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' + + *!* --- G8: dataoras/id_utils neschimbate pe VANZARI si VANZARI_DETALII --- + IF Used('v_g8a2') + Use In v_g8a2 + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a2') + goExecutor.oReset() + *!* Nvl pe TTOC: dataoras e NULL pe documentele de test - NULL == NULL da .NULL. in VFP (nu .T.), + *!* fals negativ fara el + DO asserteaza WITH lcPrefix + ' G8: VANZARI.dataoras neschimbat', ; + Nvl(Ttoc(v_g8a2.dataoras), 'NULL') == Nvl(Ttoc(m.ltDataorasVanzareA), 'NULL'), Nvl(Ttoc(v_g8a2.dataoras), 'NULL') + DO asserteaza WITH lcPrefix + ' G8: VANZARI.id_utils neschimbat', Nvl(v_g8a2.id_utils, 0) == m.lnIdUtilsVanzareA, Transform(Nvl(v_g8a2.id_utils, 0)) + Use In v_g8a2 + + IF Used('v_g8d_b') + Use In v_g8d_b + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_b') + goExecutor.oReset() + lcSnapDetB = CursorToSnapshot('v_g8d_b') + Use In v_g8d_b + DO asserteaza WITH lcPrefix + ' G8: VANZARI_DETALII dataoras/id_utils identice (nicio scriere)', m.lcSnapDetA == m.lcSnapDetB, '' + + *!* --- G11 partial: fara nicio scriere pe VANZARI_DETALII (G8), nu s-a putut genera nicio miscare + *!* de stoc noua pe acest document; nu masoara direct un tabel de stoc - proba indirecta, partiala --- + DO asserteaza WITH lcPrefix + ' G11 partial (derivat din G8): nicio scriere pe VANZARI_DETALII => stoc agregat neschimbat pe acest document', m.lcSnapDetA == m.lcSnapDetB, '' +ENDPROC + + +*!* S8 - blocarea grupurilor B si C la editare (docs\raport_s8_grup_bc.md). Citeste starea deja +*!* capturata de goDriverS8p7 (formularul e inchis pana aici) si asearta doar cand controlul e +*!* prezent - unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare. +PROCEDURE VerificaBlocajGrupBC + LPARAMETERS tcPrefix + + IF goDriverS8p7.lCtClbPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_altele (sursa) needitabil', !goDriverS8p7.lCtClbAlteleActiv, Transform(goDriverS8p7.lCtClbAlteleActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: clb_fdoc.cboFdoc (tip document) needitabil', ; + goDriverS8p7.lClbFdocPrezent AND !goDriverS8p7.lClbFdocActiv, Transform(goDriverS8p7.lClbFdocActiv) + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_nume_client (client) needitabil', ; + goDriverS8p7.lCtClbNumeClientPrezent AND !goDriverS8p7.lCtClbNumeClientActiv, Transform(goDriverS8p7.lCtClbNumeClientActiv) + IF goDriverS8p7.lCtClbValutaPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_valuta needitabil', !goDriverS8p7.lCtClbValutaActiv, Transform(goDriverS8p7.lCtClbValutaActiv) + ENDIF + IF goDriverS8p7.lClbZiCursPrezent + DO asserteaza WITH tcPrefix + ' grupB: Clb_zi_curs needitabil', !goDriverS8p7.lClbZiCursActiv, Transform(goDriverS8p7.lClbZiCursActiv) + ENDIF + IF goDriverS8p7.lCtClbGestiuneInitPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_gestiune_init (gestiune sursa) needitabil', !goDriverS8p7.lCtClbGestiuneInitActiv, Transform(goDriverS8p7.lCtClbGestiuneInitActiv) + ENDIF + IF goDriverS8p7.lCtClbPolPreturiPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_politici_preturi needitabil', !goDriverS8p7.lCtClbPolPreturiActiv, Transform(goDriverS8p7.lCtClbPolPreturiActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: but_incarca_articole needitabil (G2: evita poGeneratorNumere.verifica_numar)', ; + goDriverS8p7.lButIncarcaArticolePrezent AND !goDriverS8p7.lButIncarcaArticoleActiv, Transform(goDriverS8p7.lButIncarcaArticoleActiv) + DO asserteaza WITH tcPrefix + ' grupB: but_cursuri needitabil', ; + goDriverS8p7.lButCursuriPrezent AND !goDriverS8p7.lButCursuriActiv, Transform(goDriverS8p7.lButCursuriActiv) + IF goDriverS8p7.lCtIncasarePrezent + DO asserteaza WITH tcPrefix + ' grupC: ct_incasare needitabil', !goDriverS8p7.lCtIncasareActiv, Transform(goDriverS8p7.lCtIncasareActiv) + DO asserteaza WITH tcPrefix + ' grupC: chk_incasare needitabil', goDriverS8p7.lChkIncasarePrezent AND !goDriverS8p7.lChkIncasareActiv, Transform(goDriverS8p7.lChkIncasareActiv) + ENDIF +ENDPROC + + +*!* S8 - neregresie: pe document NOU, grupurile B/C raman editabile (docs\raport_s8_grup_bc.md). +*!* NU trece prin factureaza()/poGeneratorNumere (interzis - arde numere din plaje reale). poDate +*!* construit manual cu Createobject('oDateFactura',0,0): Init-ul clasei NU ruleaza (tnIdSet=0), +*!* deci ramane pe defaults din PropValue - inclusiv lEditare=.F., exact ca la orice document nou +*!* (vezi si test_s8_pas3_garda_alte_date.prg, acelasi tipar). tip=3 (comanda) e ales ca sa +*!* pastreze Ct_clb_altele si Ct_clb_nume_client prezente (paralel cu documentul 1113 de mai sus); +*!* nu are cursul din zi (citeste_cursuri_zi nu se cheama pentru tip=3), deci fara SELECT Oracle. +*!* Instantiat direct cu Newobject, FARA .Show() - Init ruleaza oricum la construire, iar fara +*!* Show() nu exista blocajul modal (WindowType=1 conteaza doar cand se cheama .Show()), deci nu e +*!* nevoie de driverS8p7 aici. +PROCEDURE VerificaDocumentNou + PRIVATE poDate + LOCAL loForm + + poDate = Createobject('oDateFactura', 0, 0) + poDate.tip = 3 + poDate.id_client = 0 + poDate.incasat = 0 + + loForm = Newobject('frm_facturare_articole2', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx') + DO asserteaza WITH 'document nou: Newobject(frm_facturare_articole2) reuseste (fara Show, fara factureaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + + DO asserteaza WITH 'document nou: poDate.lEditare = .F. (stare naturala, nesetata de nimeni)', !poDate.lEditare, Transform(poDate.lEditare) + + IF loForm.do_exista_obiect('Ct_clb_altele') + DO asserteaza WITH 'document nou grupB: Ct_clb_altele ramane editabil', loForm.Ct_clb_altele.lactiv, Transform(loForm.Ct_clb_altele.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: clb_fdoc.cboFdoc ramane editabil', loForm.clb_fdoc.cboFdoc.Enabled, Transform(loForm.clb_fdoc.cboFdoc.Enabled) + DO asserteaza WITH 'document nou grupB: Ct_clb_nume_client ramane editabil', loForm.Ct_clb_nume_client.lactiv, Transform(loForm.Ct_clb_nume_client.lactiv) + IF loForm.do_exista_obiect('Ct_clb_valuta') + DO asserteaza WITH 'document nou grupB: Ct_clb_valuta ramane editabil', loForm.Ct_clb_valuta.lactiv, Transform(loForm.Ct_clb_valuta.lactiv) + ENDIF + IF loForm.do_exista_obiect('Clb_zi_curs') + DO asserteaza WITH 'document nou grupB: Clb_zi_curs ramane editabil', !loForm.Clb_zi_curs.text_simplu1.ReadOnly, Transform(loForm.Clb_zi_curs.text_simplu1.ReadOnly) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_gestiune_init', loForm.ct_contabilitate) + DO asserteaza WITH 'document nou grupB: Ct_clb_gestiune_init ramane editabil', loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv, Transform(loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_politici_preturi') + DO asserteaza WITH 'document nou grupB: Ct_clb_politici_preturi ramane editabil', loForm.Ct_clb_politici_preturi.lactiv, Transform(loForm.Ct_clb_politici_preturi.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: but_incarca_articole ramane editabil', loForm.but_incarca_articole.Enabled, Transform(loForm.but_incarca_articole.Enabled) + DO asserteaza WITH 'document nou grupB: but_cursuri ramane editabil', loForm.but_cursuri.Enabled, Transform(loForm.but_cursuri.Enabled) + IF loForm.do_exista_obiect('ct_incasare') + DO asserteaza WITH 'document nou grupC: ct_incasare ramane editabil', loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH 'document nou grupC: chk_incasare ramane editabil', loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + ENDIF + + loForm.Release() +ENDPROC + + +*!* S8 - incasarea la editare (D1/D3/D4, docs\propunere_s8_incasare_la_editare.md). Replica +*!* dovedita a corpului do_editare_unificata (ofacturare_comun.vc2:3890+) pana la Createobject, +*!* promovata din investigatia I1 (probe_defect5_latent.prg) in setul permanent de probe - acolo +*!* s-a confirmat ca poDate, declarat PRIVATE aici, ramane vizibil dupa Createobject/Show() +*!* (aceeasi vizibilitate dinamica pe care se bazeaza si codul de productie pentru poDate/ +*!* poGeneratorNumere). driverS8p7 e refolosit doar ca sa inchida modalul Show(). +PROCEDURE VerificaIncasareLaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tnIncasatAsteptat, tnNrIncasareAsteptat, tnTipIncasareAsteptat, tnModAsteptat + + LOCAL lcPrefix, lnSucces, loForm, pnDiscountRon, pnDiscountValuta + LOCAL lnSters, llEProforma, lnTipDoc, lcSnapPlajeA, lcSnapPlajeB + PRIVATE pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP, poDate + Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP + lcPrefix = Transform(m.tnIdVanzare) + ' [incasare ' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + IF Used('v_plaje_inc_a') + Use In v_plaje_inc_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_inc_a') + Use In v_plaje_inc_a + + lnSucces = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip,incasat from fact_vfacturi where id_vanzare=' + Transform(m.tnIdVanzare), 'crsIncUnic') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': documentul a putut fi reincarcat', lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1, Transform(lnSucces) + IF !(lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1) + RETURN + ENDIF + SELECT crsIncUnic + lnIdVanzareP = id_vanzare + lnCod = cod + pnAn = Year(data_act) + pnLuna = Month(data_act) + lnSters = sters + lnIdFact = id_fact + llEProforma = (eproforma = 1) + lnTipDoc = tip + Use In crsIncUnic + + DO asserteaza WITH lcPrefix + ': garzile do_editare_unificata trecute (nesters/neproforma/tip valid/luna curenta)', ; + lnSters = 0 AND !llEProforma AND !Inlist(lnTipDoc,44,45,46,51) AND (pnAn*12+pnLuna) == (gnAn*12+gnLuna), '' + DO asserteaza WITH lcPrefix + ': fara referinte (incasari/plati)', !ReferinteDocumenteNota(pnAn, pnLuna, lnCod), '' + DO asserteaza WITH lcPrefix + ': nu e in eFactura', !EsteInEFactura(lnIdFact), '' + DO asserteaza WITH lcPrefix + ': fara urmasi', !DocumentAreUrmasi(lnIdVanzareP), '' + + poDate = IncarcaAntetFacturaEditare(lnIdVanzareP, @pnDiscountRon, @pnDiscountValuta) + DO asserteaza WITH lcPrefix + ': IncarcaAntetFacturaEditare reuseste', Vartype(m.poDate) == 'O', Vartype(m.poDate) + IF Vartype(m.poDate) <> 'O' + RETURN + ENDIF + + IncarcaLiniiFacturaEditare(poDate, lnIdVanzareP) + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF Used('jtva_coloane') + Use In jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ELSE + Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ENDIF + + loForm = Createobject('frm_facturare_articole2') + DO asserteaza WITH lcPrefix + ': formularul se deschide fara eroare (defectul 5 latent nu se activeaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + DO asserteaza WITH lcPrefix + ': G9 niciun amessagebox la Createobject/Init', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- asertiunile care prind regresia D1/D3/D4 --- + DO asserteaza WITH lcPrefix + ': poDate.incasat = valoarea din baza (NU suprascrisa cu totalctva)', ; + Round(Nvl(poDate.incasat,-1),2) == Round(m.tnIncasatAsteptat,2), Transform(Nvl(poDate.incasat,-1)) + DO asserteaza WITH lcPrefix + ': poDate.nr_incasare nu a fost zeroit', ; + Nvl(poDate.nr_incasare,-1) == m.tnNrIncasareAsteptat, Transform(Nvl(poDate.nr_incasare,-1)) + DO asserteaza WITH lcPrefix + ': poDate.ntip_incasare incarcat corect', ; + Nvl(poDate.ntip_incasare,-1) == m.tnTipIncasareAsteptat, Transform(Nvl(poDate.ntip_incasare,-1)) + DO asserteaza WITH lcPrefix + ': modul afisat (opt_incasat.Value) corespunde tip_incasare', ; + loForm.ct_incasare.opt_incasat.Value == m.tnModAsteptat - 1, Transform(loForm.ct_incasare.opt_incasat.Value) + DO asserteaza WITH lcPrefix + ': chk_incasare.Value = 1 (document incasat)', loForm.chk_incasare.Value == 1, Transform(loForm.chk_incasare.Value) + DO asserteaza WITH lcPrefix + ': grupC ct_incasare needitabil', !loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH lcPrefix + ': grupC chk_incasare needitabil', !loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + + loForm.ndiscfactron = pnDiscountRon + loForm.ndiscfactval = pnDiscountValuta + loForm.do_calculeaza_totaluri() + + *!* nemodal: eliberarea din Timer, in interiorul propriului Show() modal, blocheaza VFP in Release() + loForm.WindowType = 0 + goDriverS8p7.Reseteaza() + loForm.Show() + DO asserteaza WITH lcPrefix + ': niciun amessagebox pe parcursul Show()', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + Try + loForm.Release() + Catch + Endtry + + IF Used('v_plaje_inc_b') + Use In v_plaje_inc_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_inc_b') + Use In v_plaje_inc_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' +ENDPROC + + +PROCEDURE CursorToSnapshot + LPARAMETERS tcAlias + + LOCAL lcResult, lnI + lcResult = '' + SELECT (m.tcAlias) + SCAN + FOR lnI = 1 TO FCOUNT() + lcResult = lcResult + Transform(Evaluate(Field(m.lnI))) + '|' + ENDFOR + lcResult = lcResult + Chr(10) + ENDSCAN + RETURN m.lcResult +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*!* driverS8p7: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms in timp ce .Show() e blocat pe +*!* modal (un modal tot pompeaza mesaje Windows, deci timerul de pe _SCREEN tot ruleaza - acelasi +*!* tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg, folosit acolo pentru MESSAGEBOX_FORM). +*!* Citeste Ct_clb_altele din Objects (nu PEMSTATUS - RemoveObject scoate din Objects, PEMSTATUS +*!* ramane .T.) inainte sa elibereze forma, ceea ce incheie .Show() si reda controlul apelantului. +DEFINE CLASS driverS8p7 AS Custom + lBusy = .F. + lGasit = .F. + lCtClbPrezent = .F. + lCtClbAlteleActiv = .F. + cCtClbEticheta = '' + nTotalRon = 0 + nTotalVal = 0 + + *!* grupul B si C (S8, docs\raport_s8_grup_bc.md) - Prezent = mai exista in Objects (nu a fost + *!* scos de Init dupa tip/gnScadereStoc), Activ = NU e blocat (Enabled / lactiv / !ReadOnly, dupa + *!* mecanismul folosit de fiecare control) + lClbFdocPrezent = .F. + lClbFdocActiv = .F. + lCtClbNumeClientPrezent = .F. + lCtClbNumeClientActiv = .F. + lCtClbValutaPrezent = .F. + lCtClbValutaActiv = .F. + lClbZiCursPrezent = .F. + lClbZiCursActiv = .F. + lCtClbGestiuneInitPrezent = .F. + lCtClbGestiuneInitActiv = .F. + lCtClbPolPreturiPrezent = .F. + lCtClbPolPreturiActiv = .F. + lButIncarcaArticolePrezent = .F. + lButIncarcaArticoleActiv = .F. + lButCursuriPrezent = .F. + lButCursuriActiv = .F. + lCtIncasarePrezent = .F. + lCtIncasareActiv = .F. + lChkIncasarePrezent = .F. + lChkIncasareActiv = .F. + + PROCEDURE Reseteaza + This.lGasit = .F. + This.lCtClbPrezent = .F. + This.lCtClbAlteleActiv = .F. + This.cCtClbEticheta = '' + This.nTotalRon = 0 + This.nTotalVal = 0 + This.lClbFdocPrezent = .F. + This.lClbFdocActiv = .F. + This.lCtClbNumeClientPrezent = .F. + This.lCtClbNumeClientActiv = .F. + This.lCtClbValutaPrezent = .F. + This.lCtClbValutaActiv = .F. + This.lClbZiCursPrezent = .F. + This.lClbZiCursActiv = .F. + This.lCtClbGestiuneInitPrezent = .F. + This.lCtClbGestiuneInitActiv = .F. + This.lCtClbPolPreturiPrezent = .F. + This.lCtClbPolPreturiActiv = .F. + This.lButIncarcaArticolePrezent = .F. + This.lButIncarcaArticoleActiv = .F. + This.lButCursuriPrezent = .F. + This.lButCursuriActiv = .F. + This.lCtIncasarePrezent = .F. + This.lCtIncasareActiv = .F. + This.lChkIncasarePrezent = .F. + This.lChkIncasareActiv = .F. + ENDPROC + + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + TRY + LOCAL lnI, lnJ, lnJ2, loFrm2, loObj, loObj2 + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + This.nTotalRon = Nvl(loFrm2.ntotalron, 0) + This.nTotalVal = Nvl(loFrm2.ntotalval, 0) + FOR lnJ = 1 TO loFrm2.Objects.Count + loObj = loFrm2.Objects(m.lnJ) + DO CASE + CASE Upper(loObj.Name) == 'CT_CLB_ALTELE' + This.lCtClbPrezent = .T. + This.lCtClbAlteleActiv = loObj.lactiv + This.cCtClbEticheta = Alltrim(loObj.clb_tx_cautare.lb_SIMPLU1.Caption) + CASE Upper(loObj.Name) == 'CLB_FDOC' + This.lClbFdocPrezent = .T. + This.lClbFdocActiv = loObj.cboFdoc.Enabled + CASE Upper(loObj.Name) == 'CT_CLB_NUME_CLIENT' + This.lCtClbNumeClientPrezent = .T. + This.lCtClbNumeClientActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CT_CLB_VALUTA' + This.lCtClbValutaPrezent = .T. + This.lCtClbValutaActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CLB_ZI_CURS' + This.lClbZiCursPrezent = .T. + This.lClbZiCursActiv = !loObj.text_simplu1.ReadOnly + CASE Upper(loObj.Name) == 'CT_CLB_POLITICI_PRETURI' + This.lCtClbPolPreturiPrezent = .T. + This.lCtClbPolPreturiActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'BUT_INCARCA_ARTICOLE' + This.lButIncarcaArticolePrezent = .T. + This.lButIncarcaArticoleActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'BUT_CURSURI' + This.lButCursuriPrezent = .T. + This.lButCursuriActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_INCASARE' + This.lCtIncasarePrezent = .T. + This.lCtIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CHK_INCASARE' + This.lChkIncasarePrezent = .T. + This.lChkIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_CONTABILITATE' + FOR lnJ2 = 1 TO loObj.Objects.Count + loObj2 = loObj.Objects(m.lnJ2) + IF Upper(loObj2.Name) == 'CT_CLB_GESTIUNE_INIT' + This.lCtClbGestiuneInitPrezent = .T. + This.lCtClbGestiuneInitActiv = loObj2.lactiv + ENDIF + ENDFOR + ENDCASE + ENDFOR + loFrm2.Release() + EXIT + ENDIF + ENDFOR + CATCH TO loExcS8p7 + STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s8_trace2.prg b/utile/Teste/editare_factura/test_s8_trace2.prg new file mode 100644 index 0000000..989604c --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_trace2.prg @@ -0,0 +1,552 @@ +* test_s8_pas7_cablare.prg +* Verifica pasul 7 din docs\propunere_s8_incarcare.md §6: cablarea celei de-a treia optiuni de +* meniu si corpul real al lui frm_facturi.do_editare_unificata (COMUN\clase\ofacturare_comun.vc2). +* Traseul REAL: Newobject('frm_facturi') + .do_editare_unificata() (nu Createobject direct pe +* frm_facturare_articole2 - asta ar proba doar codul formularului, nu rutarea). +* Documente reale, in luna curenta a calendarului (gnAn/gnLuna), care trec toate garzile +* (nesters, ne-eproforma, tip valid, fara referinte, fara urmasi, ne-eFactura), gasite prin +* interogare read-only pe MARIUSM_AUTO: +* 1113 - sursa COMANDA (tip=3, id_comanda=2479) +* 1055 - sursa CONTRACT (tip=2, id_ctr=234) +* 1048 - factura SIMPLA, lista de preturi (tip=1, fara comanda/ctr) +* 1130 - VALUTA (tip=5, in_valuta=1) +* Nu scrie in Oracle - doar SELECT; verifica ca formularul deschis nici el nu scrie +* (G8: dataoras/id_utils neschimbate pe VANZARI/VANZARI_DETALII). +* +* frm_facturare_articole2 (ofacturare.vc2:15894) nu suprascrie WindowType, iar _frm_base il +* seteaza pe 1 = modal - .Show() blocheaza pana la inchiderea ferestrei, headless nu are cine +* sa o inchida in mod normal. Solutie: driverS8p7 (Custom, BINDEVENT pe un Timer de pe _SCREEN, +* acelasi tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg) - un modal inca pompeaza +* mesaje Windows, deci timerul tot mai ruleaza in interiorul lui .Show(); cand gaseste forma +* deschisa ii citeste prezenta/eticheta lui Ct_clb_altele (din colectia Objects, nu PEMSTATUS - +* RemoveObject scoate din Objects dar PEMSTATUS ramane .T., vezi memoria pemstatus-dupa- +* removeobject) si o elibereaza, ceea ce incheie .Show() si intoarce controlul in +* do_editare_unificata, apoi in acest test. Nu modifica NIMIC in codul de productie. +* +* Extindere S8 (blocarea grupurilor B si C la editare, docs\raport_s8_grup_bc.md): driverS8p7 +* citeste in plus, din Objects, starea needitabila a controalelor clb_fdoc.cboFdoc, Ct_clb_altele, +* Ct_clb_nume_client, Ct_clb_valuta, Clb_zi_curs, ct_contabilitate.Ct_clb_gestiune_init, +* Ct_clb_politici_preturi, but_incarca_articole, but_cursuri, ct_incasare, chk_incasare - fiecare +* verificat doar daca e prezent (unele sunt scoase de Init in functie de tip/gnScadereStoc, +* independent de lEditare). Proba de neregresie pe document nou (VerificaDocumentNou) NU trece +* prin factureaza()/poGeneratorNumere (interzis, arde numere) - construieste poDate manual cu +* Createobject('oDateFactura',0,0) (Init nu ruleaza, ramane pe defaults, lEditare=.F. ca la orice +* document nou) si instantiaza formularul direct cu Newobject, FARA .Show() (Init ruleaza oricum +* la construire; fara Show() nu exista blocaj modal, deci nu e nevoie de driver aici). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_trace2_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 + +*!* --- driver care inchide fereastra modala frm_facturare_articole2, vezi antetul fisierului --- +PUBLIC goDriverS8p7 +goDriverS8p7 = Createobject('driverS8p7') +_SCREEN.AddObject('tmrS8p7', 'Timer') +_SCREEN.tmrS8p7.Interval = 150 +Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa') +_SCREEN.tmrS8p7.Enabled = .T. + +*!* --- verificare statica: corpul do_editare_unificata nu contine nicio referinta la alocarea +*!* de numere (factureaza/poGeneratorNumere/creeaza_cursor_serii) --- +LOCAL lcSrc, lcTail, lnStart, lnEnd, lcMetoda +lcSrc = FILETOSTR('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vc2') +lnStart = AT('PROCEDURE do_editare_unificata' + CHR(13) + CHR(10), lcSrc) +DO asserteaza WITH 'static: metoda do_editare_unificata gasita in sursa', lnStart > 0, TRANSFORM(lnStart) +IF lnStart > 0 + lcTail = SUBSTR(lcSrc, lnStart) + lnEnd = AT('ENDPROC', lcTail) + lcMetoda = UPPER(SUBSTR(lcTail, 1, lnEnd + 6)) + DO asserteaza WITH 'static G2: fara FACTUREAZA( in do_editare_unificata', 'FACTUREAZA(' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara POGENERATORNUMERE in do_editare_unificata', 'POGENERATORNUMERE' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara CREEAZA_CURSOR_SERII in do_editare_unificata', 'CREEAZA_CURSOR_SERII' $ lcMetoda = .F., '' +ENDIF + +*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe cele 4 documente --- +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +LOCAL lcSchema, lcSelect, lcOrder, lcFiltru +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +lcOrder = [data_act,numar_act] +lcFiltru = [id_vanzare in (1113, 1055, 1048, 1130)] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +DO asserteaza WITH 'crsfacturi incarcat cu cele 4 documente reale (rownum=4)', Used('crsfacturi') AND Reccount('crsfacturi') = 4, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') + +*!* Ct_clb_altele (infirmare §3.2, vezi raport): document CU sursa -> prezent, etichetat din +*!* poDate.tip; factura SIMPLA -> absent, identic cu introducerea unei facturi noi (G10). +DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda' +DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract' +DO VerificaEditare WITH 1048, 'factura simpla', .F., '' +DO VerificaEditare WITH 1130, 'valuta', .F., '' + +_SCREEN.tmrS8p7.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrS8p7') +Catch +Endtry + +*!* --- S8 grupurile B/C: neregresie pe document NOU (docs\raport_s8_grup_bc.md) --- +DO VerificaDocumentNou + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +PROCEDURE VerificaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tlCtClbAsteptat, tcCtClbEtichetaAsteptata + + LOCAL lcPrefix, lnSucces, loFrm, lnI, llGasitForm + LOCAL lcSnapPlajeA, lcSnapPlajeB, lcSnapDetA, lcSnapDetB + LOCAL ltDataorasVanzareA, lnIdUtilsVanzareA + lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + *!* --- G2: snapshot generator de numere, INAINTE --- + IF Used('v_plaje_a') + Use In v_plaje_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_a') + Use In v_plaje_a + + *!* --- G8: snapshot dataoras/id_utils, INAINTE --- + IF Used('v_g8a') + Use In v_g8a + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor G8 antet Oracle a reusit', lnSucces >= 0 AND Used('v_g8a') AND Reccount('v_g8a') = 1, Transform(lnSucces) + ltDataorasVanzareA = v_g8a.dataoras + lnIdUtilsVanzareA = Nvl(v_g8a.id_utils, 0) + Use In v_g8a + + IF Used('v_g8d_a') + Use In v_g8d_a + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_a') + goExecutor.oReset() + lcSnapDetA = CursorToSnapshot('v_g8d_a') + Use In v_g8d_a + + *!* --- codul testat: traseul real, prin frm_facturi.do_editare_unificata --- + *!* Init-ul clasei presupune crsfacturi ca zona curenta (la fel ca in test_s7_urmasi.prg) - + *!* interogarile martor de mai sus au schimbat zona curenta intre timp, se restaureaza aici + Select crsfacturi + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm) + IF Vartype(m.loFrm) <> 'O' + RETURN + ENDIF + + Select crsfacturi + Locate For id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found()) + IF !Found() + loFrm.Release() + RETURN + ENDIF + + *!* --- diagnostic triaj (docs\triaj_s8_regresie_28fail.md), apel redundant read-only --- + LOCAL lnDiagA, lnDiagB + Private poDateDiag + poDateDiag = IncarcaAntetFacturaEditare(m.tnIdVanzare, @lnDiagA, @lnDiagB) + STRTOFILE(lcPrefix + ' DIAG: IncarcaAntetFacturaEditare Vartype=' + Vartype(poDateDiag) + ' oExecutor.cEroare=[' + Nvl(goExecutor.cEroare,'') + ']' + Chr(13)+Chr(10), gcErrLog, 1) + + *!* --- driverS8p7 gaseste si inchide formularul unificat (FARA but_termin1.Click()), vezi + *!* antetul fisierului; .do_editare_unificata() nu revine decat dupa ce fereastra s-a inchis --- + goDriverS8p7.Reseteaza() + loFrm.do_editare_unificata() + + DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit) + + *!* --- Ct_clb_altele: prezenta citita din colectia Objects a formularului, cat timp era deschis + *!* (infirmarea §3.2 - vezi raport) --- + DO asserteaza WITH lcPrefix + ': Ct_clb_altele prezenta = ' + Iif(m.tlCtClbAsteptat, 'prezent', 'absent'), ; + goDriverS8p7.lCtClbPrezent == m.tlCtClbAsteptat, Transform(goDriverS8p7.lCtClbPrezent) + IF m.tlCtClbAsteptat + DO asserteaza WITH lcPrefix + ': Ct_clb_altele eticheta = [' + m.tcCtClbEtichetaAsteptata + ']', ; + Upper(goDriverS8p7.cCtClbEticheta) == Upper(m.tcCtClbEtichetaAsteptata), goDriverS8p7.cCtClbEticheta + ENDIF + *!* --- grupul B si C (S8, decizia 25): needitabile la editare, verificate doar cand controlul + *!* mai exista (unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare) --- + DO VerificaBlocajGrupBC WITH m.lcPrefix + + *!* --- G5: totalul afisat de do_calculeaza_totaluri (chemat inainte de Show, in do_editare_unificata) + *!* ramane egal cu totalul deja scris in VANZARI - prinde o reevaluare tacita a cursului/preturilor --- + Select crsfacturi + IF Nvl(crsfacturi.in_valuta, 0) = 1 + DO asserteaza WITH lcPrefix + ' G5: total afisat (valuta) = VANZARI.totval', ; + Round(goDriverS8p7.nTotalVal, 2) == Round(Nvl(crsfacturi.totval, 0), 2), Transform(goDriverS8p7.nTotalVal) + ' vs ' + Transform(crsfacturi.totval) + ELSE + DO asserteaza WITH lcPrefix + ' G5: total afisat (lei) = VANZARI.total_cu_tva', ; + Round(goDriverS8p7.nTotalRon, 2) == Round(Nvl(crsfacturi.total_cu_tva, 0), 2), Transform(goDriverS8p7.nTotalRon) + ' vs ' + Transform(crsfacturi.total_cu_tva) + ENDIF + + loFrm.Release() + + *!* --- G9: niciun dialog modal la deschidere --- + DO asserteaza WITH lcPrefix + ' G9: niciun amessagebox la deschidere', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- G2: snapshot generator de numere, DUPA - identic caracter cu caracter --- + IF Used('v_plaje_b') + Use In v_plaje_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_b') + Use In v_plaje_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' + + *!* --- G8: dataoras/id_utils neschimbate pe VANZARI si VANZARI_DETALII --- + IF Used('v_g8a2') + Use In v_g8a2 + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a2') + goExecutor.oReset() + *!* Nvl pe TTOC: dataoras e NULL pe documentele de test - NULL == NULL da .NULL. in VFP (nu .T.), + *!* fals negativ fara el + DO asserteaza WITH lcPrefix + ' G8: VANZARI.dataoras neschimbat', ; + Nvl(Ttoc(v_g8a2.dataoras), 'NULL') == Nvl(Ttoc(m.ltDataorasVanzareA), 'NULL'), Nvl(Ttoc(v_g8a2.dataoras), 'NULL') + DO asserteaza WITH lcPrefix + ' G8: VANZARI.id_utils neschimbat', Nvl(v_g8a2.id_utils, 0) == m.lnIdUtilsVanzareA, Transform(Nvl(v_g8a2.id_utils, 0)) + Use In v_g8a2 + + IF Used('v_g8d_b') + Use In v_g8d_b + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_b') + goExecutor.oReset() + lcSnapDetB = CursorToSnapshot('v_g8d_b') + Use In v_g8d_b + DO asserteaza WITH lcPrefix + ' G8: VANZARI_DETALII dataoras/id_utils identice (nicio scriere)', m.lcSnapDetA == m.lcSnapDetB, '' + + *!* --- G11 partial: fara nicio scriere pe VANZARI_DETALII (G8), nu s-a putut genera nicio miscare + *!* de stoc noua pe acest document; nu masoara direct un tabel de stoc - proba indirecta, partiala --- + DO asserteaza WITH lcPrefix + ' G11 partial (derivat din G8): nicio scriere pe VANZARI_DETALII => stoc agregat neschimbat pe acest document', m.lcSnapDetA == m.lcSnapDetB, '' +ENDPROC + + +*!* S8 - blocarea grupurilor B si C la editare (docs\raport_s8_grup_bc.md). Citeste starea deja +*!* capturata de goDriverS8p7 (formularul e inchis pana aici) si asearta doar cand controlul e +*!* prezent - unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare. +PROCEDURE VerificaBlocajGrupBC + LPARAMETERS tcPrefix + + IF goDriverS8p7.lCtClbPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_altele (sursa) needitabil', !goDriverS8p7.lCtClbAlteleActiv, Transform(goDriverS8p7.lCtClbAlteleActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: clb_fdoc.cboFdoc (tip document) needitabil', ; + goDriverS8p7.lClbFdocPrezent AND !goDriverS8p7.lClbFdocActiv, Transform(goDriverS8p7.lClbFdocActiv) + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_nume_client (client) needitabil', ; + goDriverS8p7.lCtClbNumeClientPrezent AND !goDriverS8p7.lCtClbNumeClientActiv, Transform(goDriverS8p7.lCtClbNumeClientActiv) + IF goDriverS8p7.lCtClbValutaPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_valuta needitabil', !goDriverS8p7.lCtClbValutaActiv, Transform(goDriverS8p7.lCtClbValutaActiv) + ENDIF + IF goDriverS8p7.lClbZiCursPrezent + DO asserteaza WITH tcPrefix + ' grupB: Clb_zi_curs needitabil', !goDriverS8p7.lClbZiCursActiv, Transform(goDriverS8p7.lClbZiCursActiv) + ENDIF + IF goDriverS8p7.lCtClbGestiuneInitPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_gestiune_init (gestiune sursa) needitabil', !goDriverS8p7.lCtClbGestiuneInitActiv, Transform(goDriverS8p7.lCtClbGestiuneInitActiv) + ENDIF + IF goDriverS8p7.lCtClbPolPreturiPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_politici_preturi needitabil', !goDriverS8p7.lCtClbPolPreturiActiv, Transform(goDriverS8p7.lCtClbPolPreturiActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: but_incarca_articole needitabil (G2: evita poGeneratorNumere.verifica_numar)', ; + goDriverS8p7.lButIncarcaArticolePrezent AND !goDriverS8p7.lButIncarcaArticoleActiv, Transform(goDriverS8p7.lButIncarcaArticoleActiv) + DO asserteaza WITH tcPrefix + ' grupB: but_cursuri needitabil', ; + goDriverS8p7.lButCursuriPrezent AND !goDriverS8p7.lButCursuriActiv, Transform(goDriverS8p7.lButCursuriActiv) + IF goDriverS8p7.lCtIncasarePrezent + DO asserteaza WITH tcPrefix + ' grupC: ct_incasare needitabil', !goDriverS8p7.lCtIncasareActiv, Transform(goDriverS8p7.lCtIncasareActiv) + DO asserteaza WITH tcPrefix + ' grupC: chk_incasare needitabil', goDriverS8p7.lChkIncasarePrezent AND !goDriverS8p7.lChkIncasareActiv, Transform(goDriverS8p7.lChkIncasareActiv) + ENDIF +ENDPROC + + +*!* S8 - neregresie: pe document NOU, grupurile B/C raman editabile (docs\raport_s8_grup_bc.md). +*!* NU trece prin factureaza()/poGeneratorNumere (interzis - arde numere din plaje reale). poDate +*!* construit manual cu Createobject('oDateFactura',0,0): Init-ul clasei NU ruleaza (tnIdSet=0), +*!* deci ramane pe defaults din PropValue - inclusiv lEditare=.F., exact ca la orice document nou +*!* (vezi si test_s8_pas3_garda_alte_date.prg, acelasi tipar). tip=3 (comanda) e ales ca sa +*!* pastreze Ct_clb_altele si Ct_clb_nume_client prezente (paralel cu documentul 1113 de mai sus); +*!* nu are cursul din zi (citeste_cursuri_zi nu se cheama pentru tip=3), deci fara SELECT Oracle. +*!* Instantiat direct cu Newobject, FARA .Show() - Init ruleaza oricum la construire, iar fara +*!* Show() nu exista blocajul modal (WindowType=1 conteaza doar cand se cheama .Show()), deci nu e +*!* nevoie de driverS8p7 aici. +PROCEDURE VerificaDocumentNou + PRIVATE poDate + LOCAL loForm + + poDate = Createobject('oDateFactura', 0, 0) + poDate.tip = 3 + poDate.id_client = 0 + poDate.incasat = 0 + + loForm = Newobject('frm_facturare_articole2', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx') + DO asserteaza WITH 'document nou: Newobject(frm_facturare_articole2) reuseste (fara Show, fara factureaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + + DO asserteaza WITH 'document nou: poDate.lEditare = .F. (stare naturala, nesetata de nimeni)', !poDate.lEditare, Transform(poDate.lEditare) + + IF loForm.do_exista_obiect('Ct_clb_altele') + DO asserteaza WITH 'document nou grupB: Ct_clb_altele ramane editabil', loForm.Ct_clb_altele.lactiv, Transform(loForm.Ct_clb_altele.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: clb_fdoc.cboFdoc ramane editabil', loForm.clb_fdoc.cboFdoc.Enabled, Transform(loForm.clb_fdoc.cboFdoc.Enabled) + DO asserteaza WITH 'document nou grupB: Ct_clb_nume_client ramane editabil', loForm.Ct_clb_nume_client.lactiv, Transform(loForm.Ct_clb_nume_client.lactiv) + IF loForm.do_exista_obiect('Ct_clb_valuta') + DO asserteaza WITH 'document nou grupB: Ct_clb_valuta ramane editabil', loForm.Ct_clb_valuta.lactiv, Transform(loForm.Ct_clb_valuta.lactiv) + ENDIF + IF loForm.do_exista_obiect('Clb_zi_curs') + DO asserteaza WITH 'document nou grupB: Clb_zi_curs ramane editabil', !loForm.Clb_zi_curs.text_simplu1.ReadOnly, Transform(loForm.Clb_zi_curs.text_simplu1.ReadOnly) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_gestiune_init', loForm.ct_contabilitate) + DO asserteaza WITH 'document nou grupB: Ct_clb_gestiune_init ramane editabil', loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv, Transform(loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_politici_preturi') + DO asserteaza WITH 'document nou grupB: Ct_clb_politici_preturi ramane editabil', loForm.Ct_clb_politici_preturi.lactiv, Transform(loForm.Ct_clb_politici_preturi.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: but_incarca_articole ramane editabil', loForm.but_incarca_articole.Enabled, Transform(loForm.but_incarca_articole.Enabled) + DO asserteaza WITH 'document nou grupB: but_cursuri ramane editabil', loForm.but_cursuri.Enabled, Transform(loForm.but_cursuri.Enabled) + IF loForm.do_exista_obiect('ct_incasare') + DO asserteaza WITH 'document nou grupC: ct_incasare ramane editabil', loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH 'document nou grupC: chk_incasare ramane editabil', loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + ENDIF + + loForm.Release() +ENDPROC + + +PROCEDURE CursorToSnapshot + LPARAMETERS tcAlias + + LOCAL lcResult, lnI + lcResult = '' + SELECT (m.tcAlias) + SCAN + FOR lnI = 1 TO FCOUNT() + lcResult = lcResult + Transform(Evaluate(Field(m.lnI))) + '|' + ENDFOR + lcResult = lcResult + Chr(10) + ENDSCAN + RETURN m.lcResult +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*!* driverS8p7: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms in timp ce .Show() e blocat pe +*!* modal (un modal tot pompeaza mesaje Windows, deci timerul de pe _SCREEN tot ruleaza - acelasi +*!* tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg, folosit acolo pentru MESSAGEBOX_FORM). +*!* Citeste Ct_clb_altele din Objects (nu PEMSTATUS - RemoveObject scoate din Objects, PEMSTATUS +*!* ramane .T.) inainte sa elibereze forma, ceea ce incheie .Show() si reda controlul apelantului. +DEFINE CLASS driverS8p7 AS Custom + lBusy = .F. + lGasit = .F. + lCtClbPrezent = .F. + lCtClbAlteleActiv = .F. + cCtClbEticheta = '' + nTotalRon = 0 + nTotalVal = 0 + + *!* grupul B si C (S8, docs\raport_s8_grup_bc.md) - Prezent = mai exista in Objects (nu a fost + *!* scos de Init dupa tip/gnScadereStoc), Activ = NU e blocat (Enabled / lactiv / !ReadOnly, dupa + *!* mecanismul folosit de fiecare control) + lClbFdocPrezent = .F. + lClbFdocActiv = .F. + lCtClbNumeClientPrezent = .F. + lCtClbNumeClientActiv = .F. + lCtClbValutaPrezent = .F. + lCtClbValutaActiv = .F. + lClbZiCursPrezent = .F. + lClbZiCursActiv = .F. + lCtClbGestiuneInitPrezent = .F. + lCtClbGestiuneInitActiv = .F. + lCtClbPolPreturiPrezent = .F. + lCtClbPolPreturiActiv = .F. + lButIncarcaArticolePrezent = .F. + lButIncarcaArticoleActiv = .F. + lButCursuriPrezent = .F. + lButCursuriActiv = .F. + lCtIncasarePrezent = .F. + lCtIncasareActiv = .F. + lChkIncasarePrezent = .F. + lChkIncasareActiv = .F. + nTicks = 0 + + PROCEDURE Reseteaza + This.nTicks = 0 + This.lGasit = .F. + This.lCtClbPrezent = .F. + This.lCtClbAlteleActiv = .F. + This.cCtClbEticheta = '' + This.nTotalRon = 0 + This.nTotalVal = 0 + This.lClbFdocPrezent = .F. + This.lClbFdocActiv = .F. + This.lCtClbNumeClientPrezent = .F. + This.lCtClbNumeClientActiv = .F. + This.lCtClbValutaPrezent = .F. + This.lCtClbValutaActiv = .F. + This.lClbZiCursPrezent = .F. + This.lClbZiCursActiv = .F. + This.lCtClbGestiuneInitPrezent = .F. + This.lCtClbGestiuneInitActiv = .F. + This.lCtClbPolPreturiPrezent = .F. + This.lCtClbPolPreturiActiv = .F. + This.lButIncarcaArticolePrezent = .F. + This.lButIncarcaArticoleActiv = .F. + This.lButCursuriPrezent = .F. + This.lButCursuriActiv = .F. + This.lCtIncasarePrezent = .F. + This.lCtIncasareActiv = .F. + This.lChkIncasarePrezent = .F. + This.lChkIncasareActiv = .F. + ENDPROC + + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + This.nTicks = This.nTicks + 1 + IF This.nTicks <= 5 + STRTOFILE('TICK ' + Transform(This.nTicks) + ' FormCount=' + Transform(_SCREEN.FormCount) + Iif(_SCREEN.FormCount>0, ' class0=' + Upper(_SCREEN.Forms(1).Class), '') + Chr(13)+Chr(10), gcErrLog, 1) + ENDIF + TRY + LOCAL lnI, lnJ, lnJ2, loFrm2, loObj, loObj2 + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + This.nTotalRon = Nvl(loFrm2.ntotalron, 0) + This.nTotalVal = Nvl(loFrm2.ntotalval, 0) + FOR lnJ = 1 TO loFrm2.Objects.Count + loObj = loFrm2.Objects(m.lnJ) + DO CASE + CASE Upper(loObj.Name) == 'CT_CLB_ALTELE' + This.lCtClbPrezent = .T. + This.lCtClbAlteleActiv = loObj.lactiv + This.cCtClbEticheta = Alltrim(loObj.clb_tx_cautare.lb_SIMPLU1.Caption) + CASE Upper(loObj.Name) == 'CLB_FDOC' + This.lClbFdocPrezent = .T. + This.lClbFdocActiv = loObj.cboFdoc.Enabled + CASE Upper(loObj.Name) == 'CT_CLB_NUME_CLIENT' + This.lCtClbNumeClientPrezent = .T. + This.lCtClbNumeClientActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CT_CLB_VALUTA' + This.lCtClbValutaPrezent = .T. + This.lCtClbValutaActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CLB_ZI_CURS' + This.lClbZiCursPrezent = .T. + This.lClbZiCursActiv = !loObj.text_simplu1.ReadOnly + CASE Upper(loObj.Name) == 'CT_CLB_POLITICI_PRETURI' + This.lCtClbPolPreturiPrezent = .T. + This.lCtClbPolPreturiActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'BUT_INCARCA_ARTICOLE' + This.lButIncarcaArticolePrezent = .T. + This.lButIncarcaArticoleActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'BUT_CURSURI' + This.lButCursuriPrezent = .T. + This.lButCursuriActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_INCASARE' + This.lCtIncasarePrezent = .T. + This.lCtIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CHK_INCASARE' + This.lChkIncasarePrezent = .T. + This.lChkIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_CONTABILITATE' + FOR lnJ2 = 1 TO loObj.Objects.Count + loObj2 = loObj.Objects(m.lnJ2) + IF Upper(loObj2.Name) == 'CT_CLB_GESTIUNE_INIT' + This.lCtClbGestiuneInitPrezent = .T. + This.lCtClbGestiuneInitActiv = loObj2.lactiv + ENDIF + ENDFOR + ENDCASE + ENDFOR + loFrm2.Release() + EXIT + ENDIF + ENDFOR + CATCH TO loExcS8p7 + STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s8_unicitate_cursuri.prg b/utile/Teste/editare_factura/test_s8_unicitate_cursuri.prg new file mode 100644 index 0000000..bccac8b --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_unicitate_cursuri.prg @@ -0,0 +1,88 @@ +* test_s8_unicitate_cursuri.prg +* Verifica daca exista constrangere/index UNIQUE pe (ID_VANZARE, ID_VALUTA) pe VANZARI_CURSURI, +* cerut de orchestrator pentru a inchide definitiv discutia despre cardinalitatea join-ului +* folosit de VVANZARI_ARTICOLE (S8 pas 1). Nu scrie in Oracle - doar SELECT. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_unicitate_cursuri_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lcOut, lcSql +lcOut = '' + +*!* --- 1. constrangeri P/U pe VANZARI_CURSURI, cu coloanele in ordine --- +TEXT TO lcSql NOSHOW +select ac.constraint_name, ac.constraint_type, acc.column_name, acc.position +from all_constraints ac join all_cons_columns acc on ac.owner = acc.owner and ac.constraint_name = acc.constraint_name +where ac.owner = 'MARIUSM_AUTO' and ac.table_name = 'VANZARI_CURSURI' and ac.constraint_type in ('P','U') +order by ac.constraint_name, acc.position +ENDTEXT +IF Used('crscons') + Use In crscons +ENDIF +IF goExecutor.oExecute(m.lcSql, [crscons]) < 0 + lcOut = lcOut + 'EROARE constrangeri: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + '--- CONSTRANGERI P/U pe VANZARI_CURSURI ---' + CHR(13) + CHR(10) + IF RECCOUNT('crscons') = 0 + lcOut = lcOut + '(niciuna)' + CHR(13) + CHR(10) + ELSE + SELECT crscons + SCAN + lcOut = lcOut + TRANSFORM(constraint_name) + ' | ' + TRANSFORM(constraint_type) + ' | ' + TRANSFORM(column_name) + ' | pos=' + TRANSFORM(position) + CHR(13) + CHR(10) + ENDSCAN + ENDIF + USE IN crscons +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 2. indecsi (toti, cu uniqueness), coloanele in ordine --- +TEXT TO lcSql NOSHOW +select ai.index_name, ai.uniqueness, aic.column_name, aic.column_position +from all_indexes ai join all_ind_columns aic on ai.owner = aic.index_owner and ai.index_name = aic.index_name +where ai.owner = 'MARIUSM_AUTO' and ai.table_name = 'VANZARI_CURSURI' +order by ai.index_name, aic.column_position +ENDTEXT +IF Used('crsidx') + Use In crsidx +ENDIF +IF goExecutor.oExecute(m.lcSql, [crsidx]) < 0 + lcOut = lcOut + 'EROARE indecsi: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- INDECSI pe VANZARI_CURSURI ---' + CHR(13) + CHR(10) + IF RECCOUNT('crsidx') = 0 + lcOut = lcOut + '(niciunul)' + CHR(13) + CHR(10) + ELSE + SELECT crsidx + SCAN + lcOut = lcOut + TRANSFORM(index_name) + ' | ' + TRANSFORM(uniqueness) + ' | ' + TRANSFORM(column_name) + ' | pos=' + TRANSFORM(column_position) + CHR(13) + CHR(10) + ENDSCAN + ENDIF + USE IN crsidx +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s8_unicitate_cursuri2.prg b/utile/Teste/editare_factura/test_s8_unicitate_cursuri2.prg new file mode 100644 index 0000000..b7c05a2 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_unicitate_cursuri2.prg @@ -0,0 +1,124 @@ +* test_s8_unicitate_cursuri2.prg +* Diagnostic: izoleaza cauza erorii ODBC 1526 (Invalid string or buffer length) din +* test_s8_unicitate_cursuri.prg, testand query-uri mai simple pe rand. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_unicitate_cursuri2_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lcOut, lcSql + +*!* A. tabela exista? +lcSql = [select count(*) as nr from vanzari_cursuri] +IF Used('crsA') + Use In crsA +ENDIF +IF goExecutor.oExecute(m.lcSql, [crsA]) < 0 + lcOut = 'A EROARE: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = 'A OK, nr=' + TRANSFORM(crsA.nr) + CHR(13) + CHR(10) + USE IN crsA +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) + +*!* B. all_constraints simplu, fara join +lcSql = [select constraint_name, constraint_type from all_constraints where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_CURSURI'] +IF Used('crsB') + Use In crsB +ENDIF +IF goExecutor.oExecute(m.lcSql, [crsB]) < 0 + lcOut = 'B EROARE: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = 'B OK, reccount=' + TRANSFORM(RECCOUNT('crsB')) + CHR(13) + CHR(10) + IF RECCOUNT('crsB') > 0 + SELECT crsB + SCAN + lcOut = lcOut + TRANSFORM(constraint_name) + ' | ' + TRANSFORM(constraint_type) + CHR(13) + CHR(10) + ENDSCAN + ENDIF + USE IN crsB +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) + +*!* C. all_cons_columns simplu, fara join, filtrat pe tabela +lcSql = [select constraint_name, column_name, position from all_cons_columns where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_CURSURI'] +IF Used('crsC') + Use In crsC +ENDIF +IF goExecutor.oExecute(m.lcSql, [crsC]) < 0 + lcOut = 'C EROARE: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = 'C OK, reccount=' + TRANSFORM(RECCOUNT('crsC')) + CHR(13) + CHR(10) + IF RECCOUNT('crsC') > 0 + SELECT crsC + SCAN + lcOut = lcOut + TRANSFORM(constraint_name) + ' | ' + TRANSFORM(column_name) + ' | pos=' + TRANSFORM(position) + CHR(13) + CHR(10) + ENDSCAN + ENDIF + USE IN crsC +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) + +*!* D. all_indexes simplu, fara join +lcSql = [select index_name, uniqueness from all_indexes where owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_CURSURI'] +IF Used('crsD') + Use In crsD +ENDIF +IF goExecutor.oExecute(m.lcSql, [crsD]) < 0 + lcOut = 'D EROARE: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = 'D OK, reccount=' + TRANSFORM(RECCOUNT('crsD')) + CHR(13) + CHR(10) + IF RECCOUNT('crsD') > 0 + SELECT crsD + SCAN + lcOut = lcOut + TRANSFORM(index_name) + ' | ' + TRANSFORM(uniqueness) + CHR(13) + CHR(10) + ENDSCAN + ENDIF + USE IN crsD +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) + +*!* E. all_ind_columns simplu, fara join +lcSql = [select index_name, column_name, column_position from all_ind_columns where index_owner = 'MARIUSM_AUTO' and table_name = 'VANZARI_CURSURI'] +IF Used('crsE') + Use In crsE +ENDIF +IF goExecutor.oExecute(m.lcSql, [crsE]) < 0 + lcOut = 'E EROARE: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = 'E OK, reccount=' + TRANSFORM(RECCOUNT('crsE')) + CHR(13) + CHR(10) + IF RECCOUNT('crsE') > 0 + SELECT crsE + SCAN + lcOut = lcOut + TRANSFORM(index_name) + ' | ' + TRANSFORM(column_name) + ' | pos=' + TRANSFORM(column_position) + CHR(13) + CHR(10) + ENDSCAN + ENDIF + USE IN crsE +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s8_unicitate_cursuri_aplica.prg b/utile/Teste/editare_factura/test_s8_unicitate_cursuri_aplica.prg new file mode 100644 index 0000000..07ab1a4 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_unicitate_cursuri_aplica.prg @@ -0,0 +1,118 @@ +* test_s8_unicitate_cursuri_aplica.prg +* S8 pas 1, caz B din verificarea de unicitate ceruta de orchestrator: rescrie +* VVANZARI_ARTICOLE.CURS/MULTIPLICATOR ca subinterogari scalare (max(...)) in loc de LEFT JOIN pe +* VANZARI_CURSURI - (id_vanzare, id_valuta) NU e unic garantat prin constrangere/index (doar index +* NONUNIQUE), deci un LEFT JOIN ar putea multiplica randurile daca apare vreodata un duplicat. +* O subinterogare scalara intoarce cel mult un rand prin constructie. Restul view-ului neatins. +* Reia neregresia din raport: randuri sters=0 pe 1040/1047/1050/1055/1125 trebuie 1/2/4/2/4, si +* continutul real pe 894/1301 (pretd=100,id_valutad=2) si 1040/1568 (id_ctr=235,curs=5.243). +* Scrie in Oracle (CREATE OR REPLACE VIEW, idempotent). QUIT la final. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_unicitate_cursuri_aplica_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +LOCAL lcOut, lcSql, llOk +lcOut = '' + +*!* --- 1. aplica CREATE OR REPLACE VIEW cu subinterogari scalare in loc de join pe vanzari_cursuri --- +lcSql = [create or replace view vvanzari_articole as ] + ; + [select vd.id_vanzare, vd.id_vanzare_det, vd.id_articol, vd.cantitate, vd.pret, vd.pret_cu_tva, vd.proc_tvav, ] + ; + [vd.discount_unitar, vd.id_gestiune, vd.cont, vd.id_valuta, vd.id_jtva_coloana, vd.serie, vd.explicatie, ] + ; + [vd.taxcode, vd.lot, vd.sters, vd.id_vanzare_set, vd.pret_achizitie, na.denumire, na.codmat, ng.nume_gestiune, ] + ; + [nv.nume_val, vd.id_pol, vd.id_ctr, vd.diferenta, vd.pretd, vd.id_valutad, ] + ; + [(select max(vc.curs) from vanzari_cursuri vc where vc.id_vanzare = vd.id_vanzare and vc.id_valuta = vd.id_valuta) as curs, ] + ; + [(select max(vc.multiplicator) from vanzari_cursuri vc where vc.id_vanzare = vd.id_vanzare and vc.id_valuta = vd.id_valuta) as multiplicator ] + ; + [from vanzari_detalii vd ] + ; + [left join nom_articole na on na.id_articol = vd.id_articol ] + ; + [left join nom_gestiuni ng on ng.id_gestiune = vd.id_gestiune ] + ; + [left join nom_valute nv on nv.id_valuta = vd.id_valuta] + +llOk = goExecutor.oExecuta(m.lcSql) +lcOut = lcOut + '--- CREATE OR REPLACE VIEW (subinterogari scalare) ---' + CHR(13) + CHR(10) +lcOut = lcOut + 'rezultat: ' + TRANSFORM(m.llOk) + CHR(13) + CHR(10) +IF !m.llOk + lcOut = lcOut + 'EROARE: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +IF !m.llOk + STRTOFILE('OPRIT dupa eroare la CREATE OR REPLACE - nu se mai verifica.' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +*!* --- 1b. re-marcheaza versiunea (script revizuit, aceeasi cheie - idempotent) --- +llOk = goExecutor.oExecuta([begin pack_migrare.UpdateVersiune('wip13_2026_09_02_01_COMUN_VVANZARI_ARTICOLE_EXT'); end;]) +lcOut = lcOut + '--- UpdateVersiune (reaplicare) ---' + CHR(13) + CHR(10) + 'rezultat: ' + TRANSFORM(m.llOk) + CHR(13) + CHR(10) +IF !m.llOk + lcOut = lcOut + 'EROARE: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 2. randuri DUPA pe cele 5 id_vanzare de control - trebuie identice cu raportul (1/2/4/2/4) --- +lcSql = [select id_vanzare, count(*) as nr from vvanzari_articole where id_vanzare in (1050,1047,1055,1040,1125) and sters = 0 group by id_vanzare order by id_vanzare] +IF Used('crscnt') + Use In crscnt +ENDIF +IF goExecutor.oExecute(m.lcSql, [crscnt]) < 0 + lcOut = lcOut + 'EROARE numarare dupa: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + '--- randuri sters=0 pe id_vanzare de control (DUPA rescriere) - asteptat 1040->1,1047->2,1050->4,1055->2,1125->4 ---' + CHR(13) + CHR(10) + SELECT crscnt + SCAN + lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' -> ' + TRANSFORM(nr) + ' randuri' + CHR(13) + CHR(10) + ENDSCAN + USE IN crscnt +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +*!* --- 3. continut real: 894/1301 (pretd=100, id_valutad=2), 1040/1568 (id_ctr=235, curs=5.243) --- +lcSql = [select id_vanzare, id_vanzare_det, id_ctr, pretd, id_valutad, curs, multiplicator ] + ; + [from vvanzari_articole where (id_vanzare = 894 and id_vanzare_det = 1301) or (id_vanzare = 1040 and id_vanzare_det = 1568) order by id_vanzare, id_vanzare_det] +IF Used('crscheck') + Use In crscheck +ENDIF +IF goExecutor.oExecute(m.lcSql, [crscheck]) < 0 + lcOut = lcOut + 'EROARE continut nou: ' + goExecutor.cEroare + CHR(13) + CHR(10) +ELSE + lcOut = lcOut + CHR(13) + CHR(10) + '--- continut de control: 894/1301 (pretd=100,id_valutad=2) si 1040/1568 (id_ctr=235,curs=5.243) ---' + CHR(13) + CHR(10) + SELECT crscheck + SCAN + lcOut = lcOut + 'id_vanzare=' + TRANSFORM(id_vanzare) + ' det=' + TRANSFORM(id_vanzare_det) + ; + ' id_ctr=' + TRANSFORM(NVL(id_ctr,-1)) + ' pretd=' + TRANSFORM(NVL(pretd,-1)) + ; + ' id_valutad=' + TRANSFORM(NVL(id_valutad,-1)) + ' curs=' + TRANSFORM(NVL(curs,-1)) + ; + ' multiplicator=' + TRANSFORM(NVL(multiplicator,-1)) + CHR(13) + CHR(10) + ENDSCAN + USE IN crscheck +ENDIF +goExecutor.oReset() +STRTOFILE(m.lcOut, gcErrLog, 1) +lcOut = '' + +STRTOFILE('done' + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s8_x1_1048.prg b/utile/Teste/editare_factura/test_s8_x1_1048.prg new file mode 100644 index 0000000..e64cfd1 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_x1_1048.prg @@ -0,0 +1,659 @@ +* test_s8_pas7_cablare.prg +* Verifica pasul 7 din docs\propunere_s8_incarcare.md §6: cablarea celei de-a treia optiuni de +* meniu si corpul real al lui frm_facturi.do_editare_unificata (COMUN\clase\ofacturare_comun.vc2). +* Traseul REAL: Newobject('frm_facturi') + .do_editare_unificata() (nu Createobject direct pe +* frm_facturare_articole2 - asta ar proba doar codul formularului, nu rutarea). +* Documente reale, in luna curenta a calendarului (gnAn/gnLuna), care trec toate garzile +* (nesters, ne-eproforma, tip valid, fara referinte, fara urmasi, ne-eFactura), gasite prin +* interogare read-only pe MARIUSM_AUTO: +* 1113 - sursa COMANDA (tip=3, id_comanda=2479) +* 1055 - sursa CONTRACT (tip=2, id_ctr=234) +* 1048 - factura SIMPLA, lista de preturi (tip=1, fara comanda/ctr) +* 1130 - VALUTA (tip=5, in_valuta=1) +* Nu scrie in Oracle - doar SELECT; verifica ca formularul deschis nici el nu scrie +* (G8: dataoras/id_utils neschimbate pe VANZARI/VANZARI_DETALII). +* +* frm_facturare_articole2 (ofacturare.vc2:15894) nu suprascrie WindowType, iar _frm_base il +* seteaza pe 1 = modal - .Show() blocheaza pana la inchiderea ferestrei, headless nu are cine +* sa o inchida in mod normal. Solutie: driverS8p7 (Custom, BINDEVENT pe un Timer de pe _SCREEN, +* acelasi tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg) - un modal inca pompeaza +* mesaje Windows, deci timerul tot mai ruleaza in interiorul lui .Show(); cand gaseste forma +* deschisa ii citeste prezenta/eticheta lui Ct_clb_altele (din colectia Objects, nu PEMSTATUS - +* RemoveObject scoate din Objects dar PEMSTATUS ramane .T., vezi memoria pemstatus-dupa- +* removeobject) si o elibereaza, ceea ce incheie .Show() si intoarce controlul in +* do_editare_unificata, apoi in acest test. Nu modifica NIMIC in codul de productie. +* +* Extindere S8 (blocarea grupurilor B si C la editare, docs\raport_s8_grup_bc.md): driverS8p7 +* citeste in plus, din Objects, starea needitabila a controalelor clb_fdoc.cboFdoc, Ct_clb_altele, +* Ct_clb_nume_client, Ct_clb_valuta, Clb_zi_curs, ct_contabilitate.Ct_clb_gestiune_init, +* Ct_clb_politici_preturi, but_incarca_articole, but_cursuri, ct_incasare, chk_incasare - fiecare +* verificat doar daca e prezent (unele sunt scoase de Init in functie de tip/gnScadereStoc, +* independent de lEditare). Proba de neregresie pe document nou (VerificaDocumentNou) NU trece +* prin factureaza()/poGeneratorNumere (interzis, arde numere) - construieste poDate manual cu +* Createobject('oDateFactura',0,0) (Init nu ruleaza, ramane pe defaults, lEditare=.F. ca la orice +* document nou) si instantiaza formularul direct cu Newobject, FARA .Show() (Init ruleaza oricum +* la construire; fara Show() nu exista blocaj modal, deci nu e nevoie de driver aici). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_x1_1048_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 + +*!* --- driver care inchide fereastra modala frm_facturare_articole2, vezi antetul fisierului --- +PUBLIC goDriverS8p7 +goDriverS8p7 = Createobject('driverS8p7') +_SCREEN.AddObject('tmrS8p7', 'Timer') +_SCREEN.tmrS8p7.Interval = 150 +Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa') +_SCREEN.tmrS8p7.Enabled = .T. + +*!* --- verificare statica: corpul do_editare_unificata nu contine nicio referinta la alocarea +*!* de numere (factureaza/poGeneratorNumere/creeaza_cursor_serii) --- +LOCAL lcSrc, lcTail, lnStart, lnEnd, lcMetoda +lcSrc = FILETOSTR('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vc2') +lnStart = AT('PROCEDURE do_editare_unificata' + CHR(13) + CHR(10), lcSrc) +DO asserteaza WITH 'static: metoda do_editare_unificata gasita in sursa', lnStart > 0, TRANSFORM(lnStart) +IF lnStart > 0 + lcTail = SUBSTR(lcSrc, lnStart) + lnEnd = AT('ENDPROC', lcTail) + lcMetoda = UPPER(SUBSTR(lcTail, 1, lnEnd + 6)) + DO asserteaza WITH 'static G2: fara FACTUREAZA( in do_editare_unificata', 'FACTUREAZA(' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara POGENERATORNUMERE in do_editare_unificata', 'POGENERATORNUMERE' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara CREEAZA_CURSOR_SERII in do_editare_unificata', 'CREEAZA_CURSOR_SERII' $ lcMetoda = .F., '' +ENDIF + +*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe cele 4 documente --- +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +LOCAL lcSchema, lcSelect, lcOrder, lcFiltru +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +lcOrder = [data_act,numar_act] +lcFiltru = [id_vanzare in (1113, 1055, 1048, 1130)] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +DO asserteaza WITH 'crsfacturi incarcat cu cele 4 documente reale (rownum=4)', Used('crsfacturi') AND Reccount('crsfacturi') = 4, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') + +*!* Ct_clb_altele (infirmare §3.2, vezi raport): document CU sursa -> prezent, etichetat din +*!* poDate.tip; factura SIMPLA -> absent, identic cu introducerea unei facturi noi (G10). +*!* X1 skip: DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda' +*!* X1 skip: DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract' +DO VerificaEditare WITH 1048, 'factura simpla', .F., '' +*!* X1 skip: DO VerificaEditare WITH 1130, 'valuta', .F., '' + +*!* --- S8 incasarea la editare (D1/D3/D4, docs\propunere_s8_incasare_la_editare.md) - foloseste +*!* Show() real, deci trebuie sa ruleze inainte de teardown-ul lui tmrS8p7 de mai jos. +*!* 1071: tip_incasare=11 (chitanta) -> mod 2. 1072: tip_incasare=2 (bon fiscal) -> mod 3, +*!* cazul in care hardcodarea veche "mod 2" ar fi aratat gresit. +DO VerificaIncasareLaEditare WITH 1071, 'chitanta, tip_incasare=11', 119, 44, 11, 2 +DO VerificaIncasareLaEditare WITH 1072, 'bon fiscal, tip_incasare=2', 119, 66, 2, 3 + +_SCREEN.tmrS8p7.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrS8p7') +Catch +Endtry + +*!* --- S8 grupurile B/C: neregresie pe document NOU (docs\raport_s8_grup_bc.md) --- +DO VerificaDocumentNou + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +PROCEDURE VerificaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tlCtClbAsteptat, tcCtClbEtichetaAsteptata + + LOCAL lcPrefix, lnSucces, loFrm, lnI, llGasitForm + LOCAL lcSnapPlajeA, lcSnapPlajeB, lcSnapDetA, lcSnapDetB + LOCAL ltDataorasVanzareA, lnIdUtilsVanzareA + lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + *!* --- G2: snapshot generator de numere, INAINTE --- + IF Used('v_plaje_a') + Use In v_plaje_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_a') + Use In v_plaje_a + + *!* --- G8: snapshot dataoras/id_utils, INAINTE --- + IF Used('v_g8a') + Use In v_g8a + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor G8 antet Oracle a reusit', lnSucces >= 0 AND Used('v_g8a') AND Reccount('v_g8a') = 1, Transform(lnSucces) + ltDataorasVanzareA = v_g8a.dataoras + lnIdUtilsVanzareA = Nvl(v_g8a.id_utils, 0) + Use In v_g8a + + IF Used('v_g8d_a') + Use In v_g8d_a + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_a') + goExecutor.oReset() + lcSnapDetA = CursorToSnapshot('v_g8d_a') + Use In v_g8d_a + + *!* --- codul testat: traseul real, prin frm_facturi.do_editare_unificata --- + *!* Init-ul clasei presupune crsfacturi ca zona curenta (la fel ca in test_s7_urmasi.prg) - + *!* interogarile martor de mai sus au schimbat zona curenta intre timp, se restaureaza aici + Select crsfacturi + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm) + IF Vartype(m.loFrm) <> 'O' + RETURN + ENDIF + + Select crsfacturi + Locate For id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found()) + IF !Found() + loFrm.Release() + RETURN + ENDIF + + *!* --- driverS8p7 gaseste si inchide formularul unificat (FARA but_termin1.Click()), vezi + *!* antetul fisierului; .do_editare_unificata() nu revine decat dupa ce fereastra s-a inchis --- + goDriverS8p7.Reseteaza() + loFrm.do_editare_unificata() + + DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit) + + *!* --- Ct_clb_altele: prezenta citita din colectia Objects a formularului, cat timp era deschis + *!* (infirmarea §3.2 - vezi raport) --- + DO asserteaza WITH lcPrefix + ': Ct_clb_altele prezenta = ' + Iif(m.tlCtClbAsteptat, 'prezent', 'absent'), ; + goDriverS8p7.lCtClbPrezent == m.tlCtClbAsteptat, Transform(goDriverS8p7.lCtClbPrezent) + IF m.tlCtClbAsteptat + DO asserteaza WITH lcPrefix + ': Ct_clb_altele eticheta = [' + m.tcCtClbEtichetaAsteptata + ']', ; + Upper(goDriverS8p7.cCtClbEticheta) == Upper(m.tcCtClbEtichetaAsteptata), goDriverS8p7.cCtClbEticheta + ENDIF + *!* --- grupul B si C (S8, decizia 25): needitabile la editare, verificate doar cand controlul + *!* mai exista (unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare) --- + DO VerificaBlocajGrupBC WITH m.lcPrefix + + *!* --- G5: totalul afisat de do_calculeaza_totaluri (chemat inainte de Show, in do_editare_unificata) + *!* ramane egal cu totalul deja scris in VANZARI - prinde o reevaluare tacita a cursului/preturilor --- + Select crsfacturi + IF Nvl(crsfacturi.in_valuta, 0) = 1 + DO asserteaza WITH lcPrefix + ' G5: total afisat (valuta) = VANZARI.totval', ; + Round(goDriverS8p7.nTotalVal, 2) == Round(Nvl(crsfacturi.totval, 0), 2), Transform(goDriverS8p7.nTotalVal) + ' vs ' + Transform(crsfacturi.totval) + ELSE + DO asserteaza WITH lcPrefix + ' G5: total afisat (lei) = VANZARI.total_cu_tva', ; + Round(goDriverS8p7.nTotalRon, 2) == Round(Nvl(crsfacturi.total_cu_tva, 0), 2), Transform(goDriverS8p7.nTotalRon) + ' vs ' + Transform(crsfacturi.total_cu_tva) + ENDIF + + loFrm.Release() + + *!* --- G9: niciun dialog modal la deschidere --- + DO asserteaza WITH lcPrefix + ' G9: niciun amessagebox la deschidere', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- G2: snapshot generator de numere, DUPA - identic caracter cu caracter --- + IF Used('v_plaje_b') + Use In v_plaje_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_b') + Use In v_plaje_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' + + *!* --- G8: dataoras/id_utils neschimbate pe VANZARI si VANZARI_DETALII --- + IF Used('v_g8a2') + Use In v_g8a2 + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a2') + goExecutor.oReset() + *!* Nvl pe TTOC: dataoras e NULL pe documentele de test - NULL == NULL da .NULL. in VFP (nu .T.), + *!* fals negativ fara el + DO asserteaza WITH lcPrefix + ' G8: VANZARI.dataoras neschimbat', ; + Nvl(Ttoc(v_g8a2.dataoras), 'NULL') == Nvl(Ttoc(m.ltDataorasVanzareA), 'NULL'), Nvl(Ttoc(v_g8a2.dataoras), 'NULL') + DO asserteaza WITH lcPrefix + ' G8: VANZARI.id_utils neschimbat', Nvl(v_g8a2.id_utils, 0) == m.lnIdUtilsVanzareA, Transform(Nvl(v_g8a2.id_utils, 0)) + Use In v_g8a2 + + IF Used('v_g8d_b') + Use In v_g8d_b + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_b') + goExecutor.oReset() + lcSnapDetB = CursorToSnapshot('v_g8d_b') + Use In v_g8d_b + DO asserteaza WITH lcPrefix + ' G8: VANZARI_DETALII dataoras/id_utils identice (nicio scriere)', m.lcSnapDetA == m.lcSnapDetB, '' + + *!* --- G11 partial: fara nicio scriere pe VANZARI_DETALII (G8), nu s-a putut genera nicio miscare + *!* de stoc noua pe acest document; nu masoara direct un tabel de stoc - proba indirecta, partiala --- + DO asserteaza WITH lcPrefix + ' G11 partial (derivat din G8): nicio scriere pe VANZARI_DETALII => stoc agregat neschimbat pe acest document', m.lcSnapDetA == m.lcSnapDetB, '' +ENDPROC + + +*!* S8 - blocarea grupurilor B si C la editare (docs\raport_s8_grup_bc.md). Citeste starea deja +*!* capturata de goDriverS8p7 (formularul e inchis pana aici) si asearta doar cand controlul e +*!* prezent - unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare. +PROCEDURE VerificaBlocajGrupBC + LPARAMETERS tcPrefix + + IF goDriverS8p7.lCtClbPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_altele (sursa) needitabil', !goDriverS8p7.lCtClbAlteleActiv, Transform(goDriverS8p7.lCtClbAlteleActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: clb_fdoc.cboFdoc (tip document) needitabil', ; + goDriverS8p7.lClbFdocPrezent AND !goDriverS8p7.lClbFdocActiv, Transform(goDriverS8p7.lClbFdocActiv) + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_nume_client (client) needitabil', ; + goDriverS8p7.lCtClbNumeClientPrezent AND !goDriverS8p7.lCtClbNumeClientActiv, Transform(goDriverS8p7.lCtClbNumeClientActiv) + IF goDriverS8p7.lCtClbValutaPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_valuta needitabil', !goDriverS8p7.lCtClbValutaActiv, Transform(goDriverS8p7.lCtClbValutaActiv) + ENDIF + IF goDriverS8p7.lClbZiCursPrezent + DO asserteaza WITH tcPrefix + ' grupB: Clb_zi_curs needitabil', !goDriverS8p7.lClbZiCursActiv, Transform(goDriverS8p7.lClbZiCursActiv) + ENDIF + IF goDriverS8p7.lCtClbGestiuneInitPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_gestiune_init (gestiune sursa) needitabil', !goDriverS8p7.lCtClbGestiuneInitActiv, Transform(goDriverS8p7.lCtClbGestiuneInitActiv) + ENDIF + IF goDriverS8p7.lCtClbPolPreturiPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_politici_preturi needitabil', !goDriverS8p7.lCtClbPolPreturiActiv, Transform(goDriverS8p7.lCtClbPolPreturiActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: but_incarca_articole needitabil (G2: evita poGeneratorNumere.verifica_numar)', ; + goDriverS8p7.lButIncarcaArticolePrezent AND !goDriverS8p7.lButIncarcaArticoleActiv, Transform(goDriverS8p7.lButIncarcaArticoleActiv) + DO asserteaza WITH tcPrefix + ' grupB: but_cursuri needitabil', ; + goDriverS8p7.lButCursuriPrezent AND !goDriverS8p7.lButCursuriActiv, Transform(goDriverS8p7.lButCursuriActiv) + IF goDriverS8p7.lCtIncasarePrezent + DO asserteaza WITH tcPrefix + ' grupC: ct_incasare needitabil', !goDriverS8p7.lCtIncasareActiv, Transform(goDriverS8p7.lCtIncasareActiv) + DO asserteaza WITH tcPrefix + ' grupC: chk_incasare needitabil', goDriverS8p7.lChkIncasarePrezent AND !goDriverS8p7.lChkIncasareActiv, Transform(goDriverS8p7.lChkIncasareActiv) + ENDIF +ENDPROC + + +*!* S8 - neregresie: pe document NOU, grupurile B/C raman editabile (docs\raport_s8_grup_bc.md). +*!* NU trece prin factureaza()/poGeneratorNumere (interzis - arde numere din plaje reale). poDate +*!* construit manual cu Createobject('oDateFactura',0,0): Init-ul clasei NU ruleaza (tnIdSet=0), +*!* deci ramane pe defaults din PropValue - inclusiv lEditare=.F., exact ca la orice document nou +*!* (vezi si test_s8_pas3_garda_alte_date.prg, acelasi tipar). tip=3 (comanda) e ales ca sa +*!* pastreze Ct_clb_altele si Ct_clb_nume_client prezente (paralel cu documentul 1113 de mai sus); +*!* nu are cursul din zi (citeste_cursuri_zi nu se cheama pentru tip=3), deci fara SELECT Oracle. +*!* Instantiat direct cu Newobject, FARA .Show() - Init ruleaza oricum la construire, iar fara +*!* Show() nu exista blocajul modal (WindowType=1 conteaza doar cand se cheama .Show()), deci nu e +*!* nevoie de driverS8p7 aici. +PROCEDURE VerificaDocumentNou + PRIVATE poDate + LOCAL loForm + + poDate = Createobject('oDateFactura', 0, 0) + poDate.tip = 3 + poDate.id_client = 0 + poDate.incasat = 0 + + loForm = Newobject('frm_facturare_articole2', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx') + DO asserteaza WITH 'document nou: Newobject(frm_facturare_articole2) reuseste (fara Show, fara factureaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + + DO asserteaza WITH 'document nou: poDate.lEditare = .F. (stare naturala, nesetata de nimeni)', !poDate.lEditare, Transform(poDate.lEditare) + + IF loForm.do_exista_obiect('Ct_clb_altele') + DO asserteaza WITH 'document nou grupB: Ct_clb_altele ramane editabil', loForm.Ct_clb_altele.lactiv, Transform(loForm.Ct_clb_altele.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: clb_fdoc.cboFdoc ramane editabil', loForm.clb_fdoc.cboFdoc.Enabled, Transform(loForm.clb_fdoc.cboFdoc.Enabled) + DO asserteaza WITH 'document nou grupB: Ct_clb_nume_client ramane editabil', loForm.Ct_clb_nume_client.lactiv, Transform(loForm.Ct_clb_nume_client.lactiv) + IF loForm.do_exista_obiect('Ct_clb_valuta') + DO asserteaza WITH 'document nou grupB: Ct_clb_valuta ramane editabil', loForm.Ct_clb_valuta.lactiv, Transform(loForm.Ct_clb_valuta.lactiv) + ENDIF + IF loForm.do_exista_obiect('Clb_zi_curs') + DO asserteaza WITH 'document nou grupB: Clb_zi_curs ramane editabil', !loForm.Clb_zi_curs.text_simplu1.ReadOnly, Transform(loForm.Clb_zi_curs.text_simplu1.ReadOnly) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_gestiune_init', loForm.ct_contabilitate) + DO asserteaza WITH 'document nou grupB: Ct_clb_gestiune_init ramane editabil', loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv, Transform(loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_politici_preturi') + DO asserteaza WITH 'document nou grupB: Ct_clb_politici_preturi ramane editabil', loForm.Ct_clb_politici_preturi.lactiv, Transform(loForm.Ct_clb_politici_preturi.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: but_incarca_articole ramane editabil', loForm.but_incarca_articole.Enabled, Transform(loForm.but_incarca_articole.Enabled) + DO asserteaza WITH 'document nou grupB: but_cursuri ramane editabil', loForm.but_cursuri.Enabled, Transform(loForm.but_cursuri.Enabled) + IF loForm.do_exista_obiect('ct_incasare') + DO asserteaza WITH 'document nou grupC: ct_incasare ramane editabil', loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH 'document nou grupC: chk_incasare ramane editabil', loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + ENDIF + + loForm.Release() +ENDPROC + + +*!* S8 - incasarea la editare (D1/D3/D4, docs\propunere_s8_incasare_la_editare.md). Replica +*!* dovedita a corpului do_editare_unificata (ofacturare_comun.vc2:3890+) pana la Createobject, +*!* promovata din investigatia I1 (probe_defect5_latent.prg) in setul permanent de probe - acolo +*!* s-a confirmat ca poDate, declarat PRIVATE aici, ramane vizibil dupa Createobject/Show() +*!* (aceeasi vizibilitate dinamica pe care se bazeaza si codul de productie pentru poDate/ +*!* poGeneratorNumere). driverS8p7 e refolosit doar ca sa inchida modalul Show(). +PROCEDURE VerificaIncasareLaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tnIncasatAsteptat, tnNrIncasareAsteptat, tnTipIncasareAsteptat, tnModAsteptat + + LOCAL lcPrefix, lnSucces, loForm, pnDiscountRon, pnDiscountValuta + LOCAL lnSters, llEProforma, lnTipDoc, lcSnapPlajeA, lcSnapPlajeB + PRIVATE pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP, poDate + Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP + lcPrefix = Transform(m.tnIdVanzare) + ' [incasare ' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + IF Used('v_plaje_inc_a') + Use In v_plaje_inc_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_inc_a') + Use In v_plaje_inc_a + + lnSucces = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip,incasat from fact_vfacturi where id_vanzare=' + Transform(m.tnIdVanzare), 'crsIncUnic') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': documentul a putut fi reincarcat', lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1, Transform(lnSucces) + IF !(lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1) + RETURN + ENDIF + SELECT crsIncUnic + lnIdVanzareP = id_vanzare + lnCod = cod + pnAn = Year(data_act) + pnLuna = Month(data_act) + lnSters = sters + lnIdFact = id_fact + llEProforma = (eproforma = 1) + lnTipDoc = tip + Use In crsIncUnic + + DO asserteaza WITH lcPrefix + ': garzile do_editare_unificata trecute (nesters/neproforma/tip valid/luna curenta)', ; + lnSters = 0 AND !llEProforma AND !Inlist(lnTipDoc,44,45,46,51) AND (pnAn*12+pnLuna) == (gnAn*12+gnLuna), '' + DO asserteaza WITH lcPrefix + ': fara referinte (incasari/plati)', !ReferinteDocumenteNota(pnAn, pnLuna, lnCod), '' + DO asserteaza WITH lcPrefix + ': nu e in eFactura', !EsteInEFactura(lnIdFact), '' + DO asserteaza WITH lcPrefix + ': fara urmasi', !DocumentAreUrmasi(lnIdVanzareP), '' + + poDate = IncarcaAntetFacturaEditare(lnIdVanzareP, @pnDiscountRon, @pnDiscountValuta) + DO asserteaza WITH lcPrefix + ': IncarcaAntetFacturaEditare reuseste', Vartype(m.poDate) == 'O', Vartype(m.poDate) + IF Vartype(m.poDate) <> 'O' + RETURN + ENDIF + + IncarcaLiniiFacturaEditare(poDate, lnIdVanzareP) + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF Used('jtva_coloane') + Use In jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ELSE + Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ENDIF + + loForm = Createobject('frm_facturare_articole2') + DO asserteaza WITH lcPrefix + ': formularul se deschide fara eroare (defectul 5 latent nu se activeaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + DO asserteaza WITH lcPrefix + ': G9 niciun amessagebox la Createobject/Init', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- asertiunile care prind regresia D1/D3/D4 --- + DO asserteaza WITH lcPrefix + ': poDate.incasat = valoarea din baza (NU suprascrisa cu totalctva)', ; + Round(Nvl(poDate.incasat,-1),2) == Round(m.tnIncasatAsteptat,2), Transform(Nvl(poDate.incasat,-1)) + DO asserteaza WITH lcPrefix + ': poDate.nr_incasare nu a fost zeroit', ; + Nvl(poDate.nr_incasare,-1) == m.tnNrIncasareAsteptat, Transform(Nvl(poDate.nr_incasare,-1)) + DO asserteaza WITH lcPrefix + ': poDate.ntip_incasare incarcat corect', ; + Nvl(poDate.ntip_incasare,-1) == m.tnTipIncasareAsteptat, Transform(Nvl(poDate.ntip_incasare,-1)) + DO asserteaza WITH lcPrefix + ': modul afisat (opt_incasat.Value) corespunde tip_incasare', ; + loForm.ct_incasare.opt_incasat.Value == m.tnModAsteptat - 1, Transform(loForm.ct_incasare.opt_incasat.Value) + DO asserteaza WITH lcPrefix + ': chk_incasare.Value = 1 (document incasat)', loForm.chk_incasare.Value == 1, Transform(loForm.chk_incasare.Value) + DO asserteaza WITH lcPrefix + ': grupC ct_incasare needitabil', !loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH lcPrefix + ': grupC chk_incasare needitabil', !loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + + loForm.ndiscfactron = pnDiscountRon + loForm.ndiscfactval = pnDiscountValuta + loForm.do_calculeaza_totaluri() + + *!* nemodal: eliberarea din Timer, in interiorul propriului Show() modal, blocheaza VFP in Release() + loForm.WindowType = 0 + goDriverS8p7.Reseteaza() + loForm.Show() + DO asserteaza WITH lcPrefix + ': niciun amessagebox pe parcursul Show()', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + Try + loForm.Release() + Catch + Endtry + + IF Used('v_plaje_inc_b') + Use In v_plaje_inc_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_inc_b') + Use In v_plaje_inc_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' +ENDPROC + + +PROCEDURE CursorToSnapshot + LPARAMETERS tcAlias + + LOCAL lcResult, lnI + lcResult = '' + SELECT (m.tcAlias) + SCAN + FOR lnI = 1 TO FCOUNT() + lcResult = lcResult + Transform(Evaluate(Field(m.lnI))) + '|' + ENDFOR + lcResult = lcResult + Chr(10) + ENDSCAN + RETURN m.lcResult +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*!* driverS8p7: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms in timp ce .Show() e blocat pe +*!* modal (un modal tot pompeaza mesaje Windows, deci timerul de pe _SCREEN tot ruleaza - acelasi +*!* tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg, folosit acolo pentru MESSAGEBOX_FORM). +*!* Citeste Ct_clb_altele din Objects (nu PEMSTATUS - RemoveObject scoate din Objects, PEMSTATUS +*!* ramane .T.) inainte sa elibereze forma, ceea ce incheie .Show() si reda controlul apelantului. +DEFINE CLASS driverS8p7 AS Custom + lBusy = .F. + lGasit = .F. + lCtClbPrezent = .F. + lCtClbAlteleActiv = .F. + cCtClbEticheta = '' + nTotalRon = 0 + nTotalVal = 0 + + *!* grupul B si C (S8, docs\raport_s8_grup_bc.md) - Prezent = mai exista in Objects (nu a fost + *!* scos de Init dupa tip/gnScadereStoc), Activ = NU e blocat (Enabled / lactiv / !ReadOnly, dupa + *!* mecanismul folosit de fiecare control) + lClbFdocPrezent = .F. + lClbFdocActiv = .F. + lCtClbNumeClientPrezent = .F. + lCtClbNumeClientActiv = .F. + lCtClbValutaPrezent = .F. + lCtClbValutaActiv = .F. + lClbZiCursPrezent = .F. + lClbZiCursActiv = .F. + lCtClbGestiuneInitPrezent = .F. + lCtClbGestiuneInitActiv = .F. + lCtClbPolPreturiPrezent = .F. + lCtClbPolPreturiActiv = .F. + lButIncarcaArticolePrezent = .F. + lButIncarcaArticoleActiv = .F. + lButCursuriPrezent = .F. + lButCursuriActiv = .F. + lCtIncasarePrezent = .F. + lCtIncasareActiv = .F. + lChkIncasarePrezent = .F. + lChkIncasareActiv = .F. + + PROCEDURE Reseteaza + This.lGasit = .F. + This.lCtClbPrezent = .F. + This.lCtClbAlteleActiv = .F. + This.cCtClbEticheta = '' + This.nTotalRon = 0 + This.nTotalVal = 0 + This.lClbFdocPrezent = .F. + This.lClbFdocActiv = .F. + This.lCtClbNumeClientPrezent = .F. + This.lCtClbNumeClientActiv = .F. + This.lCtClbValutaPrezent = .F. + This.lCtClbValutaActiv = .F. + This.lClbZiCursPrezent = .F. + This.lClbZiCursActiv = .F. + This.lCtClbGestiuneInitPrezent = .F. + This.lCtClbGestiuneInitActiv = .F. + This.lCtClbPolPreturiPrezent = .F. + This.lCtClbPolPreturiActiv = .F. + This.lButIncarcaArticolePrezent = .F. + This.lButIncarcaArticoleActiv = .F. + This.lButCursuriPrezent = .F. + This.lButCursuriActiv = .F. + This.lCtIncasarePrezent = .F. + This.lCtIncasareActiv = .F. + This.lChkIncasarePrezent = .F. + This.lChkIncasareActiv = .F. + ENDPROC + + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + TRY + LOCAL lnI, lnJ, lnJ2, loFrm2, loObj, loObj2 + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + This.nTotalRon = Nvl(loFrm2.ntotalron, 0) + This.nTotalVal = Nvl(loFrm2.ntotalval, 0) + FOR lnJ = 1 TO loFrm2.Objects.Count + loObj = loFrm2.Objects(m.lnJ) + DO CASE + CASE Upper(loObj.Name) == 'CT_CLB_ALTELE' + This.lCtClbPrezent = .T. + This.lCtClbAlteleActiv = loObj.lactiv + This.cCtClbEticheta = Alltrim(loObj.clb_tx_cautare.lb_SIMPLU1.Caption) + CASE Upper(loObj.Name) == 'CLB_FDOC' + This.lClbFdocPrezent = .T. + This.lClbFdocActiv = loObj.cboFdoc.Enabled + CASE Upper(loObj.Name) == 'CT_CLB_NUME_CLIENT' + This.lCtClbNumeClientPrezent = .T. + This.lCtClbNumeClientActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CT_CLB_VALUTA' + This.lCtClbValutaPrezent = .T. + This.lCtClbValutaActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CLB_ZI_CURS' + This.lClbZiCursPrezent = .T. + This.lClbZiCursActiv = !loObj.text_simplu1.ReadOnly + CASE Upper(loObj.Name) == 'CT_CLB_POLITICI_PRETURI' + This.lCtClbPolPreturiPrezent = .T. + This.lCtClbPolPreturiActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'BUT_INCARCA_ARTICOLE' + This.lButIncarcaArticolePrezent = .T. + This.lButIncarcaArticoleActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'BUT_CURSURI' + This.lButCursuriPrezent = .T. + This.lButCursuriActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_INCASARE' + This.lCtIncasarePrezent = .T. + This.lCtIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CHK_INCASARE' + This.lChkIncasarePrezent = .T. + This.lChkIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_CONTABILITATE' + FOR lnJ2 = 1 TO loObj.Objects.Count + loObj2 = loObj.Objects(m.lnJ2) + IF Upper(loObj2.Name) == 'CT_CLB_GESTIUNE_INIT' + This.lCtClbGestiuneInitPrezent = .T. + This.lCtClbGestiuneInitActiv = loObj2.lactiv + ENDIF + ENDFOR + ENDCASE + ENDFOR + loFrm2.Release() + EXIT + ENDIF + ENDFOR + CATCH TO loExcS8p7 + STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s8_x1_1055.prg b/utile/Teste/editare_factura/test_s8_x1_1055.prg new file mode 100644 index 0000000..34fbe5b --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_x1_1055.prg @@ -0,0 +1,659 @@ +* test_s8_pas7_cablare.prg +* Verifica pasul 7 din docs\propunere_s8_incarcare.md §6: cablarea celei de-a treia optiuni de +* meniu si corpul real al lui frm_facturi.do_editare_unificata (COMUN\clase\ofacturare_comun.vc2). +* Traseul REAL: Newobject('frm_facturi') + .do_editare_unificata() (nu Createobject direct pe +* frm_facturare_articole2 - asta ar proba doar codul formularului, nu rutarea). +* Documente reale, in luna curenta a calendarului (gnAn/gnLuna), care trec toate garzile +* (nesters, ne-eproforma, tip valid, fara referinte, fara urmasi, ne-eFactura), gasite prin +* interogare read-only pe MARIUSM_AUTO: +* 1113 - sursa COMANDA (tip=3, id_comanda=2479) +* 1055 - sursa CONTRACT (tip=2, id_ctr=234) +* 1048 - factura SIMPLA, lista de preturi (tip=1, fara comanda/ctr) +* 1130 - VALUTA (tip=5, in_valuta=1) +* Nu scrie in Oracle - doar SELECT; verifica ca formularul deschis nici el nu scrie +* (G8: dataoras/id_utils neschimbate pe VANZARI/VANZARI_DETALII). +* +* frm_facturare_articole2 (ofacturare.vc2:15894) nu suprascrie WindowType, iar _frm_base il +* seteaza pe 1 = modal - .Show() blocheaza pana la inchiderea ferestrei, headless nu are cine +* sa o inchida in mod normal. Solutie: driverS8p7 (Custom, BINDEVENT pe un Timer de pe _SCREEN, +* acelasi tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg) - un modal inca pompeaza +* mesaje Windows, deci timerul tot mai ruleaza in interiorul lui .Show(); cand gaseste forma +* deschisa ii citeste prezenta/eticheta lui Ct_clb_altele (din colectia Objects, nu PEMSTATUS - +* RemoveObject scoate din Objects dar PEMSTATUS ramane .T., vezi memoria pemstatus-dupa- +* removeobject) si o elibereaza, ceea ce incheie .Show() si intoarce controlul in +* do_editare_unificata, apoi in acest test. Nu modifica NIMIC in codul de productie. +* +* Extindere S8 (blocarea grupurilor B si C la editare, docs\raport_s8_grup_bc.md): driverS8p7 +* citeste in plus, din Objects, starea needitabila a controalelor clb_fdoc.cboFdoc, Ct_clb_altele, +* Ct_clb_nume_client, Ct_clb_valuta, Clb_zi_curs, ct_contabilitate.Ct_clb_gestiune_init, +* Ct_clb_politici_preturi, but_incarca_articole, but_cursuri, ct_incasare, chk_incasare - fiecare +* verificat doar daca e prezent (unele sunt scoase de Init in functie de tip/gnScadereStoc, +* independent de lEditare). Proba de neregresie pe document nou (VerificaDocumentNou) NU trece +* prin factureaza()/poGeneratorNumere (interzis, arde numere) - construieste poDate manual cu +* Createobject('oDateFactura',0,0) (Init nu ruleaza, ramane pe defaults, lEditare=.F. ca la orice +* document nou) si instantiaza formularul direct cu Newobject, FARA .Show() (Init ruleaza oricum +* la construire; fara Show() nu exista blocaj modal, deci nu e nevoie de driver aici). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_x1_1055_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 + +*!* --- driver care inchide fereastra modala frm_facturare_articole2, vezi antetul fisierului --- +PUBLIC goDriverS8p7 +goDriverS8p7 = Createobject('driverS8p7') +_SCREEN.AddObject('tmrS8p7', 'Timer') +_SCREEN.tmrS8p7.Interval = 150 +Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa') +_SCREEN.tmrS8p7.Enabled = .T. + +*!* --- verificare statica: corpul do_editare_unificata nu contine nicio referinta la alocarea +*!* de numere (factureaza/poGeneratorNumere/creeaza_cursor_serii) --- +LOCAL lcSrc, lcTail, lnStart, lnEnd, lcMetoda +lcSrc = FILETOSTR('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vc2') +lnStart = AT('PROCEDURE do_editare_unificata' + CHR(13) + CHR(10), lcSrc) +DO asserteaza WITH 'static: metoda do_editare_unificata gasita in sursa', lnStart > 0, TRANSFORM(lnStart) +IF lnStart > 0 + lcTail = SUBSTR(lcSrc, lnStart) + lnEnd = AT('ENDPROC', lcTail) + lcMetoda = UPPER(SUBSTR(lcTail, 1, lnEnd + 6)) + DO asserteaza WITH 'static G2: fara FACTUREAZA( in do_editare_unificata', 'FACTUREAZA(' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara POGENERATORNUMERE in do_editare_unificata', 'POGENERATORNUMERE' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara CREEAZA_CURSOR_SERII in do_editare_unificata', 'CREEAZA_CURSOR_SERII' $ lcMetoda = .F., '' +ENDIF + +*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe cele 4 documente --- +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +LOCAL lcSchema, lcSelect, lcOrder, lcFiltru +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +lcOrder = [data_act,numar_act] +lcFiltru = [id_vanzare in (1113, 1055, 1048, 1130)] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +DO asserteaza WITH 'crsfacturi incarcat cu cele 4 documente reale (rownum=4)', Used('crsfacturi') AND Reccount('crsfacturi') = 4, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') + +*!* Ct_clb_altele (infirmare §3.2, vezi raport): document CU sursa -> prezent, etichetat din +*!* poDate.tip; factura SIMPLA -> absent, identic cu introducerea unei facturi noi (G10). +*!* X1 skip: DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda' +DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract' +*!* X1 skip: DO VerificaEditare WITH 1048, 'factura simpla', .F., '' +*!* X1 skip: DO VerificaEditare WITH 1130, 'valuta', .F., '' + +*!* --- S8 incasarea la editare (D1/D3/D4, docs\propunere_s8_incasare_la_editare.md) - foloseste +*!* Show() real, deci trebuie sa ruleze inainte de teardown-ul lui tmrS8p7 de mai jos. +*!* 1071: tip_incasare=11 (chitanta) -> mod 2. 1072: tip_incasare=2 (bon fiscal) -> mod 3, +*!* cazul in care hardcodarea veche "mod 2" ar fi aratat gresit. +DO VerificaIncasareLaEditare WITH 1071, 'chitanta, tip_incasare=11', 119, 44, 11, 2 +DO VerificaIncasareLaEditare WITH 1072, 'bon fiscal, tip_incasare=2', 119, 66, 2, 3 + +_SCREEN.tmrS8p7.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrS8p7') +Catch +Endtry + +*!* --- S8 grupurile B/C: neregresie pe document NOU (docs\raport_s8_grup_bc.md) --- +DO VerificaDocumentNou + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +PROCEDURE VerificaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tlCtClbAsteptat, tcCtClbEtichetaAsteptata + + LOCAL lcPrefix, lnSucces, loFrm, lnI, llGasitForm + LOCAL lcSnapPlajeA, lcSnapPlajeB, lcSnapDetA, lcSnapDetB + LOCAL ltDataorasVanzareA, lnIdUtilsVanzareA + lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + *!* --- G2: snapshot generator de numere, INAINTE --- + IF Used('v_plaje_a') + Use In v_plaje_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_a') + Use In v_plaje_a + + *!* --- G8: snapshot dataoras/id_utils, INAINTE --- + IF Used('v_g8a') + Use In v_g8a + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor G8 antet Oracle a reusit', lnSucces >= 0 AND Used('v_g8a') AND Reccount('v_g8a') = 1, Transform(lnSucces) + ltDataorasVanzareA = v_g8a.dataoras + lnIdUtilsVanzareA = Nvl(v_g8a.id_utils, 0) + Use In v_g8a + + IF Used('v_g8d_a') + Use In v_g8d_a + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_a') + goExecutor.oReset() + lcSnapDetA = CursorToSnapshot('v_g8d_a') + Use In v_g8d_a + + *!* --- codul testat: traseul real, prin frm_facturi.do_editare_unificata --- + *!* Init-ul clasei presupune crsfacturi ca zona curenta (la fel ca in test_s7_urmasi.prg) - + *!* interogarile martor de mai sus au schimbat zona curenta intre timp, se restaureaza aici + Select crsfacturi + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm) + IF Vartype(m.loFrm) <> 'O' + RETURN + ENDIF + + Select crsfacturi + Locate For id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found()) + IF !Found() + loFrm.Release() + RETURN + ENDIF + + *!* --- driverS8p7 gaseste si inchide formularul unificat (FARA but_termin1.Click()), vezi + *!* antetul fisierului; .do_editare_unificata() nu revine decat dupa ce fereastra s-a inchis --- + goDriverS8p7.Reseteaza() + loFrm.do_editare_unificata() + + DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit) + + *!* --- Ct_clb_altele: prezenta citita din colectia Objects a formularului, cat timp era deschis + *!* (infirmarea §3.2 - vezi raport) --- + DO asserteaza WITH lcPrefix + ': Ct_clb_altele prezenta = ' + Iif(m.tlCtClbAsteptat, 'prezent', 'absent'), ; + goDriverS8p7.lCtClbPrezent == m.tlCtClbAsteptat, Transform(goDriverS8p7.lCtClbPrezent) + IF m.tlCtClbAsteptat + DO asserteaza WITH lcPrefix + ': Ct_clb_altele eticheta = [' + m.tcCtClbEtichetaAsteptata + ']', ; + Upper(goDriverS8p7.cCtClbEticheta) == Upper(m.tcCtClbEtichetaAsteptata), goDriverS8p7.cCtClbEticheta + ENDIF + *!* --- grupul B si C (S8, decizia 25): needitabile la editare, verificate doar cand controlul + *!* mai exista (unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare) --- + DO VerificaBlocajGrupBC WITH m.lcPrefix + + *!* --- G5: totalul afisat de do_calculeaza_totaluri (chemat inainte de Show, in do_editare_unificata) + *!* ramane egal cu totalul deja scris in VANZARI - prinde o reevaluare tacita a cursului/preturilor --- + Select crsfacturi + IF Nvl(crsfacturi.in_valuta, 0) = 1 + DO asserteaza WITH lcPrefix + ' G5: total afisat (valuta) = VANZARI.totval', ; + Round(goDriverS8p7.nTotalVal, 2) == Round(Nvl(crsfacturi.totval, 0), 2), Transform(goDriverS8p7.nTotalVal) + ' vs ' + Transform(crsfacturi.totval) + ELSE + DO asserteaza WITH lcPrefix + ' G5: total afisat (lei) = VANZARI.total_cu_tva', ; + Round(goDriverS8p7.nTotalRon, 2) == Round(Nvl(crsfacturi.total_cu_tva, 0), 2), Transform(goDriverS8p7.nTotalRon) + ' vs ' + Transform(crsfacturi.total_cu_tva) + ENDIF + + loFrm.Release() + + *!* --- G9: niciun dialog modal la deschidere --- + DO asserteaza WITH lcPrefix + ' G9: niciun amessagebox la deschidere', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- G2: snapshot generator de numere, DUPA - identic caracter cu caracter --- + IF Used('v_plaje_b') + Use In v_plaje_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_b') + Use In v_plaje_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' + + *!* --- G8: dataoras/id_utils neschimbate pe VANZARI si VANZARI_DETALII --- + IF Used('v_g8a2') + Use In v_g8a2 + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a2') + goExecutor.oReset() + *!* Nvl pe TTOC: dataoras e NULL pe documentele de test - NULL == NULL da .NULL. in VFP (nu .T.), + *!* fals negativ fara el + DO asserteaza WITH lcPrefix + ' G8: VANZARI.dataoras neschimbat', ; + Nvl(Ttoc(v_g8a2.dataoras), 'NULL') == Nvl(Ttoc(m.ltDataorasVanzareA), 'NULL'), Nvl(Ttoc(v_g8a2.dataoras), 'NULL') + DO asserteaza WITH lcPrefix + ' G8: VANZARI.id_utils neschimbat', Nvl(v_g8a2.id_utils, 0) == m.lnIdUtilsVanzareA, Transform(Nvl(v_g8a2.id_utils, 0)) + Use In v_g8a2 + + IF Used('v_g8d_b') + Use In v_g8d_b + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_b') + goExecutor.oReset() + lcSnapDetB = CursorToSnapshot('v_g8d_b') + Use In v_g8d_b + DO asserteaza WITH lcPrefix + ' G8: VANZARI_DETALII dataoras/id_utils identice (nicio scriere)', m.lcSnapDetA == m.lcSnapDetB, '' + + *!* --- G11 partial: fara nicio scriere pe VANZARI_DETALII (G8), nu s-a putut genera nicio miscare + *!* de stoc noua pe acest document; nu masoara direct un tabel de stoc - proba indirecta, partiala --- + DO asserteaza WITH lcPrefix + ' G11 partial (derivat din G8): nicio scriere pe VANZARI_DETALII => stoc agregat neschimbat pe acest document', m.lcSnapDetA == m.lcSnapDetB, '' +ENDPROC + + +*!* S8 - blocarea grupurilor B si C la editare (docs\raport_s8_grup_bc.md). Citeste starea deja +*!* capturata de goDriverS8p7 (formularul e inchis pana aici) si asearta doar cand controlul e +*!* prezent - unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare. +PROCEDURE VerificaBlocajGrupBC + LPARAMETERS tcPrefix + + IF goDriverS8p7.lCtClbPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_altele (sursa) needitabil', !goDriverS8p7.lCtClbAlteleActiv, Transform(goDriverS8p7.lCtClbAlteleActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: clb_fdoc.cboFdoc (tip document) needitabil', ; + goDriverS8p7.lClbFdocPrezent AND !goDriverS8p7.lClbFdocActiv, Transform(goDriverS8p7.lClbFdocActiv) + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_nume_client (client) needitabil', ; + goDriverS8p7.lCtClbNumeClientPrezent AND !goDriverS8p7.lCtClbNumeClientActiv, Transform(goDriverS8p7.lCtClbNumeClientActiv) + IF goDriverS8p7.lCtClbValutaPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_valuta needitabil', !goDriverS8p7.lCtClbValutaActiv, Transform(goDriverS8p7.lCtClbValutaActiv) + ENDIF + IF goDriverS8p7.lClbZiCursPrezent + DO asserteaza WITH tcPrefix + ' grupB: Clb_zi_curs needitabil', !goDriverS8p7.lClbZiCursActiv, Transform(goDriverS8p7.lClbZiCursActiv) + ENDIF + IF goDriverS8p7.lCtClbGestiuneInitPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_gestiune_init (gestiune sursa) needitabil', !goDriverS8p7.lCtClbGestiuneInitActiv, Transform(goDriverS8p7.lCtClbGestiuneInitActiv) + ENDIF + IF goDriverS8p7.lCtClbPolPreturiPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_politici_preturi needitabil', !goDriverS8p7.lCtClbPolPreturiActiv, Transform(goDriverS8p7.lCtClbPolPreturiActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: but_incarca_articole needitabil (G2: evita poGeneratorNumere.verifica_numar)', ; + goDriverS8p7.lButIncarcaArticolePrezent AND !goDriverS8p7.lButIncarcaArticoleActiv, Transform(goDriverS8p7.lButIncarcaArticoleActiv) + DO asserteaza WITH tcPrefix + ' grupB: but_cursuri needitabil', ; + goDriverS8p7.lButCursuriPrezent AND !goDriverS8p7.lButCursuriActiv, Transform(goDriverS8p7.lButCursuriActiv) + IF goDriverS8p7.lCtIncasarePrezent + DO asserteaza WITH tcPrefix + ' grupC: ct_incasare needitabil', !goDriverS8p7.lCtIncasareActiv, Transform(goDriverS8p7.lCtIncasareActiv) + DO asserteaza WITH tcPrefix + ' grupC: chk_incasare needitabil', goDriverS8p7.lChkIncasarePrezent AND !goDriverS8p7.lChkIncasareActiv, Transform(goDriverS8p7.lChkIncasareActiv) + ENDIF +ENDPROC + + +*!* S8 - neregresie: pe document NOU, grupurile B/C raman editabile (docs\raport_s8_grup_bc.md). +*!* NU trece prin factureaza()/poGeneratorNumere (interzis - arde numere din plaje reale). poDate +*!* construit manual cu Createobject('oDateFactura',0,0): Init-ul clasei NU ruleaza (tnIdSet=0), +*!* deci ramane pe defaults din PropValue - inclusiv lEditare=.F., exact ca la orice document nou +*!* (vezi si test_s8_pas3_garda_alte_date.prg, acelasi tipar). tip=3 (comanda) e ales ca sa +*!* pastreze Ct_clb_altele si Ct_clb_nume_client prezente (paralel cu documentul 1113 de mai sus); +*!* nu are cursul din zi (citeste_cursuri_zi nu se cheama pentru tip=3), deci fara SELECT Oracle. +*!* Instantiat direct cu Newobject, FARA .Show() - Init ruleaza oricum la construire, iar fara +*!* Show() nu exista blocajul modal (WindowType=1 conteaza doar cand se cheama .Show()), deci nu e +*!* nevoie de driverS8p7 aici. +PROCEDURE VerificaDocumentNou + PRIVATE poDate + LOCAL loForm + + poDate = Createobject('oDateFactura', 0, 0) + poDate.tip = 3 + poDate.id_client = 0 + poDate.incasat = 0 + + loForm = Newobject('frm_facturare_articole2', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx') + DO asserteaza WITH 'document nou: Newobject(frm_facturare_articole2) reuseste (fara Show, fara factureaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + + DO asserteaza WITH 'document nou: poDate.lEditare = .F. (stare naturala, nesetata de nimeni)', !poDate.lEditare, Transform(poDate.lEditare) + + IF loForm.do_exista_obiect('Ct_clb_altele') + DO asserteaza WITH 'document nou grupB: Ct_clb_altele ramane editabil', loForm.Ct_clb_altele.lactiv, Transform(loForm.Ct_clb_altele.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: clb_fdoc.cboFdoc ramane editabil', loForm.clb_fdoc.cboFdoc.Enabled, Transform(loForm.clb_fdoc.cboFdoc.Enabled) + DO asserteaza WITH 'document nou grupB: Ct_clb_nume_client ramane editabil', loForm.Ct_clb_nume_client.lactiv, Transform(loForm.Ct_clb_nume_client.lactiv) + IF loForm.do_exista_obiect('Ct_clb_valuta') + DO asserteaza WITH 'document nou grupB: Ct_clb_valuta ramane editabil', loForm.Ct_clb_valuta.lactiv, Transform(loForm.Ct_clb_valuta.lactiv) + ENDIF + IF loForm.do_exista_obiect('Clb_zi_curs') + DO asserteaza WITH 'document nou grupB: Clb_zi_curs ramane editabil', !loForm.Clb_zi_curs.text_simplu1.ReadOnly, Transform(loForm.Clb_zi_curs.text_simplu1.ReadOnly) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_gestiune_init', loForm.ct_contabilitate) + DO asserteaza WITH 'document nou grupB: Ct_clb_gestiune_init ramane editabil', loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv, Transform(loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_politici_preturi') + DO asserteaza WITH 'document nou grupB: Ct_clb_politici_preturi ramane editabil', loForm.Ct_clb_politici_preturi.lactiv, Transform(loForm.Ct_clb_politici_preturi.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: but_incarca_articole ramane editabil', loForm.but_incarca_articole.Enabled, Transform(loForm.but_incarca_articole.Enabled) + DO asserteaza WITH 'document nou grupB: but_cursuri ramane editabil', loForm.but_cursuri.Enabled, Transform(loForm.but_cursuri.Enabled) + IF loForm.do_exista_obiect('ct_incasare') + DO asserteaza WITH 'document nou grupC: ct_incasare ramane editabil', loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH 'document nou grupC: chk_incasare ramane editabil', loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + ENDIF + + loForm.Release() +ENDPROC + + +*!* S8 - incasarea la editare (D1/D3/D4, docs\propunere_s8_incasare_la_editare.md). Replica +*!* dovedita a corpului do_editare_unificata (ofacturare_comun.vc2:3890+) pana la Createobject, +*!* promovata din investigatia I1 (probe_defect5_latent.prg) in setul permanent de probe - acolo +*!* s-a confirmat ca poDate, declarat PRIVATE aici, ramane vizibil dupa Createobject/Show() +*!* (aceeasi vizibilitate dinamica pe care se bazeaza si codul de productie pentru poDate/ +*!* poGeneratorNumere). driverS8p7 e refolosit doar ca sa inchida modalul Show(). +PROCEDURE VerificaIncasareLaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tnIncasatAsteptat, tnNrIncasareAsteptat, tnTipIncasareAsteptat, tnModAsteptat + + LOCAL lcPrefix, lnSucces, loForm, pnDiscountRon, pnDiscountValuta + LOCAL lnSters, llEProforma, lnTipDoc, lcSnapPlajeA, lcSnapPlajeB + PRIVATE pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP, poDate + Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP + lcPrefix = Transform(m.tnIdVanzare) + ' [incasare ' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + IF Used('v_plaje_inc_a') + Use In v_plaje_inc_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_inc_a') + Use In v_plaje_inc_a + + lnSucces = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip,incasat from fact_vfacturi where id_vanzare=' + Transform(m.tnIdVanzare), 'crsIncUnic') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': documentul a putut fi reincarcat', lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1, Transform(lnSucces) + IF !(lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1) + RETURN + ENDIF + SELECT crsIncUnic + lnIdVanzareP = id_vanzare + lnCod = cod + pnAn = Year(data_act) + pnLuna = Month(data_act) + lnSters = sters + lnIdFact = id_fact + llEProforma = (eproforma = 1) + lnTipDoc = tip + Use In crsIncUnic + + DO asserteaza WITH lcPrefix + ': garzile do_editare_unificata trecute (nesters/neproforma/tip valid/luna curenta)', ; + lnSters = 0 AND !llEProforma AND !Inlist(lnTipDoc,44,45,46,51) AND (pnAn*12+pnLuna) == (gnAn*12+gnLuna), '' + DO asserteaza WITH lcPrefix + ': fara referinte (incasari/plati)', !ReferinteDocumenteNota(pnAn, pnLuna, lnCod), '' + DO asserteaza WITH lcPrefix + ': nu e in eFactura', !EsteInEFactura(lnIdFact), '' + DO asserteaza WITH lcPrefix + ': fara urmasi', !DocumentAreUrmasi(lnIdVanzareP), '' + + poDate = IncarcaAntetFacturaEditare(lnIdVanzareP, @pnDiscountRon, @pnDiscountValuta) + DO asserteaza WITH lcPrefix + ': IncarcaAntetFacturaEditare reuseste', Vartype(m.poDate) == 'O', Vartype(m.poDate) + IF Vartype(m.poDate) <> 'O' + RETURN + ENDIF + + IncarcaLiniiFacturaEditare(poDate, lnIdVanzareP) + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF Used('jtva_coloane') + Use In jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ELSE + Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ENDIF + + loForm = Createobject('frm_facturare_articole2') + DO asserteaza WITH lcPrefix + ': formularul se deschide fara eroare (defectul 5 latent nu se activeaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + DO asserteaza WITH lcPrefix + ': G9 niciun amessagebox la Createobject/Init', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- asertiunile care prind regresia D1/D3/D4 --- + DO asserteaza WITH lcPrefix + ': poDate.incasat = valoarea din baza (NU suprascrisa cu totalctva)', ; + Round(Nvl(poDate.incasat,-1),2) == Round(m.tnIncasatAsteptat,2), Transform(Nvl(poDate.incasat,-1)) + DO asserteaza WITH lcPrefix + ': poDate.nr_incasare nu a fost zeroit', ; + Nvl(poDate.nr_incasare,-1) == m.tnNrIncasareAsteptat, Transform(Nvl(poDate.nr_incasare,-1)) + DO asserteaza WITH lcPrefix + ': poDate.ntip_incasare incarcat corect', ; + Nvl(poDate.ntip_incasare,-1) == m.tnTipIncasareAsteptat, Transform(Nvl(poDate.ntip_incasare,-1)) + DO asserteaza WITH lcPrefix + ': modul afisat (opt_incasat.Value) corespunde tip_incasare', ; + loForm.ct_incasare.opt_incasat.Value == m.tnModAsteptat - 1, Transform(loForm.ct_incasare.opt_incasat.Value) + DO asserteaza WITH lcPrefix + ': chk_incasare.Value = 1 (document incasat)', loForm.chk_incasare.Value == 1, Transform(loForm.chk_incasare.Value) + DO asserteaza WITH lcPrefix + ': grupC ct_incasare needitabil', !loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH lcPrefix + ': grupC chk_incasare needitabil', !loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + + loForm.ndiscfactron = pnDiscountRon + loForm.ndiscfactval = pnDiscountValuta + loForm.do_calculeaza_totaluri() + + *!* nemodal: eliberarea din Timer, in interiorul propriului Show() modal, blocheaza VFP in Release() + loForm.WindowType = 0 + goDriverS8p7.Reseteaza() + loForm.Show() + DO asserteaza WITH lcPrefix + ': niciun amessagebox pe parcursul Show()', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + Try + loForm.Release() + Catch + Endtry + + IF Used('v_plaje_inc_b') + Use In v_plaje_inc_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_inc_b') + Use In v_plaje_inc_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' +ENDPROC + + +PROCEDURE CursorToSnapshot + LPARAMETERS tcAlias + + LOCAL lcResult, lnI + lcResult = '' + SELECT (m.tcAlias) + SCAN + FOR lnI = 1 TO FCOUNT() + lcResult = lcResult + Transform(Evaluate(Field(m.lnI))) + '|' + ENDFOR + lcResult = lcResult + Chr(10) + ENDSCAN + RETURN m.lcResult +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*!* driverS8p7: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms in timp ce .Show() e blocat pe +*!* modal (un modal tot pompeaza mesaje Windows, deci timerul de pe _SCREEN tot ruleaza - acelasi +*!* tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg, folosit acolo pentru MESSAGEBOX_FORM). +*!* Citeste Ct_clb_altele din Objects (nu PEMSTATUS - RemoveObject scoate din Objects, PEMSTATUS +*!* ramane .T.) inainte sa elibereze forma, ceea ce incheie .Show() si reda controlul apelantului. +DEFINE CLASS driverS8p7 AS Custom + lBusy = .F. + lGasit = .F. + lCtClbPrezent = .F. + lCtClbAlteleActiv = .F. + cCtClbEticheta = '' + nTotalRon = 0 + nTotalVal = 0 + + *!* grupul B si C (S8, docs\raport_s8_grup_bc.md) - Prezent = mai exista in Objects (nu a fost + *!* scos de Init dupa tip/gnScadereStoc), Activ = NU e blocat (Enabled / lactiv / !ReadOnly, dupa + *!* mecanismul folosit de fiecare control) + lClbFdocPrezent = .F. + lClbFdocActiv = .F. + lCtClbNumeClientPrezent = .F. + lCtClbNumeClientActiv = .F. + lCtClbValutaPrezent = .F. + lCtClbValutaActiv = .F. + lClbZiCursPrezent = .F. + lClbZiCursActiv = .F. + lCtClbGestiuneInitPrezent = .F. + lCtClbGestiuneInitActiv = .F. + lCtClbPolPreturiPrezent = .F. + lCtClbPolPreturiActiv = .F. + lButIncarcaArticolePrezent = .F. + lButIncarcaArticoleActiv = .F. + lButCursuriPrezent = .F. + lButCursuriActiv = .F. + lCtIncasarePrezent = .F. + lCtIncasareActiv = .F. + lChkIncasarePrezent = .F. + lChkIncasareActiv = .F. + + PROCEDURE Reseteaza + This.lGasit = .F. + This.lCtClbPrezent = .F. + This.lCtClbAlteleActiv = .F. + This.cCtClbEticheta = '' + This.nTotalRon = 0 + This.nTotalVal = 0 + This.lClbFdocPrezent = .F. + This.lClbFdocActiv = .F. + This.lCtClbNumeClientPrezent = .F. + This.lCtClbNumeClientActiv = .F. + This.lCtClbValutaPrezent = .F. + This.lCtClbValutaActiv = .F. + This.lClbZiCursPrezent = .F. + This.lClbZiCursActiv = .F. + This.lCtClbGestiuneInitPrezent = .F. + This.lCtClbGestiuneInitActiv = .F. + This.lCtClbPolPreturiPrezent = .F. + This.lCtClbPolPreturiActiv = .F. + This.lButIncarcaArticolePrezent = .F. + This.lButIncarcaArticoleActiv = .F. + This.lButCursuriPrezent = .F. + This.lButCursuriActiv = .F. + This.lCtIncasarePrezent = .F. + This.lCtIncasareActiv = .F. + This.lChkIncasarePrezent = .F. + This.lChkIncasareActiv = .F. + ENDPROC + + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + TRY + LOCAL lnI, lnJ, lnJ2, loFrm2, loObj, loObj2 + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + This.nTotalRon = Nvl(loFrm2.ntotalron, 0) + This.nTotalVal = Nvl(loFrm2.ntotalval, 0) + FOR lnJ = 1 TO loFrm2.Objects.Count + loObj = loFrm2.Objects(m.lnJ) + DO CASE + CASE Upper(loObj.Name) == 'CT_CLB_ALTELE' + This.lCtClbPrezent = .T. + This.lCtClbAlteleActiv = loObj.lactiv + This.cCtClbEticheta = Alltrim(loObj.clb_tx_cautare.lb_SIMPLU1.Caption) + CASE Upper(loObj.Name) == 'CLB_FDOC' + This.lClbFdocPrezent = .T. + This.lClbFdocActiv = loObj.cboFdoc.Enabled + CASE Upper(loObj.Name) == 'CT_CLB_NUME_CLIENT' + This.lCtClbNumeClientPrezent = .T. + This.lCtClbNumeClientActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CT_CLB_VALUTA' + This.lCtClbValutaPrezent = .T. + This.lCtClbValutaActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CLB_ZI_CURS' + This.lClbZiCursPrezent = .T. + This.lClbZiCursActiv = !loObj.text_simplu1.ReadOnly + CASE Upper(loObj.Name) == 'CT_CLB_POLITICI_PRETURI' + This.lCtClbPolPreturiPrezent = .T. + This.lCtClbPolPreturiActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'BUT_INCARCA_ARTICOLE' + This.lButIncarcaArticolePrezent = .T. + This.lButIncarcaArticoleActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'BUT_CURSURI' + This.lButCursuriPrezent = .T. + This.lButCursuriActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_INCASARE' + This.lCtIncasarePrezent = .T. + This.lCtIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CHK_INCASARE' + This.lChkIncasarePrezent = .T. + This.lChkIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_CONTABILITATE' + FOR lnJ2 = 1 TO loObj.Objects.Count + loObj2 = loObj.Objects(m.lnJ2) + IF Upper(loObj2.Name) == 'CT_CLB_GESTIUNE_INIT' + This.lCtClbGestiuneInitPrezent = .T. + This.lCtClbGestiuneInitActiv = loObj2.lactiv + ENDIF + ENDFOR + ENDCASE + ENDFOR + loFrm2.Release() + EXIT + ENDIF + ENDFOR + CATCH TO loExcS8p7 + STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s8_x1_1113.prg b/utile/Teste/editare_factura/test_s8_x1_1113.prg new file mode 100644 index 0000000..bb63678 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_x1_1113.prg @@ -0,0 +1,659 @@ +* test_s8_pas7_cablare.prg +* Verifica pasul 7 din docs\propunere_s8_incarcare.md §6: cablarea celei de-a treia optiuni de +* meniu si corpul real al lui frm_facturi.do_editare_unificata (COMUN\clase\ofacturare_comun.vc2). +* Traseul REAL: Newobject('frm_facturi') + .do_editare_unificata() (nu Createobject direct pe +* frm_facturare_articole2 - asta ar proba doar codul formularului, nu rutarea). +* Documente reale, in luna curenta a calendarului (gnAn/gnLuna), care trec toate garzile +* (nesters, ne-eproforma, tip valid, fara referinte, fara urmasi, ne-eFactura), gasite prin +* interogare read-only pe MARIUSM_AUTO: +* 1113 - sursa COMANDA (tip=3, id_comanda=2479) +* 1055 - sursa CONTRACT (tip=2, id_ctr=234) +* 1048 - factura SIMPLA, lista de preturi (tip=1, fara comanda/ctr) +* 1130 - VALUTA (tip=5, in_valuta=1) +* Nu scrie in Oracle - doar SELECT; verifica ca formularul deschis nici el nu scrie +* (G8: dataoras/id_utils neschimbate pe VANZARI/VANZARI_DETALII). +* +* frm_facturare_articole2 (ofacturare.vc2:15894) nu suprascrie WindowType, iar _frm_base il +* seteaza pe 1 = modal - .Show() blocheaza pana la inchiderea ferestrei, headless nu are cine +* sa o inchida in mod normal. Solutie: driverS8p7 (Custom, BINDEVENT pe un Timer de pe _SCREEN, +* acelasi tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg) - un modal inca pompeaza +* mesaje Windows, deci timerul tot mai ruleaza in interiorul lui .Show(); cand gaseste forma +* deschisa ii citeste prezenta/eticheta lui Ct_clb_altele (din colectia Objects, nu PEMSTATUS - +* RemoveObject scoate din Objects dar PEMSTATUS ramane .T., vezi memoria pemstatus-dupa- +* removeobject) si o elibereaza, ceea ce incheie .Show() si intoarce controlul in +* do_editare_unificata, apoi in acest test. Nu modifica NIMIC in codul de productie. +* +* Extindere S8 (blocarea grupurilor B si C la editare, docs\raport_s8_grup_bc.md): driverS8p7 +* citeste in plus, din Objects, starea needitabila a controalelor clb_fdoc.cboFdoc, Ct_clb_altele, +* Ct_clb_nume_client, Ct_clb_valuta, Clb_zi_curs, ct_contabilitate.Ct_clb_gestiune_init, +* Ct_clb_politici_preturi, but_incarca_articole, but_cursuri, ct_incasare, chk_incasare - fiecare +* verificat doar daca e prezent (unele sunt scoase de Init in functie de tip/gnScadereStoc, +* independent de lEditare). Proba de neregresie pe document nou (VerificaDocumentNou) NU trece +* prin factureaza()/poGeneratorNumere (interzis, arde numere) - construieste poDate manual cu +* Createobject('oDateFactura',0,0) (Init nu ruleaza, ramane pe defaults, lEditare=.F. ca la orice +* document nou) si instantiaza formularul direct cu Newobject, FARA .Show() (Init ruleaza oricum +* la construire; fara Show() nu exista blocaj modal, deci nu e nevoie de driver aici). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_x1_1113_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 + +*!* --- driver care inchide fereastra modala frm_facturare_articole2, vezi antetul fisierului --- +PUBLIC goDriverS8p7 +goDriverS8p7 = Createobject('driverS8p7') +_SCREEN.AddObject('tmrS8p7', 'Timer') +_SCREEN.tmrS8p7.Interval = 150 +Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa') +_SCREEN.tmrS8p7.Enabled = .T. + +*!* --- verificare statica: corpul do_editare_unificata nu contine nicio referinta la alocarea +*!* de numere (factureaza/poGeneratorNumere/creeaza_cursor_serii) --- +LOCAL lcSrc, lcTail, lnStart, lnEnd, lcMetoda +lcSrc = FILETOSTR('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vc2') +lnStart = AT('PROCEDURE do_editare_unificata' + CHR(13) + CHR(10), lcSrc) +DO asserteaza WITH 'static: metoda do_editare_unificata gasita in sursa', lnStart > 0, TRANSFORM(lnStart) +IF lnStart > 0 + lcTail = SUBSTR(lcSrc, lnStart) + lnEnd = AT('ENDPROC', lcTail) + lcMetoda = UPPER(SUBSTR(lcTail, 1, lnEnd + 6)) + DO asserteaza WITH 'static G2: fara FACTUREAZA( in do_editare_unificata', 'FACTUREAZA(' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara POGENERATORNUMERE in do_editare_unificata', 'POGENERATORNUMERE' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara CREEAZA_CURSOR_SERII in do_editare_unificata', 'CREEAZA_CURSOR_SERII' $ lcMetoda = .F., '' +ENDIF + +*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe cele 4 documente --- +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +LOCAL lcSchema, lcSelect, lcOrder, lcFiltru +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +lcOrder = [data_act,numar_act] +lcFiltru = [id_vanzare in (1113, 1055, 1048, 1130)] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +DO asserteaza WITH 'crsfacturi incarcat cu cele 4 documente reale (rownum=4)', Used('crsfacturi') AND Reccount('crsfacturi') = 4, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') + +*!* Ct_clb_altele (infirmare §3.2, vezi raport): document CU sursa -> prezent, etichetat din +*!* poDate.tip; factura SIMPLA -> absent, identic cu introducerea unei facturi noi (G10). +DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda' +*!* X1 skip: DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract' +*!* X1 skip: DO VerificaEditare WITH 1048, 'factura simpla', .F., '' +*!* X1 skip: DO VerificaEditare WITH 1130, 'valuta', .F., '' + +*!* --- S8 incasarea la editare (D1/D3/D4, docs\propunere_s8_incasare_la_editare.md) - foloseste +*!* Show() real, deci trebuie sa ruleze inainte de teardown-ul lui tmrS8p7 de mai jos. +*!* 1071: tip_incasare=11 (chitanta) -> mod 2. 1072: tip_incasare=2 (bon fiscal) -> mod 3, +*!* cazul in care hardcodarea veche "mod 2" ar fi aratat gresit. +DO VerificaIncasareLaEditare WITH 1071, 'chitanta, tip_incasare=11', 119, 44, 11, 2 +DO VerificaIncasareLaEditare WITH 1072, 'bon fiscal, tip_incasare=2', 119, 66, 2, 3 + +_SCREEN.tmrS8p7.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrS8p7') +Catch +Endtry + +*!* --- S8 grupurile B/C: neregresie pe document NOU (docs\raport_s8_grup_bc.md) --- +DO VerificaDocumentNou + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +PROCEDURE VerificaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tlCtClbAsteptat, tcCtClbEtichetaAsteptata + + LOCAL lcPrefix, lnSucces, loFrm, lnI, llGasitForm + LOCAL lcSnapPlajeA, lcSnapPlajeB, lcSnapDetA, lcSnapDetB + LOCAL ltDataorasVanzareA, lnIdUtilsVanzareA + lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + *!* --- G2: snapshot generator de numere, INAINTE --- + IF Used('v_plaje_a') + Use In v_plaje_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_a') + Use In v_plaje_a + + *!* --- G8: snapshot dataoras/id_utils, INAINTE --- + IF Used('v_g8a') + Use In v_g8a + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor G8 antet Oracle a reusit', lnSucces >= 0 AND Used('v_g8a') AND Reccount('v_g8a') = 1, Transform(lnSucces) + ltDataorasVanzareA = v_g8a.dataoras + lnIdUtilsVanzareA = Nvl(v_g8a.id_utils, 0) + Use In v_g8a + + IF Used('v_g8d_a') + Use In v_g8d_a + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_a') + goExecutor.oReset() + lcSnapDetA = CursorToSnapshot('v_g8d_a') + Use In v_g8d_a + + *!* --- codul testat: traseul real, prin frm_facturi.do_editare_unificata --- + *!* Init-ul clasei presupune crsfacturi ca zona curenta (la fel ca in test_s7_urmasi.prg) - + *!* interogarile martor de mai sus au schimbat zona curenta intre timp, se restaureaza aici + Select crsfacturi + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm) + IF Vartype(m.loFrm) <> 'O' + RETURN + ENDIF + + Select crsfacturi + Locate For id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found()) + IF !Found() + loFrm.Release() + RETURN + ENDIF + + *!* --- driverS8p7 gaseste si inchide formularul unificat (FARA but_termin1.Click()), vezi + *!* antetul fisierului; .do_editare_unificata() nu revine decat dupa ce fereastra s-a inchis --- + goDriverS8p7.Reseteaza() + loFrm.do_editare_unificata() + + DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit) + + *!* --- Ct_clb_altele: prezenta citita din colectia Objects a formularului, cat timp era deschis + *!* (infirmarea §3.2 - vezi raport) --- + DO asserteaza WITH lcPrefix + ': Ct_clb_altele prezenta = ' + Iif(m.tlCtClbAsteptat, 'prezent', 'absent'), ; + goDriverS8p7.lCtClbPrezent == m.tlCtClbAsteptat, Transform(goDriverS8p7.lCtClbPrezent) + IF m.tlCtClbAsteptat + DO asserteaza WITH lcPrefix + ': Ct_clb_altele eticheta = [' + m.tcCtClbEtichetaAsteptata + ']', ; + Upper(goDriverS8p7.cCtClbEticheta) == Upper(m.tcCtClbEtichetaAsteptata), goDriverS8p7.cCtClbEticheta + ENDIF + *!* --- grupul B si C (S8, decizia 25): needitabile la editare, verificate doar cand controlul + *!* mai exista (unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare) --- + DO VerificaBlocajGrupBC WITH m.lcPrefix + + *!* --- G5: totalul afisat de do_calculeaza_totaluri (chemat inainte de Show, in do_editare_unificata) + *!* ramane egal cu totalul deja scris in VANZARI - prinde o reevaluare tacita a cursului/preturilor --- + Select crsfacturi + IF Nvl(crsfacturi.in_valuta, 0) = 1 + DO asserteaza WITH lcPrefix + ' G5: total afisat (valuta) = VANZARI.totval', ; + Round(goDriverS8p7.nTotalVal, 2) == Round(Nvl(crsfacturi.totval, 0), 2), Transform(goDriverS8p7.nTotalVal) + ' vs ' + Transform(crsfacturi.totval) + ELSE + DO asserteaza WITH lcPrefix + ' G5: total afisat (lei) = VANZARI.total_cu_tva', ; + Round(goDriverS8p7.nTotalRon, 2) == Round(Nvl(crsfacturi.total_cu_tva, 0), 2), Transform(goDriverS8p7.nTotalRon) + ' vs ' + Transform(crsfacturi.total_cu_tva) + ENDIF + + loFrm.Release() + + *!* --- G9: niciun dialog modal la deschidere --- + DO asserteaza WITH lcPrefix + ' G9: niciun amessagebox la deschidere', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- G2: snapshot generator de numere, DUPA - identic caracter cu caracter --- + IF Used('v_plaje_b') + Use In v_plaje_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_b') + Use In v_plaje_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' + + *!* --- G8: dataoras/id_utils neschimbate pe VANZARI si VANZARI_DETALII --- + IF Used('v_g8a2') + Use In v_g8a2 + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a2') + goExecutor.oReset() + *!* Nvl pe TTOC: dataoras e NULL pe documentele de test - NULL == NULL da .NULL. in VFP (nu .T.), + *!* fals negativ fara el + DO asserteaza WITH lcPrefix + ' G8: VANZARI.dataoras neschimbat', ; + Nvl(Ttoc(v_g8a2.dataoras), 'NULL') == Nvl(Ttoc(m.ltDataorasVanzareA), 'NULL'), Nvl(Ttoc(v_g8a2.dataoras), 'NULL') + DO asserteaza WITH lcPrefix + ' G8: VANZARI.id_utils neschimbat', Nvl(v_g8a2.id_utils, 0) == m.lnIdUtilsVanzareA, Transform(Nvl(v_g8a2.id_utils, 0)) + Use In v_g8a2 + + IF Used('v_g8d_b') + Use In v_g8d_b + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_b') + goExecutor.oReset() + lcSnapDetB = CursorToSnapshot('v_g8d_b') + Use In v_g8d_b + DO asserteaza WITH lcPrefix + ' G8: VANZARI_DETALII dataoras/id_utils identice (nicio scriere)', m.lcSnapDetA == m.lcSnapDetB, '' + + *!* --- G11 partial: fara nicio scriere pe VANZARI_DETALII (G8), nu s-a putut genera nicio miscare + *!* de stoc noua pe acest document; nu masoara direct un tabel de stoc - proba indirecta, partiala --- + DO asserteaza WITH lcPrefix + ' G11 partial (derivat din G8): nicio scriere pe VANZARI_DETALII => stoc agregat neschimbat pe acest document', m.lcSnapDetA == m.lcSnapDetB, '' +ENDPROC + + +*!* S8 - blocarea grupurilor B si C la editare (docs\raport_s8_grup_bc.md). Citeste starea deja +*!* capturata de goDriverS8p7 (formularul e inchis pana aici) si asearta doar cand controlul e +*!* prezent - unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare. +PROCEDURE VerificaBlocajGrupBC + LPARAMETERS tcPrefix + + IF goDriverS8p7.lCtClbPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_altele (sursa) needitabil', !goDriverS8p7.lCtClbAlteleActiv, Transform(goDriverS8p7.lCtClbAlteleActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: clb_fdoc.cboFdoc (tip document) needitabil', ; + goDriverS8p7.lClbFdocPrezent AND !goDriverS8p7.lClbFdocActiv, Transform(goDriverS8p7.lClbFdocActiv) + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_nume_client (client) needitabil', ; + goDriverS8p7.lCtClbNumeClientPrezent AND !goDriverS8p7.lCtClbNumeClientActiv, Transform(goDriverS8p7.lCtClbNumeClientActiv) + IF goDriverS8p7.lCtClbValutaPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_valuta needitabil', !goDriverS8p7.lCtClbValutaActiv, Transform(goDriverS8p7.lCtClbValutaActiv) + ENDIF + IF goDriverS8p7.lClbZiCursPrezent + DO asserteaza WITH tcPrefix + ' grupB: Clb_zi_curs needitabil', !goDriverS8p7.lClbZiCursActiv, Transform(goDriverS8p7.lClbZiCursActiv) + ENDIF + IF goDriverS8p7.lCtClbGestiuneInitPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_gestiune_init (gestiune sursa) needitabil', !goDriverS8p7.lCtClbGestiuneInitActiv, Transform(goDriverS8p7.lCtClbGestiuneInitActiv) + ENDIF + IF goDriverS8p7.lCtClbPolPreturiPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_politici_preturi needitabil', !goDriverS8p7.lCtClbPolPreturiActiv, Transform(goDriverS8p7.lCtClbPolPreturiActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: but_incarca_articole needitabil (G2: evita poGeneratorNumere.verifica_numar)', ; + goDriverS8p7.lButIncarcaArticolePrezent AND !goDriverS8p7.lButIncarcaArticoleActiv, Transform(goDriverS8p7.lButIncarcaArticoleActiv) + DO asserteaza WITH tcPrefix + ' grupB: but_cursuri needitabil', ; + goDriverS8p7.lButCursuriPrezent AND !goDriverS8p7.lButCursuriActiv, Transform(goDriverS8p7.lButCursuriActiv) + IF goDriverS8p7.lCtIncasarePrezent + DO asserteaza WITH tcPrefix + ' grupC: ct_incasare needitabil', !goDriverS8p7.lCtIncasareActiv, Transform(goDriverS8p7.lCtIncasareActiv) + DO asserteaza WITH tcPrefix + ' grupC: chk_incasare needitabil', goDriverS8p7.lChkIncasarePrezent AND !goDriverS8p7.lChkIncasareActiv, Transform(goDriverS8p7.lChkIncasareActiv) + ENDIF +ENDPROC + + +*!* S8 - neregresie: pe document NOU, grupurile B/C raman editabile (docs\raport_s8_grup_bc.md). +*!* NU trece prin factureaza()/poGeneratorNumere (interzis - arde numere din plaje reale). poDate +*!* construit manual cu Createobject('oDateFactura',0,0): Init-ul clasei NU ruleaza (tnIdSet=0), +*!* deci ramane pe defaults din PropValue - inclusiv lEditare=.F., exact ca la orice document nou +*!* (vezi si test_s8_pas3_garda_alte_date.prg, acelasi tipar). tip=3 (comanda) e ales ca sa +*!* pastreze Ct_clb_altele si Ct_clb_nume_client prezente (paralel cu documentul 1113 de mai sus); +*!* nu are cursul din zi (citeste_cursuri_zi nu se cheama pentru tip=3), deci fara SELECT Oracle. +*!* Instantiat direct cu Newobject, FARA .Show() - Init ruleaza oricum la construire, iar fara +*!* Show() nu exista blocajul modal (WindowType=1 conteaza doar cand se cheama .Show()), deci nu e +*!* nevoie de driverS8p7 aici. +PROCEDURE VerificaDocumentNou + PRIVATE poDate + LOCAL loForm + + poDate = Createobject('oDateFactura', 0, 0) + poDate.tip = 3 + poDate.id_client = 0 + poDate.incasat = 0 + + loForm = Newobject('frm_facturare_articole2', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx') + DO asserteaza WITH 'document nou: Newobject(frm_facturare_articole2) reuseste (fara Show, fara factureaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + + DO asserteaza WITH 'document nou: poDate.lEditare = .F. (stare naturala, nesetata de nimeni)', !poDate.lEditare, Transform(poDate.lEditare) + + IF loForm.do_exista_obiect('Ct_clb_altele') + DO asserteaza WITH 'document nou grupB: Ct_clb_altele ramane editabil', loForm.Ct_clb_altele.lactiv, Transform(loForm.Ct_clb_altele.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: clb_fdoc.cboFdoc ramane editabil', loForm.clb_fdoc.cboFdoc.Enabled, Transform(loForm.clb_fdoc.cboFdoc.Enabled) + DO asserteaza WITH 'document nou grupB: Ct_clb_nume_client ramane editabil', loForm.Ct_clb_nume_client.lactiv, Transform(loForm.Ct_clb_nume_client.lactiv) + IF loForm.do_exista_obiect('Ct_clb_valuta') + DO asserteaza WITH 'document nou grupB: Ct_clb_valuta ramane editabil', loForm.Ct_clb_valuta.lactiv, Transform(loForm.Ct_clb_valuta.lactiv) + ENDIF + IF loForm.do_exista_obiect('Clb_zi_curs') + DO asserteaza WITH 'document nou grupB: Clb_zi_curs ramane editabil', !loForm.Clb_zi_curs.text_simplu1.ReadOnly, Transform(loForm.Clb_zi_curs.text_simplu1.ReadOnly) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_gestiune_init', loForm.ct_contabilitate) + DO asserteaza WITH 'document nou grupB: Ct_clb_gestiune_init ramane editabil', loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv, Transform(loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_politici_preturi') + DO asserteaza WITH 'document nou grupB: Ct_clb_politici_preturi ramane editabil', loForm.Ct_clb_politici_preturi.lactiv, Transform(loForm.Ct_clb_politici_preturi.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: but_incarca_articole ramane editabil', loForm.but_incarca_articole.Enabled, Transform(loForm.but_incarca_articole.Enabled) + DO asserteaza WITH 'document nou grupB: but_cursuri ramane editabil', loForm.but_cursuri.Enabled, Transform(loForm.but_cursuri.Enabled) + IF loForm.do_exista_obiect('ct_incasare') + DO asserteaza WITH 'document nou grupC: ct_incasare ramane editabil', loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH 'document nou grupC: chk_incasare ramane editabil', loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + ENDIF + + loForm.Release() +ENDPROC + + +*!* S8 - incasarea la editare (D1/D3/D4, docs\propunere_s8_incasare_la_editare.md). Replica +*!* dovedita a corpului do_editare_unificata (ofacturare_comun.vc2:3890+) pana la Createobject, +*!* promovata din investigatia I1 (probe_defect5_latent.prg) in setul permanent de probe - acolo +*!* s-a confirmat ca poDate, declarat PRIVATE aici, ramane vizibil dupa Createobject/Show() +*!* (aceeasi vizibilitate dinamica pe care se bazeaza si codul de productie pentru poDate/ +*!* poGeneratorNumere). driverS8p7 e refolosit doar ca sa inchida modalul Show(). +PROCEDURE VerificaIncasareLaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tnIncasatAsteptat, tnNrIncasareAsteptat, tnTipIncasareAsteptat, tnModAsteptat + + LOCAL lcPrefix, lnSucces, loForm, pnDiscountRon, pnDiscountValuta + LOCAL lnSters, llEProforma, lnTipDoc, lcSnapPlajeA, lcSnapPlajeB + PRIVATE pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP, poDate + Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP + lcPrefix = Transform(m.tnIdVanzare) + ' [incasare ' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + IF Used('v_plaje_inc_a') + Use In v_plaje_inc_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_inc_a') + Use In v_plaje_inc_a + + lnSucces = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip,incasat from fact_vfacturi where id_vanzare=' + Transform(m.tnIdVanzare), 'crsIncUnic') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': documentul a putut fi reincarcat', lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1, Transform(lnSucces) + IF !(lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1) + RETURN + ENDIF + SELECT crsIncUnic + lnIdVanzareP = id_vanzare + lnCod = cod + pnAn = Year(data_act) + pnLuna = Month(data_act) + lnSters = sters + lnIdFact = id_fact + llEProforma = (eproforma = 1) + lnTipDoc = tip + Use In crsIncUnic + + DO asserteaza WITH lcPrefix + ': garzile do_editare_unificata trecute (nesters/neproforma/tip valid/luna curenta)', ; + lnSters = 0 AND !llEProforma AND !Inlist(lnTipDoc,44,45,46,51) AND (pnAn*12+pnLuna) == (gnAn*12+gnLuna), '' + DO asserteaza WITH lcPrefix + ': fara referinte (incasari/plati)', !ReferinteDocumenteNota(pnAn, pnLuna, lnCod), '' + DO asserteaza WITH lcPrefix + ': nu e in eFactura', !EsteInEFactura(lnIdFact), '' + DO asserteaza WITH lcPrefix + ': fara urmasi', !DocumentAreUrmasi(lnIdVanzareP), '' + + poDate = IncarcaAntetFacturaEditare(lnIdVanzareP, @pnDiscountRon, @pnDiscountValuta) + DO asserteaza WITH lcPrefix + ': IncarcaAntetFacturaEditare reuseste', Vartype(m.poDate) == 'O', Vartype(m.poDate) + IF Vartype(m.poDate) <> 'O' + RETURN + ENDIF + + IncarcaLiniiFacturaEditare(poDate, lnIdVanzareP) + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF Used('jtva_coloane') + Use In jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ELSE + Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ENDIF + + loForm = Createobject('frm_facturare_articole2') + DO asserteaza WITH lcPrefix + ': formularul se deschide fara eroare (defectul 5 latent nu se activeaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + DO asserteaza WITH lcPrefix + ': G9 niciun amessagebox la Createobject/Init', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- asertiunile care prind regresia D1/D3/D4 --- + DO asserteaza WITH lcPrefix + ': poDate.incasat = valoarea din baza (NU suprascrisa cu totalctva)', ; + Round(Nvl(poDate.incasat,-1),2) == Round(m.tnIncasatAsteptat,2), Transform(Nvl(poDate.incasat,-1)) + DO asserteaza WITH lcPrefix + ': poDate.nr_incasare nu a fost zeroit', ; + Nvl(poDate.nr_incasare,-1) == m.tnNrIncasareAsteptat, Transform(Nvl(poDate.nr_incasare,-1)) + DO asserteaza WITH lcPrefix + ': poDate.ntip_incasare incarcat corect', ; + Nvl(poDate.ntip_incasare,-1) == m.tnTipIncasareAsteptat, Transform(Nvl(poDate.ntip_incasare,-1)) + DO asserteaza WITH lcPrefix + ': modul afisat (opt_incasat.Value) corespunde tip_incasare', ; + loForm.ct_incasare.opt_incasat.Value == m.tnModAsteptat - 1, Transform(loForm.ct_incasare.opt_incasat.Value) + DO asserteaza WITH lcPrefix + ': chk_incasare.Value = 1 (document incasat)', loForm.chk_incasare.Value == 1, Transform(loForm.chk_incasare.Value) + DO asserteaza WITH lcPrefix + ': grupC ct_incasare needitabil', !loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH lcPrefix + ': grupC chk_incasare needitabil', !loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + + loForm.ndiscfactron = pnDiscountRon + loForm.ndiscfactval = pnDiscountValuta + loForm.do_calculeaza_totaluri() + + *!* nemodal: eliberarea din Timer, in interiorul propriului Show() modal, blocheaza VFP in Release() + loForm.WindowType = 0 + goDriverS8p7.Reseteaza() + loForm.Show() + DO asserteaza WITH lcPrefix + ': niciun amessagebox pe parcursul Show()', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + Try + loForm.Release() + Catch + Endtry + + IF Used('v_plaje_inc_b') + Use In v_plaje_inc_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_inc_b') + Use In v_plaje_inc_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' +ENDPROC + + +PROCEDURE CursorToSnapshot + LPARAMETERS tcAlias + + LOCAL lcResult, lnI + lcResult = '' + SELECT (m.tcAlias) + SCAN + FOR lnI = 1 TO FCOUNT() + lcResult = lcResult + Transform(Evaluate(Field(m.lnI))) + '|' + ENDFOR + lcResult = lcResult + Chr(10) + ENDSCAN + RETURN m.lcResult +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*!* driverS8p7: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms in timp ce .Show() e blocat pe +*!* modal (un modal tot pompeaza mesaje Windows, deci timerul de pe _SCREEN tot ruleaza - acelasi +*!* tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg, folosit acolo pentru MESSAGEBOX_FORM). +*!* Citeste Ct_clb_altele din Objects (nu PEMSTATUS - RemoveObject scoate din Objects, PEMSTATUS +*!* ramane .T.) inainte sa elibereze forma, ceea ce incheie .Show() si reda controlul apelantului. +DEFINE CLASS driverS8p7 AS Custom + lBusy = .F. + lGasit = .F. + lCtClbPrezent = .F. + lCtClbAlteleActiv = .F. + cCtClbEticheta = '' + nTotalRon = 0 + nTotalVal = 0 + + *!* grupul B si C (S8, docs\raport_s8_grup_bc.md) - Prezent = mai exista in Objects (nu a fost + *!* scos de Init dupa tip/gnScadereStoc), Activ = NU e blocat (Enabled / lactiv / !ReadOnly, dupa + *!* mecanismul folosit de fiecare control) + lClbFdocPrezent = .F. + lClbFdocActiv = .F. + lCtClbNumeClientPrezent = .F. + lCtClbNumeClientActiv = .F. + lCtClbValutaPrezent = .F. + lCtClbValutaActiv = .F. + lClbZiCursPrezent = .F. + lClbZiCursActiv = .F. + lCtClbGestiuneInitPrezent = .F. + lCtClbGestiuneInitActiv = .F. + lCtClbPolPreturiPrezent = .F. + lCtClbPolPreturiActiv = .F. + lButIncarcaArticolePrezent = .F. + lButIncarcaArticoleActiv = .F. + lButCursuriPrezent = .F. + lButCursuriActiv = .F. + lCtIncasarePrezent = .F. + lCtIncasareActiv = .F. + lChkIncasarePrezent = .F. + lChkIncasareActiv = .F. + + PROCEDURE Reseteaza + This.lGasit = .F. + This.lCtClbPrezent = .F. + This.lCtClbAlteleActiv = .F. + This.cCtClbEticheta = '' + This.nTotalRon = 0 + This.nTotalVal = 0 + This.lClbFdocPrezent = .F. + This.lClbFdocActiv = .F. + This.lCtClbNumeClientPrezent = .F. + This.lCtClbNumeClientActiv = .F. + This.lCtClbValutaPrezent = .F. + This.lCtClbValutaActiv = .F. + This.lClbZiCursPrezent = .F. + This.lClbZiCursActiv = .F. + This.lCtClbGestiuneInitPrezent = .F. + This.lCtClbGestiuneInitActiv = .F. + This.lCtClbPolPreturiPrezent = .F. + This.lCtClbPolPreturiActiv = .F. + This.lButIncarcaArticolePrezent = .F. + This.lButIncarcaArticoleActiv = .F. + This.lButCursuriPrezent = .F. + This.lButCursuriActiv = .F. + This.lCtIncasarePrezent = .F. + This.lCtIncasareActiv = .F. + This.lChkIncasarePrezent = .F. + This.lChkIncasareActiv = .F. + ENDPROC + + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + TRY + LOCAL lnI, lnJ, lnJ2, loFrm2, loObj, loObj2 + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + This.nTotalRon = Nvl(loFrm2.ntotalron, 0) + This.nTotalVal = Nvl(loFrm2.ntotalval, 0) + FOR lnJ = 1 TO loFrm2.Objects.Count + loObj = loFrm2.Objects(m.lnJ) + DO CASE + CASE Upper(loObj.Name) == 'CT_CLB_ALTELE' + This.lCtClbPrezent = .T. + This.lCtClbAlteleActiv = loObj.lactiv + This.cCtClbEticheta = Alltrim(loObj.clb_tx_cautare.lb_SIMPLU1.Caption) + CASE Upper(loObj.Name) == 'CLB_FDOC' + This.lClbFdocPrezent = .T. + This.lClbFdocActiv = loObj.cboFdoc.Enabled + CASE Upper(loObj.Name) == 'CT_CLB_NUME_CLIENT' + This.lCtClbNumeClientPrezent = .T. + This.lCtClbNumeClientActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CT_CLB_VALUTA' + This.lCtClbValutaPrezent = .T. + This.lCtClbValutaActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CLB_ZI_CURS' + This.lClbZiCursPrezent = .T. + This.lClbZiCursActiv = !loObj.text_simplu1.ReadOnly + CASE Upper(loObj.Name) == 'CT_CLB_POLITICI_PRETURI' + This.lCtClbPolPreturiPrezent = .T. + This.lCtClbPolPreturiActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'BUT_INCARCA_ARTICOLE' + This.lButIncarcaArticolePrezent = .T. + This.lButIncarcaArticoleActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'BUT_CURSURI' + This.lButCursuriPrezent = .T. + This.lButCursuriActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_INCASARE' + This.lCtIncasarePrezent = .T. + This.lCtIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CHK_INCASARE' + This.lChkIncasarePrezent = .T. + This.lChkIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_CONTABILITATE' + FOR lnJ2 = 1 TO loObj.Objects.Count + loObj2 = loObj.Objects(m.lnJ2) + IF Upper(loObj2.Name) == 'CT_CLB_GESTIUNE_INIT' + This.lCtClbGestiuneInitPrezent = .T. + This.lCtClbGestiuneInitActiv = loObj2.lactiv + ENDIF + ENDFOR + ENDCASE + ENDFOR + loFrm2.Release() + EXIT + ENDIF + ENDFOR + CATCH TO loExcS8p7 + STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s8_x1_1130.prg b/utile/Teste/editare_factura/test_s8_x1_1130.prg new file mode 100644 index 0000000..038ffe1 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_x1_1130.prg @@ -0,0 +1,659 @@ +* test_s8_pas7_cablare.prg +* Verifica pasul 7 din docs\propunere_s8_incarcare.md §6: cablarea celei de-a treia optiuni de +* meniu si corpul real al lui frm_facturi.do_editare_unificata (COMUN\clase\ofacturare_comun.vc2). +* Traseul REAL: Newobject('frm_facturi') + .do_editare_unificata() (nu Createobject direct pe +* frm_facturare_articole2 - asta ar proba doar codul formularului, nu rutarea). +* Documente reale, in luna curenta a calendarului (gnAn/gnLuna), care trec toate garzile +* (nesters, ne-eproforma, tip valid, fara referinte, fara urmasi, ne-eFactura), gasite prin +* interogare read-only pe MARIUSM_AUTO: +* 1113 - sursa COMANDA (tip=3, id_comanda=2479) +* 1055 - sursa CONTRACT (tip=2, id_ctr=234) +* 1048 - factura SIMPLA, lista de preturi (tip=1, fara comanda/ctr) +* 1130 - VALUTA (tip=5, in_valuta=1) +* Nu scrie in Oracle - doar SELECT; verifica ca formularul deschis nici el nu scrie +* (G8: dataoras/id_utils neschimbate pe VANZARI/VANZARI_DETALII). +* +* frm_facturare_articole2 (ofacturare.vc2:15894) nu suprascrie WindowType, iar _frm_base il +* seteaza pe 1 = modal - .Show() blocheaza pana la inchiderea ferestrei, headless nu are cine +* sa o inchida in mod normal. Solutie: driverS8p7 (Custom, BINDEVENT pe un Timer de pe _SCREEN, +* acelasi tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg) - un modal inca pompeaza +* mesaje Windows, deci timerul tot mai ruleaza in interiorul lui .Show(); cand gaseste forma +* deschisa ii citeste prezenta/eticheta lui Ct_clb_altele (din colectia Objects, nu PEMSTATUS - +* RemoveObject scoate din Objects dar PEMSTATUS ramane .T., vezi memoria pemstatus-dupa- +* removeobject) si o elibereaza, ceea ce incheie .Show() si intoarce controlul in +* do_editare_unificata, apoi in acest test. Nu modifica NIMIC in codul de productie. +* +* Extindere S8 (blocarea grupurilor B si C la editare, docs\raport_s8_grup_bc.md): driverS8p7 +* citeste in plus, din Objects, starea needitabila a controalelor clb_fdoc.cboFdoc, Ct_clb_altele, +* Ct_clb_nume_client, Ct_clb_valuta, Clb_zi_curs, ct_contabilitate.Ct_clb_gestiune_init, +* Ct_clb_politici_preturi, but_incarca_articole, but_cursuri, ct_incasare, chk_incasare - fiecare +* verificat doar daca e prezent (unele sunt scoase de Init in functie de tip/gnScadereStoc, +* independent de lEditare). Proba de neregresie pe document nou (VerificaDocumentNou) NU trece +* prin factureaza()/poGeneratorNumere (interzis, arde numere) - construieste poDate manual cu +* Createobject('oDateFactura',0,0) (Init nu ruleaza, ramane pe defaults, lEditare=.F. ca la orice +* document nou) si instantiaza formularul direct cu Newobject, FARA .Show() (Init ruleaza oricum +* la construire; fara Show() nu exista blocaj modal, deci nu e nevoie de driver aici). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_x1_1130_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 + +*!* --- driver care inchide fereastra modala frm_facturare_articole2, vezi antetul fisierului --- +PUBLIC goDriverS8p7 +goDriverS8p7 = Createobject('driverS8p7') +_SCREEN.AddObject('tmrS8p7', 'Timer') +_SCREEN.tmrS8p7.Interval = 150 +Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa') +_SCREEN.tmrS8p7.Enabled = .T. + +*!* --- verificare statica: corpul do_editare_unificata nu contine nicio referinta la alocarea +*!* de numere (factureaza/poGeneratorNumere/creeaza_cursor_serii) --- +LOCAL lcSrc, lcTail, lnStart, lnEnd, lcMetoda +lcSrc = FILETOSTR('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vc2') +lnStart = AT('PROCEDURE do_editare_unificata' + CHR(13) + CHR(10), lcSrc) +DO asserteaza WITH 'static: metoda do_editare_unificata gasita in sursa', lnStart > 0, TRANSFORM(lnStart) +IF lnStart > 0 + lcTail = SUBSTR(lcSrc, lnStart) + lnEnd = AT('ENDPROC', lcTail) + lcMetoda = UPPER(SUBSTR(lcTail, 1, lnEnd + 6)) + DO asserteaza WITH 'static G2: fara FACTUREAZA( in do_editare_unificata', 'FACTUREAZA(' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara POGENERATORNUMERE in do_editare_unificata', 'POGENERATORNUMERE' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara CREEAZA_CURSOR_SERII in do_editare_unificata', 'CREEAZA_CURSOR_SERII' $ lcMetoda = .F., '' +ENDIF + +*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe cele 4 documente --- +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +LOCAL lcSchema, lcSelect, lcOrder, lcFiltru +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +lcOrder = [data_act,numar_act] +lcFiltru = [id_vanzare in (1113, 1055, 1048, 1130)] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +DO asserteaza WITH 'crsfacturi incarcat cu cele 4 documente reale (rownum=4)', Used('crsfacturi') AND Reccount('crsfacturi') = 4, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') + +*!* Ct_clb_altele (infirmare §3.2, vezi raport): document CU sursa -> prezent, etichetat din +*!* poDate.tip; factura SIMPLA -> absent, identic cu introducerea unei facturi noi (G10). +*!* X1 skip: DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda' +*!* X1 skip: DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract' +*!* X1 skip: DO VerificaEditare WITH 1048, 'factura simpla', .F., '' +DO VerificaEditare WITH 1130, 'valuta', .F., '' + +*!* --- S8 incasarea la editare (D1/D3/D4, docs\propunere_s8_incasare_la_editare.md) - foloseste +*!* Show() real, deci trebuie sa ruleze inainte de teardown-ul lui tmrS8p7 de mai jos. +*!* 1071: tip_incasare=11 (chitanta) -> mod 2. 1072: tip_incasare=2 (bon fiscal) -> mod 3, +*!* cazul in care hardcodarea veche "mod 2" ar fi aratat gresit. +DO VerificaIncasareLaEditare WITH 1071, 'chitanta, tip_incasare=11', 119, 44, 11, 2 +DO VerificaIncasareLaEditare WITH 1072, 'bon fiscal, tip_incasare=2', 119, 66, 2, 3 + +_SCREEN.tmrS8p7.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrS8p7') +Catch +Endtry + +*!* --- S8 grupurile B/C: neregresie pe document NOU (docs\raport_s8_grup_bc.md) --- +DO VerificaDocumentNou + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +PROCEDURE VerificaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tlCtClbAsteptat, tcCtClbEtichetaAsteptata + + LOCAL lcPrefix, lnSucces, loFrm, lnI, llGasitForm + LOCAL lcSnapPlajeA, lcSnapPlajeB, lcSnapDetA, lcSnapDetB + LOCAL ltDataorasVanzareA, lnIdUtilsVanzareA + lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + *!* --- G2: snapshot generator de numere, INAINTE --- + IF Used('v_plaje_a') + Use In v_plaje_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_a') + Use In v_plaje_a + + *!* --- G8: snapshot dataoras/id_utils, INAINTE --- + IF Used('v_g8a') + Use In v_g8a + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor G8 antet Oracle a reusit', lnSucces >= 0 AND Used('v_g8a') AND Reccount('v_g8a') = 1, Transform(lnSucces) + ltDataorasVanzareA = v_g8a.dataoras + lnIdUtilsVanzareA = Nvl(v_g8a.id_utils, 0) + Use In v_g8a + + IF Used('v_g8d_a') + Use In v_g8d_a + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_a') + goExecutor.oReset() + lcSnapDetA = CursorToSnapshot('v_g8d_a') + Use In v_g8d_a + + *!* --- codul testat: traseul real, prin frm_facturi.do_editare_unificata --- + *!* Init-ul clasei presupune crsfacturi ca zona curenta (la fel ca in test_s7_urmasi.prg) - + *!* interogarile martor de mai sus au schimbat zona curenta intre timp, se restaureaza aici + Select crsfacturi + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm) + IF Vartype(m.loFrm) <> 'O' + RETURN + ENDIF + + Select crsfacturi + Locate For id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found()) + IF !Found() + loFrm.Release() + RETURN + ENDIF + + *!* --- driverS8p7 gaseste si inchide formularul unificat (FARA but_termin1.Click()), vezi + *!* antetul fisierului; .do_editare_unificata() nu revine decat dupa ce fereastra s-a inchis --- + goDriverS8p7.Reseteaza() + loFrm.do_editare_unificata() + + DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit) + + *!* --- Ct_clb_altele: prezenta citita din colectia Objects a formularului, cat timp era deschis + *!* (infirmarea §3.2 - vezi raport) --- + DO asserteaza WITH lcPrefix + ': Ct_clb_altele prezenta = ' + Iif(m.tlCtClbAsteptat, 'prezent', 'absent'), ; + goDriverS8p7.lCtClbPrezent == m.tlCtClbAsteptat, Transform(goDriverS8p7.lCtClbPrezent) + IF m.tlCtClbAsteptat + DO asserteaza WITH lcPrefix + ': Ct_clb_altele eticheta = [' + m.tcCtClbEtichetaAsteptata + ']', ; + Upper(goDriverS8p7.cCtClbEticheta) == Upper(m.tcCtClbEtichetaAsteptata), goDriverS8p7.cCtClbEticheta + ENDIF + *!* --- grupul B si C (S8, decizia 25): needitabile la editare, verificate doar cand controlul + *!* mai exista (unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare) --- + DO VerificaBlocajGrupBC WITH m.lcPrefix + + *!* --- G5: totalul afisat de do_calculeaza_totaluri (chemat inainte de Show, in do_editare_unificata) + *!* ramane egal cu totalul deja scris in VANZARI - prinde o reevaluare tacita a cursului/preturilor --- + Select crsfacturi + IF Nvl(crsfacturi.in_valuta, 0) = 1 + DO asserteaza WITH lcPrefix + ' G5: total afisat (valuta) = VANZARI.totval', ; + Round(goDriverS8p7.nTotalVal, 2) == Round(Nvl(crsfacturi.totval, 0), 2), Transform(goDriverS8p7.nTotalVal) + ' vs ' + Transform(crsfacturi.totval) + ELSE + DO asserteaza WITH lcPrefix + ' G5: total afisat (lei) = VANZARI.total_cu_tva', ; + Round(goDriverS8p7.nTotalRon, 2) == Round(Nvl(crsfacturi.total_cu_tva, 0), 2), Transform(goDriverS8p7.nTotalRon) + ' vs ' + Transform(crsfacturi.total_cu_tva) + ENDIF + + loFrm.Release() + + *!* --- G9: niciun dialog modal la deschidere --- + DO asserteaza WITH lcPrefix + ' G9: niciun amessagebox la deschidere', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- G2: snapshot generator de numere, DUPA - identic caracter cu caracter --- + IF Used('v_plaje_b') + Use In v_plaje_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_b') + Use In v_plaje_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' + + *!* --- G8: dataoras/id_utils neschimbate pe VANZARI si VANZARI_DETALII --- + IF Used('v_g8a2') + Use In v_g8a2 + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a2') + goExecutor.oReset() + *!* Nvl pe TTOC: dataoras e NULL pe documentele de test - NULL == NULL da .NULL. in VFP (nu .T.), + *!* fals negativ fara el + DO asserteaza WITH lcPrefix + ' G8: VANZARI.dataoras neschimbat', ; + Nvl(Ttoc(v_g8a2.dataoras), 'NULL') == Nvl(Ttoc(m.ltDataorasVanzareA), 'NULL'), Nvl(Ttoc(v_g8a2.dataoras), 'NULL') + DO asserteaza WITH lcPrefix + ' G8: VANZARI.id_utils neschimbat', Nvl(v_g8a2.id_utils, 0) == m.lnIdUtilsVanzareA, Transform(Nvl(v_g8a2.id_utils, 0)) + Use In v_g8a2 + + IF Used('v_g8d_b') + Use In v_g8d_b + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_b') + goExecutor.oReset() + lcSnapDetB = CursorToSnapshot('v_g8d_b') + Use In v_g8d_b + DO asserteaza WITH lcPrefix + ' G8: VANZARI_DETALII dataoras/id_utils identice (nicio scriere)', m.lcSnapDetA == m.lcSnapDetB, '' + + *!* --- G11 partial: fara nicio scriere pe VANZARI_DETALII (G8), nu s-a putut genera nicio miscare + *!* de stoc noua pe acest document; nu masoara direct un tabel de stoc - proba indirecta, partiala --- + DO asserteaza WITH lcPrefix + ' G11 partial (derivat din G8): nicio scriere pe VANZARI_DETALII => stoc agregat neschimbat pe acest document', m.lcSnapDetA == m.lcSnapDetB, '' +ENDPROC + + +*!* S8 - blocarea grupurilor B si C la editare (docs\raport_s8_grup_bc.md). Citeste starea deja +*!* capturata de goDriverS8p7 (formularul e inchis pana aici) si asearta doar cand controlul e +*!* prezent - unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare. +PROCEDURE VerificaBlocajGrupBC + LPARAMETERS tcPrefix + + IF goDriverS8p7.lCtClbPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_altele (sursa) needitabil', !goDriverS8p7.lCtClbAlteleActiv, Transform(goDriverS8p7.lCtClbAlteleActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: clb_fdoc.cboFdoc (tip document) needitabil', ; + goDriverS8p7.lClbFdocPrezent AND !goDriverS8p7.lClbFdocActiv, Transform(goDriverS8p7.lClbFdocActiv) + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_nume_client (client) needitabil', ; + goDriverS8p7.lCtClbNumeClientPrezent AND !goDriverS8p7.lCtClbNumeClientActiv, Transform(goDriverS8p7.lCtClbNumeClientActiv) + IF goDriverS8p7.lCtClbValutaPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_valuta needitabil', !goDriverS8p7.lCtClbValutaActiv, Transform(goDriverS8p7.lCtClbValutaActiv) + ENDIF + IF goDriverS8p7.lClbZiCursPrezent + DO asserteaza WITH tcPrefix + ' grupB: Clb_zi_curs needitabil', !goDriverS8p7.lClbZiCursActiv, Transform(goDriverS8p7.lClbZiCursActiv) + ENDIF + IF goDriverS8p7.lCtClbGestiuneInitPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_gestiune_init (gestiune sursa) needitabil', !goDriverS8p7.lCtClbGestiuneInitActiv, Transform(goDriverS8p7.lCtClbGestiuneInitActiv) + ENDIF + IF goDriverS8p7.lCtClbPolPreturiPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_politici_preturi needitabil', !goDriverS8p7.lCtClbPolPreturiActiv, Transform(goDriverS8p7.lCtClbPolPreturiActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: but_incarca_articole needitabil (G2: evita poGeneratorNumere.verifica_numar)', ; + goDriverS8p7.lButIncarcaArticolePrezent AND !goDriverS8p7.lButIncarcaArticoleActiv, Transform(goDriverS8p7.lButIncarcaArticoleActiv) + DO asserteaza WITH tcPrefix + ' grupB: but_cursuri needitabil', ; + goDriverS8p7.lButCursuriPrezent AND !goDriverS8p7.lButCursuriActiv, Transform(goDriverS8p7.lButCursuriActiv) + IF goDriverS8p7.lCtIncasarePrezent + DO asserteaza WITH tcPrefix + ' grupC: ct_incasare needitabil', !goDriverS8p7.lCtIncasareActiv, Transform(goDriverS8p7.lCtIncasareActiv) + DO asserteaza WITH tcPrefix + ' grupC: chk_incasare needitabil', goDriverS8p7.lChkIncasarePrezent AND !goDriverS8p7.lChkIncasareActiv, Transform(goDriverS8p7.lChkIncasareActiv) + ENDIF +ENDPROC + + +*!* S8 - neregresie: pe document NOU, grupurile B/C raman editabile (docs\raport_s8_grup_bc.md). +*!* NU trece prin factureaza()/poGeneratorNumere (interzis - arde numere din plaje reale). poDate +*!* construit manual cu Createobject('oDateFactura',0,0): Init-ul clasei NU ruleaza (tnIdSet=0), +*!* deci ramane pe defaults din PropValue - inclusiv lEditare=.F., exact ca la orice document nou +*!* (vezi si test_s8_pas3_garda_alte_date.prg, acelasi tipar). tip=3 (comanda) e ales ca sa +*!* pastreze Ct_clb_altele si Ct_clb_nume_client prezente (paralel cu documentul 1113 de mai sus); +*!* nu are cursul din zi (citeste_cursuri_zi nu se cheama pentru tip=3), deci fara SELECT Oracle. +*!* Instantiat direct cu Newobject, FARA .Show() - Init ruleaza oricum la construire, iar fara +*!* Show() nu exista blocajul modal (WindowType=1 conteaza doar cand se cheama .Show()), deci nu e +*!* nevoie de driverS8p7 aici. +PROCEDURE VerificaDocumentNou + PRIVATE poDate + LOCAL loForm + + poDate = Createobject('oDateFactura', 0, 0) + poDate.tip = 3 + poDate.id_client = 0 + poDate.incasat = 0 + + loForm = Newobject('frm_facturare_articole2', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx') + DO asserteaza WITH 'document nou: Newobject(frm_facturare_articole2) reuseste (fara Show, fara factureaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + + DO asserteaza WITH 'document nou: poDate.lEditare = .F. (stare naturala, nesetata de nimeni)', !poDate.lEditare, Transform(poDate.lEditare) + + IF loForm.do_exista_obiect('Ct_clb_altele') + DO asserteaza WITH 'document nou grupB: Ct_clb_altele ramane editabil', loForm.Ct_clb_altele.lactiv, Transform(loForm.Ct_clb_altele.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: clb_fdoc.cboFdoc ramane editabil', loForm.clb_fdoc.cboFdoc.Enabled, Transform(loForm.clb_fdoc.cboFdoc.Enabled) + DO asserteaza WITH 'document nou grupB: Ct_clb_nume_client ramane editabil', loForm.Ct_clb_nume_client.lactiv, Transform(loForm.Ct_clb_nume_client.lactiv) + IF loForm.do_exista_obiect('Ct_clb_valuta') + DO asserteaza WITH 'document nou grupB: Ct_clb_valuta ramane editabil', loForm.Ct_clb_valuta.lactiv, Transform(loForm.Ct_clb_valuta.lactiv) + ENDIF + IF loForm.do_exista_obiect('Clb_zi_curs') + DO asserteaza WITH 'document nou grupB: Clb_zi_curs ramane editabil', !loForm.Clb_zi_curs.text_simplu1.ReadOnly, Transform(loForm.Clb_zi_curs.text_simplu1.ReadOnly) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_gestiune_init', loForm.ct_contabilitate) + DO asserteaza WITH 'document nou grupB: Ct_clb_gestiune_init ramane editabil', loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv, Transform(loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_politici_preturi') + DO asserteaza WITH 'document nou grupB: Ct_clb_politici_preturi ramane editabil', loForm.Ct_clb_politici_preturi.lactiv, Transform(loForm.Ct_clb_politici_preturi.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: but_incarca_articole ramane editabil', loForm.but_incarca_articole.Enabled, Transform(loForm.but_incarca_articole.Enabled) + DO asserteaza WITH 'document nou grupB: but_cursuri ramane editabil', loForm.but_cursuri.Enabled, Transform(loForm.but_cursuri.Enabled) + IF loForm.do_exista_obiect('ct_incasare') + DO asserteaza WITH 'document nou grupC: ct_incasare ramane editabil', loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH 'document nou grupC: chk_incasare ramane editabil', loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + ENDIF + + loForm.Release() +ENDPROC + + +*!* S8 - incasarea la editare (D1/D3/D4, docs\propunere_s8_incasare_la_editare.md). Replica +*!* dovedita a corpului do_editare_unificata (ofacturare_comun.vc2:3890+) pana la Createobject, +*!* promovata din investigatia I1 (probe_defect5_latent.prg) in setul permanent de probe - acolo +*!* s-a confirmat ca poDate, declarat PRIVATE aici, ramane vizibil dupa Createobject/Show() +*!* (aceeasi vizibilitate dinamica pe care se bazeaza si codul de productie pentru poDate/ +*!* poGeneratorNumere). driverS8p7 e refolosit doar ca sa inchida modalul Show(). +PROCEDURE VerificaIncasareLaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tnIncasatAsteptat, tnNrIncasareAsteptat, tnTipIncasareAsteptat, tnModAsteptat + + LOCAL lcPrefix, lnSucces, loForm, pnDiscountRon, pnDiscountValuta + LOCAL lnSters, llEProforma, lnTipDoc, lcSnapPlajeA, lcSnapPlajeB + PRIVATE pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP, poDate + Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP + lcPrefix = Transform(m.tnIdVanzare) + ' [incasare ' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + IF Used('v_plaje_inc_a') + Use In v_plaje_inc_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_inc_a') + Use In v_plaje_inc_a + + lnSucces = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip,incasat from fact_vfacturi where id_vanzare=' + Transform(m.tnIdVanzare), 'crsIncUnic') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': documentul a putut fi reincarcat', lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1, Transform(lnSucces) + IF !(lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1) + RETURN + ENDIF + SELECT crsIncUnic + lnIdVanzareP = id_vanzare + lnCod = cod + pnAn = Year(data_act) + pnLuna = Month(data_act) + lnSters = sters + lnIdFact = id_fact + llEProforma = (eproforma = 1) + lnTipDoc = tip + Use In crsIncUnic + + DO asserteaza WITH lcPrefix + ': garzile do_editare_unificata trecute (nesters/neproforma/tip valid/luna curenta)', ; + lnSters = 0 AND !llEProforma AND !Inlist(lnTipDoc,44,45,46,51) AND (pnAn*12+pnLuna) == (gnAn*12+gnLuna), '' + DO asserteaza WITH lcPrefix + ': fara referinte (incasari/plati)', !ReferinteDocumenteNota(pnAn, pnLuna, lnCod), '' + DO asserteaza WITH lcPrefix + ': nu e in eFactura', !EsteInEFactura(lnIdFact), '' + DO asserteaza WITH lcPrefix + ': fara urmasi', !DocumentAreUrmasi(lnIdVanzareP), '' + + poDate = IncarcaAntetFacturaEditare(lnIdVanzareP, @pnDiscountRon, @pnDiscountValuta) + DO asserteaza WITH lcPrefix + ': IncarcaAntetFacturaEditare reuseste', Vartype(m.poDate) == 'O', Vartype(m.poDate) + IF Vartype(m.poDate) <> 'O' + RETURN + ENDIF + + IncarcaLiniiFacturaEditare(poDate, lnIdVanzareP) + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF Used('jtva_coloane') + Use In jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ELSE + Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ENDIF + + loForm = Createobject('frm_facturare_articole2') + DO asserteaza WITH lcPrefix + ': formularul se deschide fara eroare (defectul 5 latent nu se activeaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + DO asserteaza WITH lcPrefix + ': G9 niciun amessagebox la Createobject/Init', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- asertiunile care prind regresia D1/D3/D4 --- + DO asserteaza WITH lcPrefix + ': poDate.incasat = valoarea din baza (NU suprascrisa cu totalctva)', ; + Round(Nvl(poDate.incasat,-1),2) == Round(m.tnIncasatAsteptat,2), Transform(Nvl(poDate.incasat,-1)) + DO asserteaza WITH lcPrefix + ': poDate.nr_incasare nu a fost zeroit', ; + Nvl(poDate.nr_incasare,-1) == m.tnNrIncasareAsteptat, Transform(Nvl(poDate.nr_incasare,-1)) + DO asserteaza WITH lcPrefix + ': poDate.ntip_incasare incarcat corect', ; + Nvl(poDate.ntip_incasare,-1) == m.tnTipIncasareAsteptat, Transform(Nvl(poDate.ntip_incasare,-1)) + DO asserteaza WITH lcPrefix + ': modul afisat (opt_incasat.Value) corespunde tip_incasare', ; + loForm.ct_incasare.opt_incasat.Value == m.tnModAsteptat - 1, Transform(loForm.ct_incasare.opt_incasat.Value) + DO asserteaza WITH lcPrefix + ': chk_incasare.Value = 1 (document incasat)', loForm.chk_incasare.Value == 1, Transform(loForm.chk_incasare.Value) + DO asserteaza WITH lcPrefix + ': grupC ct_incasare needitabil', !loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH lcPrefix + ': grupC chk_incasare needitabil', !loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + + loForm.ndiscfactron = pnDiscountRon + loForm.ndiscfactval = pnDiscountValuta + loForm.do_calculeaza_totaluri() + + *!* nemodal: eliberarea din Timer, in interiorul propriului Show() modal, blocheaza VFP in Release() + loForm.WindowType = 0 + goDriverS8p7.Reseteaza() + loForm.Show() + DO asserteaza WITH lcPrefix + ': niciun amessagebox pe parcursul Show()', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + Try + loForm.Release() + Catch + Endtry + + IF Used('v_plaje_inc_b') + Use In v_plaje_inc_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_inc_b') + Use In v_plaje_inc_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' +ENDPROC + + +PROCEDURE CursorToSnapshot + LPARAMETERS tcAlias + + LOCAL lcResult, lnI + lcResult = '' + SELECT (m.tcAlias) + SCAN + FOR lnI = 1 TO FCOUNT() + lcResult = lcResult + Transform(Evaluate(Field(m.lnI))) + '|' + ENDFOR + lcResult = lcResult + Chr(10) + ENDSCAN + RETURN m.lcResult +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*!* driverS8p7: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms in timp ce .Show() e blocat pe +*!* modal (un modal tot pompeaza mesaje Windows, deci timerul de pe _SCREEN tot ruleaza - acelasi +*!* tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg, folosit acolo pentru MESSAGEBOX_FORM). +*!* Citeste Ct_clb_altele din Objects (nu PEMSTATUS - RemoveObject scoate din Objects, PEMSTATUS +*!* ramane .T.) inainte sa elibereze forma, ceea ce incheie .Show() si reda controlul apelantului. +DEFINE CLASS driverS8p7 AS Custom + lBusy = .F. + lGasit = .F. + lCtClbPrezent = .F. + lCtClbAlteleActiv = .F. + cCtClbEticheta = '' + nTotalRon = 0 + nTotalVal = 0 + + *!* grupul B si C (S8, docs\raport_s8_grup_bc.md) - Prezent = mai exista in Objects (nu a fost + *!* scos de Init dupa tip/gnScadereStoc), Activ = NU e blocat (Enabled / lactiv / !ReadOnly, dupa + *!* mecanismul folosit de fiecare control) + lClbFdocPrezent = .F. + lClbFdocActiv = .F. + lCtClbNumeClientPrezent = .F. + lCtClbNumeClientActiv = .F. + lCtClbValutaPrezent = .F. + lCtClbValutaActiv = .F. + lClbZiCursPrezent = .F. + lClbZiCursActiv = .F. + lCtClbGestiuneInitPrezent = .F. + lCtClbGestiuneInitActiv = .F. + lCtClbPolPreturiPrezent = .F. + lCtClbPolPreturiActiv = .F. + lButIncarcaArticolePrezent = .F. + lButIncarcaArticoleActiv = .F. + lButCursuriPrezent = .F. + lButCursuriActiv = .F. + lCtIncasarePrezent = .F. + lCtIncasareActiv = .F. + lChkIncasarePrezent = .F. + lChkIncasareActiv = .F. + + PROCEDURE Reseteaza + This.lGasit = .F. + This.lCtClbPrezent = .F. + This.lCtClbAlteleActiv = .F. + This.cCtClbEticheta = '' + This.nTotalRon = 0 + This.nTotalVal = 0 + This.lClbFdocPrezent = .F. + This.lClbFdocActiv = .F. + This.lCtClbNumeClientPrezent = .F. + This.lCtClbNumeClientActiv = .F. + This.lCtClbValutaPrezent = .F. + This.lCtClbValutaActiv = .F. + This.lClbZiCursPrezent = .F. + This.lClbZiCursActiv = .F. + This.lCtClbGestiuneInitPrezent = .F. + This.lCtClbGestiuneInitActiv = .F. + This.lCtClbPolPreturiPrezent = .F. + This.lCtClbPolPreturiActiv = .F. + This.lButIncarcaArticolePrezent = .F. + This.lButIncarcaArticoleActiv = .F. + This.lButCursuriPrezent = .F. + This.lButCursuriActiv = .F. + This.lCtIncasarePrezent = .F. + This.lCtIncasareActiv = .F. + This.lChkIncasarePrezent = .F. + This.lChkIncasareActiv = .F. + ENDPROC + + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + TRY + LOCAL lnI, lnJ, lnJ2, loFrm2, loObj, loObj2 + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + This.nTotalRon = Nvl(loFrm2.ntotalron, 0) + This.nTotalVal = Nvl(loFrm2.ntotalval, 0) + FOR lnJ = 1 TO loFrm2.Objects.Count + loObj = loFrm2.Objects(m.lnJ) + DO CASE + CASE Upper(loObj.Name) == 'CT_CLB_ALTELE' + This.lCtClbPrezent = .T. + This.lCtClbAlteleActiv = loObj.lactiv + This.cCtClbEticheta = Alltrim(loObj.clb_tx_cautare.lb_SIMPLU1.Caption) + CASE Upper(loObj.Name) == 'CLB_FDOC' + This.lClbFdocPrezent = .T. + This.lClbFdocActiv = loObj.cboFdoc.Enabled + CASE Upper(loObj.Name) == 'CT_CLB_NUME_CLIENT' + This.lCtClbNumeClientPrezent = .T. + This.lCtClbNumeClientActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CT_CLB_VALUTA' + This.lCtClbValutaPrezent = .T. + This.lCtClbValutaActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CLB_ZI_CURS' + This.lClbZiCursPrezent = .T. + This.lClbZiCursActiv = !loObj.text_simplu1.ReadOnly + CASE Upper(loObj.Name) == 'CT_CLB_POLITICI_PRETURI' + This.lCtClbPolPreturiPrezent = .T. + This.lCtClbPolPreturiActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'BUT_INCARCA_ARTICOLE' + This.lButIncarcaArticolePrezent = .T. + This.lButIncarcaArticoleActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'BUT_CURSURI' + This.lButCursuriPrezent = .T. + This.lButCursuriActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_INCASARE' + This.lCtIncasarePrezent = .T. + This.lCtIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CHK_INCASARE' + This.lChkIncasarePrezent = .T. + This.lChkIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_CONTABILITATE' + FOR lnJ2 = 1 TO loObj.Objects.Count + loObj2 = loObj.Objects(m.lnJ2) + IF Upper(loObj2.Name) == 'CT_CLB_GESTIUNE_INIT' + This.lCtClbGestiuneInitPrezent = .T. + This.lCtClbGestiuneInitActiv = loObj2.lactiv + ENDIF + ENDFOR + ENDCASE + ENDFOR + loFrm2.Release() + EXIT + ENDIF + ENDFOR + CATCH TO loExcS8p7 + STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s8_x2_stare.prg b/utile/Teste/editare_factura/test_s8_x2_stare.prg new file mode 100644 index 0000000..39f3703 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8_x2_stare.prg @@ -0,0 +1,684 @@ +* test_s8_pas7_cablare.prg +* Verifica pasul 7 din docs\propunere_s8_incarcare.md §6: cablarea celei de-a treia optiuni de +* meniu si corpul real al lui frm_facturi.do_editare_unificata (COMUN\clase\ofacturare_comun.vc2). +* Traseul REAL: Newobject('frm_facturi') + .do_editare_unificata() (nu Createobject direct pe +* frm_facturare_articole2 - asta ar proba doar codul formularului, nu rutarea). +* Documente reale, in luna curenta a calendarului (gnAn/gnLuna), care trec toate garzile +* (nesters, ne-eproforma, tip valid, fara referinte, fara urmasi, ne-eFactura), gasite prin +* interogare read-only pe MARIUSM_AUTO: +* 1113 - sursa COMANDA (tip=3, id_comanda=2479) +* 1055 - sursa CONTRACT (tip=2, id_ctr=234) +* 1048 - factura SIMPLA, lista de preturi (tip=1, fara comanda/ctr) +* 1130 - VALUTA (tip=5, in_valuta=1) +* Nu scrie in Oracle - doar SELECT; verifica ca formularul deschis nici el nu scrie +* (G8: dataoras/id_utils neschimbate pe VANZARI/VANZARI_DETALII). +* +* frm_facturare_articole2 (ofacturare.vc2:15894) nu suprascrie WindowType, iar _frm_base il +* seteaza pe 1 = modal - .Show() blocheaza pana la inchiderea ferestrei, headless nu are cine +* sa o inchida in mod normal. Solutie: driverS8p7 (Custom, BINDEVENT pe un Timer de pe _SCREEN, +* acelasi tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg) - un modal inca pompeaza +* mesaje Windows, deci timerul tot mai ruleaza in interiorul lui .Show(); cand gaseste forma +* deschisa ii citeste prezenta/eticheta lui Ct_clb_altele (din colectia Objects, nu PEMSTATUS - +* RemoveObject scoate din Objects dar PEMSTATUS ramane .T., vezi memoria pemstatus-dupa- +* removeobject) si o elibereaza, ceea ce incheie .Show() si intoarce controlul in +* do_editare_unificata, apoi in acest test. Nu modifica NIMIC in codul de productie. +* +* Extindere S8 (blocarea grupurilor B si C la editare, docs\raport_s8_grup_bc.md): driverS8p7 +* citeste in plus, din Objects, starea needitabila a controalelor clb_fdoc.cboFdoc, Ct_clb_altele, +* Ct_clb_nume_client, Ct_clb_valuta, Clb_zi_curs, ct_contabilitate.Ct_clb_gestiune_init, +* Ct_clb_politici_preturi, but_incarca_articole, but_cursuri, ct_incasare, chk_incasare - fiecare +* verificat doar daca e prezent (unele sunt scoase de Init in functie de tip/gnScadereStoc, +* independent de lEditare). Proba de neregresie pe document nou (VerificaDocumentNou) NU trece +* prin factureaza()/poGeneratorNumere (interzis, arde numere) - construieste poDate manual cu +* Createobject('oDateFactura',0,0) (Init nu ruleaza, ramane pe defaults, lEditare=.F. ca la orice +* document nou) si instantiaza formularul direct cu Newobject, FARA .Show() (Init ruleaza oricum +* la construire; fara Show() nu exista blocaj modal, deci nu e nevoie de driver aici). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8_x2_stare_log.txt' +STRTOFILE('start' + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 + +*!* --- driver care inchide fereastra modala frm_facturare_articole2, vezi antetul fisierului --- +PUBLIC goDriverS8p7 +goDriverS8p7 = Createobject('driverS8p7') +_SCREEN.AddObject('tmrS8p7', 'Timer') +_SCREEN.tmrS8p7.Interval = 150 +Bindevent(_SCREEN.tmrS8p7, 'Timer', goDriverS8p7, 'Executa') +_SCREEN.tmrS8p7.Enabled = .T. + +*!* --- verificare statica: corpul do_editare_unificata nu contine nicio referinta la alocarea +*!* de numere (factureaza/poGeneratorNumere/creeaza_cursor_serii) --- +LOCAL lcSrc, lcTail, lnStart, lnEnd, lcMetoda +lcSrc = FILETOSTR('D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vc2') +lnStart = AT('PROCEDURE do_editare_unificata' + CHR(13) + CHR(10), lcSrc) +DO asserteaza WITH 'static: metoda do_editare_unificata gasita in sursa', lnStart > 0, TRANSFORM(lnStart) +IF lnStart > 0 + lcTail = SUBSTR(lcSrc, lnStart) + lnEnd = AT('ENDPROC', lcTail) + lcMetoda = UPPER(SUBSTR(lcTail, 1, lnEnd + 6)) + DO asserteaza WITH 'static G2: fara FACTUREAZA( in do_editare_unificata', 'FACTUREAZA(' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara POGENERATORNUMERE in do_editare_unificata', 'POGENERATORNUMERE' $ lcMetoda = .F., '' + DO asserteaza WITH 'static G2: fara CREEAZA_CURSOR_SERII in do_editare_unificata', 'CREEAZA_CURSOR_SERII' $ lcMetoda = .F., '' +ENDIF + +*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe cele 4 documente --- +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +LOCAL lcSchema, lcSelect, lcOrder, lcFiltru +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +lcOrder = [data_act,numar_act] +lcFiltru = [id_vanzare in (1113, 1055, 1048, 1130)] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +DO asserteaza WITH 'crsfacturi incarcat cu cele 4 documente reale (rownum=4)', Used('crsfacturi') AND Reccount('crsfacturi') = 4, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') + +*!* Ct_clb_altele (infirmare §3.2, vezi raport): document CU sursa -> prezent, etichetat din +*!* poDate.tip; factura SIMPLA -> absent, identic cu introducerea unei facturi noi (G10). +DO LogStare WITH 'INAINTE 1113' +DO VerificaEditare WITH 1113, 'sursa comanda', .T., 'Nr. comanda' +DO LogStare WITH 'DUPA 1113' +DO LogStare WITH 'INAINTE 1055' +DO VerificaEditare WITH 1055, 'sursa contract', .T., 'Nr. contract' +DO LogStare WITH 'DUPA 1055' +DO LogStare WITH 'INAINTE 1048' +DO VerificaEditare WITH 1048, 'factura simpla', .F., '' +DO LogStare WITH 'DUPA 1048' +DO LogStare WITH 'INAINTE 1130' +DO VerificaEditare WITH 1130, 'valuta', .F., '' +DO LogStare WITH 'DUPA 1130' + +*!* --- S8 incasarea la editare (D1/D3/D4, docs\propunere_s8_incasare_la_editare.md) - foloseste +*!* Show() real, deci trebuie sa ruleze inainte de teardown-ul lui tmrS8p7 de mai jos. +*!* 1071: tip_incasare=11 (chitanta) -> mod 2. 1072: tip_incasare=2 (bon fiscal) -> mod 3, +*!* cazul in care hardcodarea veche "mod 2" ar fi aratat gresit. +DO VerificaIncasareLaEditare WITH 1071, 'chitanta, tip_incasare=11', 119, 44, 11, 2 +DO VerificaIncasareLaEditare WITH 1072, 'bon fiscal, tip_incasare=2', 119, 66, 2, 3 + +_SCREEN.tmrS8p7.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrS8p7') +Catch +Endtry + +*!* --- S8 grupurile B/C: neregresie pe document NOU (docs\raport_s8_grup_bc.md) --- +DO VerificaDocumentNou + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +PROCEDURE LogStare + LPARAMETERS tcEticheta + + LOCAL lnI, lcAliasuri, laAliasuri[1], lnCnt, lcForme, lnJ + lcAliasuri = '' + lnCnt = AUSED(laAliasuri) + FOR lnI = 1 TO m.lnCnt + lcAliasuri = lcAliasuri + laAliasuri[m.lnI, 1] + ',' + ENDFOR + lcForme = '' + FOR lnJ = 1 TO _SCREEN.FormCount + lcForme = lcForme + Upper(_SCREEN.Forms(m.lnJ).Class) + ',' + ENDFOR + STRTOFILE('STARE [' + m.tcEticheta + '] select=' + Alias() + ' aused(' + Transform(m.lnCnt) + ')=' + m.lcAliasuri + ' forme(' + Transform(_SCREEN.FormCount) + ')=' + m.lcForme + ' driver.lBusy=' + Transform(goDriverS8p7.lBusy) + ' driver.lGasit=' + Transform(goDriverS8p7.lGasit) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +PROCEDURE VerificaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tlCtClbAsteptat, tcCtClbEtichetaAsteptata + + LOCAL lcPrefix, lnSucces, loFrm, lnI, llGasitForm + LOCAL lcSnapPlajeA, lcSnapPlajeB, lcSnapDetA, lcSnapDetB + LOCAL ltDataorasVanzareA, lnIdUtilsVanzareA + lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + *!* --- G2: snapshot generator de numere, INAINTE --- + IF Used('v_plaje_a') + Use In v_plaje_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_a') + Use In v_plaje_a + + *!* --- G8: snapshot dataoras/id_utils, INAINTE --- + IF Used('v_g8a') + Use In v_g8a + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor G8 antet Oracle a reusit', lnSucces >= 0 AND Used('v_g8a') AND Reccount('v_g8a') = 1, Transform(lnSucces) + ltDataorasVanzareA = v_g8a.dataoras + lnIdUtilsVanzareA = Nvl(v_g8a.id_utils, 0) + Use In v_g8a + + IF Used('v_g8d_a') + Use In v_g8d_a + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_a') + goExecutor.oReset() + lcSnapDetA = CursorToSnapshot('v_g8d_a') + Use In v_g8d_a + + *!* --- codul testat: traseul real, prin frm_facturi.do_editare_unificata --- + *!* Init-ul clasei presupune crsfacturi ca zona curenta (la fel ca in test_s7_urmasi.prg) - + *!* interogarile martor de mai sus au schimbat zona curenta intre timp, se restaureaza aici + Select crsfacturi + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', Vartype(m.loFrm) == 'O', Vartype(m.loFrm) + IF Vartype(m.loFrm) <> 'O' + RETURN + ENDIF + + Select crsfacturi + Locate For id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', Found(), Transform(Found()) + IF !Found() + loFrm.Release() + RETURN + ENDIF + + *!* --- driverS8p7 gaseste si inchide formularul unificat (FARA but_termin1.Click()), vezi + *!* antetul fisierului; .do_editare_unificata() nu revine decat dupa ce fereastra s-a inchis --- + goDriverS8p7.Reseteaza() + loFrm.do_editare_unificata() + + DO asserteaza WITH lcPrefix + ': formularul unificat s-a deschis (traseul direct, fara factureaza())', goDriverS8p7.lGasit, Transform(goDriverS8p7.lGasit) + + *!* --- Ct_clb_altele: prezenta citita din colectia Objects a formularului, cat timp era deschis + *!* (infirmarea §3.2 - vezi raport) --- + DO asserteaza WITH lcPrefix + ': Ct_clb_altele prezenta = ' + Iif(m.tlCtClbAsteptat, 'prezent', 'absent'), ; + goDriverS8p7.lCtClbPrezent == m.tlCtClbAsteptat, Transform(goDriverS8p7.lCtClbPrezent) + IF m.tlCtClbAsteptat + DO asserteaza WITH lcPrefix + ': Ct_clb_altele eticheta = [' + m.tcCtClbEtichetaAsteptata + ']', ; + Upper(goDriverS8p7.cCtClbEticheta) == Upper(m.tcCtClbEtichetaAsteptata), goDriverS8p7.cCtClbEticheta + ENDIF + *!* --- grupul B si C (S8, decizia 25): needitabile la editare, verificate doar cand controlul + *!* mai exista (unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare) --- + DO VerificaBlocajGrupBC WITH m.lcPrefix + + *!* --- G5: totalul afisat de do_calculeaza_totaluri (chemat inainte de Show, in do_editare_unificata) + *!* ramane egal cu totalul deja scris in VANZARI - prinde o reevaluare tacita a cursului/preturilor --- + Select crsfacturi + IF Nvl(crsfacturi.in_valuta, 0) = 1 + DO asserteaza WITH lcPrefix + ' G5: total afisat (valuta) = VANZARI.totval', ; + Round(goDriverS8p7.nTotalVal, 2) == Round(Nvl(crsfacturi.totval, 0), 2), Transform(goDriverS8p7.nTotalVal) + ' vs ' + Transform(crsfacturi.totval) + ELSE + DO asserteaza WITH lcPrefix + ' G5: total afisat (lei) = VANZARI.total_cu_tva', ; + Round(goDriverS8p7.nTotalRon, 2) == Round(Nvl(crsfacturi.total_cu_tva, 0), 2), Transform(goDriverS8p7.nTotalRon) + ' vs ' + Transform(crsfacturi.total_cu_tva) + ENDIF + + loFrm.Release() + + *!* --- G9: niciun dialog modal la deschidere --- + DO asserteaza WITH lcPrefix + ' G9: niciun amessagebox la deschidere', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- G2: snapshot generator de numere, DUPA - identic caracter cu caracter --- + IF Used('v_plaje_b') + Use In v_plaje_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_b') + Use In v_plaje_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' + + *!* --- G8: dataoras/id_utils neschimbate pe VANZARI si VANZARI_DETALII --- + IF Used('v_g8a2') + Use In v_g8a2 + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_utils from vanzari where id_vanzare = ] + Transform(m.tnIdVanzare), 'v_g8a2') + goExecutor.oReset() + *!* Nvl pe TTOC: dataoras e NULL pe documentele de test - NULL == NULL da .NULL. in VFP (nu .T.), + *!* fals negativ fara el + DO asserteaza WITH lcPrefix + ' G8: VANZARI.dataoras neschimbat', ; + Nvl(Ttoc(v_g8a2.dataoras), 'NULL') == Nvl(Ttoc(m.ltDataorasVanzareA), 'NULL'), Nvl(Ttoc(v_g8a2.dataoras), 'NULL') + DO asserteaza WITH lcPrefix + ' G8: VANZARI.id_utils neschimbat', Nvl(v_g8a2.id_utils, 0) == m.lnIdUtilsVanzareA, Transform(Nvl(v_g8a2.id_utils, 0)) + Use In v_g8a2 + + IF Used('v_g8d_b') + Use In v_g8d_b + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, dataoras, id_utils from vanzari_detalii where id_vanzare = ] + Transform(m.tnIdVanzare) + [ order by id_vanzare_det], 'v_g8d_b') + goExecutor.oReset() + lcSnapDetB = CursorToSnapshot('v_g8d_b') + Use In v_g8d_b + DO asserteaza WITH lcPrefix + ' G8: VANZARI_DETALII dataoras/id_utils identice (nicio scriere)', m.lcSnapDetA == m.lcSnapDetB, '' + + *!* --- G11 partial: fara nicio scriere pe VANZARI_DETALII (G8), nu s-a putut genera nicio miscare + *!* de stoc noua pe acest document; nu masoara direct un tabel de stoc - proba indirecta, partiala --- + DO asserteaza WITH lcPrefix + ' G11 partial (derivat din G8): nicio scriere pe VANZARI_DETALII => stoc agregat neschimbat pe acest document', m.lcSnapDetA == m.lcSnapDetB, '' +ENDPROC + + +*!* S8 - blocarea grupurilor B si C la editare (docs\raport_s8_grup_bc.md). Citeste starea deja +*!* capturata de goDriverS8p7 (formularul e inchis pana aici) si asearta doar cand controlul e +*!* prezent - unele sunt scoase de Init dupa tip/gnScadereStoc, independent de lEditare. +PROCEDURE VerificaBlocajGrupBC + LPARAMETERS tcPrefix + + IF goDriverS8p7.lCtClbPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_altele (sursa) needitabil', !goDriverS8p7.lCtClbAlteleActiv, Transform(goDriverS8p7.lCtClbAlteleActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: clb_fdoc.cboFdoc (tip document) needitabil', ; + goDriverS8p7.lClbFdocPrezent AND !goDriverS8p7.lClbFdocActiv, Transform(goDriverS8p7.lClbFdocActiv) + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_nume_client (client) needitabil', ; + goDriverS8p7.lCtClbNumeClientPrezent AND !goDriverS8p7.lCtClbNumeClientActiv, Transform(goDriverS8p7.lCtClbNumeClientActiv) + IF goDriverS8p7.lCtClbValutaPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_valuta needitabil', !goDriverS8p7.lCtClbValutaActiv, Transform(goDriverS8p7.lCtClbValutaActiv) + ENDIF + IF goDriverS8p7.lClbZiCursPrezent + DO asserteaza WITH tcPrefix + ' grupB: Clb_zi_curs needitabil', !goDriverS8p7.lClbZiCursActiv, Transform(goDriverS8p7.lClbZiCursActiv) + ENDIF + IF goDriverS8p7.lCtClbGestiuneInitPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_gestiune_init (gestiune sursa) needitabil', !goDriverS8p7.lCtClbGestiuneInitActiv, Transform(goDriverS8p7.lCtClbGestiuneInitActiv) + ENDIF + IF goDriverS8p7.lCtClbPolPreturiPrezent + DO asserteaza WITH tcPrefix + ' grupB: Ct_clb_politici_preturi needitabil', !goDriverS8p7.lCtClbPolPreturiActiv, Transform(goDriverS8p7.lCtClbPolPreturiActiv) + ENDIF + DO asserteaza WITH tcPrefix + ' grupB: but_incarca_articole needitabil (G2: evita poGeneratorNumere.verifica_numar)', ; + goDriverS8p7.lButIncarcaArticolePrezent AND !goDriverS8p7.lButIncarcaArticoleActiv, Transform(goDriverS8p7.lButIncarcaArticoleActiv) + DO asserteaza WITH tcPrefix + ' grupB: but_cursuri needitabil', ; + goDriverS8p7.lButCursuriPrezent AND !goDriverS8p7.lButCursuriActiv, Transform(goDriverS8p7.lButCursuriActiv) + IF goDriverS8p7.lCtIncasarePrezent + DO asserteaza WITH tcPrefix + ' grupC: ct_incasare needitabil', !goDriverS8p7.lCtIncasareActiv, Transform(goDriverS8p7.lCtIncasareActiv) + DO asserteaza WITH tcPrefix + ' grupC: chk_incasare needitabil', goDriverS8p7.lChkIncasarePrezent AND !goDriverS8p7.lChkIncasareActiv, Transform(goDriverS8p7.lChkIncasareActiv) + ENDIF +ENDPROC + + +*!* S8 - neregresie: pe document NOU, grupurile B/C raman editabile (docs\raport_s8_grup_bc.md). +*!* NU trece prin factureaza()/poGeneratorNumere (interzis - arde numere din plaje reale). poDate +*!* construit manual cu Createobject('oDateFactura',0,0): Init-ul clasei NU ruleaza (tnIdSet=0), +*!* deci ramane pe defaults din PropValue - inclusiv lEditare=.F., exact ca la orice document nou +*!* (vezi si test_s8_pas3_garda_alte_date.prg, acelasi tipar). tip=3 (comanda) e ales ca sa +*!* pastreze Ct_clb_altele si Ct_clb_nume_client prezente (paralel cu documentul 1113 de mai sus); +*!* nu are cursul din zi (citeste_cursuri_zi nu se cheama pentru tip=3), deci fara SELECT Oracle. +*!* Instantiat direct cu Newobject, FARA .Show() - Init ruleaza oricum la construire, iar fara +*!* Show() nu exista blocajul modal (WindowType=1 conteaza doar cand se cheama .Show()), deci nu e +*!* nevoie de driverS8p7 aici. +PROCEDURE VerificaDocumentNou + PRIVATE poDate + LOCAL loForm + + poDate = Createobject('oDateFactura', 0, 0) + poDate.tip = 3 + poDate.id_client = 0 + poDate.incasat = 0 + + loForm = Newobject('frm_facturare_articole2', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx') + DO asserteaza WITH 'document nou: Newobject(frm_facturare_articole2) reuseste (fara Show, fara factureaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + + DO asserteaza WITH 'document nou: poDate.lEditare = .F. (stare naturala, nesetata de nimeni)', !poDate.lEditare, Transform(poDate.lEditare) + + IF loForm.do_exista_obiect('Ct_clb_altele') + DO asserteaza WITH 'document nou grupB: Ct_clb_altele ramane editabil', loForm.Ct_clb_altele.lactiv, Transform(loForm.Ct_clb_altele.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: clb_fdoc.cboFdoc ramane editabil', loForm.clb_fdoc.cboFdoc.Enabled, Transform(loForm.clb_fdoc.cboFdoc.Enabled) + DO asserteaza WITH 'document nou grupB: Ct_clb_nume_client ramane editabil', loForm.Ct_clb_nume_client.lactiv, Transform(loForm.Ct_clb_nume_client.lactiv) + IF loForm.do_exista_obiect('Ct_clb_valuta') + DO asserteaza WITH 'document nou grupB: Ct_clb_valuta ramane editabil', loForm.Ct_clb_valuta.lactiv, Transform(loForm.Ct_clb_valuta.lactiv) + ENDIF + IF loForm.do_exista_obiect('Clb_zi_curs') + DO asserteaza WITH 'document nou grupB: Clb_zi_curs ramane editabil', !loForm.Clb_zi_curs.text_simplu1.ReadOnly, Transform(loForm.Clb_zi_curs.text_simplu1.ReadOnly) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_gestiune_init', loForm.ct_contabilitate) + DO asserteaza WITH 'document nou grupB: Ct_clb_gestiune_init ramane editabil', loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv, Transform(loForm.ct_contabilitate.Ct_clb_gestiune_init.lactiv) + ENDIF + IF loForm.do_exista_obiect('Ct_clb_politici_preturi') + DO asserteaza WITH 'document nou grupB: Ct_clb_politici_preturi ramane editabil', loForm.Ct_clb_politici_preturi.lactiv, Transform(loForm.Ct_clb_politici_preturi.lactiv) + ENDIF + DO asserteaza WITH 'document nou grupB: but_incarca_articole ramane editabil', loForm.but_incarca_articole.Enabled, Transform(loForm.but_incarca_articole.Enabled) + DO asserteaza WITH 'document nou grupB: but_cursuri ramane editabil', loForm.but_cursuri.Enabled, Transform(loForm.but_cursuri.Enabled) + IF loForm.do_exista_obiect('ct_incasare') + DO asserteaza WITH 'document nou grupC: ct_incasare ramane editabil', loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH 'document nou grupC: chk_incasare ramane editabil', loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + ENDIF + + loForm.Release() +ENDPROC + + +*!* S8 - incasarea la editare (D1/D3/D4, docs\propunere_s8_incasare_la_editare.md). Replica +*!* dovedita a corpului do_editare_unificata (ofacturare_comun.vc2:3890+) pana la Createobject, +*!* promovata din investigatia I1 (probe_defect5_latent.prg) in setul permanent de probe - acolo +*!* s-a confirmat ca poDate, declarat PRIVATE aici, ramane vizibil dupa Createobject/Show() +*!* (aceeasi vizibilitate dinamica pe care se bazeaza si codul de productie pentru poDate/ +*!* poGeneratorNumere). driverS8p7 e refolosit doar ca sa inchida modalul Show(). +PROCEDURE VerificaIncasareLaEditare + LPARAMETERS tnIdVanzare, tcEticheta, tnIncasatAsteptat, tnNrIncasareAsteptat, tnTipIncasareAsteptat, tnModAsteptat + + LOCAL lcPrefix, lnSucces, loForm, pnDiscountRon, pnDiscountValuta + LOCAL lnSters, llEProforma, lnTipDoc, lcSnapPlajeA, lcSnapPlajeB + PRIVATE pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP, poDate + Store 0 To pnAn, pnLuna, lnCod, lnIdFact, lnIdVanzareP + lcPrefix = Transform(m.tnIdVanzare) + ' [incasare ' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + IF Used('v_plaje_inc_a') + Use In v_plaje_inc_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_inc_a') + Use In v_plaje_inc_a + + lnSucces = goExecutor.oExecute('select id_vanzare,cod,data_act,sters,id_fact,eproforma,tip,incasat from fact_vfacturi where id_vanzare=' + Transform(m.tnIdVanzare), 'crsIncUnic') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': documentul a putut fi reincarcat', lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1, Transform(lnSucces) + IF !(lnSucces >= 0 AND Used('crsIncUnic') AND Reccount('crsIncUnic') = 1) + RETURN + ENDIF + SELECT crsIncUnic + lnIdVanzareP = id_vanzare + lnCod = cod + pnAn = Year(data_act) + pnLuna = Month(data_act) + lnSters = sters + lnIdFact = id_fact + llEProforma = (eproforma = 1) + lnTipDoc = tip + Use In crsIncUnic + + DO asserteaza WITH lcPrefix + ': garzile do_editare_unificata trecute (nesters/neproforma/tip valid/luna curenta)', ; + lnSters = 0 AND !llEProforma AND !Inlist(lnTipDoc,44,45,46,51) AND (pnAn*12+pnLuna) == (gnAn*12+gnLuna), '' + DO asserteaza WITH lcPrefix + ': fara referinte (incasari/plati)', !ReferinteDocumenteNota(pnAn, pnLuna, lnCod), '' + DO asserteaza WITH lcPrefix + ': nu e in eFactura', !EsteInEFactura(lnIdFact), '' + DO asserteaza WITH lcPrefix + ': fara urmasi', !DocumentAreUrmasi(lnIdVanzareP), '' + + poDate = IncarcaAntetFacturaEditare(lnIdVanzareP, @pnDiscountRon, @pnDiscountValuta) + DO asserteaza WITH lcPrefix + ': IncarcaAntetFacturaEditare reuseste', Vartype(m.poDate) == 'O', Vartype(m.poDate) + IF Vartype(m.poDate) <> 'O' + RETURN + ENDIF + + IncarcaLiniiFacturaEditare(poDate, lnIdVanzareP) + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF Used('jtva_coloane') + Use In jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + Select * From jtva_coloane_temp Where Isnull(id_jtva_ex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ELSE + Select * From jtva_coloane_temp Where Isnull(id_jtva_neex) And !'RORTC'$Upper(coloana_jv) Into Cursor jtva_coloane + ENDIF + + loForm = Createobject('frm_facturare_articole2') + DO asserteaza WITH lcPrefix + ': formularul se deschide fara eroare (defectul 5 latent nu se activeaza)', Vartype(m.loForm) == 'O', Vartype(m.loForm) + IF Vartype(m.loForm) <> 'O' + RETURN + ENDIF + DO asserteaza WITH lcPrefix + ': G9 niciun amessagebox la Createobject/Init', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + *!* --- asertiunile care prind regresia D1/D3/D4 --- + DO asserteaza WITH lcPrefix + ': poDate.incasat = valoarea din baza (NU suprascrisa cu totalctva)', ; + Round(Nvl(poDate.incasat,-1),2) == Round(m.tnIncasatAsteptat,2), Transform(Nvl(poDate.incasat,-1)) + DO asserteaza WITH lcPrefix + ': poDate.nr_incasare nu a fost zeroit', ; + Nvl(poDate.nr_incasare,-1) == m.tnNrIncasareAsteptat, Transform(Nvl(poDate.nr_incasare,-1)) + DO asserteaza WITH lcPrefix + ': poDate.ntip_incasare incarcat corect', ; + Nvl(poDate.ntip_incasare,-1) == m.tnTipIncasareAsteptat, Transform(Nvl(poDate.ntip_incasare,-1)) + DO asserteaza WITH lcPrefix + ': modul afisat (opt_incasat.Value) corespunde tip_incasare', ; + loForm.ct_incasare.opt_incasat.Value == m.tnModAsteptat - 1, Transform(loForm.ct_incasare.opt_incasat.Value) + DO asserteaza WITH lcPrefix + ': chk_incasare.Value = 1 (document incasat)', loForm.chk_incasare.Value == 1, Transform(loForm.chk_incasare.Value) + DO asserteaza WITH lcPrefix + ': grupC ct_incasare needitabil', !loForm.ct_incasare.Enabled, Transform(loForm.ct_incasare.Enabled) + DO asserteaza WITH lcPrefix + ': grupC chk_incasare needitabil', !loForm.chk_incasare.Enabled, Transform(loForm.chk_incasare.Enabled) + + loForm.ndiscfactron = pnDiscountRon + loForm.ndiscfactval = pnDiscountValuta + loForm.do_calculeaza_totaluri() + + *!* nemodal: eliberarea din Timer, in interiorul propriului Show() modal, blocheaza VFP in Release() + loForm.WindowType = 0 + goDriverS8p7.Reseteaza() + loForm.Show() + DO asserteaza WITH lcPrefix + ': niciun amessagebox pe parcursul Show()', Empty(gcMockUltimMesaj), gcMockUltimMesaj + + Try + loForm.Release() + Catch + Endtry + + IF Used('v_plaje_inc_b') + Use In v_plaje_inc_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_inc_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_inc_b') + Use In v_plaje_inc_b + DO asserteaza WITH lcPrefix + ' G2: vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' +ENDPROC + + +PROCEDURE CursorToSnapshot + LPARAMETERS tcAlias + + LOCAL lcResult, lnI + lcResult = '' + SELECT (m.tcAlias) + SCAN + FOR lnI = 1 TO FCOUNT() + lcResult = lcResult + Transform(Evaluate(Field(m.lnI))) + '|' + ENDFOR + lcResult = lcResult + Chr(10) + ENDSCAN + RETURN m.lcResult +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*!* driverS8p7: gaseste FRM_FACTURARE_ARTICOLE2 in _SCREEN.Forms in timp ce .Show() e blocat pe +*!* modal (un modal tot pompeaza mesaje Windows, deci timerul de pe _SCREEN tot ruleaza - acelasi +*!* tipar ca driverMsgS8 din test_s8_cablare_incarcare.prg, folosit acolo pentru MESSAGEBOX_FORM). +*!* Citeste Ct_clb_altele din Objects (nu PEMSTATUS - RemoveObject scoate din Objects, PEMSTATUS +*!* ramane .T.) inainte sa elibereze forma, ceea ce incheie .Show() si reda controlul apelantului. +DEFINE CLASS driverS8p7 AS Custom + lBusy = .F. + lGasit = .F. + lCtClbPrezent = .F. + lCtClbAlteleActiv = .F. + cCtClbEticheta = '' + nTotalRon = 0 + nTotalVal = 0 + + *!* grupul B si C (S8, docs\raport_s8_grup_bc.md) - Prezent = mai exista in Objects (nu a fost + *!* scos de Init dupa tip/gnScadereStoc), Activ = NU e blocat (Enabled / lactiv / !ReadOnly, dupa + *!* mecanismul folosit de fiecare control) + lClbFdocPrezent = .F. + lClbFdocActiv = .F. + lCtClbNumeClientPrezent = .F. + lCtClbNumeClientActiv = .F. + lCtClbValutaPrezent = .F. + lCtClbValutaActiv = .F. + lClbZiCursPrezent = .F. + lClbZiCursActiv = .F. + lCtClbGestiuneInitPrezent = .F. + lCtClbGestiuneInitActiv = .F. + lCtClbPolPreturiPrezent = .F. + lCtClbPolPreturiActiv = .F. + lButIncarcaArticolePrezent = .F. + lButIncarcaArticoleActiv = .F. + lButCursuriPrezent = .F. + lButCursuriActiv = .F. + lCtIncasarePrezent = .F. + lCtIncasareActiv = .F. + lChkIncasarePrezent = .F. + lChkIncasareActiv = .F. + + PROCEDURE Reseteaza + This.lGasit = .F. + This.lCtClbPrezent = .F. + This.lCtClbAlteleActiv = .F. + This.cCtClbEticheta = '' + This.nTotalRon = 0 + This.nTotalVal = 0 + This.lClbFdocPrezent = .F. + This.lClbFdocActiv = .F. + This.lCtClbNumeClientPrezent = .F. + This.lCtClbNumeClientActiv = .F. + This.lCtClbValutaPrezent = .F. + This.lCtClbValutaActiv = .F. + This.lClbZiCursPrezent = .F. + This.lClbZiCursActiv = .F. + This.lCtClbGestiuneInitPrezent = .F. + This.lCtClbGestiuneInitActiv = .F. + This.lCtClbPolPreturiPrezent = .F. + This.lCtClbPolPreturiActiv = .F. + This.lButIncarcaArticolePrezent = .F. + This.lButIncarcaArticoleActiv = .F. + This.lButCursuriPrezent = .F. + This.lButCursuriActiv = .F. + This.lCtIncasarePrezent = .F. + This.lCtIncasareActiv = .F. + This.lChkIncasarePrezent = .F. + This.lChkIncasareActiv = .F. + ENDPROC + + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + TRY + LOCAL lnI, lnJ, lnJ2, loFrm2, loObj, loObj2 + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + This.nTotalRon = Nvl(loFrm2.ntotalron, 0) + This.nTotalVal = Nvl(loFrm2.ntotalval, 0) + FOR lnJ = 1 TO loFrm2.Objects.Count + loObj = loFrm2.Objects(m.lnJ) + DO CASE + CASE Upper(loObj.Name) == 'CT_CLB_ALTELE' + This.lCtClbPrezent = .T. + This.lCtClbAlteleActiv = loObj.lactiv + This.cCtClbEticheta = Alltrim(loObj.clb_tx_cautare.lb_SIMPLU1.Caption) + CASE Upper(loObj.Name) == 'CLB_FDOC' + This.lClbFdocPrezent = .T. + This.lClbFdocActiv = loObj.cboFdoc.Enabled + CASE Upper(loObj.Name) == 'CT_CLB_NUME_CLIENT' + This.lCtClbNumeClientPrezent = .T. + This.lCtClbNumeClientActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CT_CLB_VALUTA' + This.lCtClbValutaPrezent = .T. + This.lCtClbValutaActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'CLB_ZI_CURS' + This.lClbZiCursPrezent = .T. + This.lClbZiCursActiv = !loObj.text_simplu1.ReadOnly + CASE Upper(loObj.Name) == 'CT_CLB_POLITICI_PRETURI' + This.lCtClbPolPreturiPrezent = .T. + This.lCtClbPolPreturiActiv = loObj.lactiv + CASE Upper(loObj.Name) == 'BUT_INCARCA_ARTICOLE' + This.lButIncarcaArticolePrezent = .T. + This.lButIncarcaArticoleActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'BUT_CURSURI' + This.lButCursuriPrezent = .T. + This.lButCursuriActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_INCASARE' + This.lCtIncasarePrezent = .T. + This.lCtIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CHK_INCASARE' + This.lChkIncasarePrezent = .T. + This.lChkIncasareActiv = loObj.Enabled + CASE Upper(loObj.Name) == 'CT_CONTABILITATE' + FOR lnJ2 = 1 TO loObj.Objects.Count + loObj2 = loObj.Objects(m.lnJ2) + IF Upper(loObj2.Name) == 'CT_CLB_GESTIUNE_INIT' + This.lCtClbGestiuneInitPrezent = .T. + This.lCtClbGestiuneInitActiv = loObj2.lactiv + ENDIF + ENDFOR + ENDCASE + ENDFOR + loFrm2.Release() + EXIT + ENDIF + ENDFOR + CATCH TO loExcS8p7 + STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8p7.ErrorNo) + ' ' + loExcS8p7.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s8b_rutare_scriere.prg b/utile/Teste/editare_factura/test_s8b_rutare_scriere.prg new file mode 100644 index 0000000..6687eb4 --- /dev/null +++ b/utile/Teste/editare_factura/test_s8b_rutare_scriere.prg @@ -0,0 +1,653 @@ +* test_s8b_rutare_scriere.prg +* Proba S8b (docs\propunere_s8b_rutare_scriere.md sectiunea 5): cele 4 rute de scriere la editarea +* unui document existent, pe traseul REAL Newobject('frm_facturi') + .do_editare_unificata() + +* Thisform.do_scrie_factura() (nu apel direct pe AlegeRutaScriereEditare - proba doar codul, nu +* traseul, cf. lectia platita de trei ori in acest plan). +* +* 4 documente distincte, din setul deja folosit de test_s8_editare_incarcare.prg: +* 1047 - caz 1: nimic schimbat -> ruta 0, zero apeluri goExecutor intre deschidere si confirmare +* (DEVIZE AUTO, fara delegat - inlocuieste 1113, stricat de un diagnostic anterior) +* 1055 - caz 2: antet schimbat (text_aditional) -> ruta 2, UPDATE VANZARI pe id-ul real (defectul +* "id_vanzare sentinela" de la S8b, corectat aici) +* 1048 - caz 3: explicatie de linie schimbata -> ruta 3, UPDATE VANZARI_DETALII pe linia atinsa +* caz 4: cantitate schimbata pe o linie -> ruta 1 (regenerare), implementata (S9/S11/S14): sterge +* documentul vechi si reemite unul nou pe acelasi (numar_act, serie_act). Document DEDICAT +* (S8B/1, docs\raport_fixtura_1130.md) - nu mai e fix un id, fiindca regenerarea il consuma +* (sters=1) la fiecare rulare reusita, deci se cauta la rulare descendentul viu curent prin +* (numar_act=1, serie_act='S8B'), robust la orice numar de rerulari. Izolat de orice alt +* test - inainte folosea (numar_act=684, serie_act='SSS'), martorul VALUTA folosit cu id +* fix (1130) de alte 6 teste din editare_factura; regenerarea periodica de aici il stergea +* tacut. docs\raport_fixtura_1130.md. +* +* Caz 4 regenereaza documentul (ruta 1), dar fara numar nou - reemiterea forteaza acelasi +* (numar_act, serie_act). Cazurile 1-3 nu regenereaza; modifica_date_factura/ +* modifica_explicatie_articol nu aloca numere (verificat prin snapshot vplaje_numere inainte/dupa). +* Contorul de apeluri goExecutor foloseste tiparul deja validat in acest director +* (facturare_unificat\mock_cursor_articole.prg: subclasa de oexecutor cu oReal, nu DODEFAULT). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8b_rutare_scriere_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +*!* --- 'verificare' (Ferestre\verificare.scx, caz 4) foloseste GRID1.Gridextra1 - lipsa din +*!* SET PATH/CLASSLIB de test_init_env_auto_roafacturare.prg (nu are nevoie de el in mod normal). +*!* Adaugat preventiv, acelasi tipar deja validat in test_s6_3_aviz_retur.prg:102-103 pentru +*!* acelasi formular - NU a fost cauza blocajului initial (aceea a fost numele de clasa gresit +*!* la detectie, vezi driverVerificareS8b mai jos), dar ramane utila daca gridextra1.setup() +*!* (verificare.sc2:1159) ar avea nevoie de resurse din acest folder pe alte date de test --- +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE + +PUBLIC gnScadereStoc +gnScadereStoc = 0 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns, gnContorExecutiiS8b +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 +gnContorExecutiiS8b = 0 + +*!* --- driver care gaseste fereastra modala frm_facturare_articole2, aplica mutatia specifica +*!* cazului, cheama Thisform.do_scrie_factura() si inchide fereastra (acelasi tipar validat in +*!* test_s8_editare_incarcare.prg / driverS8p7 - Timer legat de _SCREEN prin Bindevent, viu in +*!* interiorul Show()-ului modal, care citeste formularul din colectia Forms) --- +*!* Hide(), nu Release() direct: pentru WindowType modal, Show() se intoarce la Hide() (Visible=.F.) +*!* la fel de bine ca la Release() (documentat MS: "suspended until the form is either hidden or +*!* released") - deblocheaza Show() FARA sa distruga obiectul din Timer; distrugerea reala vine +*!* singura, dupa ce Show() revine, cand loForm (local in do_editare_unificata) iese din scop - +*!* deci pe stiva do_editare_unificata, nu pe stiva Timer-ului reentrant. PostMessage(WM_CLOSE) +*!* incercat prima data a produs "Menu manager internal consistency error" pe cazurile cu scriere +*!* reala (2/3/4) - infirmat, vezi docs\raport_reparatie_s8b_rutare_scriere.md +PUBLIC goDriverS8b +goDriverS8b = Createobject('driverS8bRutare') +_SCREEN.AddObject('tmrS8bRutare', 'Timer') +_SCREEN.tmrS8bRutare.Interval = 150 +BINDEVENT(_SCREEN.tmrS8bRutare, 'Timer', goDriverS8b, 'Executa') +_SCREEN.tmrS8bRutare.Enabled = .T. + +*!* --- al doilea driver/timer, INDEPENDENT de tmrS8bRutare: 'verificare' (Ferestre\verificare.scx, +*!* clasa runtime _frmbase - vezi nota de mai jos) se deschide DIN INTERIORUL do_scrie_factura() (ofacturare.vc2:20532), deci +*!* pe cand goDriverS8b.lBusy e inca .T. - garda lui de reintrare l-ar impiedica sa trateze un al +*!* doilea formular modal aparut in timpul propriei rulari. Timer separat, la fel ca tmrDrv8/ +*!* driverAlteDate8 din creeaza_documente_s8.prg, ca sa poata raspunde in timp ce Timer-ul principal +*!* e inca "ocupat" mai jos pe stiva. do_termin() (nu Release/Hide direct) - seteaza gnButon=1 +*!* (_frm_base.vc2:363-376), aceeasi valoare pre-setata la ofacturare.vc2:20526 pentru traseul de +*!* CONFIRMARE (If gnButon=1 la linia 20533 continua scrierea reala - finalizeaza_scriere_verificare/ +*!* scrie_factura_avize_retur; orice alta valoare ar sari peste finalizare, netratand cazul ca un +*!* utilizator care apasa Terminare/CTRL+F) +PUBLIC goDriverVerifS8b, glDlgTratatVerifS8b +glDlgTratatVerifS8b = .F. +goDriverVerifS8b = Createobject('driverVerificareS8b') +_SCREEN.AddObject('tmrVerifS8b', 'Timer') +_SCREEN.tmrVerifS8b.Interval = 150 +BINDEVENT(_SCREEN.tmrVerifS8b, 'Timer', goDriverVerifS8b, 'Executa') +_SCREEN.tmrVerifS8b.Enabled = .T. + +*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe cele 4 documente --- +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +LOCAL lcSchema, lcSelect, lcOrder, lcFiltru +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +*!* --- caz 4 (cantitate schimbata -> ruta 1 regenerare): document dedicat (S8B/1, docs\ +*!* raport_fixtura_1130.md), izolat de orice alt test - regenerarea nu mai consuma un martor +*!* partajat. Descendentul viu se gaseste prin (numar_act, serie_act), care ramane FORTAT +*!* constant peste regenerari (ForteazaIdFactReemitere, ofacturare_rutare_scriere.prg:506-509), +*!* nu prin id_vanzare --- +LOCAL lnCaz4IdVanzare, lnSuccesCaz4 +lnCaz4IdVanzare = 1720 +IF USED('v_caz4_live') + USE IN v_caz4_live +ENDIF +lnSuccesCaz4 = goExecutor.oExecute([select id_vanzare from vanzari where numar_act = 1 and serie_act = 'S8B' and tip = 5 and sters = 0], 'v_caz4_live') +goExecutor.oReset() +IF lnSuccesCaz4 >= 0 AND USED('v_caz4_live') AND RECCOUNT('v_caz4_live') = 1 + lnCaz4IdVanzare = v_caz4_live.id_vanzare +ENDIF +USE IN v_caz4_live + +lcOrder = [data_act,numar_act] +lcFiltru = [id_vanzare in (1047, 1055, 1048, ] + TRANSFORM(m.lnCaz4IdVanzare) + [)] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +DO asserteaza WITH 'crsfacturi incarcat cu cele 4 documente reale (rownum=4)', Used('crsfacturi') AND Reccount('crsfacturi') = 4, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') + +*!* ===================================================================================== +*!* cele 4 rute, document distinct per caz +*!* ===================================================================================== +*!* 1047 (DEVIZE AUTO, fara delegat) in loc de 1113 - 1113 a fost stricat de un script de +*!* diagnostic anterior din acest bloc (a scris DATA_ACT=01.09.2026 direct, testand daca SQL +*!* literal functioneaza), scotandu-l din luna curenta de test; 1047 nu a fost atins de nimic +DO VerificaRutaEditare WITH 1047, 1, 'nimic schimbat - ruta 0' +DO VerificaRutaEditare WITH 1055, 2, 'antet schimbat (text_aditional) - ruta 2' +DO VerificaRutaEditare WITH 1048, 3, 'explicatie linie schimbata - ruta 3' +DO VerificaRutaEditare WITH lnCaz4IdVanzare, 4, 'cantitate schimbata - ruta 1 regenerare' + +_SCREEN.tmrS8bRutare.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrS8bRutare') +Catch +Endtry + +_SCREEN.tmrVerifS8b.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrVerifS8b') +Catch +Endtry + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*!* ===================================================================================== +PROCEDURE VerificaRutaEditare + LPARAMETERS tnIdVanzare, tnCaz, tcEticheta + + LOCAL lcPrefix, lnSucces, loFrm + LOCAL lcSnapPlajeA, lcSnapPlajeB + LOCAL lcTextAditionalVechi, lnCountLiniiA, lnIdVanzareDetPrimaLinie, lnCantitateVeche, lcExplicatieVeche + lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [ruta ' + TRANSFORM(m.tnCaz) + ' - ' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + DO CurataAliasuriReziduale + + *!* --- G2: nicio ruta din S8b aloca numere - snapshot INAINTE --- + IF USED('v_plaje_s8b_a') + USE IN v_plaje_s8b_a + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_s8b_a') + goExecutor.oReset() + lcSnapPlajeA = CursorToSnapshot('v_plaje_s8b_a') + USE IN v_plaje_s8b_a + + *!* --- martor antet Oracle, INAINTE --- + IF USED('v_antet_s8b_a') + USE IN v_antet_s8b_a + ENDIF + lnSucces = goExecutor.oExecute([select text_aditional from vanzari where id_vanzare = ] + TRANSFORM(m.tnIdVanzare), 'v_antet_s8b_a') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor antet Oracle a reusit', lnSucces >= 0 AND USED('v_antet_s8b_a') AND RECCOUNT('v_antet_s8b_a') = 1, TRANSFORM(lnSucces) + lcTextAditionalVechi = ALLTRIM(NVL(v_antet_s8b_a.text_aditional,'')) + USE IN v_antet_s8b_a + + *!* --- martor linii Oracle, INAINTE - id_vanzare_det/cantitate/explicatie ale primei linii, + *!* aceeasi ordine (id_vanzare_det) ca cea folosita de creeaza_facturacrs/prelucreaza_facturacrs --- + IF USED('v_linii_s8b_a') + USE IN v_linii_s8b_a + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_det, cantitate, explicatie from vanzari_detalii where id_vanzare = ] + TRANSFORM(m.tnIdVanzare) + [ and sters = 0 order by id_vanzare_det], 'v_linii_s8b_a') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor linii Oracle a reusit', lnSucces >= 0 AND USED('v_linii_s8b_a') AND RECCOUNT('v_linii_s8b_a') >= 1, TRANSFORM(lnSucces) + lnCountLiniiA = RECCOUNT('v_linii_s8b_a') + SELECT v_linii_s8b_a + GO TOP + lnIdVanzareDetPrimaLinie = id_vanzare_det + lnCantitateVeche = cantitate + lcExplicatieVeche = ALLTRIM(NVL(explicatie,'')) + USE IN v_linii_s8b_a + + Select crsfacturi + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', VARTYPE(m.loFrm) == 'O', VARTYPE(m.loFrm) + IF VARTYPE(m.loFrm) <> 'O' + RETURN + ENDIF + + Select crsfacturi + Locate For id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', FOUND(), TRANSFORM(FOUND()) + IF !FOUND() + loFrm.Release() + RETURN + ENDIF + + *!* --- driverS8bRutare gaseste formularul, aplica mutatia cazului, cheama do_scrie_factura, + *!* inchide formularul --- + glDlgTratatVerifS8b = .F. + goDriverVerifS8b.cCaleUrmata = '' + goDriverS8b.Reseteaza() + goDriverS8b.nCaz = m.tnCaz + STRTOFILE('MARK ' + lcPrefix + ': inainte de do_editare_unificata' + CHR(13) + CHR(10), gcErrLog, 1) + loFrm.do_editare_unificata() + STRTOFILE('MARK ' + lcPrefix + ': dupa do_editare_unificata' + CHR(13) + CHR(10), gcErrLog, 1) + + DO asserteaza WITH lcPrefix + ': formularul s-a deschis (driver a gasit frm_facturare_articole2)', goDriverS8b.lGasit, TRANSFORM(goDriverS8b.lGasit) + IF !goDriverS8b.lGasit + *!* diagnostic: care garda a respins do_editare_unificata - CU MESAJ (gcMockUltimMesaj) sau + *!* silentioasa (garda goala, ex. glLunaInchisa/ReferinteDocumenteNota/EsteInEFactura/DocumentAreUrmasi) + STRTOFILE(lcPrefix + ' diagnostic iesire: mesaj=[' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) + Try + loFrm.Release() + Catch + Endtry + DO CurataAliasuriReziduale + RETURN + ENDIF + + DO asserteaza WITH lcPrefix + ': fara eroare in driver la mutarea datelor/confirmare - ' + goDriverS8b.cEroare, EMPTY(goDriverS8b.cEroare), goDriverS8b.cEroare + DO asserteaza WITH lcPrefix + ': do_scrie_factura a intors un rezultat (fara exceptie)', goDriverS8b.lRezultatCapturat, TRANSFORM(goDriverS8b.lRezultatCapturat) + DO asserteaza WITH lcPrefix + ': linia gasita de driver = prima linie din martorul Oracle (ordine id_vanzare_det)', ; + VAL(goDriverS8b.cIdTempLinie) == m.lnIdVanzareDetPrimaLinie OR m.tnCaz < 3, TRANSFORM(VAL(goDriverS8b.cIdTempLinie)) + + Try + loFrm.Release() + Catch + Endtry + + *!* --- G2: nicio ruta din S8b aloca numere - snapshot DUPA, trebuie identic --- + IF USED('v_plaje_s8b_b') + USE IN v_plaje_s8b_b + ENDIF + lnSucces = goExecutor.oExecute([select id_plaja, urmval from vplaje_numere order by id_plaja], 'v_plaje_s8b_b') + goExecutor.oReset() + lcSnapPlajeB = CursorToSnapshot('v_plaje_s8b_b') + USE IN v_plaje_s8b_b + DO asserteaza WITH lcPrefix + ': vplaje_numere identic inainte/dupa (niciun numar alocat)', m.lcSnapPlajeA == m.lcSnapPlajeB, '' + + DO CASE + CASE m.tnCaz = 1 + *!* --- cazul 1: nimic schimbat - ruta 0, zero apeluri goExecutor intre deschidere si confirmare --- + DO asserteaza WITH lcPrefix + ': ruta 0 - do_scrie_factura intoarce .T.', goDriverS8b.lRezultat, TRANSFORM(goDriverS8b.lRezultat) + DO asserteaza WITH lcPrefix + ': ruta 0 - zero apeluri catre goExecutor (contor)', goDriverS8b.nContorExecutii == 0, TRANSFORM(goDriverS8b.nContorExecutii) + + CASE m.tnCaz = 2 + *!* --- cazul 2: antet schimbat (text_aditional) - ruta 2, UPDATE VANZARI pe id-ul real --- + DO asserteaza WITH lcPrefix + ': ruta 2 - do_scrie_factura intoarce .T.', goDriverS8b.lRezultat, TRANSFORM(goDriverS8b.lRezultat) + DO asserteaza WITH lcPrefix + ': ruta 2 - cel putin un apel catre goExecutor', goDriverS8b.nContorExecutii >= 1, TRANSFORM(goDriverS8b.nContorExecutii) + + LOCAL lcTextAditionalNou, lnCountLiniiB + IF USED('v_antet_s8b_b') + USE IN v_antet_s8b_b + ENDIF + lnSucces = goExecutor.oExecute([select text_aditional from vanzari where id_vanzare = ] + TRANSFORM(m.tnIdVanzare), 'v_antet_s8b_b') + goExecutor.oReset() + lcTextAditionalNou = ALLTRIM(NVL(v_antet_s8b_b.text_aditional,'')) + USE IN v_antet_s8b_b + DO asserteaza WITH lcPrefix + ': VANZARI.TEXT_ADITIONAL = valoarea noua (UPDATE a atins randul real, nu sentinela)', ; + m.lcTextAditionalNou == ALLTRIM(goDriverS8b.cValoareNoua), m.lcTextAditionalNou + DO asserteaza WITH lcPrefix + ': VANZARI.TEXT_ADITIONAL s-a schimbat fata de vechea valoare', !(m.lcTextAditionalNou == m.lcTextAditionalVechi), m.lcTextAditionalVechi + + IF USED('v_linii_s8b_b') + USE IN v_linii_s8b_b + ENDIF + lnSucces = goExecutor.oExecute([select count(*) as nr from vanzari_detalii where id_vanzare = ] + TRANSFORM(m.tnIdVanzare) + [ and sters = 0], 'v_linii_s8b_b') + goExecutor.oReset() + lnCountLiniiB = NVL(v_linii_s8b_b.nr,-1) + USE IN v_linii_s8b_b + DO asserteaza WITH lcPrefix + ': VANZARI_DETALII neatins (ruta 2 nu scrie liniile)', m.lnCountLiniiA == m.lnCountLiniiB, TRANSFORM(m.lnCountLiniiB) + + CASE m.tnCaz = 3 + *!* --- cazul 3: explicatie linie schimbata - ruta 3, VANZARI_DETALII.EXPLICATIE, VANZARI neatins --- + DO asserteaza WITH lcPrefix + ': ruta 3 - do_scrie_factura intoarce .T.', goDriverS8b.lRezultat, TRANSFORM(goDriverS8b.lRezultat) + DO asserteaza WITH lcPrefix + ': ruta 3 - cel putin un apel catre goExecutor', goDriverS8b.nContorExecutii >= 1, TRANSFORM(goDriverS8b.nContorExecutii) + + LOCAL lcExplicatieNoua, lcTextAditionalB3 + IF USED('v_expl_s8b_b') + USE IN v_expl_s8b_b + ENDIF + lnSucces = goExecutor.oExecute([select explicatie from vanzari_detalii where id_vanzare_det = ] + TRANSFORM(m.lnIdVanzareDetPrimaLinie), 'v_expl_s8b_b') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor linie Oracle a reusit', lnSucces >= 0 AND USED('v_expl_s8b_b') AND RECCOUNT('v_expl_s8b_b') = 1, TRANSFORM(lnSucces) + lcExplicatieNoua = ALLTRIM(NVL(v_expl_s8b_b.explicatie,'')) + USE IN v_expl_s8b_b + DO asserteaza WITH lcPrefix + ': VANZARI_DETALII.EXPLICATIE a fost scrisa pe linia atinsa', m.lcExplicatieNoua == ALLTRIM(goDriverS8b.cValoareNoua), m.lcExplicatieNoua + DO asserteaza WITH lcPrefix + ': VANZARI_DETALII.EXPLICATIE s-a schimbat fata de vechea valoare', !(m.lcExplicatieNoua == m.lcExplicatieVeche), m.lcExplicatieVeche + + IF USED('v_antet_s8b_c') + USE IN v_antet_s8b_c + ENDIF + lnSucces = goExecutor.oExecute([select text_aditional from vanzari where id_vanzare = ] + TRANSFORM(m.tnIdVanzare), 'v_antet_s8b_c') + goExecutor.oReset() + lcTextAditionalB3 = ALLTRIM(NVL(v_antet_s8b_c.text_aditional,'')) + USE IN v_antet_s8b_c + DO asserteaza WITH lcPrefix + ': VANZARI (antet) neatins (ruta 3 nu scrie antetul)', m.lcTextAditionalB3 == m.lcTextAditionalVechi, m.lcTextAditionalB3 + + CASE m.tnCaz = 4 + *!* --- cazul 4: cantitate schimbata - ruta 1 (regenerare, implementata S9/S11/S14): sterge + *!* documentul vechi (sters=1) si reemite unul nou pe acelasi (numar_act, serie_act) - + *!* StergeDocumentFacturare + ForteazaIdFactReemitere, ofacturare_rutare_scriere.prg --- + DO asserteaza WITH lcPrefix + ': ruta 1 - do_scrie_factura intoarce .T. (regenerare reusita)', goDriverS8b.lRezultat, TRANSFORM(goDriverS8b.lRezultat) + DO asserteaza WITH lcPrefix + ': ruta 1 - cel putin un apel catre goExecutor (regenerare reala)', goDriverS8b.nContorExecutii >= 1, TRANSFORM(goDriverS8b.nContorExecutii) + + LOCAL lnCaz4IdNou, lnCantitateNoua + lnCaz4IdNou = 0 + IF USED('v_caz4_live_b') + USE IN v_caz4_live_b + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare from vanzari where numar_act = 1 and serie_act = 'S8B' and tip = 5 and sters = 0], 'v_caz4_live_b') + goExecutor.oReset() + IF lnSucces >= 0 AND USED('v_caz4_live_b') AND RECCOUNT('v_caz4_live_b') = 1 + lnCaz4IdNou = v_caz4_live_b.id_vanzare + ENDIF + USE IN v_caz4_live_b + DO asserteaza WITH lcPrefix + ': ruta 1 - documentul vechi a fost inlocuit cu unul nou (acelasi numar_act/serie_act)', lnCaz4IdNou > 0 AND lnCaz4IdNou <> m.tnIdVanzare, TRANSFORM(lnCaz4IdNou) + + IF USED('v_vechi_s8b_b') + USE IN v_vechi_s8b_b + ENDIF + lnSucces = goExecutor.oExecute([select sters from vanzari where id_vanzare = ] + TRANSFORM(m.tnIdVanzare), 'v_vechi_s8b_b') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': ruta 1 - documentul vechi e marcat sters', lnSucces >= 0 AND USED('v_vechi_s8b_b') AND RECCOUNT('v_vechi_s8b_b') = 1 AND v_vechi_s8b_b.sters == 1, IIF(USED('v_vechi_s8b_b'), TRANSFORM(NVL(v_vechi_s8b_b.sters,-1)), 'lipsa') + USE IN v_vechi_s8b_b + + IF lnCaz4IdNou > 0 + IF USED('v_cant_s8b_b') + USE IN v_cant_s8b_b + ENDIF + lnSucces = goExecutor.oExecute([select cantitate from vanzari_detalii where id_vanzare = ] + TRANSFORM(lnCaz4IdNou) + [ and sters = 0 order by id_vanzare_det], 'v_cant_s8b_b') + goExecutor.oReset() + lnCantitateNoua = NVL(v_cant_s8b_b.cantitate,-1) + USE IN v_cant_s8b_b + DO asserteaza WITH lcPrefix + ': ruta 1 - documentul nou preia cantitatea modificata (veche+1)', ROUND(m.lnCantitateNoua,4) == ROUND(m.lnCantitateVeche+1,4), TRANSFORM(m.lnCantitateNoua) + ENDIF + + ENDCASE + + DO CurataAliasuriReziduale +ENDPROC + + +PROCEDURE CurataAliasuriReziduale + LOCAL laAlias(1), lnI, lcA + laAlias(1) = 'CRSGESTIUNI' + DIMENSION laAlias(9) + laAlias(2) = 'JTVA_COLOANE' + laAlias(3) = 'JTVA_COLOANE_TEMP' + laAlias(4) = 'SAFT_TAXTABLE' + laAlias(5) = 'CRSCURSURI' + laAlias(6) = 'CRSARTICOLE_DOC' + laAlias(7) = 'CRSARTICOLE_EDITARE' + laAlias(8) = 'V_ANTET_EDITARE' + laAlias(9) = 'CRSFACTURA' + FOR lnI = 1 TO ALEN(laAlias) + lcA = laAlias(lnI) + IF Used(m.lcA) + Use In (m.lcA) + ENDIF + ENDFOR +ENDPROC + + +PROCEDURE CursorToSnapshot + LPARAMETERS tcAlias + + LOCAL lcResult, lnI + lcResult = '' + SELECT (m.tcAlias) + SCAN + FOR lnI = 1 TO FCOUNT() + lcResult = lcResult + Transform(Evaluate(Field(m.lnI))) + '|' + ENDFOR + lcResult = lcResult + Chr(10) + ENDSCAN + RETURN m.lcResult +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*!* --- subclasa de contor pentru oexecutor: acelasi tipar ca facturare_unificat\mock_cursor_articole.prg +*!* (oReal, nu DODEFAULT) - numara ORICE apel catre oExecute; oExecuta (mostenita, nesuprascrisa) +*!* cheama intern This.oExecute, deci e numarata automat, fara suprascriere separata --- +DEFINE CLASS oExecutorContorS8b AS oexecutor + oReal = NULL + + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect + LOCAL lnNr, lRetExec + gnContorExecutiiS8b = gnContorExecutiiS8b + 1 + lnNr = gnContorExecutiiS8b + STRTOFILE('MARK oExecute #' + TRANSFORM(m.lnNr) + ': begin ' + LEFT(m.tcSql, 120) + CHR(13) + CHR(10), gcErrLog, 1) + IF 'CITESTE_SETARI_DOCUMENT' $ UPPER(m.tcSql) + LOCAL lnNivel, lcStack, lcProg + lcStack = '' + FOR lnNivel = 1 TO 20 + lcProg = SYS(16, m.lnNivel) + IF EMPTY(m.lcProg) + EXIT + ENDIF + lcStack = lcStack + ' [' + TRANSFORM(m.lnNivel) + '] ' + m.lcProg + CHR(13) + CHR(10) + ENDFOR + STRTOFILE('MARK oExecute #' + TRANSFORM(m.lnNr) + ': STACK' + CHR(13) + CHR(10) + m.lcStack, gcErrLog, 1) + ENDIF + TRY + lRetExec = This.oReal.oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect) + STRTOFILE('MARK oExecute #' + TRANSFORM(m.lnNr) + ': dupa, rezultat=' + TRANSFORM(m.lRetExec) + CHR(13) + CHR(10), gcErrLog, 1) + CATCH TO loExcOExecute + STRTOFILE('MARK oExecute #' + TRANSFORM(m.lnNr) + ': EROARE ' + TRANSFORM(loExcOExecute.ErrorNo) + ' ' + loExcOExecute.Message + CHR(13) + CHR(10), gcErrLog, 1) + THROW + ENDTRY + RETURN m.lRetExec + ENDPROC +ENDDEFINE + + +DEFINE CLASS driverS8bRutare AS Custom + lBusy = .F. + lGasit = .F. + nCaz = 0 + lRezultat = .F. + lRezultatCapturat = .F. + nContorExecutii = -1 + cEroare = '' + cIdTempLinie = '' + cValoareNoua = '' + + PROCEDURE Reseteaza + This.lGasit = .F. + This.lRezultat = .F. + This.lRezultatCapturat = .F. + This.nContorExecutii = -1 + This.cEroare = '' + This.cIdTempLinie = '' + This.cValoareNoua = '' + ENDPROC + + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + TRY + LOCAL lnI, loFrm2, loExecutorOriginal, loExecutorContor + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + + DO CASE + CASE This.nCaz = 2 + *!* antet schimbat - text_aditional, direct pe poDate (Private, viu pe stiva + *!* do_editare_unificata -> Show() -> pompa de mesaje -> acest Timer) + IF TYPE('poDate') == 'O' + This.cValoareNoua = 'S8B TEST ANTET ' + TTOC(DATETIME()) + poDate.text_aditional = This.cValoareNoua + ELSE + This.cEroare = 'poDate nevizibil din driver (caz 2)' + ENDIF + CASE This.nCaz = 3 + IF USED('crsfactura') + SELECT crsfactura + GO TOP + This.cIdTempLinie = TRANSFORM(id_temp) + This.cValoareNoua = 'S8B TEST EXPL ' + TTOC(DATETIME()) + REPLACE explicatie WITH This.cValoareNoua + ELSE + This.cEroare = 'crsfactura nedeschis (caz 3)' + ENDIF + CASE This.nCaz = 4 + IF USED('crsfactura') + SELECT crsfactura + GO TOP + This.cIdTempLinie = TRANSFORM(id_temp) + REPLACE cantitate WITH cantitate + 1 + ELSE + This.cEroare = 'crsfactura nedeschis (caz 4)' + ENDIF + ENDCASE + + IF EMPTY(This.cEroare) + gnContorExecutiiS8b = 0 + loExecutorOriginal = goExecutor + loExecutorContor = Createobject('oExecutorContorS8b') + loExecutorContor.oReal = loExecutorOriginal + goExecutor = loExecutorContor + STRTOFILE('MARK caz ' + TRANSFORM(This.nCaz) + ': inainte de do_scrie_factura' + CHR(13) + CHR(10), gcErrLog, 1) + TRY + This.lRezultat = loFrm2.do_scrie_factura() + This.lRezultatCapturat = .T. + STRTOFILE('MARK caz ' + TRANSFORM(This.nCaz) + ': do_scrie_factura a intors ' + TRANSFORM(This.lRezultat) + CHR(13) + CHR(10), gcErrLog, 1) + CATCH TO loExcInterior + This.cEroare = 'do_scrie_factura: ' + TRANSFORM(loExcInterior.ErrorNo) + ' ' + loExcInterior.Message + ENDTRY + goExecutor = loExecutorOriginal + This.nContorExecutii = gnContorExecutiiS8b + ENDIF + + *!* Hide(), nu Release() direct din Timer - vezi comentariul de la inceputul fisierului + Try + loFrm2.Hide() + Catch + Endtry + EXIT + ENDIF + ENDFOR + CATCH TO loExcS8b + This.cEroare = 'driver: ' + TRANSFORM(loExcS8b.ErrorNo) + ' ' + loExcS8b.Message + STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8b.ErrorNo) + ' ' + loExcS8b.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE + + +*!* --- driverVerificareS8b: cauta 'verificare' (Ferestre/verificare.scx, deschis modal DIN +*!* INTERIORUL do_scrie_factura la a doua regenerare a documentului caz 4) si apasa Terminare +*!* (do_termin) - acelasi tipar validat de driverAlteDate8/tmrDrv8 din creeaza_documente_s8.prg +*!* (timer separat, garda de tratare unica prin variabila globala, PEMSTATUS pe un control cunoscut +*!* ca test suplimentar fata de simplul nume de clasa). Clasa runtime a formularului e '_FRMBASE' +*!* (NU '_frmbase12' din verificare.sc2 - acela e numele sintetizat de FoxBin2Prg pentru textul +*!* .sc2, diferit de .Class la rulare; confirmat empiric printr-un heartbeat de diagnostic, scos +*!* dupa ce a facut treaba - vezi raportul) --- +DEFINE CLASS driverVerificareS8b AS Custom + cCaleUrmata = '' + + PROCEDURE Executa + LOCAL lnI, loForm, llGasit + llGasit = .F. + FOR lnI = 1 TO _SCREEN.FormCount + IF UPPER(_SCREEN.Forms(m.lnI).Class) == '_FRMBASE' AND PEMSTATUS(_SCREEN.Forms(m.lnI), 'but_TERMIN1', 5) + loForm = _SCREEN.Forms(m.lnI) + llGasit = .T. + ENDIF + ENDFOR + IF glDlgTratatVerifS8b OR !llGasit + RETURN + ENDIF + STRTOFILE('MARK driverVerificareS8b: verificare detectat, apas do_termin()' + CHR(13) + CHR(10), gcErrLog, 1) + TRY + *!* lhide=.T. -> do_termin() cheama Hide(), nu Release() (_frm_base.vc2:363-374) - acelasi + *!* motiv ca la loFrm2.Hide() din driverS8bRutare: Release() direct dintr-un Timer nested + *!* (acest driver ruleaza in timp ce goDriverS8b.Executa e inca pe stiva, sub do_scrie_factura) + *!* a produs "Menu manager internal consistency error" (verificat empiric azi) + loForm.lhide = .T. + loForm.do_termin() + glDlgTratatVerifS8b = .T. + *!* Visible=.F. dupa do_termin() = inainte_de_do_termin() (verificare_note_contabile) a + *!* trecut si Hide() chiar a rulat (gnButon=1, traseul de confirmare cerut). Visible=.T. = + *!* validarea de business a RESPINS confirmarea inainte de gnButon/Hide() + *!* (verificare.sc2:1112-1120) - pe datele reale de azi, mesajul e "simboluri analitice + *!* necompletate pentru conturile 4111,704" pe documentul curent - o problema reala in + *!* datele Oracle de test, nu in driver. FALLBACK: do_renunt() (gnButon=2, validare + *!* neconditionata .T. la _frm_base.vc2:489-491) doar ca sa nu ramana testul agatat la + *!* nesfarsit - caz4 va inregistra corect un FAIL pe asertiunile de "regenerare confirmata", + *!* explicat, nu ascuns (vezi cCaleUrmata mai jos, citit din VerificaRutaEditare) + This.cCaleUrmata = 'TERMIN' + IF loForm.Visible + STRTOFILE('MARK driverVerificareS8b: do_termin() respins de validare business - mesaj=[' + gcMockUltimMesaj + '] - fallback do_renunt()' + CHR(13) + CHR(10), gcErrLog, 1) + TRY + loForm.do_renunt() + This.cCaleUrmata = 'RENUNT_FALLBACK' + CATCH TO loExcVerifFallback + STRTOFILE('MARK driverVerificareS8b: fallback do_renunt() CATCH ErrorNo=' + TRANSFORM(loExcVerifFallback.ErrorNo) + ' Message=' + loExcVerifFallback.Message + CHR(13) + CHR(10), gcErrLog, 1) + This.cCaleUrmata = 'RENUNT_FALLBACK_ESUAT' + ENDTRY + ENDIF + STRTOFILE('MARK driverVerificareS8b: dupa do_termin() Visible=' + TRANSFORM(loForm.Visible) + ' cale=' + This.cCaleUrmata + ' mesaj_mock=[' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) + CATCH TO loExcVerifS8b + STRTOFILE('MARK driverVerificareS8b: CATCH ErrorNo=' + TRANSFORM(loExcVerifS8b.ErrorNo) + ' Message=' + loExcVerifS8b.Message + CHR(13) + CHR(10), gcErrLog, 1) + glDlgTratatVerifS8b = .T. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s8c_buton_antet.prg b/utile/Teste/editare_factura/test_s8c_buton_antet.prg new file mode 100644 index 0000000..65a364c --- /dev/null +++ b/utile/Teste/editare_factura/test_s8c_buton_antet.prg @@ -0,0 +1,602 @@ +* test_s8c_buton_antet.prg +* Proba S8c (docs\propunere_s8c_antet.md sectiunea 6): butonul comutator de antet, pe traseul REAL +* Newobject('frm_facturi') + .do_editare_unificata() + Thisform.do_comuta_antet() (nu apel direct pe +* ScrieAntetEditare - proba doar codul, nu traseul, cf. lectia platita de S8b). +* +* Documente reale, deja folosite si validate de test_s8b_rutare_scriere.prg pe MARIUSM_AUTO: +* 1055 - sursa CONTRACT, cu delegat - caz 1 (corectare delegat prin buton) + caz 4 (Termina dupa +* salvare, fara alta modificare, trebuie ruta 0) +* 1048 - factura SIMPLA - caz 2 (corectare data scadentei prin buton) +* 1130 - VALUTA - caz 3 (deschis si inchis fara a apasa butonul, zero scriere) +* +* Masurare pe Oracle (nu pe UI - coloanele/proprietatile de grid nu se materializeaza headless): +* dataoras + numarul de randuri din VANZARI_DETALII, si sumele SUM(valoare)/SUM(valoarev) din +* vact_tot/vrul_tot (acelasi filtru sters=0/an/luna/cod ca StergeDocumentFacturare), neschimbate. + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s8c_buton_antet_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +PUBLIC gnScadereStoc +gnScadereStoc = 0 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns, gnContorExecutiiS8c +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 +gnContorExecutiiS8c = 0 + +*!* --- driver: gaseste fereastra modala frm_facturare_articole2 si conduce cazul (acelasi tipar +*!* validat de test_s8b_rutare_scriere.prg - Timer legat de _SCREEN, viu in interiorul Show()-ului +*!* modal, care citeste formularul din colectia Forms) --- +PUBLIC goDriverS8c +goDriverS8c = Createobject('driverS8cAntet') +_SCREEN.AddObject('tmrS8cAntet', 'Timer') +_SCREEN.tmrS8cAntet.Interval = 150 +BINDEVENT(_SCREEN.tmrS8cAntet, 'Timer', goDriverS8c, 'Executa') +_SCREEN.tmrS8cAntet.Enabled = .T. + +*!* --- crsfacturi, exact ca in test_s8b_rutare_scriere.prg (schema/select deja validate) --- +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +LOCAL lcSchema, lcSelect, lcOrder, lcFiltru +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +lcOrder = [data_act,numar_act] +lcFiltru = [id_vanzare in (1055, 1048, 1130)] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +DO asserteaza WITH 'crsfacturi incarcat cu cele 3 documente reale (rownum=3)', Used('crsfacturi') AND Reccount('crsfacturi') = 3, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') + +*!* --- alternativa valida de delegat pentru cazul 1: orice id_delegat real, diferit de cel curent +*!* de pe 1055 - FK valid (interogare directa pe VANZARI, nu un id inventat); testul scrie in +*!* Oracle real, deci rularile repetate pot lasa 1055 deja pe valoarea scrisa de o rulare anterioara - +*!* interogarea ia direct din baza un delegat diferit, nu unul fix dintr-un document martor --- +LOCAL lnDelegatAlt, lcDelegatAlt, lnDelegatOriginal1055 +lnDelegatAlt = 0 +lcDelegatAlt = '' +IF USED('crsfacturi') + SELECT crsfacturi + LOCATE FOR id_vanzare = 1055 + lnDelegatOriginal1055 = IIF(FOUND(), NVL(id_delegat, 0), 0) +ENDIF +IF USED('v_s8c_delegat_alt') + USE IN v_s8c_delegat_alt +ENDIF +*!* doar id_delegat - "delegat" (numele) nu e coloana pe VANZARI (doar pe view-uri cu JOIN), si oricum +*!* nu e scris de modifica_date_factura/ScrieAntetEditare, deci nu e nevoie de un nume real aici +IF goExecutor.oExecute([select id_delegat from ] + gcs + [.vanzari where id_delegat is not null and id_delegat <> ] + TRANSFORM(NVL(lnDelegatOriginal1055,0)) + [ and rownum <= 1], 'v_s8c_delegat_alt') >= 0 + IF USED('v_s8c_delegat_alt') AND RECCOUNT('v_s8c_delegat_alt') = 1 + lnDelegatAlt = v_s8c_delegat_alt.id_delegat + lcDelegatAlt = 'S8C TEST DELEGAT' + ENDIF +ENDIF +goExecutor.oReset() +IF USED('v_s8c_delegat_alt') + USE IN v_s8c_delegat_alt +ENDIF +DO asserteaza WITH 'alternativa de delegat gasita in Oracle, diferita de cea curenta de pe 1055', lnDelegatAlt > 0 AND lnDelegatAlt <> lnDelegatOriginal1055, TRANSFORM(lnDelegatAlt) + +*!* ===================================================================================== +*!* cele 3 cazuri ale criteriului "Gata cand", plus caz 4 (ruta 0 dupa salvare) legat de cazul 1 +*!* ===================================================================================== +DO VerificaButonAntetDelegat WITH 1055, lnDelegatAlt, lcDelegatAlt, 'caz 1+4: corectare delegat prin buton, apoi Termina fara alta modificare' +DO VerificaButonAntetDataScad WITH 1048, 'caz 2: corectare data scadentei prin buton' +DO VerificaFaraButon WITH 1130, 'caz 3: deschis si inchis fara a apasa butonul - zero scriere' + +_SCREEN.tmrS8cAntet.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrS8cAntet') +Catch +Endtry + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*!* ===================================================================================== +*!* martor Oracle comun celor 3 cazuri: dataoras antet, numarul si dataoras liniilor, sumele +*!* ACT/RUL ale documentului (acelasi filtru ca StergeDocumentFacturare) +*!* ===================================================================================== +PROCEDURE CapturaMartor + LPARAMETERS tnIdVanzare, tnAn, tnLuna, tnCod, tcAlias + + LOCAL loMartor, lnSucces + loMartor = Createobject('Empty') + + IF USED(m.tcAlias) + USE IN (m.tcAlias) + ENDIF + lnSucces = goExecutor.oExecute([select dataoras, id_delegat, data_scad from vanzari where id_vanzare = ] + TRANSFORM(m.tnIdVanzare), m.tcAlias) + goExecutor.oReset() + IF m.lnSucces >= 0 AND USED(m.tcAlias) AND RECCOUNT(m.tcAlias) = 1 + =AddProperty(loMartor, 'dataoras_antet', NVL(&tcAlias..dataoras, {})) + =AddProperty(loMartor, 'id_delegat', NVL(&tcAlias..id_delegat, 0)) + =AddProperty(loMartor, 'data_scad', NVL(&tcAlias..data_scad, {})) + ELSE + =AddProperty(loMartor, 'dataoras_antet', {}) + =AddProperty(loMartor, 'id_delegat', -1) + =AddProperty(loMartor, 'data_scad', {}) + ENDIF + USE IN (m.tcAlias) + + IF USED(m.tcAlias + '_det') + USE IN (m.tcAlias + '_det') + ENDIF + lnSucces = goExecutor.oExecute([select count(*) as nr, max(dataoras) as mx from vanzari_detalii where id_vanzare = ] + TRANSFORM(m.tnIdVanzare) + [ and sters = 0], m.tcAlias + '_det') + goExecutor.oReset() + =AddProperty(loMartor, 'linii_nr', NVL(Evaluate(m.tcAlias + '_det.nr'), -1)) + =AddProperty(loMartor, 'linii_mx', NVL(Evaluate(m.tcAlias + '_det.mx'), {})) + USE IN (m.tcAlias + '_det') + + IF USED(m.tcAlias + '_act') + USE IN (m.tcAlias + '_act') + ENDIF + *!* vact_tot: coloanele de suma sunt SUMA (lei) / SUMA_VAL (valuta), nu VALOARE/VALOAREV (acelea + *!* sunt specifice vrul_tot) - verificat live (probe_s8c_vact_cols.prg) + lnSucces = goExecutor.oExecute([select nvl(sum(suma),0) as lei, nvl(sum(suma_val),0) as val from ] + gcs + [.vact_tot where sters = 0 and an = ] + TRANSFORM(m.tnAn) + [ and luna = ] + TRANSFORM(m.tnLuna) + [ and cod = ] + TRANSFORM(m.tnCod), m.tcAlias + '_act') + goExecutor.oReset() + =AddProperty(loMartor, 'act_lei', NVL(Evaluate(m.tcAlias + '_act.lei'), -1)) + =AddProperty(loMartor, 'act_val', NVL(Evaluate(m.tcAlias + '_act.val'), -1)) + USE IN (m.tcAlias + '_act') + + IF USED(m.tcAlias + '_rul') + USE IN (m.tcAlias + '_rul') + ENDIF + lnSucces = goExecutor.oExecute([select nvl(sum(valoare),0) as lei, nvl(sum(valoarev),0) as val from ] + gcs + [.vrul_tot where sters = 0 and an = ] + TRANSFORM(m.tnAn) + [ and luna = ] + TRANSFORM(m.tnLuna) + [ and cod = ] + TRANSFORM(m.tnCod), m.tcAlias + '_rul') + goExecutor.oReset() + =AddProperty(loMartor, 'rul_lei', NVL(Evaluate(m.tcAlias + '_rul.lei'), -1)) + =AddProperty(loMartor, 'rul_val', NVL(Evaluate(m.tcAlias + '_rul.val'), -1)) + USE IN (m.tcAlias + '_rul') + + RETURN m.loMartor +ENDPROC + + +*!* ===================================================================================== +PROCEDURE VerificaButonAntetDelegat + LPARAMETERS tnIdVanzare, tnDelegatAlt, tcDelegatAlt, tcEticheta + + LOCAL lcPrefix, loFrm, loMartorA, loMartorB, lnAn, lnLuna, lnCod + lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + DO CurataAliasuriReziduale + IF m.tnDelegatAlt <= 0 + STRTOFILE(lcPrefix + ': SARIT - nicio alternativa valida de delegat gasita' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + + SELECT crsfacturi + LOCATE FOR id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', FOUND(), TRANSFORM(FOUND()) + IF !FOUND() + RETURN + ENDIF + lnAn = YEAR(data_act) + lnLuna = MONTH(data_act) + lnCod = cod + + loMartorA = CapturaMartor(m.tnIdVanzare, m.lnAn, m.lnLuna, m.lnCod, 'v_s8c_a') + + Select crsfacturi + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', VARTYPE(m.loFrm) == 'O', VARTYPE(m.loFrm) + IF VARTYPE(m.loFrm) <> 'O' + RETURN + ENDIF + + SELECT crsfacturi + LOCATE FOR id_vanzare = m.tnIdVanzare + + goDriverS8c.Reseteaza() + goDriverS8c.nCaz = 1 + goDriverS8c.nDelegatAlt = m.tnDelegatAlt + goDriverS8c.cDelegatAlt = m.tcDelegatAlt + loFrm.do_editare_unificata() + + DO asserteaza WITH lcPrefix + ': formularul s-a deschis', goDriverS8c.lGasit, TRANSFORM(goDriverS8c.lGasit) + IF !goDriverS8c.lGasit + STRTOFILE(lcPrefix + ' diagnostic iesire: mesaj=[' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) + Try + loFrm.Release() + Catch + Endtry + DO CurataAliasuriReziduale + RETURN + ENDIF + + DO asserteaza WITH lcPrefix + ': fara eroare in driver - ' + goDriverS8c.cEroare, EMPTY(goDriverS8c.cEroare), goDriverS8c.cEroare + DO asserteaza WITH lcPrefix + ': click 1 a deblocat antetul (lantet_deblocat=.T. dupa click 1)', goDriverS8c.lDeblocatDupaClick1, TRANSFORM(goDriverS8c.lDeblocatDupaClick1) + DO asserteaza WITH lcPrefix + ': click 2 (salvare) - cel putin un apel catre goExecutor', goDriverS8c.nContorClick2 >= 1, TRANSFORM(goDriverS8c.nContorClick2) + DO asserteaza WITH lcPrefix + ': dupa click 2, antetul s-a reblocat (lantet_deblocat=.F.)', goDriverS8c.lReblocatDupaClick2, TRANSFORM(goDriverS8c.lReblocatDupaClick2) + + *!* --- caz 4: Termina fara alta modificare -> ruta 0, snapshot-ul s-a reimprospatat --- + DO asserteaza WITH lcPrefix + ': Termina dupa salvare (fara alta modificare) - zero apeluri suplimentare (ruta 0)', goDriverS8c.nContorTermina == 0, TRANSFORM(goDriverS8c.nContorTermina) + DO asserteaza WITH lcPrefix + ': Termina dupa salvare intoarce .T. (nu blocheaza)', goDriverS8c.lRezultatTermina, TRANSFORM(goDriverS8c.lRezultatTermina) + + Try + loFrm.Release() + Catch + Endtry + + loMartorB = CapturaMartor(m.tnIdVanzare, m.lnAn, m.lnLuna, m.lnCod, 'v_s8c_b') + + DO asserteaza WITH lcPrefix + ': VANZARI.ID_DELEGAT s-a schimbat la valoarea noua', loMartorB.id_delegat == m.tnDelegatAlt, TRANSFORM(loMartorB.id_delegat) + DO asserteaza WITH lcPrefix + ': VANZARI.ID_DELEGAT diferit de valoarea veche', !(loMartorB.id_delegat == loMartorA.id_delegat), TRANSFORM(loMartorA.id_delegat) + DO asserteaza WITH lcPrefix + ': VANZARI_DETALII numar randuri neschimbat (zero scriere pe linii)', loMartorB.linii_nr == loMartorA.linii_nr, TRANSFORM(loMartorB.linii_nr) + DO asserteaza WITH lcPrefix + ': VANZARI_DETALII.MAX(dataoras) neschimbat (zero scriere pe linii)', loMartorB.linii_mx == loMartorA.linii_mx, TRANSFORM(loMartorB.linii_mx) + DO asserteaza WITH lcPrefix + ': suma ACT (lei) neschimbata', ROUND(loMartorB.act_lei, 2) == ROUND(loMartorA.act_lei, 2), TRANSFORM(loMartorB.act_lei) + DO asserteaza WITH lcPrefix + ': suma ACT (valuta) neschimbata', ROUND(loMartorB.act_val, 2) == ROUND(loMartorA.act_val, 2), TRANSFORM(loMartorB.act_val) + DO asserteaza WITH lcPrefix + ': suma RUL (lei) neschimbata', ROUND(loMartorB.rul_lei, 2) == ROUND(loMartorA.rul_lei, 2), TRANSFORM(loMartorB.rul_lei) + DO asserteaza WITH lcPrefix + ': suma RUL (valuta) neschimbata', ROUND(loMartorB.rul_val, 2) == ROUND(loMartorA.rul_val, 2), TRANSFORM(loMartorB.rul_val) + + DO CurataAliasuriReziduale +ENDPROC + + +*!* ===================================================================================== +PROCEDURE VerificaButonAntetDataScad + LPARAMETERS tnIdVanzare, tcEticheta + + LOCAL lcPrefix, loFrm, loMartorA, loMartorB, lnAn, lnLuna, lnCod, ldDataScadNoua + lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + DO CurataAliasuriReziduale + + SELECT crsfacturi + LOCATE FOR id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', FOUND(), TRANSFORM(FOUND()) + IF !FOUND() + RETURN + ENDIF + lnAn = YEAR(data_act) + lnLuna = MONTH(data_act) + lnCod = cod + + loMartorA = CapturaMartor(m.tnIdVanzare, m.lnAn, m.lnLuna, m.lnCod, 'v_s8c_c') + ldDataScadNoua = IIF(EMPTY(loMartorA.data_scad), DATE() + 30, loMartorA.data_scad + 5) + + Select crsfacturi + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', VARTYPE(m.loFrm) == 'O', VARTYPE(m.loFrm) + IF VARTYPE(m.loFrm) <> 'O' + RETURN + ENDIF + + SELECT crsfacturi + LOCATE FOR id_vanzare = m.tnIdVanzare + + goDriverS8c.Reseteaza() + goDriverS8c.nCaz = 2 + goDriverS8c.dDataScadNoua = m.ldDataScadNoua + loFrm.do_editare_unificata() + + DO asserteaza WITH lcPrefix + ': formularul s-a deschis', goDriverS8c.lGasit, TRANSFORM(goDriverS8c.lGasit) + IF !goDriverS8c.lGasit + STRTOFILE(lcPrefix + ' diagnostic iesire: mesaj=[' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) + Try + loFrm.Release() + Catch + Endtry + DO CurataAliasuriReziduale + RETURN + ENDIF + + DO asserteaza WITH lcPrefix + ': fara eroare in driver - ' + goDriverS8c.cEroare, EMPTY(goDriverS8c.cEroare), goDriverS8c.cEroare + DO asserteaza WITH lcPrefix + ': click 2 (salvare) - cel putin un apel catre goExecutor', goDriverS8c.nContorClick2 >= 1, TRANSFORM(goDriverS8c.nContorClick2) + DO asserteaza WITH lcPrefix + ': dupa click 2, antetul s-a reblocat (lantet_deblocat=.F.)', goDriverS8c.lReblocatDupaClick2, TRANSFORM(goDriverS8c.lReblocatDupaClick2) + + Try + loFrm.Release() + Catch + Endtry + + loMartorB = CapturaMartor(m.tnIdVanzare, m.lnAn, m.lnLuna, m.lnCod, 'v_s8c_d') + + DO asserteaza WITH lcPrefix + ': VANZARI.DATA_SCAD s-a schimbat la valoarea noua', loMartorB.data_scad == m.ldDataScadNoua, DTOC(loMartorB.data_scad) + DO asserteaza WITH lcPrefix + ': VANZARI.DATA_SCAD diferita de valoarea veche', !(loMartorB.data_scad == loMartorA.data_scad), DTOC(loMartorA.data_scad) + DO asserteaza WITH lcPrefix + ': VANZARI_DETALII numar randuri neschimbat', loMartorB.linii_nr == loMartorA.linii_nr, TRANSFORM(loMartorB.linii_nr) + DO asserteaza WITH lcPrefix + ': suma ACT (lei) neschimbata', ROUND(loMartorB.act_lei, 2) == ROUND(loMartorA.act_lei, 2), TRANSFORM(loMartorB.act_lei) + DO asserteaza WITH lcPrefix + ': suma RUL (lei) neschimbata', ROUND(loMartorB.rul_lei, 2) == ROUND(loMartorA.rul_lei, 2), TRANSFORM(loMartorB.rul_lei) + + DO CurataAliasuriReziduale +ENDPROC + + +*!* ===================================================================================== +PROCEDURE VerificaFaraButon + LPARAMETERS tnIdVanzare, tcEticheta + + LOCAL lcPrefix, loFrm, loMartorA, loMartorB, lnAn, lnLuna, lnCod + lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + DO CurataAliasuriReziduale + + SELECT crsfacturi + LOCATE FOR id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', FOUND(), TRANSFORM(FOUND()) + IF !FOUND() + RETURN + ENDIF + lnAn = YEAR(data_act) + lnLuna = MONTH(data_act) + lnCod = cod + + loMartorA = CapturaMartor(m.tnIdVanzare, m.lnAn, m.lnLuna, m.lnCod, 'v_s8c_e') + + Select crsfacturi + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', VARTYPE(m.loFrm) == 'O', VARTYPE(m.loFrm) + IF VARTYPE(m.loFrm) <> 'O' + RETURN + ENDIF + + SELECT crsfacturi + LOCATE FOR id_vanzare = m.tnIdVanzare + + goDriverS8c.Reseteaza() + goDriverS8c.nCaz = 3 + loFrm.do_editare_unificata() + + DO asserteaza WITH lcPrefix + ': formularul s-a deschis', goDriverS8c.lGasit, TRANSFORM(goDriverS8c.lGasit) + IF goDriverS8c.lGasit + DO asserteaza WITH lcPrefix + ': fara eroare in driver - ' + goDriverS8c.cEroare, EMPTY(goDriverS8c.cEroare), goDriverS8c.cEroare + DO asserteaza WITH lcPrefix + ': butonul porneste blocat (lantet_deblocat=.F.)', goDriverS8c.lBlocatInitial, TRANSFORM(goDriverS8c.lBlocatInitial) + ENDIF + + Try + loFrm.Release() + Catch + Endtry + + loMartorB = CapturaMartor(m.tnIdVanzare, m.lnAn, m.lnLuna, m.lnCod, 'v_s8c_f') + + DO asserteaza WITH lcPrefix + ': VANZARI.DATAORAS neschimbat (zero scriere pe antet)', loMartorB.dataoras_antet == loMartorA.dataoras_antet, IIF(EMPTY(loMartorB.dataoras_antet), '(gol)', TTOC(loMartorB.dataoras_antet)) + DO asserteaza WITH lcPrefix + ': VANZARI_DETALII numar randuri neschimbat', loMartorB.linii_nr == loMartorA.linii_nr, TRANSFORM(loMartorB.linii_nr) + DO asserteaza WITH lcPrefix + ': VANZARI_DETALII.MAX(dataoras) neschimbat', loMartorB.linii_mx == loMartorA.linii_mx, TRANSFORM(loMartorB.linii_mx) + DO asserteaza WITH lcPrefix + ': suma ACT (lei) neschimbata', ROUND(loMartorB.act_lei, 2) == ROUND(loMartorA.act_lei, 2), TRANSFORM(loMartorB.act_lei) + DO asserteaza WITH lcPrefix + ': suma RUL (lei) neschimbata', ROUND(loMartorB.rul_lei, 2) == ROUND(loMartorA.rul_lei, 2), TRANSFORM(loMartorB.rul_lei) + + DO CurataAliasuriReziduale +ENDPROC + + +PROCEDURE CurataAliasuriReziduale + LOCAL laAlias(1), lnI, lcA + laAlias(1) = 'CRSGESTIUNI' + DIMENSION laAlias(9) + laAlias(2) = 'JTVA_COLOANE' + laAlias(3) = 'JTVA_COLOANE_TEMP' + laAlias(4) = 'SAFT_TAXTABLE' + laAlias(5) = 'CRSCURSURI' + laAlias(6) = 'CRSARTICOLE_DOC' + laAlias(7) = 'CRSARTICOLE_EDITARE' + laAlias(8) = 'V_ANTET_EDITARE' + laAlias(9) = 'CRSFACTURA' + FOR lnI = 1 TO ALEN(laAlias) + lcA = laAlias(lnI) + IF Used(m.lcA) + Use In (m.lcA) + ENDIF + ENDFOR +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*!* --- subclasa de contor pentru oexecutor: acelasi tipar ca test_s8b_rutare_scriere.prg (oReal, +*!* nu DODEFAULT) - numara ORICE apel catre oExecute; oExecuta (mostenita, nesuprascrisa) cheama +*!* intern This.oExecute, deci e numarata automat, fara suprascriere separata --- +DEFINE CLASS oExecutorContorS8c AS oexecutor + oReal = NULL + + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect + gnContorExecutiiS8c = gnContorExecutiiS8c + 1 + RETURN This.oReal.oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect) + ENDPROC +ENDDEFINE + + +DEFINE CLASS driverS8cAntet AS Custom + lBusy = .F. + lGasit = .F. + nCaz = 0 + nDelegatAlt = 0 + cDelegatAlt = '' + dDataScadNoua = {} + cEroare = '' + lDeblocatDupaClick1 = .F. + lReblocatDupaClick2 = .F. + lBlocatInitial = .F. + nContorClick2 = -1 + nContorTermina = -1 + lRezultatTermina = .F. + + PROCEDURE Reseteaza + This.lGasit = .F. + This.cEroare = '' + This.lDeblocatDupaClick1 = .F. + This.lReblocatDupaClick2 = .F. + This.lBlocatInitial = .F. + This.nContorClick2 = -1 + This.nContorTermina = -1 + This.lRezultatTermina = .F. + ENDPROC + + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + TRY + LOCAL lnI, loFrm2, loExecutorOriginal, loExecutorContor + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + + This.lBlocatInitial = !loFrm2.lantet_deblocat + + DO CASE + CASE This.nCaz = 1 + *!* click 1: deblocheaza antetul + loFrm2.do_comuta_antet() + This.lDeblocatDupaClick1 = loFrm2.lantet_deblocat + + IF TYPE('poDate') == 'O' + poDate.id_delegat = This.nDelegatAlt + poDate.nume_delegat = This.cDelegatAlt + ELSE + This.cEroare = 'poDate nevizibil din driver (caz 1)' + ENDIF + + IF EMPTY(This.cEroare) + gnContorExecutiiS8c = 0 + loExecutorOriginal = goExecutor + loExecutorContor = Createobject('oExecutorContorS8c') + loExecutorContor.oReal = loExecutorOriginal + goExecutor = loExecutorContor + TRY + *!* click 2: salveaza antetul (ScrieAntetEditare + reimprospatare snapshot) + loFrm2.do_comuta_antet() + CATCH TO loExcInterior + This.cEroare = 'click2 do_comuta_antet: ' + TRANSFORM(loExcInterior.ErrorNo) + ' ' + loExcInterior.Message + ENDTRY + goExecutor = loExecutorOriginal + This.nContorClick2 = gnContorExecutiiS8c + This.lReblocatDupaClick2 = !loFrm2.lantet_deblocat + + *!* caz 4: Termina fara alta modificare -> ruta 0 (zero apeluri suplimentare) + IF EMPTY(This.cEroare) + gnContorExecutiiS8c = 0 + loExecutorOriginal = goExecutor + loExecutorContor = Createobject('oExecutorContorS8c') + loExecutorContor.oReal = loExecutorOriginal + goExecutor = loExecutorContor + TRY + This.lRezultatTermina = loFrm2.do_scrie_factura() + CATCH TO loExcTermina + This.cEroare = 'Termina (do_scrie_factura): ' + TRANSFORM(loExcTermina.ErrorNo) + ' ' + loExcTermina.Message + ENDTRY + goExecutor = loExecutorOriginal + This.nContorTermina = gnContorExecutiiS8c + ENDIF + ENDIF + + CASE This.nCaz = 2 + loFrm2.do_comuta_antet() + IF TYPE('poDate') == 'O' + poDate.datascad = This.dDataScadNoua + ELSE + This.cEroare = 'poDate nevizibil din driver (caz 2)' + ENDIF + + IF EMPTY(This.cEroare) + gnContorExecutiiS8c = 0 + loExecutorOriginal = goExecutor + loExecutorContor = Createobject('oExecutorContorS8c') + loExecutorContor.oReal = loExecutorOriginal + goExecutor = loExecutorContor + TRY + loFrm2.do_comuta_antet() + CATCH TO loExcInterior2 + This.cEroare = 'click2 do_comuta_antet: ' + TRANSFORM(loExcInterior2.ErrorNo) + ' ' + loExcInterior2.Message + ENDTRY + goExecutor = loExecutorOriginal + This.nContorClick2 = gnContorExecutiiS8c + This.lReblocatDupaClick2 = !loFrm2.lantet_deblocat + ENDIF + + CASE This.nCaz = 3 + *!* nimic - nu se apasa butonul + ENDCASE + + Try + loFrm2.Release() + Catch + Endtry + EXIT + ENDIF + ENDFOR + CATCH TO loExcS8c + This.cEroare = 'driver: ' + TRANSFORM(loExcS8c.ErrorNo) + ' ' + loExcS8c.Message + STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS8c.ErrorNo) + ' ' + loExcS8c.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s9_1_2_listaid_snapshot.prg b/utile/Teste/editare_factura/test_s9_1_2_listaid_snapshot.prg new file mode 100644 index 0000000..dd63957 --- /dev/null +++ b/utile/Teste/editare_factura/test_s9_1_2_listaid_snapshot.prg @@ -0,0 +1,331 @@ +* test_s9_1_2_listaid_snapshot.prg +* Proba S9-1 + S9-2 (docs\propunere_s9_stergere_reemitere.md sectiunile 4 si 3), pe traseul REAL +* Newobject('frm_facturi') + .do_editare_unificata() (nu apel direct pe functii / Createobject +* direct pe frm_facturare_articole2 - poSnapshotEditare e Private declarat IN do_editare_unificata, +* pe o replica declaratia nu ruleaza si proba ar fi falsa). +* +* S9-1: CalculeazaListaidReemitere(poDate) (ofacturare_rutare_scriere.prg), citit din interiorul +* formularului deschis (poDate e Private, viu pe stiva cat Show() e modal - acelasi tipar ca +* test_s8b_rutare_scriere.prg / driverS8bRutare), comparat cu o interogare SQL de control separata. +* S9-2: poSnapshotEditare.id_fact/cod/an/luna, comparate cu crsfacturi. +* +* Complet read-only: driver-ul NU cheama do_scrie_factura, doar citeste poDate/poSnapshotEditare +* si inchide formularul - zero scriere Oracle, zero numar consumat. +* +* 4 documente reale, cate unul din fiecare familie (probe_s9_candidati.prg / probe_s9_aviz.prg): +* 1125 - aviz (tip=4, are avize sursa reale in VANZARI_CORESP TIP=1) +* 1113 - comanda (tip=3, in Inlist(3,21,25,28,42,47), id_comanda=2479) - inlocuieste 1115, +* care a capatat urmasi intre timp ("Documentul are facturi sau avize emise pe lantul +* lui") si nu mai poate fi deschis; 1113 e protejat de listele de excludere din +* test_s9_3_stergere / test_s9_6_idfact_fortat, deci nu se consuma +* 1055 - contract (tip=2, id_ctr=234) - deja validat deschis de test_s8b (ruta 2) +* 1048 - Otherwise / fara sursa (tip=1) - deja validat deschis de test_s8b (ruta 3) + +SET SAFETY OFF +SET TALK OFF + +*!* nume de fisier unic per rulare (marca de timp inclusa in nume) - o rulare nu poate niciodata +*!* sa suprascrie logul alteia, deci nicio copiere manuala nu poate confunda doua executii distincte +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s9_1_2_listaid_snapshot_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +PUBLIC gnScadereStoc +gnScadereStoc = 0 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul - +*!* mock-ul se pune in fata listei existente, altfel amessagebox() real blocheaza headless +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +PUBLIC gnPass, gnFail, gcMockUltimMesaj, gnMockUltimTip, gnMockRaspuns +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnMockRaspuns = 6 +gnPass = 0 +gnFail = 0 + +*!* --- driver: gaseste frm_facturare_articole2, citeste poDate/poSnapshotEditare, NU scrie nimic --- +PUBLIC goDriverS9 +goDriverS9 = Createobject('driverS9Snapshot') +_SCREEN.AddObject('tmrS9Snapshot', 'Timer') +_SCREEN.tmrS9Snapshot.Interval = 150 +BINDEVENT(_SCREEN.tmrS9Snapshot, 'Timer', goDriverS9, 'Executa') +_SCREEN.tmrS9Snapshot.Enabled = .T. + +*!* --- crsfacturi, exact ca in oproceduri_facturare.vizualizare_facturi, pe cele 4 documente --- +Private poFacturi +poFacturi = Null +IF Used('crsfacturi') + Use In crsfacturi +ENDIF + +LOCAL lcSchema, lcSelect, lcOrder, lcFiltru +lcSchema = ['ales n(1),id_vanzare n(20),id_comanda n(20),dataora t,dataora_exp t,data_act d,data_scad d,sters n(1),dataoras t,numar_act n(14),serie_act c(10),'+] + ; + ['tip n(5),id_part n(10),discount n(17,4),disc_fara_tva n(17,4),discount_evidentiat n(1),text_aditional M,facturat n(1),data_facturat t,'+] + ; + ['explicatie c(240),altele c(200),client c(100),cod n(20),id_util I,utilizator c(30),utils c(30),utilfact c(30),delegat c(70),'+] + ; + ['bidelegat c(30),cnpdelegat c(15),nume_agent c(70),nrinmat c(10),total_fara_tva n(20,4),total_tva n(20,4),total_cu_tva n(20,4),id_gestiune n(10),'+] + ; + ['serie_chit c(20),nr_incasare n(10),incasat n(17,4),in_valuta n(1),sucursala c(100),id_ruta n(10),ruta c(100),curs n(20,4),multiplicator n(10),nume_val c(50),'+] + ; + ['valuta c(50), id_valuta n(5), valval n(20,4), tvaval n(20,4), totval n(20,4),'+] + ; + ['id_delegat n(10),id_agent n(10),id_masina n(10),valoarea N(20,4),nume_gestiune C(50),id_sectie n(5),sectie c(50),id_lucrare n(20), lucrare c(200),'+] + ; + ['tip_incasare n(10),afisare_scadenta n(1),id_ordl n(10),tva_incasare n(1),listare_detaliata n(1),'+] + ; + ['id_facturare n(10),adresa_facturare c(250),email_facturare c(100),adresa_client c(250),email_client c(100),adresa_beneficiar c(250),email_beneficiar c(100),'+] + ; + ['id_beneficiar n(20),beneficiar C(100),tip_factura N(5),ctip_factura C(100), id_ctr N(10), contract C(100),eproforma N(1),tip_saft N(3) null,tip_saftname V(250) null,'+]+; + ['id_livrare N(10),adresa_livrare V(250), denumire_adresa_livrare V(100), email_livrare V(100),institutie_publica N(1) null,efactura N(1) null,cod_fiscal C(20),id_fact N(20)'] + +lcSelect = ['select 0 as ales,id_vanzare,id_comanda,dataora,dataora_exp,data_act,data_scad,sters,dataoras,numar_act,serie_act,'+] + ; + ['tip,id_part,discount,disc_fara_tva,discount_evidentiat,text_aditional,facturat,data_facturat,'+] + ; + ['explicatie,altele,client,cod,id_util,utilizator,utils,utilfact,delegat,bidelegat,cnpdelegat,'+] + ; + ['nume_agent,nrinmat,total_fara_tva,total_tva,total_cu_tva,id_gestiune,serie_chit,nr_incasare,incasat,'+] + ; + ['in_valuta,sucursala,id_ruta,ruta,curs,multiplicator,nume_val,'+] + ; + ['valuta,id_valuta,valval,tvaval,totval,'+] + ; + ['id_delegat,id_agent,id_masina,valoarea,'+] + ; + ['nume_gestiune,id_sectie,sectie,id_lucrare,lucrare,tip_incasare,afisare_scadenta,id_ordl,tva_incasare,listare_detaliata,'+] + ; + ['id_facturare,adresa_facturare,email_facturare,adresa_client,email_client,adresa_beneficiar,email_beneficiar,'+] + ; + ['id_beneficiar, beneficiar, tip_factura, ctip_factura, id_ctr, contract, eproforma,tip_saft,tip_saftname, '+]+; + ['id_livrare,adresa_livrare,denumire_adresa_livrare,email_livrare,institutie_publica,efactura,cod_fiscal,id_fact from fact_vfacturi where '] + +lcOrder = [data_act,numar_act] +lcFiltru = [id_vanzare in (1125, 1113, 1055, 1048)] +gencursor('poFacturi', 'crsfacturi', lcSelect, lcFiltru, lcSchema, lcOrder, .F., [], .F., []) +poFacturi.ca_baza1.afisare() + +DO asserteaza WITH 'crsfacturi incarcat cu cele 4 documente reale (rownum=4)', Used('crsfacturi') AND Reccount('crsfacturi') = 4, IIF(Used('crsfacturi'), TRANSFORM(Reccount('crsfacturi')), 'crsfacturi lipsa') + +*!* ===================================================================================== +*!* cate un document din fiecare familie folosita de dispecerizarea scrierii +*!* ===================================================================================== +DO VerificaListaidSiSnapshot WITH 1125, 'aviz', 'tip=4, cListaSursaAvize' +DO VerificaListaidSiSnapshot WITH 1113, 'comanda', 'tip=3, Inlist comenzi, cListaSursa' +DO VerificaListaidSiSnapshot WITH 1055, 'contract', 'tip=2, Otherwise (fara ramura proprie)' +DO VerificaListaidSiSnapshot WITH 1048, 'else', 'tip=1, Otherwise, fara sursa' + +_SCREEN.tmrS9Snapshot.Enabled = .F. +Try + _SCREEN.RemoveObject('tmrS9Snapshot') +Catch +Endtry + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*!* ===================================================================================== +PROCEDURE VerificaListaidSiSnapshot + LPARAMETERS tnIdVanzare, tcFamilie, tcEticheta + + LOCAL lcPrefix, lnSucces, loFrm + LOCAL lnIdFactControl, lnCodControl, lnAnControl, lnLunaControl + LOCAL lcListaidControl + lcPrefix = TRANSFORM(m.tnIdVanzare) + ' [' + m.tcFamilie + ' - ' + m.tcEticheta + ']' + gcMockUltimMesaj = '' + + DO CurataAliasuriReziduale + + *!* --- oracol independent: interogare de control pentru listaid asteptat, in functie de familie --- + DO CASE + CASE m.tcFamilie == 'aviz' + IF USED('v_ctrl_aviz') + USE IN v_ctrl_aviz + ENDIF + lnSucces = goExecutor.oExecute([select id_vanzare_aviz from vanzari_coresp where sters=0 and tip=1 and id_vanzare_fact=] + TRANSFORM(m.tnIdVanzare) + [ order by id_vanzare_aviz], 'v_ctrl_aviz') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor avize sursa Oracle a reusit', lnSucces >= 0 AND USED('v_ctrl_aviz'), TRANSFORM(lnSucces) + lcListaidControl = '' + IF USED('v_ctrl_aviz') + SELECT v_ctrl_aviz + SCAN + lcListaidControl = lcListaidControl + IIF(!EMPTY(lcListaidControl), ',', '') + ALLTRIM(STR(id_vanzare_aviz)) + ENDSCAN + USE IN v_ctrl_aviz + ENDIF + CASE m.tcFamilie == 'comanda' + IF USED('v_ctrl_cmd') + USE IN v_ctrl_cmd + ENDIF + lnSucces = goExecutor.oExecute([select id_comanda from vanzari where id_vanzare=] + TRANSFORM(m.tnIdVanzare), 'v_ctrl_cmd') + goExecutor.oReset() + DO asserteaza WITH lcPrefix + ': martor id_comanda Oracle a reusit', lnSucces >= 0 AND USED('v_ctrl_cmd') AND RECCOUNT('v_ctrl_cmd') = 1, TRANSFORM(lnSucces) + lcListaidControl = ALLTRIM(STR(NVL(v_ctrl_cmd.id_comanda,0))) + USE IN v_ctrl_cmd + OTHERWISE + *!* contract si else - Otherwise in CASE-ul de scriere, fara ramura proprie (S9 propunere §1.8) + lcListaidControl = '' + ENDCASE + + *!* --- martor S9-2: identitatea documentului vechi, direct din crsfacturi --- + Select crsfacturi + Locate For id_vanzare = m.tnIdVanzare + DO asserteaza WITH lcPrefix + ': documentul e in crsfacturi', FOUND(), TRANSFORM(FOUND()) + IF !FOUND() + RETURN + ENDIF + lnIdFactControl = NVL(id_fact, 0) + lnCodControl = NVL(cod, 0) + lnAnControl = YEAR(data_act) + lnLunaControl = MONTH(data_act) + + loFrm = Newobject('frm_facturi', 'D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare_comun.vcx') + DO asserteaza WITH lcPrefix + ': Newobject(frm_facturi) reuseste', VARTYPE(m.loFrm) == 'O', VARTYPE(m.loFrm) + IF VARTYPE(m.loFrm) <> 'O' + RETURN + ENDIF + + goDriverS9.Reseteaza() + loFrm.do_editare_unificata() + + DO asserteaza WITH lcPrefix + ': formularul s-a deschis (driver a gasit frm_facturare_articole2)', goDriverS9.lGasit, TRANSFORM(goDriverS9.lGasit) + IF !goDriverS9.lGasit + STRTOFILE(lcPrefix + ' diagnostic iesire: mesaj=[' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) + Try + loFrm.Release() + Catch + Endtry + DO CurataAliasuriReziduale + RETURN + ENDIF + + DO asserteaza WITH lcPrefix + ': fara eroare in driver - ' + goDriverS9.cEroare, EMPTY(goDriverS9.cEroare), goDriverS9.cEroare + + *!* --- S9-1: CalculeazaListaidReemitere(poDate) vs interogarea de control --- + DO asserteaza WITH lcPrefix + ': S9-1 CalculeazaListaidReemitere == control (' + m.lcListaidControl + ')', ; + ALLTRIM(goDriverS9.cListaidCalculat) == m.lcListaidControl, goDriverS9.cListaidCalculat + + *!* --- S9-2: poSnapshotEditare.id_fact/cod/an/luna vs crsfacturi --- + DO asserteaza WITH lcPrefix + ': S9-2 snapshot.id_fact == crsfacturi.id_fact', goDriverS9.nSnapIdFact == m.lnIdFactControl, TRANSFORM(goDriverS9.nSnapIdFact) + ' vs ' + TRANSFORM(m.lnIdFactControl) + DO asserteaza WITH lcPrefix + ': S9-2 snapshot.cod == crsfacturi.cod', goDriverS9.nSnapCod == m.lnCodControl, TRANSFORM(goDriverS9.nSnapCod) + ' vs ' + TRANSFORM(m.lnCodControl) + DO asserteaza WITH lcPrefix + ': S9-2 snapshot.an == crsfacturi.an(data_act)', goDriverS9.nSnapAn == m.lnAnControl, TRANSFORM(goDriverS9.nSnapAn) + ' vs ' + TRANSFORM(m.lnAnControl) + DO asserteaza WITH lcPrefix + ': S9-2 snapshot.luna == crsfacturi.luna(data_act)', goDriverS9.nSnapLuna == m.lnLunaControl, TRANSFORM(goDriverS9.nSnapLuna) + ' vs ' + TRANSFORM(m.lnLunaControl) + DO asserteaza WITH lcPrefix + ': S9-2 snapshot.id_vanzare == documentul deschis', goDriverS9.nSnapIdVanzare == m.tnIdVanzare, TRANSFORM(goDriverS9.nSnapIdVanzare) + + Try + loFrm.Release() + Catch + Endtry + + DO CurataAliasuriReziduale +ENDPROC + + +PROCEDURE CurataAliasuriReziduale + LOCAL laAlias(1), lnI, lcA + laAlias(1) = 'CRSGESTIUNI' + DIMENSION laAlias(9) + laAlias(2) = 'JTVA_COLOANE' + laAlias(3) = 'JTVA_COLOANE_TEMP' + laAlias(4) = 'SAFT_TAXTABLE' + laAlias(5) = 'CRSCURSURI' + laAlias(6) = 'CRSARTICOLE_DOC' + laAlias(7) = 'CRSARTICOLE_EDITARE' + laAlias(8) = 'V_ANTET_EDITARE' + laAlias(9) = 'CRSFACTURA' + FOR lnI = 1 TO ALEN(laAlias) + lcA = laAlias(lnI) + IF Used(m.lcA) + Use In (m.lcA) + ENDIF + ENDFOR +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +DEFINE CLASS driverS9Snapshot AS Custom + lBusy = .F. + lGasit = .F. + cEroare = '' + cListaidCalculat = '' + nSnapIdFact = -1 + nSnapCod = -1 + nSnapAn = -1 + nSnapLuna = -1 + nSnapIdVanzare = -1 + + PROCEDURE Reseteaza + This.lGasit = .F. + This.cEroare = '' + This.cListaidCalculat = '' + This.nSnapIdFact = -1 + This.nSnapCod = -1 + This.nSnapAn = -1 + This.nSnapLuna = -1 + This.nSnapIdVanzare = -1 + ENDPROC + + PROCEDURE Executa + IF This.lBusy OR This.lGasit + RETURN + ENDIF + This.lBusy = .T. + TRY + LOCAL lnI, loFrm2 + FOR lnI = 1 TO _SCREEN.FormCount + IF Upper(_SCREEN.Forms(m.lnI).Class) == 'FRM_FACTURARE_ARTICOLE2' + loFrm2 = _SCREEN.Forms(m.lnI) + This.lGasit = .T. + + IF TYPE('poDate') == 'O' + This.cListaidCalculat = CalculeazaListaidReemitere(poDate) + ELSE + This.cEroare = This.cEroare + 'poDate nevizibil din driver; ' + ENDIF + + IF TYPE('poSnapshotEditare') == 'O' + This.nSnapIdFact = poSnapshotEditare.id_fact + This.nSnapCod = poSnapshotEditare.cod + This.nSnapAn = poSnapshotEditare.an + This.nSnapLuna = poSnapshotEditare.luna + This.nSnapIdVanzare = poSnapshotEditare.id_vanzare + ELSE + This.cEroare = This.cEroare + 'poSnapshotEditare nevizibil din driver; ' + ENDIF + + Try + loFrm2.Release() + Catch + Endtry + EXIT + ENDIF + ENDFOR + CATCH TO loExcS9 + This.cEroare = 'driver: ' + TRANSFORM(loExcS9.ErrorNo) + ' ' + loExcS9.Message + STRTOFILE('DRIVER EROARE ' + TRANSFORM(loExcS9.ErrorNo) + ' ' + loExcS9.Message + CHR(13) + CHR(10), gcErrLog, 1) + FINALLY + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/editare_factura/test_s9_3_stergere.prg b/utile/Teste/editare_factura/test_s9_3_stergere.prg new file mode 100644 index 0000000..103204a --- /dev/null +++ b/utile/Teste/editare_factura/test_s9_3_stergere.prg @@ -0,0 +1,159 @@ +* test_s9_3_stergere.prg +* Proba S9-3 (docs\propunere_s9_stergere_reemitere.md, sectiunea 3) - StergeDocumentFacturare +* (ofacturare_rutare_scriere.prg), piciorul de stergere extras din ofacturare_comun.vc2:4837-4977. +* +* SCRIE IN ORACLE: alege singur, la rulare, un document eligibil (STERS=0, in perioada gnAn/gnLuna +* activa din calendar, fara referinte incasari/plati, fara urmasi, cu randuri reale in vact_tot/ +* vrul_tot - ca sa probeze reversarea de stoc) si il sterge definitiv (soft-delete). Nu reemite. +* Zero numere SSS consumate. Trei rulari distincte ale acestui script sterg trei documente diferite +* (fiecare candidat ales e exclus de urmatoarea rulare, fiindca STERS a devenit 1). +* +* Documente EXCLUSE explicit (folosite de alte suite / DATA_ACT alterata): +* 1047, 1048, 1055, 1130 (test_s8b_rutare_scriere / test_s9_1_2_listaid_snapshot) +* 1113 (DATA_ACT alterata, iese din luna curenta) + +LPARAMETERS tnForceAn, tnForceLuna +*!* tnForceAn/tnForceLuna optionale: forteaza perioada activa gnAn/gnLuna (test_init_env_auto_ +*!* roafacturare accepta tnAn/tnLuna) - folosit doar cand luna curenta reala e epuizata de candidati +*!* eligibili (STERS=0 + randuri reale vact_tot/vrul_tot + fara referinte/urmasi); alege un document +*!* real din acea perioada, nu ocoleste nicio garda a functiei testate + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s9_3_stergere_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', tnForceAn, tnForceLuna +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +PUBLIC gnPass, gnFail +gnPass = 0 +gnFail = 0 + +DO RuleazaS93 + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +PROCEDURE RuleazaS93 + STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) + + *!* --- alege un candidat eligibil: STERS=0, in perioada activa, cu randuri reale in vact_tot SI vrul_tot + *!* (vact_tot singur nu garanteaza randuri de stoc - articolele pot fi negestionabile) --- + LOCAL lcSqlCand, lcExclusi + *!* documentele-martor ale celorlalte teste din suita: le sterge o singura data si raman + *!* rosii pana la rularea scriptului de regenerare (docs\wip13_2026_09_05_04_COMUN_FIXTURI_TEST) + lcExclusi = [1047,1048,1049,1050,1055,1071,1072,1113,1125,1126,1128,1129,1130,1160] + lcSqlCand = [select v.id_vanzare, v.cod, v.tip, v.data_act from vanzari v ] + ; + [where v.sters = 0 and extract(year from v.data_act) = ] + TRANSFORM(gnAn) + ; + [ and extract(month from v.data_act) = ] + TRANSFORM(gnLuna) + ; + [ and v.id_vanzare not in (] + lcExclusi + [) ] + ; + [ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ; + [ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + ; + [ and exists (select 1 from ] + gcs + [.vrul_tot r where r.sters = 0 and r.an = ] + TRANSFORM(gnAn) + ; + [ and r.luna = ] + TRANSFORM(gnLuna) + [ and r.cod = v.cod) ] + ; + [order by v.id_vanzare] + + IF USED('v_candidati_s93') + USE IN v_candidati_s93 + ENDIF + LOCAL lnSuccesCand + lnSuccesCand = goExecutor.oExecuta(lcSqlCand, 'v_candidati_s93') + DO asserteaza WITH 'interogarea de candidati a reusit', m.lnSuccesCand, TRANSFORM(m.lnSuccesCand) + IF !m.lnSuccesCand + RETURN + ENDIF + + LOCAL lnIdVanzareAles, lnCodAles, lnTipAles, lnAnAles, lnLunaAles + lnIdVanzareAles = 0 + SELECT v_candidati_s93 + SCAN + lnIdVanzareAles = id_vanzare + lnCodAles = cod + lnTipAles = tip + lnAnAles = YEAR(data_act) + lnLunaAles = MONTH(data_act) + *!* excludem candidatii cu referinte incasari/plati sau cu urmasi - garzile pe care do_sterge/ + *!* editarea le fac deja INAINTE de piciorul de stergere, nu fac parte din functia extrasa + IF !ReferinteDocumenteNota(lnAnAles, lnLunaAles, lnCodAles) AND !DocumentAreUrmasi(lnIdVanzareAles) + EXIT + ENDIF + lnIdVanzareAles = 0 + ENDSCAN + USE IN v_candidati_s93 + + DO asserteaza WITH 'exista un candidat eligibil (fara referinte, fara urmasi)', m.lnIdVanzareAles > 0, TRANSFORM(m.lnIdVanzareAles) + IF m.lnIdVanzareAles = 0 + RETURN + ENDIF + + STRTOFILE('candidat ales: id_vanzare=' + TRANSFORM(lnIdVanzareAles) + ' cod=' + TRANSFORM(lnCodAles) + ; + ' tip=' + TRANSFORM(lnTipAles) + ' an=' + TRANSFORM(lnAnAles) + ' luna=' + TRANSFORM(lnLunaAles) + CHR(13) + CHR(10), gcErrLog, 1) + + *!* --- stare INAINTE --- + LOCAL lnStersInainte, lnRulInainte + lnStersInainte = -1 + lnRulInainte = -1 + goExecutor.oSelecteaza2Value([select sters from vanzari where id_vanzare = ] + TRANSFORM(lnIdVanzareAles), @lnStersInainte) + DO asserteaza WITH 'INAINTE: documentul ales nu e deja sters', m.lnStersInainte == 0, TRANSFORM(m.lnStersInainte) + + goExecutor.oSelecteaza2Value([select count(*) as nr from rul where sters = 0 and an = ] + TRANSFORM(lnAnAles) + ; + [ and luna = ] + TRANSFORM(lnLunaAles) + [ and cod = ] + TRANSFORM(lnCodAles), @lnRulInainte) + STRTOFILE('INAINTE: vanzari.sters=' + TRANSFORM(lnStersInainte) + ' rul sters=0 count=' + TRANSFORM(lnRulInainte) + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'INAINTE: exista randuri RUL nesterse de reversat (precondite candidat)', m.lnRulInainte > 0, TRANSFORM(m.lnRulInainte) + IF m.lnRulInainte <= 0 + RETURN + ENDIF + + *!* --- executa piciorul de stergere --- + LOCAL llRezultat + llRezultat = StergeDocumentFacturare(m.lnIdVanzareAles, m.lnCodAles, m.lnAnAles, m.lnLunaAles, 8) + DO asserteaza WITH 'StergeDocumentFacturare a intors .T.', m.llRezultat, TRANSFORM(m.llRezultat) + + *!* --- stare DUPA: VANZARI.STERS=1 si RUL marcat STERS=1 (dovada reversarii de stoc) --- + LOCAL lnStersDupa, lnRulRamasNesters + lnStersDupa = -1 + lnRulRamasNesters = -1 + goExecutor.oSelecteaza2Value([select sters from vanzari where id_vanzare = ] + TRANSFORM(lnIdVanzareAles), @lnStersDupa) + goExecutor.oSelecteaza2Value([select count(*) as nr from rul where sters = 0 and an = ] + TRANSFORM(lnAnAles) + ; + [ and luna = ] + TRANSFORM(lnLunaAles) + [ and cod = ] + TRANSFORM(lnCodAles), @lnRulRamasNesters) + STRTOFILE('DUPA: vanzari.sters=' + TRANSFORM(lnStersDupa) + ' rul sters=0 count=' + TRANSFORM(lnRulRamasNesters) + CHR(13) + CHR(10), gcErrLog, 1) + + DO asserteaza WITH 'DUPA: vanzari.sters = 1', m.lnStersDupa == 1, TRANSFORM(m.lnStersDupa) + DO asserteaza WITH 'DUPA: toate randurile RUL ale documentului sunt sters=1 (reversare stoc probata)', m.lnRulRamasNesters == 0, TRANSFORM(m.lnRulRamasNesters) +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + Transform(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s9_4_regenerare.prg b/utile/Teste/editare_factura/test_s9_4_regenerare.prg new file mode 100644 index 0000000..6d3053a --- /dev/null +++ b/utile/Teste/editare_factura/test_s9_4_regenerare.prg @@ -0,0 +1,1021 @@ +* test_s9_4_regenerare.prg +* Proba S9-4: regenerarea documentului editat pe sume (stergere + reemitere in ACEEASI tranzactie +* manuala), cablata in frm_facturare_articole2.do_scrie_factura / .do_scrie_articole +* (COMUN\clase\ofacturare.vc2) peste StergeDocumentFacturare (ofacturare_rutare_scriere.prg). +* +* Parametru tnRulare: +* 1 = ATOMICITATE. Nu trece prin formular si NU consuma niciun document: deschide tranzactia +* manual, cheama StergeDocumentFacturare, verifica pe un AL DOILEA handle Oracle ca nimic +* n-a scapat comis, apoi face SQLRollback. Pica la A3 daca garda de COMMIT/ROLLBACK din +* StergeDocumentFacturare lipseste - e testul de regresie al acelei garzi. +* 2 = CICLU COMPLET. Reproduce drumul lui do_editare_unificata (ofacturare_comun.vc2:3890-3977) +* fara Show(), schimba o cantitate si cheama do_scrie_factura(). SCRIE IN ORACLE: sterge +* documentul ales si emite unul nou. Documentul nou e el insusi candidat pentru rularea +* urmatoare. Se alege un document din familia Otherwise (nu tip=4 - facturarea din aviz are +* riscul de dialog fals "aviz de retur", neprobat). +* 3 = S9-5, ATOMICITATEA ATASAMENTELOR. Seamana atasamente pe candidat, forteaza esecul +* reemiterii (serie_act mai lunga decat coloana => eroare Oracle dupa stergere) si verifica +* ca rollback-ul readuce si documentul, si atasamentele, la sters = 0. NU consuma documentul +* (rollback), iar atasamentele semanate se sterg fizic la final. +* 4 = S11, CONTROLUL NEGATIV. Aceeasi rulare 2, dar cu mock_muta_borderou.prg incarcat primul in +* SET PROCEDURE, deci MutaBorderouReemitere devine no-op = starea codului dinainte de +* reparatia S11. Trebuie sa cada EXACT B-b1, B-b2 si B-b4; B-b3 trebuie sa treaca (randul +* exista in borderou, dar arata documentul sters). SCRIE IN ORACLE, consuma un document. +* 5 = S11, ATOMICITATEA MUTARII. Cheama MutaBorderouReemitere REALA intr-o tranzactie manuala si +* verifica pe un al doilea handle ca mutarea nu a scapat comisa, apoi ca rollback-ul readuce +* randul pe id-ul vechi. Nu consuma documentul; borderoul semanat se sterge la final. +* +* S11 (2.1 din docs\propunere_s11_legaturi_id_vanzare.md - randul de borderou eFactura se muta de +* pe id_vanzare vechi pe cel nou) e probat de asertiunile B-b1..B-b4 din rularea 2, de controlul +* negativ din rularea 4 si de rularea 5. Borderoul se seamana de proba, prin chiar procedurile de +* productie (pack_fact_borderou.BorderouNou / BorderouAdaugaFactura): pe schema de test cele 39 de +* randuri FACT_BORDEROU_DETALII existente nu cad pe niciun candidat, deci proba ar trece vida. +* +* S9-5 (decizia 53 - atasamentele NU se remigreaza la reemitere) e probat de asertiunile B14-B17 +* din rularea 2 si de rularea 3. Atasamentele documentului vechi se seamana de proba: pe schema de +* test nu exista niciun rand ATASAMENTE_VANZARI legat prin ID_VANZARE (cele 20 existente sunt +* legate prin COD, mostenire ROACONT, invizibile in VATASAMENTE_VANZARI). +* +* Candidatul trebuie sa aiba randuri reale in vact_tot: doar atunci stergerea trece prin ramura cu +* nota contabila, singura care contine COMMIT-ul pazit. Fara aceasta preconditie asertiunea A3 ar +* trece si cu garda lipsa, deci proba ar fi fara valoare. +* +* Documente EXCLUSE (folosite de alte suite / DATA_ACT alterata): +* 1047, 1048, 1055, 1113, 1130 + +LPARAMETERS tnRulare + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail, gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +PUBLIC poDate, poSnapshotEditare, glRegenerareEditare, gnMockMutaApeluri, glControlNegativ + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s9_4_regenerare_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' rulare=' + TRANSFORM(tnRulare) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +*!* parametrul din linia de comanda soseste ca sir - fara VAL comparatia numerica da eroare de tip, +*!* iar ON ERROR ar lasa executia sa cada in rularea urmatoare +LOCAL lnRulare +lnRulare = VAL(TRANSFORM(tnRulare)) + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +IF lnRulare = 4 + *!* controlul negativ S11: MutaBorderouReemitere devine no-op, fara sa se atinga fisierul comis + lcProcExistent = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_muta_borderou.prg,' + lcProcExistent +ENDIF +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +*!* stub_verificare inaintea lui COMUN\FERESTRE: Do Form verificare (ofacturare.vc2) nu se afiseaza +LOCAL lcPathVechi, lcPathNou +lcPathVechi = SET("PATH") +lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi +SET PATH TO &lcPathNou + +*!* 7 = "Nu" la "Doriti sa se inchida comanda?" si la "Doriti sa se inregistreze si avizul de retur?" +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnPass = 0 +gnFail = 0 +glRegenerareEditare = .F. +gnMockMutaApeluri = 0 +glControlNegativ = (lnRulare = 4) + +STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) + +STRTOFILE('rulare ceruta: ' + TRANSFORM(lnRulare) + CHR(13) + CHR(10), gcErrLog, 1) + +DO CASE +CASE lnRulare = 1 + DO Rularea1 +CASE lnRulare = 2 + DO Rularea2 +CASE lnRulare = 3 + DO Rularea3 +CASE lnRulare = 4 + STRTOFILE('CONTROL NEGATIV S11: se asteapta sa cada EXACT B-b1, B-b2 si B-b4; B-b3 trece' + CHR(13) + CHR(10), gcErrLog, 1) + DO Rularea2 +CASE lnRulare = 5 + DO Rularea5 +OTHERWISE + STRTOFILE('EROARE: tnRulare trebuie sa fie intre 1 si 5' + CHR(13) + CHR(10), gcErrLog, 1) +ENDCASE + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*============================================================================================== +* RULAREA 1 - atomicitatea. Nu consuma documente: rollback la final. +*============================================================================================== +PROCEDURE Rularea1 + LOCAL lnIdV, lnCod, lnTip, lnAn, lnLuna, lnH2, lnActInainte + LOCAL lnStersH1, lnStersH2, lnTranz, llSters, lnIdSetIesit + + IF !AlegeCandidat(@lnIdV, @lnCod, @lnTip, @lnAn, @lnLuna, .F.) + RETURN + ENDIF + + *!* preconditie obligatorie: randuri in vact_tot => stergerea trece prin ramura cu nota contabila, + *!* singura care contine COMMIT-ul pazit (fara asta A3 ar trece si cu garda lipsa) + lnActInainte = -1 + goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.vact_tot where sters = 0 and an = ] + ; + TRANSFORM(gnAn) + [ and luna = ] + TRANSFORM(gnLuna) + [ and cod = ] + TRANSFORM(lnCod), @lnActInainte) + DO asserteaza WITH 'PRECONDITIE: candidatul are randuri vact_tot (ramura cu nota contabila)', lnActInainte > 0, TRANSFORM(lnActInainte) + IF lnActInainte <= 0 + RETURN + ENDIF + + *!* al doilea handle: vede numai ce e COMIS pe server + SQLSetprop(0, "DispLogin", 3) + lnH2 = SQLSTRINGCONNECT("dsn=CENTRAL;Uid=MARIUSM_AUTO;Pwd=ROMFASTSOFT;") + DO asserteaza WITH 'al doilea handle Oracle deschis', lnH2 > 0, TRANSFORM(lnH2) + IF lnH2 <= 0 + RETURN + ENDIF + + *!* tranzactie manuala, ca in _frm_base.do_deschide_tranzactie (trezirea conexiunii inclusa) + SQLEXEC(gnHandle, "select * from dual", "v_dual_s94") + IF USED('v_dual_s94') + USE IN v_dual_s94 + ENDIF + SQLSetprop(gnHandle, "Transactions", 2) + + lnIdSetIesit = 0 + llSters = StergeDocumentFacturare(lnIdV, lnCod, lnAn, lnLuna, 8, @lnIdSetIesit) + DO asserteaza WITH 'A1 StergeDocumentFacturare a intors .T. sub tranzactie manuala', llSters, TRANSFORM(llSters) + + lnTranz = SQLGetprop(gnHandle, "Transactions") + DO asserteaza WITH 'A2 tranzactia manuala e inca deschisa dupa stergere (Transactions = 2)', lnTranz = 2, TRANSFORM(lnTranz) + + lnStersH2 = CitesteStersPeHandle(lnH2, lnIdV) + DO asserteaza WITH 'A3 pe al doilea handle documentul e inca NESTERS (nimic n-a scapat comis)', lnStersH2 = 0, TRANSFORM(lnStersH2) + + lnStersH1 = -1 + goExecutor.oSelecteaza2Value([select sters from vanzari where id_vanzare = ] + TRANSFORM(lnIdV), @lnStersH1) + DO asserteaza WITH 'A4 in interiorul tranzactiei documentul apare sters (sters = 1)', lnStersH1 = 1, TRANSFORM(lnStersH1) + + STRTOFILE('id_set intors prin referinta (hunk C) = ' + TRANSFORM(lnIdSetIesit) + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'A6 id_set-ul notei vechi a iesit prin parametrul de referinta', lnIdSetIesit <> 0, TRANSFORM(lnIdSetIesit) + + *!* rollback: documentul trebuie sa ramana intact pe ambele handle-uri + SQLRollback(gnHandle) + SQLSetprop(gnHandle, "Transactions", 1) + + lnStersH1 = -1 + goExecutor.oSelecteaza2Value([select sters from vanzari where id_vanzare = ] + TRANSFORM(lnIdV), @lnStersH1) + lnStersH2 = CitesteStersPeHandle(lnH2, lnIdV) + DO asserteaza WITH 'A5a dupa rollback documentul e intact pe handle-ul 1 (sters = 0)', lnStersH1 = 0, TRANSFORM(lnStersH1) + DO asserteaza WITH 'A5b dupa rollback documentul e intact pe handle-ul 2 (sters = 0)', lnStersH2 = 0, TRANSFORM(lnStersH2) + + SQLDISCONNECT(lnH2) + STRTOFILE('rularea 1 NU a consumat documentul ' + TRANSFORM(lnIdV) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*============================================================================================== +* RULAREA 2 - ciclul complet sterge + reemite. SCRIE IN ORACLE. +*============================================================================================== +PROCEDURE Rularea2 + LOCAL lnIdV, lnCod, lnTip, lnAn, lnLuna, lnIdFactVechi, lnDocVechi + LOCAL loForm, lnDiscRon, lnDiscVal, lnLiniiCrs, lnCantVeche, lnCantNoua, lnIdArtModificat + LOCAL llRez, lnIdVNou, lnNr, lnSters, lnLiniiNoi, lnCantNouaDb, lnIdFactNou, lnRulVechiNesters + LOCAL lcSerie, lnNumar, ldData, lnCorespVechi, lnCorespNou, lnSurse, lnSurseFacturate + LOCAL lnDocNou, lnRulSumInainte, lnRulSumDupa, lnVrulInainte, lcSerieNou, lnNumarNou + LOCAL ldDataIregVechi, ldDataIregNou, ldDataAct, lnIdVMaxInainte + LOCAL lnStersNotaVeche, lnIdFdocVechiMasurat, lnIdFdocNou + LOCAL lnAtasInainte, lnAtasNesterse, lnAtasSterse, lnAtasNou, lnAtasAudit + LOCAL lnIdBorderou, lnBordVechiInainte, lnTotalBordInainte, lnBordVechi, lnBordNou + LOCAL lnBordView, lnTotalBordDupa, lnTotalVanzNou + LOCAL lnIdUtilVechi, ldDataoraVechi, lnIdUtilNou, ldDataoraNou, lnIdUtilmNou, ldDataoramNou + + IF !AlegeCandidat(@lnIdV, @lnCod, @lnTip, @lnAn, @lnLuna, .T.) + RETURN + ENDIF + + *!* --- starea INAINTE --- + DO urma WITH 'antet INAINTE' + lnIdFactVechi = 0 + lcSerie = '' + lnNumar = 0 + IF USED('v_ant_s94') + USE IN v_ant_s94 + ENDIF + ldDataAct = {} + lnIdUtilVechi = 0 + ldDataoraVechi = {} + IF goExecutor.oExecuta([select id_fact, serie_act, numar_act, data_act, id_util, dataora from vanzari where id_vanzare = ] + TRANSFORM(lnIdV), 'v_ant_s94') + SELECT v_ant_s94 + GO TOP + lnIdFactVechi = NVL(id_fact, 0) + lcSerie = ALLTRIM(NVL(serie_act, '')) + lnNumar = NVL(numar_act, 0) + ldDataAct = NVL(data_act, {}) + lnIdUtilVechi = NVL(id_util, 0) + ldDataoraVechi = NVL(dataora, {}) + USE IN v_ant_s94 + ENDIF + + DO urma WITH 'rul INAINTE' + lnVrulInainte = -1 + goExecutor.oSelecteaza2Value([select count(*) as nr from rul where sters = 0 and an = ] + TRANSFORM(lnAn) + ; + [ and luna = ] + TRANSFORM(lnLuna) + [ and cod = ] + TRANSFORM(lnCod), @lnVrulInainte) + + *!* DOCUMENTE (nota contabila) nu are ID_FACT: cheia ei e ID_DOC, egal cu VANZARI.ID_FACT. + *!* ID_SET nu identifica nota - e setul contabil, comun mai multor documente din perioada. + DO urma WITH 'documente INAINTE' + lnDocVechi = -1 + ldDataIregVechi = {} + IF USED('v_doc_s94') + USE IN v_doc_s94 + ENDIF + IF goExecutor.oExecuta([select sters, dataireg from documente where id_doc = ] + TRANSFORM(lnIdFactVechi), 'v_doc_s94') + SELECT v_doc_s94 + lnDocVechi = RECCOUNT('v_doc_s94') + IF lnDocVechi > 0 + GO TOP + ldDataIregVechi = NVL(dataireg, {}) + ENDIF + USE IN v_doc_s94 + ENDIF + STRTOFILE('nota contabila INAINTE: id_doc=' + TRANSFORM(lnIdFactVechi) + ' randuri=' + TRANSFORM(lnDocVechi) + ; + ' dataireg=' + TRANSFORM(ldDataIregVechi) + CHR(13) + CHR(10), gcErrLog, 1) + + *!* id_fdoc e atribut per RAND contabil, nu per document (16% din documente au valori mixte). + *!* Mecanismul poarta valoarea primului rand (actactan: GO top peste order by id_act), deci + *!* asta se compara - nu max(), care ar da un fals esec pe documentele neuniforme. + DO urma WITH 'id_fdoc INAINTE' + lnIdFdocVechiMasurat = -1 + goExecutor.oSelecteaza2Value([select id_fdoc from ] + gcs + [.vact_tot where id_act = ] + ; + [(select min(id_act) from ] + gcs + [.vact_tot where sters = 0 and an = ] + TRANSFORM(lnAn) + ; + [ and luna = ] + TRANSFORM(lnLuna) + [ and cod = ] + TRANSFORM(lnCod) + [)], @lnIdFdocVechiMasurat) + + DO urma WITH 'max id_vanzare INAINTE' + lnIdVMaxInainte = 0 + goExecutor.oSelecteaza2Value([select nvl(max(id_vanzare),0) as id from vanzari], @lnIdVMaxInainte) + + DO urma WITH 'coresp INAINTE' + lnCorespVechi = -1 + goExecutor.oSelecteaza2Value([select count(*) as nr from vanzari_coresp where sters = 0 and ] + ; + [(id_vanzare_fact = ] + TRANSFORM(lnIdV) + [ or id_vanzare_aviz = ] + TRANSFORM(lnIdV) + [)], @lnCorespVechi) + + STRTOFILE('INAINTE: id_vanzare=' + TRANSFORM(lnIdV) + ' cod=' + TRANSFORM(lnCod) + ' tip=' + TRANSFORM(lnTip) + ; + ' id_fact=' + TRANSFORM(lnIdFactVechi) + ' serie=' + TRANSFORM(lcSerie) + ' numar=' + TRANSFORM(lnNumar) + ; + ' rul_nesters=' + TRANSFORM(lnVrulInainte) + ' coresp_nesters=' + TRANSFORM(lnCorespVechi) + ; + ' documente=' + TRANSFORM(lnDocVechi) + CHR(13) + CHR(10), gcErrLog, 1) + + IF lnVrulInainte = 0 + STRTOFILE('NOTA: candidatul nu are randuri RUL - asertiunea B6 (stoc neutru) e VIDA pentru el' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + + *!* --- S9-5: atasamentele documentului vechi (decizia 53) --- + *!* fara semanare proba ar fi vida: schema de test nu are niciun atasament legat prin ID_VANZARE + DO SeamanaAtasamente WITH lnIdV + lnAtasInainte = NumaraAtasamente(lnIdV, 0) + DO asserteaza WITH 'PRECONDITIE S9-5: documentul vechi are 2 atasamente nesterse', lnAtasInainte = 2, TRANSFORM(lnAtasInainte) + + *!* --- S11: borderoul eFactura (2.1) --- + *!* semanat prin chiar procedurile de productie; fara el proba ar trece vida (niciunul dintre + *!* cele 39 de randuri FACT_BORDEROU_DETALII existente nu cade pe un candidat) + lnIdBorderou = SeamanaBorderou(lnIdV) + DO asserteaza WITH 'PRECONDITIE S11: borderoul semanat s-a creat', lnIdBorderou > 0, TRANSFORM(lnIdBorderou) + lnBordVechiInainte = NumaraBorderouDetalii(lnIdBorderou, lnIdV) + DO asserteaza WITH 'PRECONDITIE S11: randul de borderou sta pe documentul vechi', lnBordVechiInainte = 1, TRANSFORM(lnBordVechiInainte) + lnTotalBordInainte = CitesteTotalBorderou(lnIdBorderou) + STRTOFILE('S11: id_borderou=' + TRANSFORM(lnIdBorderou) + ' total_cu_tva citit din ' + ; + 'FACT_VBORDEROU_DETALII INAINTE=' + TRANSFORM(lnTotalBordInainte) + CHR(13) + CHR(10), gcErrLog, 1) + + *!* --- drumul lui do_editare_unificata, fara Show() --- + DO urma WITH 'IncarcaAntetFacturaEditare' + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal) + DO asserteaza WITH 'antetul documentului s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate) + IF VARTYPE(poDate) <> 'O' + RETURN + ENDIF + + DO urma WITH 'IncarcaLiniiFacturaEditare' + IncarcaLiniiFacturaEditare(poDate, lnIdV) + DO asserteaza WITH 'liniile documentului s-au incarcat in crsfactura', USED('crsfactura') AND RECCOUNT('crsfactura') > 0, ; + TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1)) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + RETURN + ENDIF + + DO urma WITH 'update_jtva_coloane / update_saft_taxtable' + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + DO urma WITH 'CREATEOBJECT frm_facturare_articole2' + loForm = CREATEOBJECT('frm_facturare_articole2') + DO urma WITH 'do_calculeaza_totaluri' + loForm.ndiscfactron = lnDiscRon + loForm.ndiscfactval = lnDiscVal + loForm.do_calculeaza_totaluri() + poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, lnIdV, lnIdFactVechi, lnCod, lnAn, lnLuna) + DO asserteaza WITH 'instantaneul de editare s-a creat', VARTYPE(poSnapshotEditare) = 'O', VARTYPE(poSnapshotEditare) + IF VARTYPE(poSnapshotEditare) <> 'O' + RETURN + ENDIF + + *!* --- modificarea utilizatorului: o cantitate pe prima linie => ruta 1 (regenerare) --- + SELECT crsfactura + GO TOP + lnLiniiCrs = RECCOUNT('crsfactura') + lnCantVeche = cantitate + lnIdArtModificat = id_articol + lnCantNoua = lnCantVeche + 1 + REPLACE cantitate WITH lnCantNoua IN crsfactura + loForm.do_calculeaza_totaluri() + STRTOFILE('modificare: id_articol=' + TRANSFORM(lnIdArtModificat) + ' cantitate ' + ; + TRANSFORM(lnCantVeche) + ' -> ' + TRANSFORM(lnCantNoua) + ' (linii crsfactura=' + ; + TRANSFORM(lnLiniiCrs) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + + DO asserteaza WITH 'ruta aleasa pentru modificarea de cantitate este 1 (regenerare)', ; + AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura') = 1, ; + TRANSFORM(AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')) + + *!* --- comutatorul care deschide ruta 1; in productie lipseste, deci ruta 1 ramane cu mesajul --- + DO urma WITH 'do_scrie_factura (SCRIE IN ORACLE)' + glRegenerareEditare = .T. + llRez = loForm.do_scrie_factura() + glRegenerareEditare = .F. + DO urma WITH 'do_scrie_factura a revenit' + + DO asserteaza WITH 'B1 do_scrie_factura() a intors .T.', llRez, TRANSFORM(llRez) + STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) + + *!* --- starea DUPA --- + lnSters = -1 + goExecutor.oSelecteaza2Value([select sters from vanzari where id_vanzare = ] + TRANSFORM(lnIdV), @lnSters) + DO asserteaza WITH 'B2 documentul vechi are VANZARI.STERS = 1', lnSters = 1, TRANSFORM(lnSters) + + *!* serie+numar NU identifica unic un document pe aceasta schema de test (exista duplicate reale) - + *!* documentul nou e cel cu id_vanzare peste maximul dinainte de apel + lnNr = -1 + goExecutor.oSelecteaza2Value([select count(*) as nr from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxInainte), @lnNr) + DO asserteaza WITH 'B3 exista exact UN document nou nesters (id_vanzare peste maximul dinainte)', lnNr = 1, TRANSFORM(lnNr) + + lnIdVNou = 0 + goExecutor.oSelecteaza2Value([select nvl(max(id_vanzare),0) as id from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxInainte), @lnIdVNou) + + DO asserteaza WITH 'B4 poDate.nid_vanzare (parametru OUT) = id-ul documentului nou', ; + lnIdVNou > 0 AND poDate.nid_vanzare = lnIdVNou, TRANSFORM(poDate.nid_vanzare) + ' vs ' + TRANSFORM(lnIdVNou) + + IF lnIdVNou <= 0 + RETURN + ENDIF + + lnLiniiNoi = -1 + goExecutor.oSelecteaza2Value([select count(*) as nr from vanzari_detalii where sters = 0 and id_vanzare = ] + TRANSFORM(lnIdVNou), @lnLiniiNoi) + DO asserteaza WITH 'B5a numarul de linii noi = Reccount(crsfactura)', lnLiniiNoi = lnLiniiCrs, ; + TRANSFORM(lnLiniiNoi) + ' vs ' + TRANSFORM(lnLiniiCrs) + + lnCantNouaDb = -1 + goExecutor.oSelecteaza2Value([select nvl(sum(cantitate),-1) as s from vanzari_detalii where sters = 0 and id_vanzare = ] + ; + TRANSFORM(lnIdVNou) + [ and id_articol = ] + TRANSFORM(lnIdArtModificat), @lnCantNouaDb) + DO asserteaza WITH 'B5b cantitatea modificata se regaseste pe linia noua', lnCantNouaDb = lnCantNoua, ; + TRANSFORM(lnCantNouaDb) + ' vs ' + TRANSFORM(lnCantNoua) + + lnRulVechiNesters = -1 + goExecutor.oSelecteaza2Value([select count(*) as nr from rul where sters = 0 and an = ] + TRANSFORM(lnAn) + ; + [ and luna = ] + TRANSFORM(lnLuna) + [ and cod = ] + TRANSFORM(lnCod), @lnRulVechiNesters) + STRTOFILE('B6: rul nesters pe codul vechi INAINTE=' + TRANSFORM(lnVrulInainte) + ' DUPA=' + TRANSFORM(lnRulVechiNesters) + CHR(13) + CHR(10), gcErrLog, 1) + IF lnVrulInainte > 0 + DO asserteaza WITH 'B6 randurile RUL ale documentului vechi sunt toate sters=1', lnRulVechiNesters = 0, TRANSFORM(lnRulVechiNesters) + ELSE + STRTOFILE('B6 VID (candidatul nu avea randuri RUL) - nu se asertioneaza' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + + lnCorespNou = -1 + goExecutor.oSelecteaza2Value([select count(*) as nr from vanzari_coresp where sters = 0 and ] + ; + [(id_vanzare_fact = ] + TRANSFORM(lnIdV) + [ or id_vanzare_aviz = ] + TRANSFORM(lnIdV) + [)], @lnCorespNou) + DO asserteaza WITH 'B7 VANZARI_CORESP ale documentului vechi sunt toate sters=1', lnCorespNou = 0, ; + TRANSFORM(lnCorespVechi) + ' -> ' + TRANSFORM(lnCorespNou) + + lnSurse = -1 + lnSurseFacturate = -1 + goExecutor.oSelecteaza2Value([select count(*) as nr from vanzari_coresp where sters = 0 and id_vanzare_fact = ] + TRANSFORM(lnIdVNou), @lnSurse) + goExecutor.oSelecteaza2Value([select count(*) as nr from vanzari where facturat = 1 and id_vanzare in ] + ; + [(select id_vanzare_aviz from vanzari_coresp where sters = 0 and id_vanzare_fact = ] + TRANSFORM(lnIdVNou) + [)], @lnSurseFacturate) + STRTOFILE('B8: surse legate de documentul nou=' + TRANSFORM(lnSurse) + ' dintre care facturat=1: ' + TRANSFORM(lnSurseFacturate) + CHR(13) + CHR(10), gcErrLog, 1) + IF lnSurse > 0 + DO asserteaza WITH 'B8 toate sursele legate de documentul nou sunt marcate facturat = 1', lnSurseFacturate = lnSurse, ; + TRANSFORM(lnSurseFacturate) + ' vs ' + TRANSFORM(lnSurse) + DO asserteaza WITH 'B9 poDate.listaid nu e gol (documentul avea sursa)', !EMPTY(poDate.listaid), TRANSFORM(poDate.listaid) + ELSE + STRTOFILE('B8/B9 VIDE (documentul nu are surse in vanzari_coresp) - nu se asertioneaza' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + + lnIdFactNou = 0 + goExecutor.oSelecteaza2Value([select id_fact from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou), @lnIdFactNou) + STRTOFILE('B10: ID_FACT vechi=' + TRANSFORM(lnIdFactVechi) + ' nou=' + TRANSFORM(lnIdFactNou) + ; + ' (identic = ASTEPTAT azi, S9-7 cableaza ForteazaIdFactReemitere)' + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'B10 documentul nou pastreaza ID_FACT-ul vechi (identic - garantat de S9-7)', lnIdFactNou = lnIdFactVechi, ; + TRANSFORM(lnIdFactVechi) + ' -> ' + TRANSFORM(lnIdFactNou) + + *!* S14: perechea de creare (id_util/dataora) trebuie transportata pe documentul nou, direct pe + *!* randul curent - nu doar reconstruibila prin lantul ID_FACT; iar perechea de modificare + *!* (id_utilm/dataoram) trebuie sa poarte utilizatorul si momentul reemiterii curente + lnIdUtilNou = -1 + ldDataoraNou = {} + lnIdUtilmNou = -1 + ldDataoramNou = {} + IF USED('v_aud_s94') + USE IN v_aud_s94 + ENDIF + IF goExecutor.oExecuta([select id_util, dataora, nvl(id_utilm,-1) as id_utilm, dataoram from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou), 'v_aud_s94') + SELECT v_aud_s94 + GO TOP + lnIdUtilNou = NVL(id_util, 0) + ldDataoraNou = NVL(dataora, {}) + lnIdUtilmNou = id_utilm + ldDataoramNou = NVL(dataoram, {}) + USE IN v_aud_s94 + ENDIF + STRTOFILE('S14: id_util vechi=' + TRANSFORM(lnIdUtilVechi) + ' nou=' + TRANSFORM(lnIdUtilNou) + ; + ' dataora vechi=' + TRANSFORM(ldDataoraVechi) + ' nou=' + TRANSFORM(ldDataoraNou) + ; + ' id_utilm nou=' + TRANSFORM(lnIdUtilmNou) + ' dataoram nou=' + TRANSFORM(ldDataoramNou) + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'S14-1 documentul nou pastreaza ID_UTIL-ul creatiei originale', lnIdUtilNou = lnIdUtilVechi, ; + TRANSFORM(lnIdUtilVechi) + ' -> ' + TRANSFORM(lnIdUtilNou) + DO asserteaza WITH 'S14-2 documentul nou pastreaza DATAORA creatiei originale', ; + !EMPTY(ldDataoraNou) AND TTOC(ldDataoraNou) == TTOC(ldDataoraVechi), ; + TRANSFORM(ldDataoraVechi) + ' -> ' + TRANSFORM(ldDataoraNou) + DO asserteaza WITH 'S14-3 documentul nou are ID_UTILM = utilizatorul reemiterii', lnIdUtilmNou = gnIdUtil, ; + TRANSFORM(gnIdUtil) + ' vs ' + TRANSFORM(lnIdUtilmNou) + DO asserteaza WITH 'S14-4 documentul nou are DATAORAM completat (momentul reemiterii)', !EMPTY(ldDataoramNou), TRANSFORM(ldDataoramNou) + + *!* ID_FACT pastrat (B10): id_doc nou = id_doc vechi, randul din DOCUMENTE se REFOLOSESTE, nu se sterge + lnDocNou = -1 + lnStersNotaVeche = -1 + ldDataIregNou = {} + IF USED('v_doc2_s94') + USE IN v_doc2_s94 + ENDIF + IF goExecutor.oExecuta([select sters, dataireg from documente where id_doc = ] + TRANSFORM(lnIdFactNou), 'v_doc2_s94') + SELECT v_doc2_s94 + lnDocNou = RECCOUNT('v_doc2_s94') + IF lnDocNou > 0 + GO TOP + ldDataIregNou = NVL(dataireg, {}) + ENDIF + USE IN v_doc2_s94 + ENDIF + goExecutor.oSelecteaza2Value([select sters from documente where id_doc = ] + TRANSFORM(lnIdFactVechi), @lnStersNotaVeche) + STRTOFILE('nota contabila DUPA: id_doc nou=' + TRANSFORM(lnIdFactNou) + ' randuri=' + TRANSFORM(lnDocNou) + ; + ' dataireg=' + TRANSFORM(ldDataIregNou) + ' (nota veche id_doc=' + TRANSFORM(lnIdFactVechi) + ; + ' sters=' + TRANSFORM(lnStersNotaVeche) + ' dataireg=' + TRANSFORM(ldDataIregVechi) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + + DO asserteaza WITH 'B11a exista o nota contabila noua (ID_DOC = ID_FACT-ul nou)', lnDocNou = 1, TRANSFORM(lnDocNou) + IF lnDocVechi > 0 + DO asserteaza WITH 'B11b nota contabila veche a fost REFOLOSITA, nu stearsa (sters = 0)', lnStersNotaVeche = 0, TRANSFORM(lnStersNotaVeche) + *!* fidelitate: dataireg reala a notei vechi e purtata pe documentul nou, nu inlocuita cu data_act + DO asserteaza WITH 'B11c dataireg a notei noi = dataireg a notei vechi (fidelitate pastrata)', ; + !EMPTY(ldDataIregNou) AND TTOD(ldDataIregNou) = TTOD(ldDataIregVechi), ; + TRANSFORM(ldDataIregVechi) + ' -> ' + TRANSFORM(ldDataIregNou) + ENDIF + + *!* fidelitate: id_fdoc real al documentului vechi e purtat pe cel nou (vact_tot, nu DOCUMENTE) + lnIdFdocNou = -1 + goExecutor.oSelecteaza2Value([select a.id_fdoc from ] + gcs + [.vact_tot a, vanzari v ] + ; + [where v.id_vanzare = ] + TRANSFORM(lnIdVNou) + [ and a.cod = v.cod and a.sters = 0 ] + ; + [and a.id_act = (select min(b.id_act) from ] + gcs + [.vact_tot b where b.cod = v.cod and b.sters = 0)], @lnIdFdocNou) + STRTOFILE('B13: id_fdoc vechi=' + TRANSFORM(lnIdFdocVechiMasurat) + ' nou=' + TRANSFORM(lnIdFdocNou) + CHR(13) + CHR(10), gcErrLog, 1) + IF lnIdFdocVechiMasurat > 0 + DO asserteaza WITH 'B13 id_fdoc al documentului nou = cel al documentului vechi', ; + lnIdFdocNou = lnIdFdocVechiMasurat, TRANSFORM(lnIdFdocVechiMasurat) + ' -> ' + TRANSFORM(lnIdFdocNou) + ENDIF + + lcSerieNou = '' + lnNumarNou = 0 + goExecutor.oSelecteaza2Value([select serie_act from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou), @lcSerieNou) + goExecutor.oSelecteaza2Value([select numar_act from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou), @lnNumarNou) + DO asserteaza WITH 'B12 seria+numarul sunt aceleasi (nu s-au consumat numere SSS)', ; + ALLTRIM(lcSerieNou) == ALLTRIM(lcSerie) AND lnNumarNou = lnNumar, ; + TRANSFORM(lcSerie) + '/' + TRANSFORM(lnNumar) + ' -> ' + TRANSFORM(lcSerieNou) + '/' + TRANSFORM(lnNumarNou) + + *!* --- S9-5: atasamentele (decizia 53 - se sterg, nu se remigreaza) --- + lnAtasNesterse = NumaraAtasamente(lnIdV, 0) + lnAtasSterse = NumaraAtasamente(lnIdV, 1) + DO asserteaza WITH 'B14 atasamentele documentului vechi sunt toate sters = 1', ; + lnAtasNesterse = 0 AND lnAtasSterse = lnAtasInainte, ; + 'nesterse=' + TRANSFORM(lnAtasNesterse) + ' sterse=' + TRANSFORM(lnAtasSterse) + + lnAtasNou = NumaraAtasamente(lnIdVNou, -1) + DO asserteaza WITH 'B15 documentul nou nu are niciun atasament (porneste curat)', lnAtasNou = 0, TRANSFORM(lnAtasNou) + + *!* auditul stergerii, ca la VANZARI: id_utils + dataoras completate pe randurile sterse + lnAtasAudit = -1 + goExecutor.oSelecteaza2Value([select count(*) as nr from atasamente_vanzari where sters = 1 ] + ; + [and id_vanzare = ] + TRANSFORM(lnIdV) + [ and id_utils = ] + TRANSFORM(gnIdUtil) + [ and dataoras is not null], @lnAtasAudit) + DO asserteaza WITH 'B16 randurile sterse poarta id_utils si dataoras', lnAtasAudit = lnAtasInainte, ; + TRANSFORM(lnAtasAudit) + ' vs ' + TRANSFORM(lnAtasInainte) + + *!* --- S11: randul de borderou s-a mutat pe documentul nou (2.1) --- + IF glControlNegativ + DO asserteaza WITH 'CN mock-ul a preluat MutaBorderouReemitere (apeluri din .vc2)', ; + gnMockMutaApeluri > 0, TRANSFORM(gnMockMutaApeluri) + ENDIF + + lnBordVechi = NumaraBorderouDetalii(lnIdBorderou, lnIdV) + DO asserteaza WITH 'B-b1 niciun rand de borderou nu mai sta pe id_vanzare vechi', lnBordVechi = 0, TRANSFORM(lnBordVechi) + + lnBordNou = NumaraBorderouDetalii(lnIdBorderou, lnIdVNou) + DO asserteaza WITH 'B-b2 randul de borderou sta pe id_vanzare nou', lnBordNou = 1, TRANSFORM(lnBordNou) + + lnBordView = NumaraViewBorderou(lnIdBorderou) + DO asserteaza WITH 'B-b3 borderoul nu a pierdut randul (1 rand in FACT_VBORDEROU_DETALII)', ; + lnBordView = 1, TRANSFORM(lnBordView) + + lnTotalBordDupa = CitesteTotalBorderou(lnIdBorderou) + lnTotalVanzNou = -1 + goExecutor.oSelecteaza2Value([select nvl(total_cu_tva,-1) as t from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou), @lnTotalVanzNou) + STRTOFILE('B-b4: total in borderou INAINTE=' + TRANSFORM(lnTotalBordInainte) + ' DUPA=' + ; + TRANSFORM(lnTotalBordDupa) + ' | total_cu_tva al documentului nou=' + TRANSFORM(lnTotalVanzNou) + ; + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'B-b4 borderoul arata totalul documentului NOU, nu al celui sters', ; + ABS(lnTotalBordDupa - lnTotalVanzNou) < 0.005 AND ABS(lnTotalBordDupa - lnTotalBordInainte) >= 0.005, ; + TRANSFORM(lnTotalBordInainte) + ' -> ' + TRANSFORM(lnTotalBordDupa) + ' (vanzari nou: ' + TRANSFORM(lnTotalVanzNou) + ')' + + STRTOFILE('BORDEROU SEMANAT NECURATAT: id=' + TRANSFORM(lnIdBorderou) + ; + ' - se sterge cu curata_s11_borderou.prg' + CHR(13) + CHR(10), gcErrLog, 1) + + STRTOFILE('CONSUMAT: id_vanzare vechi=' + TRANSFORM(lnIdV) + ' nou=' + TRANSFORM(lnIdVNou) + ; + ' cod vechi=' + TRANSFORM(lnCod) + ' ID_FACT vechi=' + TRANSFORM(lnIdFactVechi) + ' nou=' + TRANSFORM(lnIdFactNou) + ; + ' serie/numar=' + TRANSFORM(lcSerieNou) + '/' + TRANSFORM(lnNumarNou) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*============================================================================================== +* RULAREA 3 (S9-5) - atomicitatea atasamentelor. Forteaza esecul reemiterii DUPA stergere si +* verifica ca rollback-ul readuce atasamentele la sters = 0. Nu consuma documentul. +*============================================================================================== +PROCEDURE Rularea3 + LOCAL lnIdV, lnCod, lnTip, lnAn, lnLuna, lnIdFactVechi, lnDiscRon, lnDiscVal, loForm + LOCAL lnAtasInainte, lnAtasDupa, lnSters, lnIdVMaxInainte, lnNoi, llRez, lnLungSerie + LOCAL lnIdBorderou, lnBordDupa + + IF !AlegeCandidat(@lnIdV, @lnCod, @lnTip, @lnAn, @lnLuna, .T.) + RETURN + ENDIF + + lnIdFactVechi = 0 + goExecutor.oSelecteaza2Value([select id_fact from vanzari where id_vanzare = ] + TRANSFORM(lnIdV), @lnIdFactVechi) + + lnIdBorderou = SeamanaBorderou(lnIdV) + DO asserteaza WITH 'PRECONDITIE C: borderoul semanat s-a creat', lnIdBorderou > 0, TRANSFORM(lnIdBorderou) + + DO SeamanaAtasamente WITH lnIdV + lnAtasInainte = NumaraAtasamente(lnIdV, 0) + DO asserteaza WITH 'PRECONDITIE C: documentul are 2 atasamente nesterse', lnAtasInainte = 2, TRANSFORM(lnAtasInainte) + IF lnAtasInainte <> 2 + RETURN + ENDIF + + lnIdVMaxInainte = 0 + goExecutor.oSelecteaza2Value([select nvl(max(id_vanzare),0) as id from vanzari], @lnIdVMaxInainte) + + DO urma WITH 'R3 IncarcaAntetFacturaEditare' + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(lnIdV, @lnDiscRon, @lnDiscVal) + IF VARTYPE(poDate) <> 'O' + DO asserteaza WITH 'C0 antetul s-a incarcat', .F., VARTYPE(poDate) + RETURN + ENDIF + IncarcaLiniiFacturaEditare(poDate, lnIdV) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + DO asserteaza WITH 'C0 liniile s-au incarcat', .F., '0' + RETURN + ENDIF + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + loForm = CREATEOBJECT('frm_facturare_articole2') + loForm.ndiscfactron = lnDiscRon + loForm.ndiscfactval = lnDiscVal + loForm.do_calculeaza_totaluri() + poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, lnIdV, lnIdFactVechi, lnCod, lnAn, lnLuna) + IF VARTYPE(poSnapshotEditare) <> 'O' + DO asserteaza WITH 'C0 instantaneul s-a creat', .F., VARTYPE(poSnapshotEditare) + RETURN + ENDIF + + SELECT crsfactura + GO TOP + REPLACE cantitate WITH cantitate + 1 IN crsfactura + loForm.do_calculeaza_totaluri() + + *!* esecul fortat: serie mai lunga decat coloana => eroare Oracle la scrierea antetului nou, + *!* adica DUPA stergerea documentului vechi si DUPA stergerea atasamentelor + lnLungSerie = 0 + goExecutor.oSelecteaza2Value([select data_length from all_tab_columns where owner = '] + gcs + ; + [' and table_name = 'VANZARI' and column_name = 'SERIE_ACT'], @lnLungSerie) + DO asserteaza WITH 'C0 lungimea coloanei SERIE_ACT s-a citit', lnLungSerie > 0, TRANSFORM(lnLungSerie) + IF lnLungSerie <= 0 + RETURN + ENDIF + poDate.serie_act = REPLICATE('Z', lnLungSerie + 5) + + *!* fara ruta 1 nu s-ar intra deloc in blocul de regenerare, iar C2/C3 ar trece degeaba + DO asserteaza WITH 'C0b ruta aleasa este 1 (regenerare)', ; + AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura') = 1, ; + TRANSFORM(AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')) + + DO urma WITH 'R3 do_scrie_factura (asteptat ESEC)' + gcMockUltimMesaj = '' + glRegenerareEditare = .T. + llRez = loForm.do_scrie_factura() + glRegenerareEditare = .F. + DO urma WITH 'R3 do_scrie_factura a revenit' + + DO asserteaza WITH 'C1 do_scrie_factura() a esuat, cum s-a fortat', !llRez, TRANSFORM(llRez) + + *!* esecul trebuie sa fie AL SCRIERII, nu al stergerii - altfel blocul de atasamente nu a rulat + STRTOFILE('R3 ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'C1b esecul e la scrierea documentului nou, nu la stergere/atasamente', ; + !('nu a putut fi sters' $ LOWER(gcMockUltimMesaj)) AND !('atasamentele documentului vechi' $ LOWER(gcMockUltimMesaj)), ; + gcMockUltimMesaj + + lnSters = -1 + goExecutor.oSelecteaza2Value([select sters from vanzari where id_vanzare = ] + TRANSFORM(lnIdV), @lnSters) + DO asserteaza WITH 'C2 rollback-ul a readus documentul vechi (sters = 0)', lnSters = 0, TRANSFORM(lnSters) + + lnAtasDupa = NumaraAtasamente(lnIdV, 0) + DO asserteaza WITH 'C3 rollback-ul a readus si atasamentele (sters = 0)', lnAtasDupa = lnAtasInainte, ; + TRANSFORM(lnAtasDupa) + ' vs ' + TRANSFORM(lnAtasInainte) + + lnNoi = -1 + goExecutor.oSelecteaza2Value([select count(*) as nr from vanzari where id_vanzare > ] + TRANSFORM(lnIdVMaxInainte), @lnNoi) + DO asserteaza WITH 'C4 niciun document nou nu a ramas in urma', lnNoi = 0, TRANSFORM(lnNoi) + + *!* esecul cade INAINTE de mutarea borderoului (scrierea antetului nou), deci randul nu are voie + *!* sa se fi miscat - garda impotriva unei mutari scapate in afara tranzactiei + lnBordDupa = NumaraBorderouDetalii(lnIdBorderou, lnIdV) + DO asserteaza WITH 'C5 randul de borderou a ramas pe documentul vechi', lnBordDupa = 1, TRANSFORM(lnBordDupa) + + *!* curatenie: atasamentele si borderoul semanate se sterg fizic, documentul ramane refolosibil + goExecutor.oExecuta([delete from ] + gcs + [.atasamente_vanzari where id_vanzare = ] + TRANSFORM(lnIdV)) + goExecutor.oExecuta([COMMIT]) + DO CurataBorderouSemanat WITH lnIdBorderou + STRTOFILE('R3: atasamentele semanate pe ' + TRANSFORM(lnIdV) + ' au fost sterse fizic; documentul NU a fost consumat' + ; + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*============================================================================================== +* RULAREA 5 (S11) - atomicitatea mutarii. Cheama MutaBorderouReemitere REALA sub tranzactie +* manuala si verifica pe al doilea handle ca nimic n-a scapat comis; rollback la final. +* Nu consuma documentul. +*============================================================================================== +PROCEDURE Rularea5 + LOCAL lnIdV, lnCod, lnTip, lnAn, lnLuna, lnIdBorderou, lnH2, lnIdTinta + LOCAL llMutat, lnTranz, lnVechiH1, lnNouH1, lnVechiH2, lnNouH2 + + IF !AlegeCandidat(@lnIdV, @lnCod, @lnTip, @lnAn, @lnLuna, .T.) + RETURN + ENDIF + + lnIdBorderou = SeamanaBorderou(lnIdV) + DO asserteaza WITH 'PRECONDITIE D: borderoul semanat s-a creat', lnIdBorderou > 0, TRANSFORM(lnIdBorderou) + IF lnIdBorderou <= 0 + RETURN + ENDIF + + *!* tinta = alt document real: FACT_BORDEROU_DETALII are FK pe VANZARI, un id inexistent ar pica + *!* pe constrangere si proba ar masura constrangerea, nu atomicitatea + lnIdTinta = 0 + goExecutor.oSelecteaza2Value([select nvl(min(id_vanzare),0) as id from vanzari where id_vanzare <> ] + TRANSFORM(lnIdV), @lnIdTinta) + DO asserteaza WITH 'D0 exista un id_vanzare tinta real', lnIdTinta > 0, TRANSFORM(lnIdTinta) + IF lnIdTinta <= 0 + DO CurataBorderouSemanat WITH lnIdBorderou + RETURN + ENDIF + + SQLSetprop(0, "DispLogin", 3) + lnH2 = SQLSTRINGCONNECT("dsn=CENTRAL;Uid=MARIUSM_AUTO;Pwd=ROMFASTSOFT;") + DO asserteaza WITH 'D0b al doilea handle Oracle deschis', lnH2 > 0, TRANSFORM(lnH2) + IF lnH2 <= 0 + DO CurataBorderouSemanat WITH lnIdBorderou + RETURN + ENDIF + + SQLEXEC(gnHandle, "select * from dual", "v_dual_s11") + IF USED('v_dual_s11') + USE IN v_dual_s11 + ENDIF + SQLSetprop(gnHandle, "Transactions", 2) + + llMutat = MutaBorderouReemitere(lnIdV, lnIdTinta) + DO asserteaza WITH 'D1 MutaBorderouReemitere a intors .T. sub tranzactie manuala', llMutat, TRANSFORM(llMutat) + + lnTranz = SQLGetprop(gnHandle, "Transactions") + DO asserteaza WITH 'D2 tranzactia manuala e inca deschisa dupa mutare (Transactions = 2)', lnTranz = 2, TRANSFORM(lnTranz) + + lnNouH1 = NumaraBorderouDetalii(lnIdBorderou, lnIdTinta) + DO asserteaza WITH 'D3 in interiorul tranzactiei randul e pe id-ul tinta', lnNouH1 = 1, TRANSFORM(lnNouH1) + + lnVechiH2 = NumaraDetaliiPeHandle(lnH2, lnIdBorderou, lnIdV) + lnNouH2 = NumaraDetaliiPeHandle(lnH2, lnIdBorderou, lnIdTinta) + DO asserteaza WITH 'D4 pe al doilea handle mutarea NU a scapat comisa (inca pe id-ul vechi)', ; + lnVechiH2 = 1 AND lnNouH2 = 0, 'vechi=' + TRANSFORM(lnVechiH2) + ' tinta=' + TRANSFORM(lnNouH2) + + SQLRollback(gnHandle) + SQLSetprop(gnHandle, "Transactions", 1) + + lnVechiH1 = NumaraBorderouDetalii(lnIdBorderou, lnIdV) + lnNouH1 = NumaraBorderouDetalii(lnIdBorderou, lnIdTinta) + DO asserteaza WITH 'D5 dupa rollback randul a revenit pe id_vanzare vechi', ; + lnVechiH1 = 1 AND lnNouH1 = 0, 'vechi=' + TRANSFORM(lnVechiH1) + ' tinta=' + TRANSFORM(lnNouH1) + + SQLDISCONNECT(lnH2) + DO CurataBorderouSemanat WITH lnIdBorderou + STRTOFILE('rularea 5 NU a consumat documentul ' + TRANSFORM(lnIdV) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*============================================================================================== +* S11: semanarea borderoului (prin procedurile de productie), numararea si curatenia. +*============================================================================================== +FUNCTION SeamanaBorderou + LPARAMETERS tnIdVanzare + LOCAL lnIdPart, lnMaxInainte, lnId, llOk + + lnIdPart = 0 + goExecutor.oSelecteaza2Value([select id_part from vanzari where id_vanzare = ] + TRANSFORM(tnIdVanzare), @lnIdPart) + IF EMPTY(NVL(lnIdPart, 0)) + STRTOFILE('SeamanaBorderou: documentul ' + TRANSFORM(tnIdVanzare) + ' nu are id_part' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN 0 + ENDIF + + lnMaxInainte = 0 + goExecutor.oSelecteaza2Value([select nvl(max(id),0) as id from ] + gcs + [.fact_borderou], @lnMaxInainte) + + llOk = goExecutor.oExecuta([declare n number; begin ] + gcs + [.pack_fact_borderou.BorderouNou(] + ; + TRANSFORM(lnIdPart) + [, ] + TRANSFORM(gnIdUtil) + [, n); ] + gcs + ; + [.pack_fact_borderou.BorderouAdaugaFactura(n, ] + TRANSFORM(tnIdVanzare) + [); end;]) + IF !llOk + STRTOFILE('SeamanaBorderou ESEC: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + goExecutor.oExecuta([ROLLBACK]) + RETURN 0 + ENDIF + goExecutor.oExecuta([COMMIT]) + + lnId = 0 + goExecutor.oSelecteaza2Value([select nvl(max(id),0) as id from ] + gcs + [.fact_borderou where id > ] + TRANSFORM(lnMaxInainte), @lnId) + STRTOFILE('SeamanaBorderou: id_part=' + TRANSFORM(lnIdPart) + ' id_borderou=' + TRANSFORM(lnId) + ; + ' pe id_vanzare=' + TRANSFORM(tnIdVanzare) + CHR(13) + CHR(10), gcErrLog, 1) + RETURN lnId +ENDFUNC + + +FUNCTION NumaraBorderouDetalii + LPARAMETERS tnIdBorderou, tnIdVanzare + LOCAL lnNr + lnNr = -1 + goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_borderou_detalii where id_borderou = ] + ; + TRANSFORM(tnIdBorderou) + [ and id_vanzare = ] + TRANSFORM(tnIdVanzare), @lnNr) + RETURN lnNr +ENDFUNC + + +FUNCTION NumaraViewBorderou + LPARAMETERS tnIdBorderou + LOCAL lnNr + lnNr = -1 + goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.fact_vborderou_detalii where id_borderou = ] + ; + TRANSFORM(tnIdBorderou), @lnNr) + RETURN lnNr +ENDFUNC + + +FUNCTION CitesteTotalBorderou + LPARAMETERS tnIdBorderou + LOCAL lnTot + lnTot = -1 + goExecutor.oSelecteaza2Value([select nvl(sum(total_cu_tva),-1) as t from ] + gcs + ; + [.fact_vborderou_detalii where id_borderou = ] + TRANSFORM(tnIdBorderou), @lnTot) + RETURN lnTot +ENDFUNC + + +PROCEDURE CurataBorderouSemanat + LPARAMETERS tnIdBorderou + IF EMPTY(NVL(tnIdBorderou, 0)) + RETURN + ENDIF + goExecutor.oExecuta([delete from ] + gcs + [.fact_borderou_detalii where id_borderou = ] + TRANSFORM(tnIdBorderou)) + goExecutor.oExecuta([delete from ] + gcs + [.fact_borderou where id = ] + TRANSFORM(tnIdBorderou)) + goExecutor.oExecuta([COMMIT]) + STRTOFILE('borderoul semanat ' + TRANSFORM(tnIdBorderou) + ' a fost sters fizic' + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +PROCEDURE NumaraDetaliiPeHandle + LPARAMETERS tnHandle, tnIdBorderou, tnIdVanzare + LOCAL lnRez, lnVal + lnVal = -1 + IF USED('v_h2_s11') + USE IN v_h2_s11 + ENDIF + lnRez = SQLEXEC(tnHandle, "select count(*) as nr from fact_borderou_detalii where id_borderou = " + ; + TRANSFORM(tnIdBorderou) + " and id_vanzare = " + TRANSFORM(tnIdVanzare), "v_h2_s11") + IF lnRez > 0 AND USED('v_h2_s11') + SELECT v_h2_s11 + GO TOP + lnVal = NVL(nr, -1) + USE IN v_h2_s11 + ENDIF + RETURN lnVal +ENDPROC + + +*============================================================================================== +* S9-5: semanarea si numararea atasamentelor. tnSters = -1 numara toate randurile. +*============================================================================================== +PROCEDURE SeamanaAtasamente + LPARAMETERS tnIdVanzare + LOCAL lnExistente, llOk + + lnExistente = NumaraAtasamente(tnIdVanzare, -1) + IF lnExistente > 0 + STRTOFILE('SeamanaAtasamente: documentul ' + TRANSFORM(tnIdVanzare) + ' are deja ' + ; + TRANSFORM(lnExistente) + ' randuri - nu se mai seamana' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + + llOk = goExecutor.oExecuta([begin insert into ] + gcs + [.atasamente_vanzari ] + ; + [(id_vanzare, tip, format, document, id_util) values (] + TRANSFORM(tnIdVanzare) + ; + [, 1, 'A4', utl_raw.cast_to_raw('proba S9-5 factura'), ] + TRANSFORM(gnIdUtil) + [); ] + ; + [insert into ] + gcs + [.atasamente_vanzari ] + ; + [(id_vanzare, tip, format, document, id_util) values (] + TRANSFORM(tnIdVanzare) + ; + [, 5, 'A4', utl_raw.cast_to_raw('proba S9-5 aviz'), ] + TRANSFORM(gnIdUtil) + [); end;]) + IF llOk + goExecutor.oExecuta([COMMIT]) + ENDIF + STRTOFILE('SeamanaAtasamente pe id_vanzare=' + TRANSFORM(tnIdVanzare) + ': ' + ; + IIF(llOk, 'OK', 'ESEC ' + goExecutor.cEroare) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +FUNCTION NumaraAtasamente + LPARAMETERS tnIdVanzare, tnSters + LOCAL lnNr, lcFiltru + lnNr = -1 + lcFiltru = IIF(tnSters < 0, '', [ and sters = ] + TRANSFORM(tnSters)) + goExecutor.oSelecteaza2Value([select count(*) as nr from ] + gcs + [.atasamente_vanzari where id_vanzare = ] + ; + TRANSFORM(tnIdVanzare) + lcFiltru, @lnNr) + RETURN lnNr +ENDFUNC + + +*============================================================================================== +* Alegerea candidatului: STERS=0, perioada activa, randuri in vact_tot, fara referinte/urmasi. +* tlDoarOtherwise = .T. exclude tipurile cu ramura proprie in do_scrie_factura (proforma, 4, +* 3/21/25/28/42/47) - raman doar cele care cad pe Otherwise. +*============================================================================================== +PROCEDURE AlegeCandidat + LPARAMETERS tnIdV, tnCod, tnTip, tnAn, tnLuna, tlDoarOtherwise + LOCAL lcSql, lcExclusi, lnOk, lnGasit, lnIdFactCand + + *!* 1111/1112: articolul 315554536 nu are gestiune - reemiterea pica pe FACT-007, inainte de + *!* orice asertiune S9/S11 (conditie de date, nu regresie) + lcExclusi = [1047,1048,1055,1111,1112,1113,1130] + lcSql = [select v.id_vanzare, v.cod, v.tip, v.data_act, v.id_fact from vanzari v where v.sters = 0 ] + ; + [ and extract(year from v.data_act) = ] + TRANSFORM(gnAn) + ; + [ and extract(month from v.data_act) = ] + TRANSFORM(gnLuna) + ; + [ and nvl(v.eproforma,0) = 0 ] + ; + [ and v.id_vanzare not in (] + lcExclusi + [) ] + ; + [ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ; + [ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + IF tlDoarOtherwise + *!* linii reale cu cantitate > 0 - un document degenerat (cantitate 0) nu probeaza reemiterea + *!* total > 0: pe MARIUSM_AUTO exista ~40 de documente reziduale (total_cu_tva = 0, + *!* id_articol 4294507490, nr_incasare fara lista de incasare) pe care scrie_factura2 pica cu + *!* parametru vid - nu probeaza nici reemiterea, nici asertiunile pe sume + lcSql = lcSql + [ and v.tip not in (4,3,21,25,28,42,47,44,45,46,51) ] + ; + [ and nvl(v.total_cu_tva,0) > 0 ] + ; + [ and exists (select 1 from vanzari_detalii d where d.sters = 0 and d.id_vanzare = v.id_vanzare ] + ; + [ and nvl(d.cantitate,0) > 0) ] + ENDIF + lcSql = lcSql + [order by v.id_vanzare] + + IF USED('v_cand_s94') + USE IN v_cand_s94 + ENDIF + lnOk = goExecutor.oExecuta(lcSql, 'v_cand_s94') + DO asserteaza WITH 'interogarea de candidati a reusit', lnOk, TRANSFORM(lnOk) + IF !lnOk + RETURN .F. + ENDIF + + lnGasit = 0 + SELECT v_cand_s94 + SCAN + *!* valorile se citesc INAINTE de garzi - ReferinteDocumenteNota/DocumentAreUrmasi/EsteInEFactura + *!* isi deschid propriile cursoare si schimba zona de lucru curenta + tnIdV = id_vanzare + tnCod = cod + tnTip = tip + tnAn = YEAR(data_act) + tnLuna = MONTH(data_act) + lnIdFactCand = NVL(id_fact, 0) + IF !ReferinteDocumenteNota(tnAn, tnLuna, tnCod) AND !DocumentAreUrmasi(tnIdV) AND !EsteInEFactura(lnIdFactCand) + lnGasit = 1 + EXIT + ENDIF + ENDSCAN + USE IN v_cand_s94 + + DO asserteaza WITH 'exista un candidat eligibil', lnGasit = 1, TRANSFORM(lnGasit) + IF lnGasit = 0 + RETURN .F. + ENDIF + + STRTOFILE('candidat ales: id_vanzare=' + TRANSFORM(tnIdV) + ' cod=' + TRANSFORM(tnCod) + ; + ' tip=' + TRANSFORM(tnTip) + ' an/luna=' + TRANSFORM(tnAn) + '/' + TRANSFORM(tnLuna) + CHR(13) + CHR(10), gcErrLog, 1) + RETURN .T. +ENDPROC + + +PROCEDURE CitesteStersPeHandle + LPARAMETERS tnHandle, tnIdVanzare + LOCAL lnRez, lnVal + lnVal = -1 + IF USED('v_h2_s94') + USE IN v_h2_s94 + ENDIF + lnRez = SQLEXEC(tnHandle, "select sters from vanzari where id_vanzare = " + TRANSFORM(tnIdVanzare), "v_h2_s94") + IF lnRez > 0 AND USED('v_h2_s94') + SELECT v_h2_s94 + IF RECCOUNT('v_h2_s94') = 1 + GO TOP + lnVal = NVL(sters, -1) + ENDIF + USE IN v_h2_s94 + ENDIF + RETURN lnVal +ENDPROC + + +PROCEDURE urma + LPARAMETERS tcPas + STRTOFILE('URMA ' + TTOC(DATETIME()) + ' ' + m.tcPas + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s9_6_idfact_fortat.prg b/utile/Teste/editare_factura/test_s9_6_idfact_fortat.prg new file mode 100644 index 0000000..5239410 --- /dev/null +++ b/utile/Teste/editare_factura/test_s9_6_idfact_fortat.prg @@ -0,0 +1,765 @@ +* test_s9_6_idfact_fortat.prg +* Proba S9-6 (docs\propunere_s9_6_pack_contafin.md, sectiunea 6a): PACK_CONTAFIN.nIdFactFortat +* impune ID_FACT-ul documentului reemis, iar scrierea in DOCUMENTE (acum MERGE, nu INSERT) +* reinvie randul existent in loc sa cada cu ORA-00001. +* +* Parametru tnRulare: +* 1 = AUTOMATISM S9-7 (fost CONTROL NEGATIV A). Reemitere FARA fortare manuala din test. De la +* S9-7 (658acc6), do_scrie_articole cheama ForteazaIdFactReemitere NECONDITIONAT la orice +* regenerare a unui document cu ID_FACT - deci nu mai exista in productie o reemitere "fara +* pastrare" pentru asemenea documente. Asteptat: ID_FACT PASTRAT automat, la fel ca rularea 2, +* dar fara ca testul sa fi setat nimic - dovedeste ca automatismul nu depinde de apelant. +* 2 = PROBA PRINCIPALA. Se seteaza pack_contafin.nIdFactFortat = ID_FACT-ul vechi inainte de +* do_scrie_factura(). Asteptat: ID_FACT pastrat, UN singur rand in DOCUMENTE, sters=0, +* coloanele de identitate ale documentului NOU, iar ID_UTIL/DATAORA cele INITIALE. +* Ramura MATCHED a MERGE-ului e atinsa numai aici. +* 3 = RETRASA (fosta CONTROL NEGATIV B, fortare pe un ID_DOC inexistent -> ramura NOT MATCHED). +* De la S9-7, do_scrie_articole ruleaza inaintea oricarei scrieri si suprascrie neconditionat +* nIdFactFortat cu ID_FACT-ul REAL al documentului vechi - orice valoare fortata manual de test +* e inlocuita inainte sa ajunga la SET_IDFACT (masurat: 8025760 impus manual, 8010086 - ID_FACT-ul +* real - efectiv folosit). Ramura NOT MATCHED ramane exercitata doar de documente FARA ID_FACT, +* in afara acestui test (preconditia lui cere ID_FACT>0). +* 4 = REEMITERE DUBLA. Rularea 2 aplicata de doua ori la rand pe acelasi document: ID_FACT, serie +* si numar identice dupa fiecare, iar COUNT(*) pe DOCUMENTE pentru acel ID_DOC ramane 1. +* +* Rularile 5-7 probeaza S9-7 (scriptul Oracle #9, fortare TINTITA pe (nract, serie_act)) si cer un +* document cu grup de incasare pe ACEEASI serie ca factura - la egalitate de serie, "order by 4" din +* SCRIE_IN_ACT nu departajeaza grupurile, iar masuratoarea de la cod 1141166 arata incasarea prima: +* 5 = TINTIRE. Se seteaza toate trei variabilele (nIdFactFortat, nNractFortat, cSerieFortata) pe +* grupul FACTURII. Asteptat: ID_FACT pastrat, iar randul reinviat din DOCUMENTE poarta seria si +* NUMARUL FACTURII, nu ale chitantei; grupul de incasare primeste un ID_DOC din secventa. +* 6 = CONTROL NEGATIV FARA TINTIRE. Aceleasi verificari ca rularea 5, dar cu nNractFortat si +* cSerieFortata lasate NULL. Asteptat: PICA - valoarea ajunge pe primul grup din bucla, adica +* pe incasare. Daca aceasta rulare trece, rularea 5 nu masoara nimic. +* 7 = RESET DUPA BUCLA (hunk C4). Se forteaza un (nract, serie_act) care nu apare in bucla +* (nract + 1). Asteptat: niciun grup nu se potriveste, documentul primeste ID_FACT nou, randul +* vechi ramane sters = 1, si toate trei variabilele sunt NULL dupa apel. +* +* SCRIE IN ORACLE: fiecare rulare sterge documentul ales si emite unul nou (acelasi mecanism ca +* test_s9_4_regenerare.prg rularea 2, care nu consuma numere SSS - seria/numarul se pastreaza). +* +* Documente EXCLUSE (folosite de alte suite / DATA_ACT alterata): +* 1047, 1048, 1055, 1113, 1130 + +LPARAMETERS tnRulare, tnIdVanzare + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail, gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +PUBLIC poDate, poSnapshotEditare, glRegenerareEditare, gnIdVCerut, glCereIncasareSerie +gnIdVCerut = VAL(TRANSFORM(tnIdVanzare)) +glCereIncasareSerie = .F. + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s9_6_idfact_fortat_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' rulare=' + TRANSFORM(tnRulare) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +*!* stub_verificare inaintea lui COMUN\FERESTRE: Do Form verificare (ofacturare.vc2) nu se afiseaza +LOCAL lcPathVechi, lcPathNou +lcPathVechi = SET("PATH") +lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi +SET PATH TO &lcPathNou + +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnPass = 0 +gnFail = 0 +glRegenerareEditare = .F. + +STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) + +LOCAL lnRulare +lnRulare = VAL(TRANSFORM(tnRulare)) +STRTOFILE('rulare ceruta: ' + TRANSFORM(lnRulare) + CHR(13) + CHR(10), gcErrLog, 1) + +DO CASE +CASE lnRulare = 1 + DO Ruleaza WITH 0 +CASE lnRulare = 2 + DO Ruleaza WITH 1 +CASE lnRulare = 3 + *!* retrasa: vezi antetul fisierului - S9-7 suprascrie orice fortare manuala inainte de SET_IDFACT + STRTOFILE('RETRASA: fortarea pe ID_DOC inexistent nu mai e reproductibila prin do_scrie_factura' + ; + ' de cand S9-7 suprascrie neconditionat nIdFactFortat cu ID_FACT-ul real (vezi antetul fisierului)' + CHR(13) + CHR(10), gcErrLog, 1) +CASE lnRulare = 4 + DO Ruleaza WITH 3 +CASE lnRulare = 5 + glCereIncasareSerie = .T. + DO Ruleaza WITH 4 +CASE lnRulare = 6 + glCereIncasareSerie = .T. + DO Ruleaza WITH 5 +CASE lnRulare = 7 + glCereIncasareSerie = .T. + DO Ruleaza WITH 6 +OTHERWISE + STRTOFILE('EROARE: tnRulare trebuie sa fie intre 1 si 7' + CHR(13) + CHR(10), gcErrLog, 1) +ENDCASE + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*============================================================================================== +* Ruleaza: tnMod 0 = fara fortare (control negativ A), 1 = fortare pe ID_FACT-ul vechi, +* 2 = fortare pe un ID_DOC inexistent (control negativ B), 3 = fortare de doua ori +*============================================================================================== +PROCEDURE Ruleaza + LPARAMETERS tnMod + LOCAL lnIdV, lnCod, lnTip, lnAn, lnLuna, lnIdFactVechi, lnIdFortat, lnIdVNou, lnIdFactNou + LOCAL lnDocMaxInainte, lnDocTotalInainte, lnDocTotalDupa, lnIdUtilInainte, lnIdVMaxInainte + LOCAL lcDataOraInainte, lnNrDocFortat, lnStersDoc, lnActNesters, lnFortatDupa, llRez + LOCAL lcSerieNoua, lnNumarNou, ldDataActNoua, lnPas, lnIdFactRunda1, lcSerieRunda1, lnNumarRunda1 + LOCAL lcSerieVeche, lnNumarVechi, lnNractTinta, lcSerieTinta, lnIncMaxInainte + + IF !AlegeCandidat(@lnIdV, @lnCod, @lnTip, @lnAn, @lnLuna) + RETURN + ENDIF + + *!* --- starea INAINTE --- + lnIdFactVechi = 0 + lnIdFactVechi = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)) + DO asserteaza WITH 'PRECONDITIE documentul ales are ID_FACT', lnIdFactVechi > 0, TRANSFORM(lnIdFactVechi) + IF lnIdFactVechi <= 0 + RETURN + ENDIF + + lnIdUtilInainte = -1 + lcDataOraInainte = '' + IF USED('v_doc96') + USE IN v_doc96 + ENDIF + IF goExecutor.oExecuta([select id_util, to_char(dataora,'dd.mm.yyyy hh24:mi:ss') as dataorat, sters ] + ; + [from documente where id_doc = ] + TRANSFORM(lnIdFactVechi), 'v_doc96') + SELECT v_doc96 + IF RECCOUNT('v_doc96') = 1 + GO TOP + lnIdUtilInainte = NVL(id_util, -1) + lcDataOraInainte = ALLTRIM(NVL(dataorat, '')) + ENDIF + USE IN v_doc96 + ENDIF + STRTOFILE('INAINTE: id_vanzare=' + TRANSFORM(lnIdV) + ' cod=' + TRANSFORM(lnCod) + ' tip=' + TRANSFORM(lnTip) + ; + ' id_fact=' + TRANSFORM(lnIdFactVechi) + ' documente.id_util=' + TRANSFORM(lnIdUtilInainte) + ; + ' documente.dataora=' + lcDataOraInainte + CHR(13) + CHR(10), gcErrLog, 1) + + lnDocMaxInainte = 0 + lnDocTotalInainte = 0 + lnIdVMaxInainte = 0 + lnDocMaxInainte = Val1([select nvl(max(id_doc),0) as v from documente]) + lnDocTotalInainte = Val1([select count(*) as v from documente]) + lnIdVMaxInainte = Val1([select nvl(max(id_vanzare),0) as v from vanzari]) + + *!* valoarea impusa: ID_FACT-ul vechi al documentului (mod 2, fortare pe ID_DOC inexistent, retras) + lnIdFortat = lnIdFactVechi + + *!* seria si numarul se pastreaza la reemitere, deci grupul tintit al facturii se cunoaste dinainte + lcSerieVeche = '' + lnNumarVechi = 0 + *!* DO...WITH cu doi parametri prin referinta arunca "Syntax error" (10) in acest mediu - + *!* apel ca functie, cu paranteze, ca la AlegeCandidat(@...) mai sus, care functioneaza + = CitesteSerieNumar(lnIdV, @lcSerieVeche, @lnNumarVechi) + lnNractTinta = 0 + lcSerieTinta = '' + DO CASE + CASE tnMod = 4 + lnNractTinta = lnNumarVechi + lcSerieTinta = lcSerieVeche + CASE tnMod = 6 + lnNractTinta = lnNumarVechi + 1 + lcSerieTinta = lcSerieVeche + ENDCASE + STRTOFILE('TINTA: nract=' + TRANSFORM(lnNractTinta) + ' serie=[' + lcSerieTinta + ']' + ; + ' (documentul vechi: ' + lcSerieVeche + '/' + TRANSFORM(lnNumarVechi) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + DO ListeazaGrupuriAct WITH lnCod + + *!* --- reemiterea, runda 1 --- + lnIdVNou = 0 + IF !ReemiteDocument(lnIdV, lnIdFactVechi, IIF(tnMod = 0, 0, lnIdFortat), @lnIdVNou, @llRez, lnIdVMaxInainte, 1, lnCod, lnAn, lnLuna, lnNractTinta, lcSerieTinta) + RETURN + ENDIF + + *!* --- variabila e consumata? (citita pe acelasi handle Oracle, deci aceeasi sesiune) --- + lnFortatDupa = CitesteFortat() + STRTOFILE('nIdFactFortat dupa apel = ' + TRANSFORM(lnFortatDupa) + ' (-1 = NULL, -999 = necitibil)' + CHR(13) + CHR(10), gcErrLog, 1) + IF lnFortatDupa <> -999 + DO asserteaza WITH 'C10 nIdFactFortat e consumat (NULL) dupa apel', lnFortatDupa = -1, TRANSFORM(lnFortatDupa) + ELSE + STRTOFILE('C10 NECONCLUDENT: variabila de pachet nu s-a putut citi prin bind OUT' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + + *!* cele doua variabile de tintire se sterg dupa bucla (hunk C4), nu in SET_IDFACT + IF INLIST(tnMod, 4, 5, 6) + DO VerificaVariabileTinta + ENDIF + + lnIdFactNou = 0 + lnIdFactNou = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou)) + lcSerieNoua = '' + lnNumarNou = 0 + IF USED('v_ant96') + USE IN v_ant96 + ENDIF + IF goExecutor.oExecuta([select serie_act, numar_act, data_act from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou), 'v_ant96') + SELECT v_ant96 + IF RECCOUNT('v_ant96') = 1 + GO TOP + lcSerieNoua = ALLTRIM(NVL(serie_act, '')) + lnNumarNou = NVL(numar_act, 0) + ldDataActNoua = NVL(data_act, {}) + ENDIF + USE IN v_ant96 + ENDIF + STRTOFILE('DUPA: id_vanzare nou=' + TRANSFORM(lnIdVNou) + ' id_fact nou=' + TRANSFORM(lnIdFactNou) + ; + ' serie=' + lcSerieNoua + ' numar=' + TRANSFORM(lnNumarNou) + CHR(13) + CHR(10), gcErrLog, 1) + + *!* --- randurile din DOCUMENTE atinse de operatie --- + DO ListeazaDocumente WITH lnIdFactVechi, lnIdFortat, lnDocMaxInainte + + lnDocTotalDupa = Val1([select count(*) as v from documente]) + STRTOFILE('DOCUMENTE total: INAINTE=' + TRANSFORM(lnDocTotalInainte) + ' DUPA=' + TRANSFORM(lnDocTotalDupa) + ; + ' (delta ' + TRANSFORM(lnDocTotalDupa - lnDocTotalInainte) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + + lnNrDocFortat = -1 + lnNrDocFortat = Val1([select count(*) as v from documente where id_doc = ] + TRANSFORM(lnIdFactVechi)) + + DO CASE + CASE tnMod = 0 + *!* AUTOMATISM S9-7: testul nu forteaza nimic, dar do_scrie_articole o face oricum - + *!* ID_FACT trebuie PASTRAT, exact ca la proba principala (mod 1) + DO asserteaza WITH 'N1 fara fortare manuala, ID_FACT-ul documentului nou e PASTRAT automat', ; + lnIdFactNou > 0 AND lnIdFactNou = lnIdFactVechi, TRANSFORM(lnIdFactVechi) + ' -> ' + TRANSFORM(lnIdFactNou) + DO asserteaza WITH 'N2 DOCUMENTE are exact UN rand pe ID_DOC-ul pastrat (nu doua)', ; + lnNrDocFortat = 1, TRANSFORM(lnNrDocFortat) + lnStersDoc = -1 + lnStersDoc = Val1([select nvl(sters,-1) as v from documente where id_doc = ] + TRANSFORM(lnIdFactNou)) + DO asserteaza WITH 'N3 randul pastrat e REINVIAT (sters = 0), nu ramas sters', lnStersDoc = 0, TRANSFORM(lnStersDoc) + + CASE tnMod = 6 + *!* TINTA GRESITA: niciun grup nu se potriveste, deci nimeni nu consuma valoarea fortata. + *!* Documentul primeste ID_FACT nou, iar variabilele raman curate doar prin hunk-ul C4. + DO asserteaza WITH 'W1 cu tinta inexistenta, ID_FACT-ul documentului nou e DIFERIT de cel vechi', ; + lnIdFactNou > 0 AND lnIdFactNou <> lnIdFactVechi, TRANSFORM(lnIdFactVechi) + ' -> ' + TRANSFORM(lnIdFactNou) + lnStersDoc = -1 + lnStersDoc = Val1([select nvl(sters,-1) as v from documente where id_doc = ] + TRANSFORM(lnIdFactVechi)) + DO asserteaza WITH 'W2 randul vechi din DOCUMENTE ramane sters = 1', lnStersDoc = 1, TRANSFORM(lnStersDoc) + + OTHERWISE + *!* PROBA PRINCIPALA (mod 1) si prima runda a modului 3 + DO asserteaza WITH 'C1 do_scrie_factura() a intors .T.', llRez, TRANSFORM(llRez) + DO asserteaza WITH 'C4 ID_FACT-ul documentului nou = ID_FACT-ul vechi (identitate pastrata)', ; + lnIdFactNou = lnIdFactVechi, TRANSFORM(lnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactNou) + DO asserteaza WITH 'C5 DOCUMENTE are exact UN rand pe ID_DOC-ul pastrat (nu doua)', ; + lnNrDocFortat = 1, TRANSFORM(lnNrDocFortat) + DO VerificaRandulReinviat WITH lnIdFactVechi, lcSerieNoua, lnNumarNou, lnIdUtilInainte, lcDataOraInainte + + lnActNesters = -1 + lnActNesters = Val1([select count(*) as v from act where id_fact = ] + TRANSFORM(lnIdFactVechi) + ; + [ and sters = 0]) + DO asserteaza WITH 'C9 exista randuri ACT nesterse pe ID_FACT-ul pastrat', lnActNesters > 0, TRANSFORM(lnActNesters) + ENDCASE + + *!* --- pe CE grup a ajuns ID_FACT-ul fortat (riscul 4). Modul 5 e controlul negativ: aici se + *!* --- asteapta esec, fiindca fara tintire valoarea ajunge pe primul grup din bucla --- + IF INLIST(tnMod, 4, 5) + DO ListeazaGrupuriAct WITH Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou)) + DO VerificaTintireGrupuri WITH lnIdVNou, lnIdFactVechi, lcSerieNoua, lnNumarNou + ENDIF + + *!* --- modul 3: a doua reemitere, cu fortare din nou pe acelasi ID_FACT --- + IF tnMod = 3 + lnIdFactRunda1 = lnIdFactNou + lcSerieRunda1 = lcSerieNoua + lnNumarRunda1 = lnNumarNou + + lnIdVMaxInainte = 0 + lnIdVMaxInainte = Val1([select nvl(max(id_vanzare),0) as v from vanzari]) + + LOCAL lnIdVNou2, llRez2, lnIdFactNou2, lcSerieNoua2, lnNumarNou2, lnNrDoc2, lnCodNou + lnIdVNou2 = 0 + lnCodNou = 0 + lnCodNou = Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou)) + IF !ReemiteDocument(lnIdVNou, lnIdFactRunda1, lnIdFactRunda1, @lnIdVNou2, @llRez2, lnIdVMaxInainte, 2, lnCodNou, lnAn, lnLuna, 0, '') + RETURN + ENDIF + lnIdFactNou2 = 0 + lnIdFactNou2 = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou2)) + lcSerieNoua2 = '' + lnNumarNou2 = 0 + IF USED('v_ant96b') + USE IN v_ant96b + ENDIF + IF goExecutor.oExecuta([select serie_act, numar_act from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou2), 'v_ant96b') + SELECT v_ant96b + IF RECCOUNT('v_ant96b') = 1 + GO TOP + lcSerieNoua2 = ALLTRIM(NVL(serie_act, '')) + lnNumarNou2 = NVL(numar_act, 0) + ENDIF + USE IN v_ant96b + ENDIF + lnNrDoc2 = -1 + lnNrDoc2 = Val1([select count(*) as v from documente where id_doc = ] + TRANSFORM(lnIdFactRunda1)) + + STRTOFILE('RUNDA 2: id_vanzare=' + TRANSFORM(lnIdVNou2) + ' id_fact=' + TRANSFORM(lnIdFactNou2) + ; + ' serie=' + lcSerieNoua2 + ' numar=' + TRANSFORM(lnNumarNou2) + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'D1 a doua reemitere a intors .T.', llRez2, TRANSFORM(llRez2) + DO asserteaza WITH 'D2 ID_FACT identic si dupa a doua reemitere', lnIdFactNou2 = lnIdFactRunda1, ; + TRANSFORM(lnIdFactRunda1) + ' vs ' + TRANSFORM(lnIdFactNou2) + DO asserteaza WITH 'D3 seria si numarul raman aceleasi', lcSerieNoua2 == lcSerieRunda1 AND lnNumarNou2 = lnNumarRunda1, ; + lcSerieRunda1 + '/' + TRANSFORM(lnNumarRunda1) + ' vs ' + lcSerieNoua2 + '/' + TRANSFORM(lnNumarNou2) + DO asserteaza WITH 'D4 COUNT(*) pe DOCUMENTE pentru acel ID_DOC ramane 1', lnNrDoc2 = 1, TRANSFORM(lnNrDoc2) + ENDIF + + STRTOFILE('CONSUMAT: id_vanzare vechi=' + TRANSFORM(lnIdV) + ' nou=' + TRANSFORM(lnIdVNou) + ; + ' ID_FACT vechi=' + TRANSFORM(lnIdFactVechi) + ' nou=' + TRANSFORM(lnIdFactNou) + ; + ' serie/numar=' + lcSerieNoua + '/' + TRANSFORM(lnNumarNou) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*============================================================================================== +* ReemiteDocument: drumul lui do_editare_unificata fara Show() - incarca documentul, modifica o +* cantitate, si cheama do_scrie_factura(). Daca tnIdFortat > 0, seteaza pack_contafin.nIdFactFortat +* imediat inainte de apel. Intoarce .F. daca s-a oprit inainte de scriere. +*============================================================================================== +PROCEDURE ReemiteDocument + LPARAMETERS tnIdV, tnIdFactVechi, tnIdFortat, tnIdVNou, tlRez, tnIdVMaxInainte, tnRunda, tnCod, tnAn, tnLuna, ; + tnNractFortat, tcSerieFortata + LOCAL loForm, lnDiscRon, lnDiscVal, lnCantVeche, lnCantNoua, lnNr, llSetat, lcBloc + + DO urma WITH 'runda ' + TRANSFORM(tnRunda) + ': IncarcaAntetFacturaEditare' + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal) + DO asserteaza WITH 'antetul documentului s-a incarcat (runda ' + TRANSFORM(tnRunda) + ')', VARTYPE(poDate) = 'O', VARTYPE(poDate) + IF VARTYPE(poDate) <> 'O' + RETURN .F. + ENDIF + + DO urma WITH 'runda ' + TRANSFORM(tnRunda) + ': IncarcaLiniiFacturaEditare' + IncarcaLiniiFacturaEditare(poDate, tnIdV) + DO asserteaza WITH 'liniile documentului s-au incarcat (runda ' + TRANSFORM(tnRunda) + ')', ; + USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1)) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + RETURN .F. + ENDIF + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + loForm = CREATEOBJECT('frm_facturare_articole2') + loForm.ndiscfactron = lnDiscRon + loForm.ndiscfactval = lnDiscVal + loForm.do_calculeaza_totaluri() + poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ; + tnIdV, tnIdFactVechi, tnCod, tnAn, tnLuna) + IF VARTYPE(poSnapshotEditare) <> 'O' + DO asserteaza WITH 'instantaneul de editare s-a creat (runda ' + TRANSFORM(tnRunda) + ')', .F., VARTYPE(poSnapshotEditare) + RETURN .F. + ENDIF + + SELECT crsfactura + GO TOP + lnCantVeche = cantitate + lnCantNoua = lnCantVeche + 1 + REPLACE cantitate WITH lnCantNoua IN crsfactura + loForm.do_calculeaza_totaluri() + STRTOFILE('runda ' + TRANSFORM(tnRunda) + ': cantitate ' + TRANSFORM(lnCantVeche) + ' -> ' + ; + TRANSFORM(lnCantNoua) + CHR(13) + CHR(10), gcErrLog, 1) + + DO asserteaza WITH 'ruta aleasa e 1 (regenerare), runda ' + TRANSFORM(tnRunda), ; + AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura') = 1, ; + TRANSFORM(AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')) + + *!* poDate.nract / poDate.serie_act sunt sursa tintirii in cablajul VFP propus (S9-7 2.B hunk B1) + STRTOFILE('poDate: nract=' + IIF(PEMSTATUS(poDate, 'nract', 5), TRANSFORM(poDate.nract), '(lipseste)') + ; + ' serie_act=[' + IIF(PEMSTATUS(poDate, 'serie_act', 5), ALLTRIM(NVL(poDate.serie_act, '')), '(lipseste)') + ']' + ; + CHR(13) + CHR(10), gcErrLog, 1) + + *!* --- fortarea ID_FACT-ului: bloc PL/SQL anonim cu valoarea literala (fara bind, care s-ar + *!* --- lega de PRIVATE si ar putea agata SQLExec) --- + IF tnIdFortat > 0 + lcBloc = [begin pack_contafin.nIdFactFortat := ] + TRANSFORM(tnIdFortat) + [; ] + IF tnNractFortat > 0 + lcBloc = lcBloc + [pack_contafin.nNractFortat := ] + TRANSFORM(tnNractFortat) + [; ] + ; + [pack_contafin.cSerieFortata := ] + ; + IIF(EMPTY(tcSerieFortata), [NULL], ['] + ALLTRIM(tcSerieFortata) + [']) + [; ] + ENDIF + lcBloc = lcBloc + [end;] + llSetat = goExecutor.oExecuta(lcBloc) + DO asserteaza WITH 'nIdFactFortat s-a putut seta (runda ' + TRANSFORM(tnRunda) + ')', llSetat, TRANSFORM(llSetat) + STRTOFILE('FORTAT: ' + lcBloc + CHR(13) + CHR(10), gcErrLog, 1) + IF !llSetat + RETURN .F. + ENDIF + ELSE + STRTOFILE('FARA FORTARE (control negativ)' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + + DO urma WITH 'runda ' + TRANSFORM(tnRunda) + ': do_scrie_factura (SCRIE IN ORACLE)' + glRegenerareEditare = .T. + tlRez = loForm.do_scrie_factura() + glRegenerareEditare = .F. + DO urma WITH 'runda ' + TRANSFORM(tnRunda) + ': do_scrie_factura a revenit' + STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) + + lnNr = -1 + lnNr = Val1([select count(*) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(tnIdVMaxInainte)) + DO asserteaza WITH 'exista exact UN document nou nesters (runda ' + TRANSFORM(tnRunda) + ')', lnNr = 1, TRANSFORM(lnNr) + + tnIdVNou = 0 + tnIdVNou = Val1([select nvl(max(id_vanzare),0) as v from vanzari where sters = 0 and id_vanzare > ] + ; + TRANSFORM(tnIdVMaxInainte)) + IF tnIdVNou <= 0 + RETURN .F. + ENDIF + + LOCAL lnStersVechi + lnStersVechi = -1 + lnStersVechi = Val1([select nvl(sters,-1) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV)) + DO asserteaza WITH 'documentul vechi are VANZARI.STERS = 1 (runda ' + TRANSFORM(tnRunda) + ')', lnStersVechi = 1, TRANSFORM(lnStersVechi) + + RETURN .T. +ENDPROC + + +*============================================================================================== +* VerificaRandulReinviat: coloanele randului din DOCUMENTE dupa ramura MATCHED +*============================================================================================== +PROCEDURE VerificaRandulReinviat + LPARAMETERS tnIdDoc, tcSerieNoua, tnNumarNou, tnIdUtilInainte, tcDataOraInainte + LOCAL lnSters, lcSerie, lnNract, lnIdUtil, lcDataOra + + IF USED('v_ver96') + USE IN v_ver96 + ENDIF + IF !goExecutor.oExecuta([select sters, nvl(serie_act,' ') as serie_act, nvl(nract,-1) as nract, ] + ; + [id_util, to_char(dataora,'dd.mm.yyyy hh24:mi:ss') as dataorat ] + ; + [from documente where id_doc = ] + TRANSFORM(tnIdDoc), 'v_ver96') + DO asserteaza WITH 'C6-C8 randul reinviat s-a putut citi', .F., 'eroare interogare' + RETURN + ENDIF + SELECT v_ver96 + IF RECCOUNT('v_ver96') <> 1 + DO asserteaza WITH 'C6-C8 randul reinviat exista o singura data', .F., TRANSFORM(RECCOUNT('v_ver96')) + USE IN v_ver96 + RETURN + ENDIF + GO TOP + lnSters = NVL(sters, -1) + lcSerie = ALLTRIM(NVL(serie_act, '')) + lnNract = NVL(nract, -1) + lnIdUtil = NVL(id_util, -1) + lcDataOra = ALLTRIM(NVL(dataorat, '')) + USE IN v_ver96 + + STRTOFILE('RAND REINVIAT id_doc=' + TRANSFORM(tnIdDoc) + ': sters=' + TRANSFORM(lnSters) + ; + ' serie_act=[' + lcSerie + '] nract=' + TRANSFORM(lnNract) + ' id_util=' + TRANSFORM(lnIdUtil) + ; + ' dataora=' + lcDataOra + CHR(13) + CHR(10), gcErrLog, 1) + + DO asserteaza WITH 'C6 randul reinviat are STERS = 0', lnSters = 0, TRANSFORM(lnSters) + DO asserteaza WITH 'C7a serie_act = seria documentului nou', lcSerie == tcSerieNoua, ; + '[' + lcSerie + '] vs [' + tcSerieNoua + ']' + DO asserteaza WITH 'C7b nract = numarul documentului nou', lnNract = tnNumarNou, ; + TRANSFORM(lnNract) + ' vs ' + TRANSFORM(tnNumarNou) + DO asserteaza WITH 'C8a ID_UTIL neschimbat (audit de creare)', lnIdUtil = tnIdUtilInainte, ; + TRANSFORM(tnIdUtilInainte) + ' -> ' + TRANSFORM(lnIdUtil) + DO asserteaza WITH 'C8b DATAORA neschimbata (audit de creare)', lcDataOra == tcDataOraInainte, ; + '[' + tcDataOraInainte + '] -> [' + lcDataOra + ']' +ENDPROC + + +*============================================================================================== +* ListeazaDocumente: toate randurile atinse - cel impus si cele aparute peste maximul dinainte. +* Pe documentele cu incasare exista doua grupuri in ACT_TEMP, deci doua randuri in DOCUMENTE; +* asa se vede pe care dintre ele a ajuns ID_FACT-ul impus (riscul 4 din propunere). +*============================================================================================== +PROCEDURE ListeazaDocumente + LPARAMETERS tnIdDocVechi, tnIdFortat, tnDocMaxInainte + + IF USED('v_lst96') + USE IN v_lst96 + ENDIF + IF !goExecutor.oExecuta([select id_doc, sters, nvl(serie_act,' ') as serie_act, nvl(nract,-1) as nract, ] + ; + [id_util, nvl(id_set,-1) as id_set, nvl(tva_incasare,-1) as tva_incasare ] + ; + [from documente where id_doc = ] + TRANSFORM(tnIdDocVechi) + ; + [ or id_doc = ] + TRANSFORM(tnIdFortat) + ; + [ or id_doc > ] + TRANSFORM(tnDocMaxInainte) + [ order by id_doc], 'v_lst96') + STRTOFILE('EROARE la listarea randurilor DOCUMENTE' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + STRTOFILE('--- randuri DOCUMENTE atinse (' + TRANSFORM(RECCOUNT('v_lst96')) + ') ---' + CHR(13) + CHR(10), gcErrLog, 1) + SELECT v_lst96 + SCAN + STRTOFILE(' id_doc=' + TRANSFORM(id_doc) + ' sters=' + TRANSFORM(sters) + ; + ' serie=[' + ALLTRIM(serie_act) + '] nract=' + TRANSFORM(nract) + ; + ' id_util=' + TRANSFORM(id_util) + ' id_set=' + TRANSFORM(id_set) + ; + ' tva_incasare=' + TRANSFORM(tva_incasare) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_lst96 +ENDPROC + + +*============================================================================================== +* CitesteFortat: variabila de pachet nu poate fi citita din SQL - se citeste prin bind OUT +* intr-un bloc PL/SQL anonim, pe acelasi handle (deci aceeasi sesiune Oracle). +* -1 = NULL (consumata), -999 = apelul nu a reusit (rezultat neconcludent). +*============================================================================================== +FUNCTION CitesteFortat + LOCAL lnRez + PRIVATE pnFortat96 + pnFortat96 = 0 + lnRez = SQLEXEC(gnHandle, "begin ?@pnFortat96 := nvl(pack_contafin.nIdFactFortat, -1); end;") + IF lnRez < 0 + RETURN -999 + ENDIF + RETURN NVL(pnFortat96, -999) +ENDFUNC + + +*============================================================================================== +* VerificaVariabileTinta: cele doua variabile de tintire nu sunt consumate de SET_IDFACT - se +* sterg numai de blocul de dupa bucla (hunk C4). Citite prin bind OUT pe acelasi handle. +*============================================================================================== +PROCEDURE VerificaVariabileTinta + LOCAL lnRez + PRIVATE pnNract96, pcSerie96 + pnNract96 = 0 + pcSerie96 = '' + lnRez = SQLEXEC(gnHandle, "begin ?@pnNract96 := nvl(pack_contafin.nNractFortat, -1); " + ; + "?@pcSerie96 := nvl(pack_contafin.cSerieFortata, '#NULL#'); end;") + IF lnRez < 0 + STRTOFILE('T8-T9 NECONCLUDENT: variabilele de tintire nu s-au putut citi prin bind OUT' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + STRTOFILE('DUPA APEL: nNractFortat=' + TRANSFORM(NVL(pnNract96, -999)) + ; + ' cSerieFortata=[' + ALLTRIM(NVL(pcSerie96, '?')) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'T8 nNractFortat e NULL dupa apel (resetarea de dupa bucla)', ; + NVL(pnNract96, -999) = -1, TRANSFORM(NVL(pnNract96, -999)) + DO asserteaza WITH 'T9 cSerieFortata e NULL dupa apel (resetarea de dupa bucla)', ; + ALLTRIM(NVL(pcSerie96, '?')) == '#NULL#', '[' + ALLTRIM(NVL(pcSerie96, '?')) + ']' +ENDPROC + + +*============================================================================================== +* CitesteSerieNumar: seria si numarul documentului, care se pastreaza la reemitere si dau deci +* grupul (nract, serie_act) al FACTURII, adica tinta fortarii. +*============================================================================================== +PROCEDURE CitesteSerieNumar + LPARAMETERS tnIdV, tcSerie, tnNumar + + IF USED('v_sn97') + USE IN v_sn97 + ENDIF + IF goExecutor.oExecuta([select nvl(serie_act,' ') as serie_act, nvl(numar_act,0) as numar_act ] + ; + [from vanzari where id_vanzare = ] + TRANSFORM(tnIdV), 'v_sn97') + SELECT v_sn97 + IF RECCOUNT('v_sn97') = 1 + GO TOP + tcSerie = ALLTRIM(NVL(serie_act, '')) + tnNumar = NVL(numar_act, 0) + ENDIF + USE IN v_sn97 + ENDIF +ENDPROC + + +*============================================================================================== +* ListeazaGrupuriAct: grupurile din ACT ale unui cod - asa se vede care e grupul facturii si care +* al incasarii, si ce ID_FACT a primit fiecare. +*============================================================================================== +PROCEDURE ListeazaGrupuriAct + LPARAMETERS tnCod + + IF USED('v_gr97') + USE IN v_gr97 + ENDIF + IF !goExecutor.oExecuta([select id_fact, nvl(serie_act,' ') as serie_act, nract, ] + ; + [max(case when scd like '5%' or scc like '5%' then 1 else 0 end) as e_inc, count(*) as n ] + ; + [from act where cod = ] + TRANSFORM(tnCod) + [ and sters = 0 ] + ; + [group by id_fact, serie_act, nract order by id_fact], 'v_gr97') + STRTOFILE('EROARE la listarea grupurilor ACT' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + STRTOFILE('--- grupuri ACT pentru cod ' + TRANSFORM(tnCod) + ' (' + TRANSFORM(RECCOUNT('v_gr97')) + ') ---' + CHR(13) + CHR(10), gcErrLog, 1) + SELECT v_gr97 + SCAN + STRTOFILE(' id_fact=' + TRANSFORM(id_fact) + ' serie=[' + ALLTRIM(serie_act) + '] nract=' + ; + TRANSFORM(nract) + ' incasare=' + TRANSFORM(e_inc) + ' randuri=' + TRANSFORM(n) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_gr97 +ENDPROC + + +*============================================================================================== +* VerificaTintireGrupuri: proba riscului 4. Grupul FACTURII (nract = numarul documentului) trebuie +* sa poarte ID_FACT-ul pastrat, iar grupul de incasare (nract diferit) trebuie sa fi luat NEXTVAL. +*============================================================================================== +PROCEDURE VerificaTintireGrupuri + LPARAMETERS tnIdVNou, tnIdFactVechi, tcSerieNoua, tnNumarNou + LOCAL lnCodNou, lnIdFactFactura, lnIdFactIncasare, lnNractIncasare + + lnCodNou = Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdVNou)) + lnIdFactFactura = Val1([select nvl(min(id_fact),0) as v from act where cod = ] + TRANSFORM(lnCodNou) + ; + [ and sters = 0 and nract = ] + TRANSFORM(tnNumarNou) + ; + [ and nvl(serie_act,'+_') = '] + ALLTRIM(tcSerieNoua) + [']) + lnIdFactIncasare = Val1([select nvl(min(id_fact),0) as v from act where cod = ] + TRANSFORM(lnCodNou) + ; + [ and sters = 0 and nract <> ] + TRANSFORM(tnNumarNou)) + lnNractIncasare = Val1([select nvl(min(nract),-1) as v from act where cod = ] + TRANSFORM(lnCodNou) + ; + [ and sters = 0 and nract <> ] + TRANSFORM(tnNumarNou)) + + STRTOFILE('TINTIRE: grup factura (nract=' + TRANSFORM(tnNumarNou) + ') id_fact=' + TRANSFORM(lnIdFactFactura) + ; + ' grup incasare (nract=' + TRANSFORM(lnNractIncasare) + ') id_fact=' + TRANSFORM(lnIdFactIncasare) + ; + ' vechi=' + TRANSFORM(tnIdFactVechi) + CHR(13) + CHR(10), gcErrLog, 1) + + DO asserteaza WITH 'T6 documentul de test are si un grup de incasare, pe alt nract', ; + lnIdFactIncasare > 0, TRANSFORM(lnNractIncasare) + DO asserteaza WITH 'T7 ID_FACT-ul pastrat a ajuns pe grupul FACTURII', ; + lnIdFactFactura = tnIdFactVechi, TRANSFORM(tnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactFactura) + DO asserteaza WITH 'T7b grupul de INCASARE a primit alt ID_FACT (din secventa)', ; + lnIdFactIncasare > 0 AND lnIdFactIncasare <> tnIdFactVechi, ; + TRANSFORM(tnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactIncasare) +ENDPROC + + +*============================================================================================== +PROCEDURE AlegeCandidat + LPARAMETERS tnIdV, tnCod, tnTip, tnAn, tnLuna + LOCAL lcSql, lcExclusi, lnOk, lnGasit, lnIdFactCand + + *!* 1076: lcListaIncasare iese gol la reemitere si scrie_factura2 pica pe sintaxa - defect + *!* preexistent al caii de editare, fara legatura cu S9-6 + *!* documentele-martor ale celorlalte teste din suita se exclud: reemiterea le consuma + lcExclusi = [1047,1048,1049,1050,1055,1071,1072,1076,1113,1125,1126,1128,1129,1130,1160] + lcSql = [select v.id_vanzare, v.cod, v.tip, v.data_act, v.id_fact from vanzari v where v.sters = 0 ] + ; + [ and extract(year from v.data_act) = ] + TRANSFORM(gnAn) + ; + [ and extract(month from v.data_act) = ] + TRANSFORM(gnLuna) + ; + [ and nvl(v.eproforma,0) = 0 ] + ; + [ and nvl(v.id_fact,0) > 0 ] + ; + [ and v.id_vanzare not in (] + lcExclusi + [) ] + ; + [ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ; + [ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + ; + [ and v.tip not in (4,3,21,25,28,42,47,44,45,46,51) ] + ; + [ and exists (select 1 from vanzari_detalii d where d.sters = 0 and d.id_vanzare = v.id_vanzare ] + ; + [ and nvl(d.cantitate,0) > 0) ] + ; + [order by v.id_vanzare] + IF gnIdVCerut > 0 + lcSql = STRTRAN(lcSql, [order by v.id_vanzare], [ and v.id_vanzare = ] + TRANSFORM(gnIdVCerut) + [ order by v.id_vanzare]) + ENDIF + + IF USED('v_cand96') + USE IN v_cand96 + ENDIF + lnOk = goExecutor.oExecuta(lcSql, 'v_cand96') + DO asserteaza WITH 'interogarea de candidati a reusit', lnOk, TRANSFORM(lnOk) + IF !lnOk + RETURN .F. + ENDIF + + lnGasit = 0 + SELECT v_cand96 + SCAN + tnIdV = id_vanzare + tnCod = cod + tnTip = tip + tnAn = YEAR(data_act) + tnLuna = MONTH(data_act) + lnIdFactCand = NVL(id_fact, 0) + IF !ReferinteDocumenteNota(tnAn, tnLuna, tnCod) AND !DocumentAreUrmasi(tnIdV) AND !EsteInEFactura(lnIdFactCand) + lnGasit = 1 + EXIT + ENDIF + ENDSCAN + USE IN v_cand96 + + DO asserteaza WITH 'exista un candidat eligibil', lnGasit = 1, TRANSFORM(lnGasit) + IF lnGasit = 0 + RETURN .F. + ENDIF + + STRTOFILE('candidat ales: id_vanzare=' + TRANSFORM(tnIdV) + ' cod=' + TRANSFORM(tnCod) + ; + ' tip=' + TRANSFORM(tnTip) + ' an/luna=' + TRANSFORM(tnAn) + '/' + TRANSFORM(tnLuna) + CHR(13) + CHR(10), gcErrLog, 1) + RETURN .T. +ENDPROC + + +*============================================================================================== +* Val1: o singura valoare numerica dintr-un select care aliaseaza coloana ca "v". +* Nu foloseste oSelect2Value: acela citeste Field(1) din zona de lucru CURENTA, nu din cursorul +* propriu, si cade cand zona curenta e alta (a picat exact asa in prima rulare a acestei probe). +*============================================================================================== +FUNCTION Val1 + LPARAMETERS tcSql + LOCAL lnRet + lnRet = -1 + IF USED('v_val96') + USE IN v_val96 + ENDIF + IF goExecutor.oExecuta(tcSql, 'v_val96') + SELECT v_val96 + IF RECCOUNT('v_val96') > 0 + GO TOP + lnRet = NVL(v_val96.v, -1) + ENDIF + USE IN v_val96 + ELSE + STRTOFILE('EROARE Val1: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + RETURN lnRet +ENDFUNC + + +PROCEDURE urma + LPARAMETERS tcPas + STRTOFILE('URMA ' + TTOC(DATETIME()) + ' ' + m.tcPas + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s9_7_cablare_idfact.prg b/utile/Teste/editare_factura/test_s9_7_cablare_idfact.prg new file mode 100644 index 0000000..9d747f7 --- /dev/null +++ b/utile/Teste/editare_factura/test_s9_7_cablare_idfact.prg @@ -0,0 +1,839 @@ +* test_s9_7_cablare_idfact.prg +* Proba S9-7 (docs\propunere_s9_7_cablare_idfact.md, sectiunea 4): cablajul VFP care impune +* ID_FACT-ul documentului vechi la reemitere, TINTIT pe (nract, serie_act), fara comutator. +* +* Diferenta esentiala fata de test_s9_6_idfact_fortat.prg: acest test NU seteaza el +* pack_contafin.nIdFactFortat/nNractFortat/cSerieFortata si NU seteaza glRegenerareEditare. +* Fortarea e facuta AUTOMAT de do_scrie_articole (ofacturare.vc2, hunk B1), tintita pe +* poDate.nract/poDate.serie_act, imediat ce poSnapshotEditare.id_fact > 0. Comutatorul +* glRegenerareEditare a fost scos (hunk B2) - ruta 1 (regenerare) e vizibila necoditionat. +* +* Parametru tnRulare: +* 1 = P1 reemitere document FARA grup de incasare (id_vanzare 1082) +* 2 = P2 reemitere document CU incasare pe ACEEASI serie ca factura (id_vanzare 1149, +* cod 1141174 - documentul masurat in propunere sectiunea 1.5 sub codul vechi +* 1141166). Verifica si P3 (comutatorul scos - ruta 1 fara glRegenerareEditare). +* 3 = P4 esec real dupa stergere: documentul 1076 (m.lcListaIncasare gol, defect +* preexistent). do_scrie_factura() trebuie sa intoarca .F. SI sa curete +* pack_contafin.nIdFactFortat (piesa 2). +* 4 = P5 D3: dupa o reemitere reusita, o A DOUA chemare a do_scrie_factura() pe acelasi +* poDate/poSnapshotEditare nu mai scrie nimic (poSnapshotEditare = .Null. dupa +* succes - hunk B5). Document 1154 (era 1086, consumat de o rulare anterioara cu bug +* in test - vezi nota din raport). +* 5 = P6 neregresie: reemitere OBISNUITA (fara particularitati), coloanele randului +* DOCUMENTE reinviat comparate cu setul de 22 coloane din s9_6_snapshot_dupa.txt. +* Document 1090. +* 6 = CN2 control negativ: tinta GRESITA. poDate.nract se corupe (+1) inainte de apel, deci +* fortarea automata tinteste un grup care nu exista in bucla. Asteptat: ID_FACT nou, +* randul vechi ramane sters=1, toate trei variabilele NULL dupa apel (hunk C4). +* Document 1094. Acelasi mecanism ca rularea 7 din raportul Oracle (deja probat acolo +* direct in PL/SQL) - aici e probat capat-la-capat prin formularul VFP. +* 7 = CN3 control negativ: piesa 2 FARA curatare. Se seteaza nIdFactFortat direct (apel +* ForteazaIdFactReemitere, functia livrata de S9-7), apoi ROLLBACK direct - FARA +* CurataIdFactFortat(). Asteptat: nIdFactFortat ramane NECURATAT (non-NULL) - dovada +* ca ROLLBACK singur nu rezolva piesa 2, doar apelul explicit o face. Nu scrie/sterge +* niciun document real. +* 8 = CN4 control negativ: D3 FARA resetare. Dupa o reemitere reusita (poSnapshotEditare +* devine .Null. prin hunk B5), se RESTAUREAZA manual referinta veche (simuland ca +* hunk B5 n-ar fi rulat) si se cheama do_scrie_factura() a doua oara. Asteptat: DOUA +* documente noi (al treilea document, exact bug-ul D3 din raport_s9_4.md). Document 1095. +* +* CN1 (fara tintire deloc) NU se ruleaza prin acest test: hunk B1 cheama necoditionat +* ForteazaIdFactReemitere(poSnapshotEditare.id_fact, poDate.nract, poDate.serie_act) - iar +* poDate.nract al unui document real INCARCAT nu poate fi NULL/gol, deci cablajul VFP nu poate +* produce scenariul "fara tintire" (comportamentul S9-6 simplu) prin traseul normal, indiferent +* de documentul ales. Scenariul e deja probat la nivel Oracle (raport_s9_7_oracle.md sectiunea 3, +* rularea 6: 20 PASS / 4 FAIL - a picat exact cum trebuia, cu id_vanzare 1079 -> 1150), prin apel +* PL/SQL direct care ocoleste cablajul VFP. Nu se reproduce aici ca sa nu se dubleze un apel de +* scriere Oracle in afara caii oficiale (StergeDocumentFacturare + SCRIE_IN_ACT) doar ca sa se +* forteze un caz pe care cablajul insusi nu-l poate produce. +* +* Documente EXCLUSE (folosite de alte suite / DATA_ACT alterata / deja consumate de proba Oracle): +* 1047, 1048, 1055, 1076(folosit explicit la P4), 1113, 1130, 1141, 1146, 1149(folosit explicit +* la P2), 1150, 1151, 1077, 1078, 1147, 1148, 1079, 1083 + +LPARAMETERS tnRulare + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail +PUBLIC poDate, poSnapshotEditare, goFormReemitere, goSnapshotAntic + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s9_7_cablare_idfact_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' rulare=' + TRANSFORM(tnRulare) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +*!* stub_verificare inaintea lui COMUN\FERESTRE: Do Form verificare (ofacturare.vc2) nu se afiseaza +LOCAL lcPathVechi, lcPathNou +lcPathVechi = SET("PATH") +lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi +SET PATH TO &lcPathNou + +PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnPass = 0 +gnFail = 0 + +STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) + +LOCAL lnRulare +lnRulare = VAL(TRANSFORM(tnRulare)) +STRTOFILE('rulare ceruta: ' + TRANSFORM(lnRulare) + CHR(13) + CHR(10), gcErrLog, 1) + +DO CASE +CASE lnRulare = 1 + DO ProbaP1 +CASE lnRulare = 2 + DO ProbaP2 +CASE lnRulare = 3 + DO ProbaP4 +CASE lnRulare = 4 + DO ProbaP5 +CASE lnRulare = 5 + DO ProbaP6 +CASE lnRulare = 6 + DO ProbaCN2 +CASE lnRulare = 7 + DO ProbaCN3 +CASE lnRulare = 8 + DO ProbaCN4 +OTHERWISE + STRTOFILE('EROARE: tnRulare trebuie sa fie intre 1 si 8' + CHR(13) + CHR(10), gcErrLog, 1) +ENDCASE + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*============================================================================================== +* P1 - reemitere fara grup de incasare. Identitatea (ID_FACT) trebuie pastrata integral. +*============================================================================================== +PROCEDURE ProbaP1 + LOCAL lnIdV, lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lnIdVNou, llRez, lnIdFactNou + LOCAL lcSerieNoua, lnNumarNou, lnNrDocFortat, lnFortatDupa + + *!* sursa se alege la rulare: reemiterea o consuma, iar un id fix face proba verde o singura + *!* data (1082 -> 1152 -> 1160, toate consumate de rularile anterioare) + lnIdV = AlegeDocS97(.F.) + DO asserteaza WITH 'P1 exista un document reemitabil fara grup de incasare', lnIdV > 0, TRANSFORM(lnIdV) + IF lnIdV <= 0 + RETURN + ENDIF + + IF !CititStareInainte(lnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte) + RETURN + ENDIF + + IF !ReemiteDocumentAuto(lnIdV, @lnIdVNou, @llRez, 0, '') + RETURN + ENDIF + + lnFortatDupa = CitesteFortat() + DO asserteaza WITH 'P1-C1 do_scrie_factura() a intors .T.', llRez, TRANSFORM(llRez) + DO asserteaza WITH 'P1-C10 nIdFactFortat e consumat (NULL) dupa apel', ; + lnFortatDupa = -1 OR lnFortatDupa = -999, TRANSFORM(lnFortatDupa) + + lnIdFactNou = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou)) + DO asserteaza WITH 'P1-C4 ID_FACT-ul documentului nou = ID_FACT-ul vechi (identitate pastrata)', ; + lnIdFactNou = lnIdFactVechi, TRANSFORM(lnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactNou) + + lnNrDocFortat = Val1([select count(*) as v from documente where id_doc = ] + TRANSFORM(lnIdFactVechi)) + DO asserteaza WITH 'P1-C5 DOCUMENTE are exact UN rand pe ID_DOC-ul pastrat', lnNrDocFortat = 1, TRANSFORM(lnNrDocFortat) + + CititStareDupa(lnIdVNou, @lcSerieNoua, @lnNumarNou) + DO VerificaRandulReinviat WITH lnIdFactVechi, lcSerieNoua, lnNumarNou, lnIdUtilInainte, lcDataOraInainte, 'P1' +ENDPROC + + +*============================================================================================== +* P2 - reemitere document CU incasare pe aceeasi serie ca factura. Randul DOCUMENTE reinviat +* trebuie sa poarte seria/numarul FACTURII, nu ale chitantei (riscul 4). Verifica si P3 +* (comutatorul scos): NU se seteaza glRegenerareEditare, deci daca ruta 1 nu ar mai fi vizibila +* ar aparea mesajul "nu e inca implementata" prin mock. +*============================================================================================== +PROCEDURE ProbaP2 + LOCAL lnIdV, lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lnIdVNou, llRez, lnIdFactNou + LOCAL lcSerieNoua, lnNumarNou + + *!* 1161 = succesorul lui 1149 -> 1153 (ambii consumati); acelasi id_fact=8010203 (SSS/601), + *!* aceeasi pereche de grupuri ACT (factura SSS/601 + incasare SSS/45, aceeasi serie) - verificat + *!* inainte de aceasta rulare + lnIdV = 1161 + IF !CititStareInainte(lnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte) + RETURN + ENDIF + DO ListeazaGrupuriAct WITH Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)) + + IF !ReemiteDocumentAuto(lnIdV, @lnIdVNou, @llRez, 0, '') + RETURN + ENDIF + + *!* P3: comutatorul a fost scos - gcMockUltimMesaj nu trebuie sa contina textul vechi + DO asserteaza WITH 'P3 comutatorul glRegenerareEditare e scos (fara mesaj "nu e inca implementata")', ; + !('nu e inca implementata' $ LOWER(gcMockUltimMesaj)), '[' + gcMockUltimMesaj + ']' + DO asserteaza WITH 'P2-C1 do_scrie_factura() a intors .T.', llRez, TRANSFORM(llRez) + + lnIdFactNou = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou)) + DO asserteaza WITH 'P2-C4 ID_FACT-ul documentului nou = ID_FACT-ul vechi (identitate pastrata)', ; + lnIdFactNou = lnIdFactVechi, TRANSFORM(lnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactNou) + + CititStareDupa(lnIdVNou, @lcSerieNoua, @lnNumarNou) + DO VerificaRandulReinviat WITH lnIdFactVechi, lcSerieNoua, lnNumarNou, lnIdUtilInainte, lcDataOraInainte, 'P2' + + *!* riscul 4: grupul FACTURII (nract=numarul nou) trebuie sa poarte id_fact-ul vechi, grupul + *!* de INCASARE trebuie sa fi primit alt id_fact, din secventa + DO ListeazaGrupuriAct WITH Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou)) + DO VerificaTintireGrupuri WITH lnIdVNou, lnIdFactVechi, lcSerieNoua, lnNumarNou, 'P2' +ENDPROC + + +*============================================================================================== +* P4 - esec real dupa stergere: documentul 1076 pica in do_scrie_factura (lcListaIncasare gol, +* defect preexistent). Proba piesei 2: nIdFactFortat trebuie curatat chiar si pe esec. +*============================================================================================== +PROCEDURE ProbaP4 + LOCAL lnIdV, lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lnIdVNou, llRez, lnFortatDupa + LOCAL lnStersDupa, lnIdFactDupa + + lnIdV = 1076 + IF !CititStareInainte(lnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte) + RETURN + ENDIF + + *!* aici NU se asteapta succes - ReemiteDocumentAuto intoarce .T. daca s-a ajuns pana la apel; + *!* rezultatul apelului insusi (llRez) trebuie sa fie .F. + IF !ReemiteDocumentAuto(lnIdV, @lnIdVNou, @llRez, 0, '') + STRTOFILE('P4: nu s-a putut incarca/pregati documentul 1076' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + + DO asserteaza WITH 'P4-1 do_scrie_factura() a intors .F. (esec real, dupa stergere)', !llRez, TRANSFORM(llRez) + + lnFortatDupa = CitesteFortat() + STRTOFILE('P4: nIdFactFortat dupa esec = ' + TRANSFORM(lnFortatDupa) + ' (-1=NULL, -999=necitibil)' + CHR(13) + CHR(10), gcErrLog, 1) + IF lnFortatDupa <> -999 + DO asserteaza WITH 'P4-2 nIdFactFortat e curatat (NULL) chiar si pe esecul real (piesa 2)', ; + lnFortatDupa = -1, TRANSFORM(lnFortatDupa) + ELSE + STRTOFILE('P4-2 NECONCLUDENT: variabila nu s-a putut citi prin bind OUT' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + + lnStersDupa = Val1([select nvl(sters,-1) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)) + DO asserteaza WITH 'P4-3 documentul 1076 ramane STERS = 0 (nu s-a scris nimic)', lnStersDupa = 0, TRANSFORM(lnStersDupa) + lnIdFactDupa = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdV)) + DO asserteaza WITH 'P4-4 ID_FACT-ul documentului 1076 neschimbat', lnIdFactDupa = lnIdFactVechi, ; + TRANSFORM(lnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactDupa) +ENDPROC + + +*============================================================================================== +* P5 - D3: dupa o reemitere reusita, poSnapshotEditare devine .Null. (hunk B5). O a doua +* chemare a do_scrie_factura() pe acelasi obiect NU mai scrie nimic (ruta 0). +*============================================================================================== +PROCEDURE ProbaP5 + LOCAL lnIdV, lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lnIdVNou, llRez, lnIdVMaxDupa1 + LOCAL llRez2, lnCntDupa2 + + *!* 1155 = succesorul lui 1086 -> 1154 (ambii consumati de rularile anterioare); acelasi id_fact=8010083 + lnIdV = 1155 + IF !CititStareInainte(lnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte) + RETURN + ENDIF + + IF !ReemiteDocumentAuto(lnIdV, @lnIdVNou, @llRez, 0, '') + RETURN + ENDIF + DO asserteaza WITH 'P5-1 prima scriere a reusit', llRez, TRANSFORM(llRez) + + DO asserteaza WITH 'P5-2 poSnapshotEditare devine .Null. dupa succes (hunk B5)', ; + VARTYPE(poSnapshotEditare) <> 'O', VARTYPE(poSnapshotEditare) + + lnIdVMaxDupa1 = Val1([select nvl(max(id_vanzare),0) as v from vanzari]) + + DO urma WITH 'P5: a doua chemare do_scrie_factura() pe acelasi obiect' + llRez2 = goFormReemitere.do_scrie_factura() + STRTOFILE('P5: a doua chemare a intors ' + TRANSFORM(llRez2) + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'P5-3 a doua chemare intoarce .T. (ruta 0, nimic de scris)', llRez2, TRANSFORM(llRez2) + + lnCntDupa2 = Val1([select count(*) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxDupa1)) + DO asserteaza WITH 'P5-4 niciun document nou dupa a doua chemare (fara al treilea document)', ; + lnCntDupa2 = 0, TRANSFORM(lnCntDupa2) +ENDPROC + + +*============================================================================================== +* P6 - neregresie: reemitere obisnuita, coloanele randului DOCUMENTE reinviat comparate cu +* setul de 22 coloane din s9_6_snapshot_dupa.txt (acelasi set, aceeasi semantica). +*============================================================================================== +PROCEDURE ProbaP6 + LOCAL lnIdV, lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lnIdVNou, llRez + + *!* 1156 = succesorul lui 1090 (consumat de rularea anterioara); acelasi id_fact=8010090 + lnIdV = 1156 + IF !CititStareInainte(lnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte) + RETURN + ENDIF + + IF !ReemiteDocumentAuto(lnIdV, @lnIdVNou, @llRez, 0, '') + RETURN + ENDIF + DO asserteaza WITH 'P6-1 scrierea a reusit', llRez, TRANSFORM(llRez) + + IF USED('v_p6') + USE IN v_p6 + ENDIF + IF !goExecutor.oExecuta([select id_doc, dataora, id_util, sters, dataoras, id_utils, tva_incasare, ] + ; + [serie_act, nract, dataact, id_part, id_ctr, cont, acont, id_valuta, id_sucursala, ] + ; + [ip_ani, ip_lunai, ip_soldi, id_set, dataireg, tip_saft from documente where id_doc = ] + ; + TRANSFORM(lnIdFactVechi), 'v_p6') + DO asserteaza WITH 'P6-2 randul reinviat s-a putut citi cu toate cele 22 coloane', .F., 'eroare interogare' + RETURN + ENDIF + DO asserteaza WITH 'P6-2 randul reinviat s-a putut citi cu toate cele 22 de coloane din s9_6_snapshot_dupa.txt', ; + RECCOUNT('v_p6') = 1, TRANSFORM(RECCOUNT('v_p6')) + SELECT v_p6 + GO TOP + STRTOFILE('P6 RAND (22 coloane): id_doc=' + TRANSFORM(id_doc) + ' sters=' + TRANSFORM(sters) + ; + ' serie_act=[' + ALLTRIM(NVL(serie_act,'')) + '] nract=' + TRANSFORM(NVL(nract,-1)) + ; + ' id_util=' + TRANSFORM(NVL(id_util,-1)) + ' tva_incasare=' + TRANSFORM(NVL(tva_incasare,-1)) + ; + ' id_set=' + TRANSFORM(NVL(id_set,-1)) + ' tip_saft=' + TRANSFORM(NVL(tip_saft,-1)) + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'P6-3 randul reinviat are STERS = 0 (aceeasi semantica ca s9_6_snapshot_dupa.txt)', ; + NVL(sters,-1) = 0, TRANSFORM(NVL(sters,-1)) + USE IN v_p6 +ENDPROC + + +*============================================================================================== +* CN2 - control negativ: tinta GRESITA. poDate.nract se corupe (+1) chiar inainte de apel, deci +* fortarea automata (nNractFortat = poDate.nract corupt) nu se potriveste cu niciun grup real. +* Asteptat: ID_FACT nou, randul vechi ramane sters=1, toate variabilele NULL dupa apel (hunk C4). +*============================================================================================== +PROCEDURE ProbaCN2 + LOCAL lnIdV, lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lnIdVNou, llRez, lnIdFactNou + LOCAL lnStersDoc, lnFortatDupa + + *!* 1096 = candidat proaspat, fara incasare (1094 deja consumat de rularea anterioara) + lnIdV = 1096 + IF !CititStareInainte(lnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte) + RETURN + ENDIF + + *!* corupe tinta: poDate.nract + 1000 (nu exista niciun grup ACT cu acest nract) + IF !ReemiteDocumentAuto(lnIdV, @lnIdVNou, @llRez, 1000, '') + RETURN + ENDIF + + lnIdFactNou = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou)) + DO asserteaza WITH 'CN2-1 cu tinta gresita, ID_FACT-ul documentului nou e DIFERIT de cel vechi', ; + lnIdFactNou > 0 AND lnIdFactNou <> lnIdFactVechi, TRANSFORM(lnIdFactVechi) + ' -> ' + TRANSFORM(lnIdFactNou) + + lnStersDoc = Val1([select nvl(sters,-1) as v from documente where id_doc = ] + TRANSFORM(lnIdFactVechi)) + DO asserteaza WITH 'CN2-2 randul vechi din DOCUMENTE ramane sters = 1', lnStersDoc = 1, TRANSFORM(lnStersDoc) + + lnFortatDupa = CitesteFortat() + IF lnFortatDupa <> -999 + DO asserteaza WITH 'CN2-3 nIdFactFortat e NULL dupa apel (resetare dupa bucla, hunk C4)', ; + lnFortatDupa = -1, TRANSFORM(lnFortatDupa) + ELSE + STRTOFILE('CN2-3 NECONCLUDENT: variabila nu s-a putut citi prin bind OUT' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + DO VerificaVariabileTinta WITH 'CN2' +ENDPROC + + +*============================================================================================== +* CN3 - control negativ: piesa 2 FARA curatare. Se seteaza direct nIdFactFortat (functia livrata +* de S9-7, ForteazaIdFactReemitere), apoi se face ROLLBACK direct pe handle - FARA +* CurataIdFactFortat(). Nu scrie/sterge niciun document real - foloseste un id_fact existent +* doar ca valoare de proba. +*============================================================================================== +PROCEDURE ProbaCN3 + LOCAL lnIdFactProba, llSetat, lnFortatDupa + + lnIdFactProba = Val1([select nvl(max(id_fact),0) as v from vanzari where sters=0]) + DO asserteaza WITH 'CN3-precond exista un id_fact de proba', lnIdFactProba > 0, TRANSFORM(lnIdFactProba) + IF lnIdFactProba <= 0 + RETURN + ENDIF + + llSetat = ForteazaIdFactReemitere(lnIdFactProba, 999999, 'ZZ') + DO asserteaza WITH 'CN3-1 ForteazaIdFactReemitere a reusit (functie livrata de S9-7)', llSetat, TRANSFORM(llSetat) + + *!* ROLLBACK direct, FARA CurataIdFactFortat() - simuleaza piesa 2 lipsa + goExecutor.oExecuta('ROLLBACK') + + lnFortatDupa = CitesteFortat() + STRTOFILE('CN3: nIdFactFortat dupa ROLLBACK fara curatare = ' + TRANSFORM(lnFortatDupa) + CHR(13) + CHR(10), gcErrLog, 1) + IF lnFortatDupa <> -999 + DO asserteaza WITH 'CN3-2 nIdFactFortat NU e curatat de ROLLBACK singur (asteptat sa PICE ca "NULL")', ; + lnFortatDupa <> -1, TRANSFORM(lnFortatDupa) + ELSE + STRTOFILE('CN3-2 NECONCLUDENT: variabila nu s-a putut citi prin bind OUT' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + + *!* curatare finala, ca sesiunea sa nu ramana contaminata pentru rularile urmatoare + CurataIdFactFortatDirect() + lnFortatDupa = CitesteFortat() + STRTOFILE('CN3: nIdFactFortat dupa curatare finala manuala = ' + TRANSFORM(lnFortatDupa) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +*============================================================================================== +* CN4 - control negativ: D3 FARA resetare. Dupa o reemitere reusita (poSnapshotEditare devine +* .Null. prin hunk B5), se RESTAUREAZA manual referinta veche (simuland ca hunk B5 n-ar fi +* rulat) si se cheama do_scrie_factura() a doua oara. Asteptat: DOUA documente noi (al treilea +* document total) - bug-ul D3 reprodus. +*============================================================================================== +PROCEDURE ProbaCN4 + LOCAL lnIdV, lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lnIdVNou, llRez, lnIdVMaxDupa1 + LOCAL llRez2, lnCntDupa2 + + *!* 1097 = candidat proaspat (1095 deja consumat de rularea anterioara) + lnIdV = 1097 + IF !CititStareInainte(lnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte) + RETURN + ENDIF + + IF !ReemiteDocumentAuto(lnIdV, @lnIdVNou, @llRez, 0, '') + RETURN + ENDIF + DO asserteaza WITH 'CN4-1 prima scriere a reusit', llRez, TRANSFORM(llRez) + + DO asserteaza WITH 'CN4-precond poSnapshotEditare a devenit .Null. dupa succes (confirmare hunk B5 activ)', ; + VARTYPE(poSnapshotEditare) <> 'O', VARTYPE(poSnapshotEditare) + DO asserteaza WITH 'CN4-precond referinta veche (goSnapshotAntic) a fost pastrata, pre-scriere', ; + VARTYPE(goSnapshotAntic) = 'O', VARTYPE(goSnapshotAntic) + + *!* restaureaza manual - simuleaza "fara poSnapshotEditare = .Null." dupa succes + poSnapshotEditare = goSnapshotAntic + + lnIdVMaxDupa1 = Val1([select nvl(max(id_vanzare),0) as v from vanzari]) + + DO urma WITH 'CN4: a doua chemare do_scrie_factura() cu instantaneul VECHI restaurat manual' + llRez2 = goFormReemitere.do_scrie_factura() + STRTOFILE('CN4: a doua chemare (fara reset) a intors ' + TRANSFORM(llRez2) + CHR(13) + CHR(10), gcErrLog, 1) + + lnCntDupa2 = Val1([select count(*) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxDupa1)) + STRTOFILE('CN4: documente noi dupa a doua chemare fara reset = ' + TRANSFORM(lnCntDupa2) + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH 'CN4-2 fara resetare apare un AL TREILEA document (asteptat sa PICE fata de comportamentul corect)', ; + lnCntDupa2 >= 1, TRANSFORM(lnCntDupa2) +ENDPROC + + +*============================================================================================== +* ReemiteDocumentAuto: incarca documentul in editare, modifica o cantitate, cheama +* do_scrie_factura() REAL - fara nicio forta manuala si fara glRegenerareEditare. tnCorupeNract +* (0 = normal) se aduna la poDate.nract chiar inainte de apel, pentru CN2. +*============================================================================================== +PROCEDURE ReemiteDocumentAuto + LPARAMETERS tnIdV, tnIdVNou, tlRez, tnCorupeNract, tcNefolosit, toFormIesire + LOCAL loForm, lnDiscRon, lnDiscVal, lnCantVeche, lnCantNoua, lnNr, lnIdVMaxInainte, lnCod, lnAn, lnLuna, lnIdFactVechi + + lnIdVMaxInainte = Val1([select nvl(max(id_vanzare),0) as v from vanzari]) + lnCod = Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV)) + lnIdFactVechi = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV)) + lnAn = gnAn + lnLuna = gnLuna + + DO urma WITH 'IncarcaAntetFacturaEditare ' + TRANSFORM(tnIdV) + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal) + DO asserteaza WITH 'antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate) + IF VARTYPE(poDate) <> 'O' + RETURN .F. + ENDIF + + DO urma WITH 'IncarcaLiniiFacturaEditare ' + TRANSFORM(tnIdV) + IncarcaLiniiFacturaEditare(poDate, tnIdV) + DO asserteaza WITH 'liniile documentului ' + TRANSFORM(tnIdV) + ' s-au incarcat', ; + USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1)) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + RETURN .F. + ENDIF + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + loForm = CREATEOBJECT('frm_facturare_articole2') + loForm.ndiscfactron = lnDiscRon + loForm.ndiscfactval = lnDiscVal + loForm.do_calculeaza_totaluri() + poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ; + tnIdV, lnIdFactVechi, lnCod, lnAn, lnLuna) + IF VARTYPE(poSnapshotEditare) <> 'O' + DO asserteaza WITH 'instantaneul de editare s-a creat (' + TRANSFORM(tnIdV) + ')', .F., VARTYPE(poSnapshotEditare) + RETURN .F. + ENDIF + *!* referinta PRE-scriere - poSnapshotEditare devine .Null. dupa succes (hunk B5); pastrata + *!* aici pentru controlul negativ CN4, care simuleaza absenta acelei resetari + goSnapshotAntic = poSnapshotEditare + + SELECT crsfactura + GO TOP + lnCantVeche = cantitate + lnCantNoua = lnCantVeche + 1 + REPLACE cantitate WITH lnCantNoua IN crsfactura + loForm.do_calculeaza_totaluri() + STRTOFILE('cantitate ' + TRANSFORM(lnCantVeche) + ' -> ' + TRANSFORM(lnCantNoua) + CHR(13) + CHR(10), gcErrLog, 1) + + DO asserteaza WITH 'ruta aleasa e 1 (regenerare), doc ' + TRANSFORM(tnIdV), ; + AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura') = 1, ; + TRANSFORM(AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura')) + + IF tnCorupeNract <> 0 + STRTOFILE('CORUPERE TINTA: poDate.nract ' + TRANSFORM(poDate.nract) + ' -> ' + ; + TRANSFORM(poDate.nract + tnCorupeNract) + CHR(13) + CHR(10), gcErrLog, 1) + poDate.nract = poDate.nract + tnCorupeNract + ENDIF + + *!* FARA nicio fortare manuala, FARA glRegenerareEditare - fortarea o face automat hunk B1 + DO urma WITH 'do_scrie_factura (SCRIE IN ORACLE, fortare automata prin cablaj) doc ' + TRANSFORM(tnIdV) + tlRez = loForm.do_scrie_factura() + DO urma WITH 'do_scrie_factura a revenit, doc ' + TRANSFORM(tnIdV) + STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) + + goFormReemitere = loForm + + lnNr = Val1([select count(*) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxInainte)) + tnIdVNou = 0 + IF lnNr >= 1 + tnIdVNou = Val1([select nvl(max(id_vanzare),0) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxInainte)) + ENDIF + STRTOFILE('documente noi nesterse dupa apel = ' + TRANSFORM(lnNr) + ' id_vanzare nou=' + TRANSFORM(tnIdVNou) + CHR(13) + CHR(10), gcErrLog, 1) + + RETURN .T. +ENDPROC + + +*============================================================================================== +*============================================================================================== +* Alege la rulare un document reemitabil, dupa acelasi tipar ca AlegeCandidat din +* test_s9_6_idfact_fortat.prg: viu, in perioada activa, cu ID_FACT, cu note in vact_tot, cu +* cantitate pe linii, fara referinte / urmasi / eFactura. tlCuIncasare cere (sau exclude) un grup +* de incasare pe cod - randuri ACT cu SCD care incepe cu 5 si SCC <> 418. +* Documentele-martor ale celorlalte teste din suita se exclud: reemiterea le consuma. +* Doar ProbaP1 alege dinamic; probele P2/P4/P5/P6/CN2/CN3/CN4 au inca id-uri fixe. +FUNCTION AlegeDocS97 + LPARAMETERS tlCuIncasare + + LOCAL lcSql, lnOk, lnAles, lnAn, lnLuna, lnIdV, lnCod, lnIdFact + lnAles = 0 + lcSql = [select v.id_vanzare, v.cod, v.data_act, v.id_fact from vanzari v where v.sters = 0 ] + ; + [ and extract(year from v.data_act) = ] + TRANSFORM(gnAn) + ; + [ and extract(month from v.data_act) = ] + TRANSFORM(gnLuna) + ; + [ and nvl(v.eproforma,0) = 0 and nvl(v.id_fact,0) > 0 ] + ; + [ and v.tip not in (4,3,21,25,28,42,47,44,45,46,51) ] + ; + [ and v.id_vanzare not in (1047,1048,1049,1050,1055,1071,1072,1076,1113,1125,1126,1128,1129,1130,1160) ] + ; + [ and exists (select 1 from ] + gcs + [.vact_tot a where a.sters = 0 and a.an = ] + TRANSFORM(gnAn) + ; + [ and a.luna = ] + TRANSFORM(gnLuna) + [ and a.cod = v.cod) ] + ; + [ and exists (select 1 from vanzari_detalii d where d.sters = 0 and d.id_vanzare = v.id_vanzare ] + ; + [ and nvl(d.cantitate,0) > 0) ] + ; + [ and ] + IIF(m.tlCuIncasare, [], [not ]) + ; + [exists (select 1 from act i where i.sters = 0 and i.cod = v.cod ] + ; + [ and substr(i.scd,1,1) = '5' and i.scc <> '418') ] + ; + [order by v.id_vanzare] + + IF USED('v_cand97') + USE IN v_cand97 + ENDIF + lnOk = goExecutor.oExecuta(lcSql, 'v_cand97') + IF !lnOk + RETURN 0 + ENDIF + SELECT v_cand97 + SCAN + *!* campurile se citesc INAINTE de apeluri - garzile schimba zona curenta + lnIdV = v_cand97.id_vanzare + lnCod = v_cand97.cod + lnIdFact = NVL(v_cand97.id_fact, 0) + lnAn = YEAR(v_cand97.data_act) + lnLuna = MONTH(v_cand97.data_act) + IF !ReferinteDocumenteNota(lnAn, lnLuna, lnCod) AND !DocumentAreUrmasi(lnIdV) ; + AND !EsteInEFactura(lnIdFact) + lnAles = m.lnIdV + EXIT + ENDIF + SELECT v_cand97 + ENDSCAN + USE IN v_cand97 + + STRTOFILE('sursa aleasa la rulare: id_vanzare=' + TRANSFORM(lnAles) + ; + ' (cu incasare=' + TRANSFORM(m.tlCuIncasare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN m.lnAles +ENDFUNC + + +PROCEDURE CititStareInainte + LPARAMETERS tnIdV, tnIdFactVechi, tnIdUtilInainte, tcDataOraInainte + + tnIdFactVechi = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV) + [ and sters = 0]) + DO asserteaza WITH 'PRECONDITIE documentul ' + TRANSFORM(tnIdV) + ' e viu si are ID_FACT', tnIdFactVechi > 0, TRANSFORM(tnIdFactVechi) + IF tnIdFactVechi <= 0 + RETURN .F. + ENDIF + + tnIdUtilInainte = -1 + tcDataOraInainte = '' + IF USED('v_doc97') + USE IN v_doc97 + ENDIF + IF goExecutor.oExecuta([select id_util, to_char(dataora,'dd.mm.yyyy hh24:mi:ss') as dataorat from documente ] + ; + [where id_doc = ] + TRANSFORM(tnIdFactVechi), 'v_doc97') + SELECT v_doc97 + IF RECCOUNT('v_doc97') = 1 + GO TOP + tnIdUtilInainte = NVL(id_util, -1) + tcDataOraInainte = ALLTRIM(NVL(dataorat, '')) + ENDIF + USE IN v_doc97 + ENDIF + STRTOFILE('INAINTE doc ' + TRANSFORM(tnIdV) + ': id_fact=' + TRANSFORM(tnIdFactVechi) + ; + ' documente.id_util=' + TRANSFORM(tnIdUtilInainte) + ' documente.dataora=' + tcDataOraInainte + CHR(13) + CHR(10), gcErrLog, 1) + RETURN .T. +ENDPROC + + +PROCEDURE CititStareDupa + LPARAMETERS tnIdVNou, tcSerie, tnNumar + tcSerie = '' + tnNumar = 0 + IF USED('v_ant97') + USE IN v_ant97 + ENDIF + IF goExecutor.oExecuta([select serie_act, numar_act from vanzari where id_vanzare = ] + TRANSFORM(tnIdVNou), 'v_ant97') + SELECT v_ant97 + IF RECCOUNT('v_ant97') = 1 + GO TOP + tcSerie = ALLTRIM(NVL(serie_act, '')) + tnNumar = NVL(numar_act, 0) + ENDIF + USE IN v_ant97 + ENDIF +ENDPROC + + +*============================================================================================== +PROCEDURE VerificaRandulReinviat + LPARAMETERS tnIdDoc, tcSerieNoua, tnNumarNou, tnIdUtilInainte, tcDataOraInainte, tcPrefix + LOCAL lnSters, lcSerie, lnNract, lnIdUtil, lcDataOra + + IF USED('v_ver97') + USE IN v_ver97 + ENDIF + IF !goExecutor.oExecuta([select sters, nvl(serie_act,' ') as serie_act, nvl(nract,-1) as nract, ] + ; + [id_util, to_char(dataora,'dd.mm.yyyy hh24:mi:ss') as dataorat ] + ; + [from documente where id_doc = ] + TRANSFORM(tnIdDoc), 'v_ver97') + DO asserteaza WITH tcPrefix + '-rand randul reinviat s-a putut citi', .F., 'eroare interogare' + RETURN + ENDIF + SELECT v_ver97 + IF RECCOUNT('v_ver97') <> 1 + DO asserteaza WITH tcPrefix + '-rand randul reinviat exista o singura data', .F., TRANSFORM(RECCOUNT('v_ver97')) + USE IN v_ver97 + RETURN + ENDIF + GO TOP + lnSters = NVL(sters, -1) + lcSerie = ALLTRIM(NVL(serie_act, '')) + lnNract = NVL(nract, -1) + lnIdUtil = NVL(id_util, -1) + lcDataOra = ALLTRIM(NVL(dataorat, '')) + USE IN v_ver97 + + STRTOFILE(tcPrefix + ' RAND REINVIAT id_doc=' + TRANSFORM(tnIdDoc) + ': sters=' + TRANSFORM(lnSters) + ; + ' serie_act=[' + lcSerie + '] nract=' + TRANSFORM(lnNract) + ' id_util=' + TRANSFORM(lnIdUtil) + ; + ' dataora=' + lcDataOra + CHR(13) + CHR(10), gcErrLog, 1) + + DO asserteaza WITH tcPrefix + '-C6 randul reinviat are STERS = 0', lnSters = 0, TRANSFORM(lnSters) + DO asserteaza WITH tcPrefix + '-C7a serie_act = seria documentului NOU (nu a chitantei)', lcSerie == tcSerieNoua, ; + '[' + lcSerie + '] vs [' + tcSerieNoua + ']' + DO asserteaza WITH tcPrefix + '-C7b nract = numarul documentului NOU (nu al chitantei)', lnNract = tnNumarNou, ; + TRANSFORM(lnNract) + ' vs ' + TRANSFORM(tnNumarNou) + DO asserteaza WITH tcPrefix + '-C8a ID_UTIL neschimbat (audit de creare)', lnIdUtil = tnIdUtilInainte, ; + TRANSFORM(tnIdUtilInainte) + ' -> ' + TRANSFORM(lnIdUtil) + DO asserteaza WITH tcPrefix + '-C8b DATAORA neschimbata (audit de creare)', lcDataOra == tcDataOraInainte, ; + '[' + tcDataOraInainte + '] -> [' + lcDataOra + ']' +ENDPROC + + +*============================================================================================== +PROCEDURE VerificaTintireGrupuri + LPARAMETERS tnIdVNou, tnIdFactVechi, tcSerieNoua, tnNumarNou, tcPrefix + LOCAL lnCodNou, lnIdFactFactura, lnIdFactIncasare, lnNractIncasare + + lnCodNou = Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdVNou)) + lnIdFactFactura = Val1([select nvl(min(id_fact),0) as v from act where cod = ] + TRANSFORM(lnCodNou) + ; + [ and sters = 0 and nract = ] + TRANSFORM(tnNumarNou) + ; + [ and nvl(serie_act,'+_') = '] + ALLTRIM(tcSerieNoua) + [']) + lnIdFactIncasare = Val1([select nvl(min(id_fact),0) as v from act where cod = ] + TRANSFORM(lnCodNou) + ; + [ and sters = 0 and nract <> ] + TRANSFORM(tnNumarNou)) + lnNractIncasare = Val1([select nvl(min(nract),-1) as v from act where cod = ] + TRANSFORM(lnCodNou) + ; + [ and sters = 0 and nract <> ] + TRANSFORM(tnNumarNou)) + + STRTOFILE(tcPrefix + ' TINTIRE: grup factura (nract=' + TRANSFORM(tnNumarNou) + ') id_fact=' + TRANSFORM(lnIdFactFactura) + ; + ' grup incasare (nract=' + TRANSFORM(lnNractIncasare) + ') id_fact=' + TRANSFORM(lnIdFactIncasare) + ; + ' vechi=' + TRANSFORM(tnIdFactVechi) + CHR(13) + CHR(10), gcErrLog, 1) + + DO asserteaza WITH tcPrefix + '-T6 documentul are grup de incasare pe alt nract', lnIdFactIncasare > 0, TRANSFORM(lnNractIncasare) + DO asserteaza WITH tcPrefix + '-T7 ID_FACT-ul pastrat a ajuns pe grupul FACTURII', ; + lnIdFactFactura = tnIdFactVechi, TRANSFORM(tnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactFactura) + DO asserteaza WITH tcPrefix + '-T7b grupul de INCASARE a primit alt ID_FACT (din secventa)', ; + lnIdFactIncasare > 0 AND lnIdFactIncasare <> tnIdFactVechi, ; + TRANSFORM(tnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactIncasare) +ENDPROC + + +*============================================================================================== +PROCEDURE ListeazaGrupuriAct + LPARAMETERS tnCod + + IF USED('v_gr98') + USE IN v_gr98 + ENDIF + IF !goExecutor.oExecuta([select id_fact, nvl(serie_act,' ') as serie_act, nract, ] + ; + [max(case when scd like '5%' or scc like '5%' then 1 else 0 end) as e_inc, count(*) as n ] + ; + [from act where cod = ] + TRANSFORM(tnCod) + [ and sters = 0 ] + ; + [group by id_fact, serie_act, nract order by id_fact], 'v_gr98') + STRTOFILE('EROARE la listarea grupurilor ACT' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + STRTOFILE('--- grupuri ACT cod ' + TRANSFORM(tnCod) + ' (' + TRANSFORM(RECCOUNT('v_gr98')) + ') ---' + CHR(13) + CHR(10), gcErrLog, 1) + SELECT v_gr98 + SCAN + STRTOFILE(' id_fact=' + TRANSFORM(id_fact) + ' serie=[' + ALLTRIM(serie_act) + '] nract=' + ; + TRANSFORM(nract) + ' incasare=' + TRANSFORM(e_inc) + ' randuri=' + TRANSFORM(n) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_gr98 +ENDPROC + + +*============================================================================================== +* CitesteFortat: variabila de pachet nu poate fi citita din SQL - se citeste prin bind OUT +* intr-un bloc PL/SQL anonim, pe acelasi handle (deci aceeasi sesiune Oracle). +* -1 = NULL (consumata), -999 = apelul nu a reusit (rezultat neconcludent). +*============================================================================================== +FUNCTION CitesteFortat + LOCAL lnRez + PRIVATE pnFortat97 + pnFortat97 = 0 + lnRez = SQLEXEC(gnHandle, "begin ?@pnFortat97 := nvl(pack_contafin.nIdFactFortat, -1); end;") + IF lnRez < 0 + RETURN -999 + ENDIF + RETURN NVL(pnFortat97, -999) +ENDFUNC + + +*============================================================================================== +PROCEDURE VerificaVariabileTinta + LPARAMETERS tcPrefix + LOCAL lnRez + PRIVATE pnNract97, pcSerie97 + pnNract97 = 0 + pcSerie97 = '' + lnRez = SQLEXEC(gnHandle, "begin ?@pnNract97 := nvl(pack_contafin.nNractFortat, -1); " + ; + "?@pcSerie97 := nvl(pack_contafin.cSerieFortata, '#NULL#'); end;") + IF lnRez < 0 + STRTOFILE(tcPrefix + '-T8/T9 NECONCLUDENT: variabilele de tintire nu s-au putut citi' + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + STRTOFILE(tcPrefix + ' DUPA APEL: nNractFortat=' + TRANSFORM(NVL(pnNract97, -999)) + ; + ' cSerieFortata=[' + ALLTRIM(NVL(pcSerie97, '?')) + ']' + CHR(13) + CHR(10), gcErrLog, 1) + DO asserteaza WITH tcPrefix + '-T8 nNractFortat e NULL dupa apel (resetarea de dupa bucla)', ; + NVL(pnNract97, -999) = -1, TRANSFORM(NVL(pnNract97, -999)) + DO asserteaza WITH tcPrefix + '-T9 cSerieFortata e NULL dupa apel (resetarea de dupa bucla)', ; + ALLTRIM(NVL(pcSerie97, '?')) == '#NULL#', '[' + ALLTRIM(NVL(pcSerie97, '?')) + ']' +ENDPROC + + +*============================================================================================== +* CurataIdFactFortatDirect: apel direct la functia CurataIdFactFortat livrata de S9-7, ocolind +* garda pe plRegenerareEditare (nedeclarata in acest scop) - folosit doar pentru curatare finala +* dupa CN3, ca sesiunea Oracle sa nu ramana contaminata pentru rularile urmatoare. +*============================================================================================== +FUNCTION CurataIdFactFortatDirect + RETURN goExecutor.oExecuta([begin pack_contafin.nIdFactFortat := NULL; ] + ; + [pack_contafin.nNractFortat := NULL; pack_contafin.cSerieFortata := NULL; end;]) +ENDFUNC + + +*============================================================================================== +* Val1: o singura valoare numerica dintr-un select care aliaseaza coloana ca "v". +*============================================================================================== +FUNCTION Val1 + LPARAMETERS tcSql + LOCAL lnRet + lnRet = -1 + IF USED('v_val97') + USE IN v_val97 + ENDIF + IF goExecutor.oExecuta(tcSql, 'v_val97') + SELECT v_val97 + IF RECCOUNT('v_val97') > 0 + GO TOP + lnRet = NVL(v_val97.v, -1) + ENDIF + USE IN v_val97 + ELSE + STRTOFILE('EROARE Val1: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + RETURN lnRet +ENDFUNC + + +PROCEDURE urma + LPARAMETERS tcPas + STRTOFILE('URMA ' + TTOC(DATETIME()) + ' ' + m.tcPas + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/editare_factura/test_s9_8_flux.prg b/utile/Teste/editare_factura/test_s9_8_flux.prg new file mode 100644 index 0000000..df5db0b --- /dev/null +++ b/utile/Teste/editare_factura/test_s9_8_flux.prg @@ -0,0 +1,541 @@ +* test_s9_8_flux.prg +* Proba S9-8 (docs\propunere_s9_stergere_reemitere.md:115): testul de flux. Reemitere IDENTICA + +* reemitere CU MODIFICARI, pe cate un document din fiecare familie de dispecerizare a scrierii +* (ofacturare.vc2:20171,20214,20249): AVIZ (tip=4), COMANDA (tip in 3,21,25,28,42,47), CONTRACT +* (tip in 2,6,26,52), ELSE (restul - aici tip=-3). Depinde de S9-1..S9-7, toate probate. +* +* Foloseste acelasi driver ca test_s9_7_cablare_idfact.prg (IncarcaAntetFacturaEditare + +* IncarcaLiniiFacturaEditare + do_scrie_factura() REAL, fara nicio fortare manuala si fara +* glRegenerareEditare - fortarea ID_FACT o face automat cablajul S9-7). Diferenta: scenariul A +* (identica) NU modifica nimic pe crsfactura inainte de apel; scenariul B (modificata) creste +* cantitatea primei linii cu 1, ca in test_s9_7. +* +* CONSTATARE, verificata pe cod (ofacturare_rutare_scriere.prg:69-95) inainte de a scrie probele +* de mai jos: AlegeRutaScriereEditare intoarce ruta 1 (regenerare = sterge+reemite) NUMAI cand +* LiniiAuSumeSchimbate() gaseste o diferenta reala fata de instantaneu (cantitate/pret/discount/ +* tva/gestiune/lot/serie sau discountul de document). O salvare FARA nicio modificare nu trece +* niciodata prin sterge+reemite - ea cade pe ruta 0 (nimic), exact ca a doua chemare din D3 +* (test_s9_7 P5). Deci scenariul A ("reemitere identica") NU produce un rand DOCUMENTE "STERS +* revenit la 0" prin fluxul normal de editare - documentul original ramane pur si simplu neatins. +* Testat mai jos ca atare (ruta 0 confirmata, nimic scris), nu fortat artificial pe ruta 1. +* +* Parametru tnRulare: +* 0 = DESCOPERIRE (read-only, nu scrie nimic) - lista candidati vii pe fiecare familie, pentru +* alegerea documentelor de mai jos. Nu face parte din sweep-ul de proba. +* 1 = AVIZ A (identica) doc 1118 (DATA_ACT 2026/8 - coincide cu perioada implicita) +* 2 = AVIZ B (modificata) doc 1189 (DATA_ACT 2026/8 - coincide cu perioada implicita; +* lantul 1119 -> 1180 -> 1182 -> 1184 -> 1186 -> 1189, fiecare rulare B isi consuma documentul) +* 3 = COMANDA A (identica) doc 306 +* 4 = COMANDA B (modificata) doc 1188 (DATA_ACT 2014/1 - necesita tnForceAn=2014, +* tnForceLuna=1; doc 146 initial ales a picat cu ORA-01400 chiar cu perioada implicita, +* pastrat in raport ca prima dovada a CONSTATARII a doua) +* 5 = CONTRACT A (identica) doc 630 +* 6 = CONTRACT B (modificata) doc 1191 (DATA_ACT 2024/7 - necesita tnForceAn=2024, +* tnForceLuna=7; lantul 992 -> 1191, fiecare rulare B isi consuma documentul; +* doc 1192 e rezerva echivalenta, din lantul 870 -> 1192) +* 7 = ELSE A (identica) doc 372 (tip -3) +* 8 = ELSE B (modificata) doc 1190 (tip 1, DATA_ACT 2014/1 - necesita tnForceAn=2014, +* tnForceLuna=1; lantul 580 -> 1172 -> 1181 -> 1183 -> 1185 -> 1187 -> 1190, fiecare rulare B isi consuma documentul) +* +* Scenariul A verifica: ruta aleasa e 0 (nimic), niciun document nou, iar documentul ORIGINAL +* ramane neatins (ID_FACT/serie/numar/total/STERS/ID_UTIL/DATAORA identice) - vezi CONSTATAREA +* de mai sus. Scenariul B verifica: ruta 1, ID_FACT pastrat pe documentul NOU, serie/numar +* identice (identitatea de act), randul DOCUMENTE reinviat (STERS revenit la 0), ID_UTIL/DATAORA +* initiale (auditul de creare nu se rescrie), TOTAL_CU_TVA schimbat (modificarea a ajuns in +* Oracle) si legatura cu sursa (AVIZ: VANZARI_CORESP tip=1; COMANDA/CONTRACT: +* FACT_VFACTURI.id_comanda/id_ctr) pastrata pe documentul NOU. +* +* Documente alese prin interogare directa (sqlplus, citite, nu scrise) pe MARIUSM_AUTO, apoi +* verificate ca nu apar in niciun alt fisier din COMUN\utile\Teste (grep pe numar exact) - vezi +* raportul S9-8 pentru lista completa cercetata si motivul alegerii fiecarui id. +* +* CONSTATARE (a doua): rularea 4 pe doc 146 (id_facturare NULL) A DAT ORA-01400 "cannot insert +* NULL into ACT_TEMP.ID_FDOC" (PACK_FACTURARE, linia ~11315, din 6309/5006) - dar acelasi +* ORA-01400 a reaparut IDENTIC si pe doc 631 (id_facturare=523, NENULL!) - deci NU e despre +* id_facturare. Cauza reala, confirmata pe codul test_s9_3_stergere.prg:15-17,61-67: candidatii +* eligibili pentru stergere/reemitere sunt filtrati explicit "extract(year/month from data_act) = +* gnAn/gnLuna" - mecanismul S9 (ACT_TEMP/VACT_TOT/VRUL_TOT) e SCOPAT pe perioada activa. Toate +* documentele COMANDA/CONTRACT/ELSE gasite initial sunt din 2008-2015, in afara perioadei active +* (gnAn/gnLuna, azi 2026/8) - de-asta pica orice document mai vechi, indiferent de familie sau de +* id_facturare. Solutia (tiparul test_s9_3): tnForceAn/tnForceLuna, LPARAMETERS suplimentare care +* forteaza perioada activa sa coincida cu DATA_ACT a documentului tintit - vezi mai jos. + +* CONSTATARE (a treia): familia CONTRACT nu e uniforma. Documentele CONTRACT ale caror linii +* au VANZARI_DETALII.ID_RATA <> 0 cad la reemitere cu "Too many columns." (VFP 1872), pentru +* ca PACK_FACTURARE body 5055-5058 le trimite prin contabilizeaza_rata - ramura pe care nicio +* alta familie n-o atinge. Documentele CONTRACT fara linii de rata trec (992, 870: 13/0). +* Docs 360 si 1055 sunt documente cu rata si raman datorie deschisa - docs/raport_contract_b.md. + +*!* tnForceAn/tnForceLuna optionale (tiparul test_s9_3_stergere.prg:15-17): forteaza perioada +*!* activa gnAn/gnLuna sa coincida cu DATA_ACT a documentului tintit de scenariul B - necesar +*!* pentru COMANDA/CONTRACT/ELSE (vezi CONSTATAREA a doua); scenariile A si AVIZ nu au nevoie +*!* (A nu scrie nimic, AVIZ nu foloseste ACT_TEMP scopat pe perioada) +LPARAMETERS tnRulare, tnForceAn, tnForceLuna, tnIdFirma + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail +PUBLIC poDate, poSnapshotEditare, goFormReemitere + +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_s9_8_flux_log_' + ; + STRTRAN(STRTRAN(STRTRAN(TTOC(DATETIME()), '/', ''), ':', ''), ' ', '_') + '.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + ' rulare=' + TRANSFORM(tnRulare) + CHR(13) + CHR(10), gcErrLog) + +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +*!* tnForceAn/tnForceLuna sosesc ca STRING cand vin din linia de comanda vfp9.exe (nu din DO...WITH +*!* intern) - VAL() le converteste; VAL('') = 0, iar EMPTY(0) e .T. in test_init_env_auto_..., deci +*!* neforsat cade corect pe YEAR(DATE())/MONTH(DATE()) +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', VAL(TRANSFORM(tnForceAn)), VAL(TRANSFORM(tnForceLuna)), VAL(TRANSFORM(tnIdFirma)) +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF +gnIdUtil = 8 + +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_editare.prg ADDITIVE +SET PROCEDURE TO D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare_rutare_scriere.prg ADDITIVE + +*!* la nume duplicat de procedura castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul +LOCAL lcProcExistent +lcProcExistent = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProcExistent + +*!* stub_verificare inaintea lui COMUN\FERESTRE: Do Form verificare (ofacturare.vc2) nu se afiseaza +LOCAL lcPathVechi, lcPathNou +lcPathVechi = SET("PATH") +lcPathNou = 'D:\ROA\ROAFACTURARE\COMUN\Utile\Teste\achizitie_import\stub_verificare;' + lcPathVechi +SET PATH TO &lcPathNou + +PUBLIC gnMockRaspuns, gcMockUltimMesaj, gnMockUltimTip +gnMockRaspuns = 7 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gnPass = 0 +gnFail = 0 + +STRTOFILE('perioada activa gnAn/gnLuna = ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + CHR(13) + CHR(10), gcErrLog, 1) + +LOCAL lnRulare +lnRulare = VAL(TRANSFORM(tnRulare)) +STRTOFILE('rulare ceruta: ' + TRANSFORM(lnRulare) + CHR(13) + CHR(10), gcErrLog, 1) + +DO CASE +CASE lnRulare = 0 + DO Descoperire +CASE lnRulare = 1 + DO ProbaScenariu WITH 1118, 'AVIZ', .F., 'AVIZ-A' +CASE lnRulare = 2 + DO ProbaScenariu WITH 1189, 'AVIZ', .T., 'AVIZ-B' +CASE lnRulare = 3 + DO ProbaScenariu WITH 306, 'COMANDA', .F., 'COM-A' +CASE lnRulare = 4 + DO ProbaScenariu WITH 1188, 'COMANDA', .T., 'COM-B' +CASE lnRulare = 5 + DO ProbaScenariu WITH 630, 'CONTRACT', .F., 'CTR-A' +CASE lnRulare = 6 + DO ProbaScenariu WITH 1191, 'CONTRACT', .T., 'CTR-B' +CASE lnRulare = 7 + DO ProbaScenariu WITH 372, 'ELSE', .F., 'ELSE-A' +CASE lnRulare = 8 + DO ProbaScenariu WITH 1190, 'ELSE', .T., 'ELSE-B' +OTHERWISE + STRTOFILE('EROARE: tnRulare trebuie sa fie intre 0 si 8' + CHR(13) + CHR(10), gcErrLog, 1) +ENDCASE + +STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) +STRTOFILE('end ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + +QUIT + + +*============================================================================================== +* Descoperire: LISTEAZA candidati vii (STERS=0, ID_FACT>0) pe fiecare familie - read-only, nu +* face parte din sweep-ul de proba. Rulata o singura data, inaintea alegerii documentelor de mai +* sus (rezultatul e citat in raportul S9-8, nu retesteaza nimic aici). +*============================================================================================== +PROCEDURE Descoperire + DO ListeazaCandidati WITH 'AVIZ', [tip=4 and exists (select 1 from vanzari_coresp vc where vc.tip=1 and vc.sters=0 and vc.id_vanzare_fact=v.id_vanzare)] + DO ListeazaCandidati WITH 'COMANDA', [tip in (3,21,25,28,42,47)] + DO ListeazaCandidati WITH 'CONTRACT', [tip in (2,6,26,52)] + DO ListeazaCandidati WITH 'ELSE', [tip not in (4,3,21,25,28,42,47,2,6,26,52)] +ENDPROC + +PROCEDURE ListeazaCandidati + LPARAMETERS tcFamilie, tcFiltru + + IF USED('v_disc98') + USE IN v_disc98 + ENDIF + IF !goExecutor.oExecuta([select id_vanzare, tip, id_fact from vanzari v where sters=0 and nvl(id_fact,0)>0 and ] + ; + tcFiltru + [ and rownum <= 10 order by id_vanzare desc], 'v_disc98') + STRTOFILE('EROARE la descoperire ' + tcFamilie + CHR(13) + CHR(10), gcErrLog, 1) + RETURN + ENDIF + STRTOFILE('--- candidati ' + tcFamilie + ' ---' + CHR(13) + CHR(10), gcErrLog, 1) + SELECT v_disc98 + SCAN + STRTOFILE(' id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ' id_fact=' + TRANSFORM(id_fact) + CHR(13) + CHR(10), gcErrLog, 1) + ENDSCAN + USE IN v_disc98 +ENDPROC + + +*============================================================================================== +* ProbaScenariu: reemite tnIdV o singura data. tlModifica = .F. -> reemitere IDENTICA (nicio +* schimbare pe crsfactura). tlModifica = .T. -> reemitere CU MODIFICARI (cantitatea primei linii +* +1). Verifica identitatea (ID_FACT, serie/numar/data), auditul de creare neschimbat, si - pe +* scenariul B - ca schimbarea a ajuns in Oracle (TOTAL_CU_TVA diferit) si ca legatura cu sursa +* s-a pastrat pe documentul nou (AVIZ: VANZARI_CORESP; COMANDA/CONTRACT: FACT_VFACTURI). +*============================================================================================== +PROCEDURE ProbaScenariu + LPARAMETERS tnIdV, tcFamilie, tlModifica, tcPrefix + LOCAL lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, lcSerieInainte, lnNumarInainte + LOCAL lnTotalInainte, lnLegaturaInainte, lnComandaInainte, lnCtrInainte + LOCAL lnIdVNou, llRez, lcSerieDupa, lnNumarDupa, lnTotalDupa, lnLegaturaDupa + LOCAL lnComandaDupa, lnCtrDupa, lnLiniiInainte, lnLiniiDupa + + IF !CititStareInainte(tnIdV, @lnIdFactVechi, @lnIdUtilInainte, @lcDataOraInainte) + RETURN + ENDIF + CititAntetInainte(tnIdV, @lcSerieInainte, @lnNumarInainte, @lnTotalInainte, @lnComandaInainte, @lnCtrInainte) + lnLegaturaInainte = CititLegaturaSursa(tcFamilie, tnIdV) + lnLiniiInainte = NumaraLiniiVii(tnIdV) + STRTOFILE(tcPrefix + ' INAINTE: serie=[' + lcSerieInainte + '] numar=' + TRANSFORM(lnNumarInainte) + ; + ' total=' + TRANSFORM(lnTotalInainte) + ' legatura=' + TRANSFORM(lnLegaturaInainte) + ; + ' id_comanda=' + TRANSFORM(lnComandaInainte) + ' id_ctr=' + TRANSFORM(lnCtrInainte) + ; + ' linii=' + TRANSFORM(lnLiniiInainte) + CHR(13) + CHR(10), gcErrLog, 1) + + LOCAL lnRuta + IF !ReemiteDocumentAuto2(tnIdV, @lnIdVNou, @llRez, tlModifica, @lnRuta) + RETURN + ENDIF + DO asserteaza WITH tcPrefix + '-1 do_scrie_factura() a intors .T.', llRez, TRANSFORM(llRez) + IF !llRez + RETURN + ENDIF + + IF !tlModifica + *!* scenariul A, verificat pe cod (vezi antetul fisierului): fara nicio modificare, ruta e 0 + *!* (nimic) - documentul ORIGINAL (tnIdV) trebuie sa ramana complet neatins, fara reemitere + DO asserteaza WITH tcPrefix + '-2 niciun document nou (ruta 0, nimic scris)', lnIdVNou = 0, TRANSFORM(lnIdVNou) + + LOCAL lnIdFactAcum, lnStersAcum + lnIdFactAcum = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV)) + lnStersAcum = Val1([select nvl(sters,-1) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV)) + DO asserteaza WITH tcPrefix + '-3 ID_FACT-ul documentului original neschimbat', lnIdFactAcum = lnIdFactVechi, ; + TRANSFORM(lnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactAcum) + DO asserteaza WITH tcPrefix + '-4 documentul original ramane STERS = 0 (n-a fost sters/reemis)', ; + lnStersAcum = 0, TRANSFORM(lnStersAcum) + + CititAntetInainte(tnIdV, @lcSerieDupa, @lnNumarDupa, @lnTotalDupa, @lnComandaDupa, @lnCtrDupa) + DO asserteaza WITH tcPrefix + '-5 serie/numar/total identice (nimic scris)', ; + lcSerieDupa == lcSerieInainte AND lnNumarDupa = lnNumarInainte AND lnTotalDupa = lnTotalInainte, ; + '[' + lcSerieInainte + '/' + TRANSFORM(lnNumarInainte) + '/' + TRANSFORM(lnTotalInainte) + ; + '] vs [' + lcSerieDupa + '/' + TRANSFORM(lnNumarDupa) + '/' + TRANSFORM(lnTotalDupa) + ']' + + DO VerificaRandulDocumente WITH lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, tcPrefix + RETURN + ENDIF + + *!* scenariul B: modificare reala -> ruta 1 -> sterge+reemite. Identitatea (ID_FACT, serie, + *!* numar) trebuie pastrata pe documentul NOU, iar continutul trebuie sa reflecte modificarea. + LOCAL lnIdFactNou + lnIdFactNou = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(lnIdVNou)) + DO asserteaza WITH tcPrefix + '-2 ID_FACT pastrat (identitate)', lnIdFactNou = lnIdFactVechi, ; + TRANSFORM(lnIdFactVechi) + ' vs ' + TRANSFORM(lnIdFactNou) + + CititAntetInainte(lnIdVNou, @lcSerieDupa, @lnNumarDupa, @lnTotalDupa, @lnComandaDupa, @lnCtrDupa) + DO asserteaza WITH tcPrefix + '-3 serie/numar identice fata de inainte (identitatea de act pastrata)', ; + lcSerieDupa == lcSerieInainte AND lnNumarDupa = lnNumarInainte, ; + '[' + lcSerieInainte + '/' + TRANSFORM(lnNumarInainte) + '] vs [' + lcSerieDupa + '/' + TRANSFORM(lnNumarDupa) + ']' + + DO VerificaRandulDocumente WITH lnIdFactVechi, lnIdUtilInainte, lcDataOraInainte, tcPrefix + + DO asserteaza WITH tcPrefix + '-6 TOTAL_CU_TVA s-a schimbat (modificarea a ajuns in Oracle)', ; + lnTotalDupa <> lnTotalInainte, TRANSFORM(lnTotalInainte) + ' -> ' + TRANSFORM(lnTotalDupa) + + DO CASE + CASE tcFamilie == 'AVIZ' + lnLegaturaDupa = CititLegaturaSursa(tcFamilie, lnIdVNou) + DO asserteaza WITH tcPrefix + '-7 legatura AVIZ (VANZARI_CORESP) pastrata pe documentul nou', ; + lnLegaturaDupa >= 1 AND lnLegaturaDupa = lnLegaturaInainte, ; + TRANSFORM(lnLegaturaInainte) + ' -> ' + TRANSFORM(lnLegaturaDupa) + CASE tcFamilie == 'COMANDA' + DO asserteaza WITH tcPrefix + '-7 legatura ID_COMANDA pastrata pe documentul nou', ; + lnComandaDupa = lnComandaInainte AND lnComandaInainte > 0, ; + TRANSFORM(lnComandaInainte) + ' -> ' + TRANSFORM(lnComandaDupa) + CASE tcFamilie == 'CONTRACT' + DO asserteaza WITH tcPrefix + '-7 legatura ID_CTR pastrata pe documentul nou', ; + lnCtrDupa = lnCtrInainte AND lnCtrInainte > 0, ; + TRANSFORM(lnCtrInainte) + ' -> ' + TRANSFORM(lnCtrDupa) + OTHERWISE + STRTOFILE(tcPrefix + '-7 familia ELSE nu are legatura sursa de verificat' + CHR(13) + CHR(10), gcErrLog, 1) + ENDCASE + + *!* fara asta, o linie pierduta tacut la reemitere (FACT-005 / FACT-030) trece de toate + *!* asertiunile de mai sus, care verifica doar identitatea si antetul + lnLiniiDupa = NumaraLiniiVii(lnIdVNou) + DO asserteaza WITH tcPrefix + '-8 numarul de linii vii pastrat pe documentul nou', ; + lnLiniiDupa = lnLiniiInainte AND lnLiniiInainte > 0, ; + TRANSFORM(lnLiniiInainte) + ' -> ' + TRANSFORM(lnLiniiDupa) +ENDPROC + + +*============================================================================================== +* NumaraLiniiVii: cate linii nesterse are documentul. +*============================================================================================== +FUNCTION NumaraLiniiVii + LPARAMETERS tnIdV + RETURN Val1([select count(*) as v from vanzari_detalii where sters = 0 and id_vanzare = ] + TRANSFORM(tnIdV)) +ENDFUNC + + +*============================================================================================== +* ReemiteDocumentAuto2: acelasi driver ca test_s9_7 (IncarcaAntetFacturaEditare + +* IncarcaLiniiFacturaEditare + do_scrie_factura() REAL, fara fortare manuala). tlModifica = .F. +* NU atinge crsfactura (reemitere identica); .T. creste cantitatea primei linii cu 1. +*============================================================================================== +PROCEDURE ReemiteDocumentAuto2 + LPARAMETERS tnIdV, tnIdVNou, tlRez, tlModifica, tnRutaAleasa + LOCAL loForm, lnDiscRon, lnDiscVal, lnCantVeche, lnCantNoua, lnNr, lnIdVMaxInainte + + lnIdVMaxInainte = Val1([select nvl(max(id_vanzare),0) as v from vanzari]) + + DO urma WITH 'IncarcaAntetFacturaEditare ' + TRANSFORM(tnIdV) + lnDiscRon = 0 + lnDiscVal = 0 + poDate = IncarcaAntetFacturaEditare(tnIdV, @lnDiscRon, @lnDiscVal) + DO asserteaza WITH 'antetul documentului ' + TRANSFORM(tnIdV) + ' s-a incarcat', VARTYPE(poDate) = 'O', VARTYPE(poDate) + IF VARTYPE(poDate) <> 'O' + RETURN .F. + ENDIF + + DO urma WITH 'IncarcaLiniiFacturaEditare ' + TRANSFORM(tnIdV) + IncarcaLiniiFacturaEditare(poDate, tnIdV) + DO asserteaza WITH 'liniile documentului ' + TRANSFORM(tnIdV) + ' s-au incarcat', ; + USED('crsfactura') AND RECCOUNT('crsfactura') > 0, TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), -1)) + IF !USED('crsfactura') OR RECCOUNT('crsfactura') = 0 + RETURN .F. + ENDIF + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + loForm = CREATEOBJECT('frm_facturare_articole2') + loForm.ndiscfactron = lnDiscRon + loForm.ndiscfactval = lnDiscVal + loForm.do_calculeaza_totaluri() + poSnapshotEditare = CreeazaSnapshotEditare(poDate, loForm.ndiscfactron, loForm.ndiscfactval, ; + tnIdV, Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV)), ; + Val1([select nvl(cod,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV)), gnAn, gnLuna) + IF VARTYPE(poSnapshotEditare) <> 'O' + DO asserteaza WITH 'instantaneul de editare s-a creat (' + TRANSFORM(tnIdV) + ')', .F., VARTYPE(poSnapshotEditare) + RETURN .F. + ENDIF + + IF tlModifica + SELECT crsfactura + GO TOP + lnCantVeche = cantitate + lnCantNoua = lnCantVeche + 1 + REPLACE cantitate WITH lnCantNoua IN crsfactura + loForm.do_calculeaza_totaluri() + STRTOFILE('cantitate ' + TRANSFORM(lnCantVeche) + ' -> ' + TRANSFORM(lnCantNoua) + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + STRTOFILE('reemitere IDENTICA - crsfactura neatins' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + + tnRutaAleasa = AlegeRutaScriereEditare(poSnapshotEditare, poDate, loForm.ndiscfactron, loForm.ndiscfactval, 'crsfactura') + DO asserteaza WITH 'ruta aleasa e ' + TRANSFORM(IIF(tlModifica,1,0)) + IIF(tlModifica,' (regenerare)',' (nimic)') + ', doc ' + TRANSFORM(tnIdV), ; + tnRutaAleasa = IIF(tlModifica, 1, 0), TRANSFORM(tnRutaAleasa) + + *!* FARA nicio fortare manuala, FARA glRegenerareEditare - fortarea o face automat cablajul S9-7 + DO urma WITH 'do_scrie_factura (SCRIE IN ORACLE, fortare automata prin cablaj) doc ' + TRANSFORM(tnIdV) + tlRez = loForm.do_scrie_factura() + DO urma WITH 'do_scrie_factura a revenit, doc ' + TRANSFORM(tnIdV) + STRTOFILE('ultimul mesaj prin mock: [' + gcMockUltimMesaj + ']' + CHR(13) + CHR(10), gcErrLog, 1) + + goFormReemitere = loForm + + lnNr = Val1([select count(*) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxInainte)) + tnIdVNou = 0 + IF lnNr >= 1 + tnIdVNou = Val1([select nvl(max(id_vanzare),0) as v from vanzari where sters = 0 and id_vanzare > ] + TRANSFORM(lnIdVMaxInainte)) + ENDIF + STRTOFILE('documente noi nesterse dupa apel = ' + TRANSFORM(lnNr) + ' id_vanzare nou=' + TRANSFORM(tnIdVNou) + CHR(13) + CHR(10), gcErrLog, 1) + + RETURN .T. +ENDPROC + + +*============================================================================================== +PROCEDURE CititStareInainte + LPARAMETERS tnIdV, tnIdFactVechi, tnIdUtilInainte, tcDataOraInainte + + tnIdFactVechi = Val1([select nvl(id_fact,0) as v from vanzari where id_vanzare = ] + TRANSFORM(tnIdV) + [ and sters = 0]) + DO asserteaza WITH 'PRECONDITIE documentul ' + TRANSFORM(tnIdV) + ' e viu si are ID_FACT', tnIdFactVechi > 0, TRANSFORM(tnIdFactVechi) + IF tnIdFactVechi <= 0 + RETURN .F. + ENDIF + + tnIdUtilInainte = -1 + tcDataOraInainte = '' + IF USED('v_doc98') + USE IN v_doc98 + ENDIF + IF goExecutor.oExecuta([select id_util, to_char(dataora,'dd.mm.yyyy hh24:mi:ss') as dataorat from documente ] + ; + [where id_doc = ] + TRANSFORM(tnIdFactVechi), 'v_doc98') + SELECT v_doc98 + IF RECCOUNT('v_doc98') = 1 + GO TOP + tnIdUtilInainte = NVL(id_util, -1) + tcDataOraInainte = ALLTRIM(NVL(dataorat, '')) + ENDIF + USE IN v_doc98 + ENDIF + STRTOFILE('INAINTE doc ' + TRANSFORM(tnIdV) + ': id_fact=' + TRANSFORM(tnIdFactVechi) + ; + ' documente.id_util=' + TRANSFORM(tnIdUtilInainte) + ' documente.dataora=' + tcDataOraInainte + CHR(13) + CHR(10), gcErrLog, 1) + RETURN .T. +ENDPROC + + +*============================================================================================== +* CititAntetInainte: serie/numar/total/id_comanda/id_ctr direct din FACT_VFACTURI (o singura +* interogare, aceleasi coloane folosite si "inainte" si "dupa"). +*============================================================================================== +PROCEDURE CititAntetInainte + LPARAMETERS tnIdV, tcSerie, tnNumar, tnTotal, tnComanda, tnCtr + tcSerie = '' + tnNumar = 0 + tnTotal = -1 + tnComanda = 0 + tnCtr = 0 + IF USED('v_ant98') + USE IN v_ant98 + ENDIF + IF goExecutor.oExecuta([select nvl(serie_act,' ') as serie_act, nvl(numar_act,-1) as numar_act, ] + ; + [nvl(total_cu_tva,-1) as total_cu_tva, nvl(id_comanda,0) as id_comanda, nvl(id_ctr,0) as id_ctr ] + ; + [from fact_vfacturi where id_vanzare = ] + TRANSFORM(tnIdV), 'v_ant98') + SELECT v_ant98 + IF RECCOUNT('v_ant98') = 1 + GO TOP + tcSerie = ALLTRIM(NVL(serie_act, '')) + tnNumar = NVL(numar_act, -1) + tnTotal = NVL(total_cu_tva, -1) + tnComanda = NVL(id_comanda, 0) + tnCtr = NVL(id_ctr, 0) + ENDIF + USE IN v_ant98 + ENDIF +ENDPROC + + +*============================================================================================== +* CititLegaturaSursa: numarul de avize sursa vii (VANZARI_CORESP TIP=1) legate de documentul dat. +* Foloseste doar familia AVIZ; celelalte familii se verifica direct din FACT_VFACTURI. +*============================================================================================== +FUNCTION CititLegaturaSursa + LPARAMETERS tcFamilie, tnIdV + IF tcFamilie <> 'AVIZ' + RETURN -1 + ENDIF + RETURN Val1([select count(*) as v from vanzari_coresp where tip=1 and sters=0 and id_vanzare_fact = ] + TRANSFORM(tnIdV)) +ENDFUNC + + +*============================================================================================== +PROCEDURE VerificaRandulDocumente + LPARAMETERS tnIdDoc, tnIdUtilInainte, tcDataOraInainte, tcPrefix + LOCAL lnSters, lnIdUtil, lcDataOra + + IF USED('v_ver98') + USE IN v_ver98 + ENDIF + IF !goExecutor.oExecuta([select sters, id_util, to_char(dataora,'dd.mm.yyyy hh24:mi:ss') as dataorat ] + ; + [from documente where id_doc = ] + TRANSFORM(tnIdDoc), 'v_ver98') + DO asserteaza WITH tcPrefix + '-4 randul reinviat s-a putut citi', .F., 'eroare interogare' + RETURN + ENDIF + SELECT v_ver98 + IF RECCOUNT('v_ver98') <> 1 + DO asserteaza WITH tcPrefix + '-4 randul reinviat exista o singura data', .F., TRANSFORM(RECCOUNT('v_ver98')) + USE IN v_ver98 + RETURN + ENDIF + GO TOP + lnSters = NVL(sters, -1) + lnIdUtil = NVL(id_util, -1) + lcDataOra = ALLTRIM(NVL(dataorat, '')) + USE IN v_ver98 + + DO asserteaza WITH tcPrefix + '-4 randul reinviat are STERS = 0', lnSters = 0, TRANSFORM(lnSters) + DO asserteaza WITH tcPrefix + '-5a ID_UTIL neschimbat (audit de creare)', lnIdUtil = tnIdUtilInainte, ; + TRANSFORM(tnIdUtilInainte) + ' -> ' + TRANSFORM(lnIdUtil) + DO asserteaza WITH tcPrefix + '-5b DATAORA neschimbata (audit de creare)', lcDataOra == tcDataOraInainte, ; + '[' + tcDataOraInainte + '] -> [' + lcDataOra + ']' +ENDPROC + + +*============================================================================================== +* Val1: o singura valoare numerica dintr-un select care aliaseaza coloana ca "v". +*============================================================================================== +FUNCTION Val1 + LPARAMETERS tcSql + LOCAL lnRet + lnRet = -1 + IF USED('v_val98') + USE IN v_val98 + ENDIF + IF goExecutor.oExecuta(tcSql, 'v_val98') + SELECT v_val98 + IF RECCOUNT('v_val98') > 0 + GO TOP + lnRet = NVL(v_val98.v, -1) + ENDIF + USE IN v_val98 + ELSE + STRTOFILE('EROARE Val1: ' + goExecutor.cEroare + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + RETURN lnRet +ENDFUNC + + +PROCEDURE urma + LPARAMETERS tcPas + STRTOFILE('URMA ' + TTOC(DATETIME()) + ' ' + m.tcPas + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC + + +PROCEDURE asserteaza + LPARAMETERS tcNume, tlConditie, tcValoare + + IF m.tlConditie + gnPass = gnPass + 1 + STRTOFILE('PASS ' + m.tcNume + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE('FAIL ' + m.tcNume + ' (valoare: ' + TRANSFORM(m.tcValoare) + ')' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnError, tcMessage, tcProgram, tnLineNo + + STRTOFILE('EROARE ' + TRANSFORM(tnError) + ' [' + tcProgram + ':' + TRANSFORM(tnLineNo) + '] ' + tcMessage + CHR(13) + CHR(10), gcErrLog, 1) + gnFail = gnFail + 1 + STRTOFILE('REZULTAT: ' + TRANSFORM(gnPass) + ' PASS / ' + TRANSFORM(gnFail) + ' FAIL' + CHR(13) + CHR(10), gcErrLog, 1) + STRTOFILE('end (eroare) ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDPROC diff --git a/utile/Teste/editare_factura/test_scan_workarea.prg b/utile/Teste/editare_factura/test_scan_workarea.prg index 9f33ba3..fdec29f 100644 --- a/utile/Teste/editare_factura/test_scan_workarea.prg +++ b/utile/Teste/editare_factura/test_scan_workarea.prg @@ -19,7 +19,7 @@ PUBLIC gcErrLog gcErrLog = lcLog ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() -DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), lcLog, 1) QUIT diff --git a/utile/Teste/editare_factura/test_vctva_prelucreaza.prg b/utile/Teste/editare_factura/test_vctva_prelucreaza.prg new file mode 100644 index 0000000..811b687 --- /dev/null +++ b/utile/Teste/editare_factura/test_vctva_prelucreaza.prg @@ -0,0 +1,155 @@ +* test_vctva_prelucreaza.prg +* Proba tintita pentru reparatia din docs\propunere_comparatie_coloane_crsfactura.md sectiunea 3.1: +* vpretctva / vdiscountctva trebuie sa iasa din prelucreaza_facturacrs exact din Pret_val / +* discount_unitar_val, nu 0 tacit. Verifica si ca ramura in lei si campurile de dupa punctele de +* inserare din lista pozitionala INSERT ... SELECT au ramas neschimbate, plus prezenta coloanei +* NUME_GESTIUNE in VVANZARI_ARTICOLE (reparatia din sectiunea 3.2). + +SET SAFETY OFF +SET TALK OFF + +PUBLIC gcErrLog, gnPass, gnFail +gcErrLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\editare_factura\test_vctva_prelucreaza_log.txt' +STRTOFILE('start ' + TRANSFORM(DATETIME()) + CHR(13) + CHR(10), gcErrLog) +ON ERROR DO test_error_handler WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO ('D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +IF gnHandle <= 0 + STRTOFILE('EROARE: conectare esuata' + CHR(13) + CHR(10), gcErrLog, 1) + QUIT +ENDIF + +gnPass = 0 +gnFail = 0 +STRTOFILE('precizii: gnPVal=' + TRANSFORM(gnPVal) + ' gnPPretV=' + TRANSFORM(gnPPretV) + ' gnPc=' + TRANSFORM(gnPc) + CHR(13) + CHR(10), gcErrLog, 1) + +DO CazValutaCuTva +DO CazValutaFaraTva +DO CazLei +DO ColoanaNumeGestiune + +STRTOFILE(CHR(13) + CHR(10) + 'REZULTAT: pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + CHR(13) + CHR(10), gcErrLog, 1) +QUIT + + +PROCEDURE CreeazaSursa + LPARAMETERS tnPretCuTva, tnTipValuta, tnPret, tnDiscount, tnPretVal, tnDiscountVal + IF USED('crssursavctva') + USE IN crssursavctva + ENDIF + CREATE CURSOR crssursavctva (id_vanzare_det N(10), id_articol N(10), explicatie M, denumire C(100), ; + lot C(20) NULL, serie C(100) NULL, codmat C(50), codmatc C(50), id_jtva_coloana N(10) NULL, ; + id_jtva_coloana_ex N(10) NULL, taxcode N(6) NULL, codmatf C(50), codbare C(50), ; + pret_achizitie N(20,6), cantitate N(20,6), proc_tvav N(20,4), um C(10), cod_um_iso C(5), ; + pret_cu_tva N(1), pret N(20,6), discount_unitar N(20,6), pret_val N(20,6), discount_unitar_val N(20,6), ; + id_vanzare_set N(20) NULL, id_gestiune N(20) NULL, id_ctr N(20) NULL, numar_contract C(100) NULL, ; + id_valuta N(10), tip_valuta N(1), curs N(20,4), multiplicator N(10), nume_val C(100), ; + codnc8 V(20) NULL, codcpv V(20) NULL) + INSERT INTO crssursavctva (id_vanzare_det, id_articol, explicatie, denumire, lot, serie, codmat, codmatc, ; + id_jtva_coloana, id_jtva_coloana_ex, taxcode, codmatf, codbare, pret_achizitie, cantitate, proc_tvav, ; + um, cod_um_iso, pret_cu_tva, pret, discount_unitar, pret_val, discount_unitar_val, id_vanzare_set, ; + id_gestiune, id_ctr, numar_contract, id_valuta, tip_valuta, curs, multiplicator, nume_val, codnc8, codcpv) ; + VALUES (77, 4242, 'expl', 'ARTICOL PROBA', 'L1', 'S1', 'CM1', 'CMC1', ; + 11, .NULL., 0, 'CMF1', 'CB1', 5.000000, 2.000000, 1.1900, 'BUC', 'H87', ; + tnPretCuTva, tnPret, tnDiscount, tnPretVal, tnDiscountVal, 900, ; + 31, 55, 'CTR-1', 3, tnTipValuta, 4.9000, 1, 'EUR', 'NC8', 'CPV') + creeaza_facturacrs('crsfactura') + prelucreaza_facturacrs('crssursavctva', 'crsfactura', 0, 0, 0) + SELECT crsfactura + GO TOP +ENDPROC + + +PROCEDURE CazValutaCuTva + STRTOFILE(CHR(13) + CHR(10) + '--- CAZ 1: valuta (tip_valuta=1) + pret_cu_tva=1' + CHR(13) + CHR(10), gcErrLog, 1) + DO CreeazaSursa WITH 1, 1, 490.000000, 49.000000, 100.000000, 10.000000 + DO Asserta WITH 'vpretctva = Round(Pret_val)', crsfactura.vpretctva, ROUND(100.000000, gnPVal) + DO Asserta WITH 'vdiscountctva = Round(discount_unitar_val)', crsfactura.vdiscountctva, ROUND(10.000000, gnPVal) + DO Asserta WITH 'pretctva (lei, neschimbat)', crsfactura.pretctva, ROUND(490.000000, gnPPretV) + DO Asserta WITH 'discountctva (lei, neschimbat)', crsfactura.discountctva, ROUND(49.000000, gnPPretV) + DO ProbeazaPozitii +ENDPROC + + +PROCEDURE CazValutaFaraTva + STRTOFILE(CHR(13) + CHR(10) + '--- CAZ 2: valuta (tip_valuta=1) + pret_cu_tva=0' + CHR(13) + CHR(10), gcErrLog, 1) + DO CreeazaSursa WITH 0, 1, 490.000000, 49.000000, 100.000000, 10.000000 + DO Asserta WITH 'vpretctva = pret_val + tva', crsfactura.vpretctva, ; + ROUND(100.000000, gnPVal) + ROUND(ROUND(100.000000, gnPVal) * (1.1900 - 1), gnPVal) + DO Asserta WITH 'vdiscountctva = 0 pe ramura fara tva', crsfactura.vdiscountctva, 0.000 + DO Asserta WITH 'vpretftva = pret_val', crsfactura.vpretftva, ROUND(100.000000, gnPVal) + DO Asserta WITH 'vdiscountftva = discount_unitar_val', crsfactura.vdiscountftva, ROUND(10.000000, gnPVal) + DO ProbeazaPozitii +ENDPROC + + +PROCEDURE CazLei + STRTOFILE(CHR(13) + CHR(10) + '--- CAZ 3: lei (tip_valuta=0) + pret_cu_tva=1' + CHR(13) + CHR(10), gcErrLog, 1) + DO CreeazaSursa WITH 1, 0, 200.000000, 20.000000, 0.000000, 0.000000 + DO Asserta WITH 'pretctva', crsfactura.pretctva, ROUND(200.000000, gnPPretV) + DO Asserta WITH 'discountctva', crsfactura.discountctva, ROUND(20.000000, gnPPretV) + DO Asserta WITH 'vpretctva = 0 (fara valuta)', crsfactura.vpretctva, 0.000 + DO Asserta WITH 'vdiscountctva = 0 (fara valuta)', crsfactura.vdiscountctva, 0.000 + DO Asserta WITH 'vpretftva = 0 (fara valuta)', crsfactura.vpretftva, 0.000 + DO Asserta WITH 'vdiscountftva = 0 (fara valuta)', crsfactura.vdiscountftva, 0.000 + DO ProbeazaPozitii +ENDPROC + + +*!* campurile de DUPA cele doua puncte de inserare din lista pozitionala INSERT ... SELECT: +*!* o nepotrivire de ordine le-ar muta tacit valorile +PROCEDURE ProbeazaPozitii + DO Asserta WITH 'pozitie: id_set_fact', crsfactura.id_set_fact, 900 + DO Asserta WITH 'pozitie: gestionabil', crsfactura.gestionabil, 1 + DO Asserta WITH 'pozitie: id_ctr', crsfactura.id_ctr, 55 + DO Asserta WITH 'pozitie: id_valuta', crsfactura.id_valuta, 3 + DO Asserta WITH 'pozitie: curs', crsfactura.curs, 4.9000 + DO Asserta WITH 'pozitie: multiplicator', crsfactura.multiplicator, 1 + DO AssertaC WITH 'pozitie: numar_contract', ALLTRIM(NVL(crsfactura.numar_contract, '')), 'CTR-1' + DO AssertaC WITH 'pozitie: nume_val', ALLTRIM(NVL(crsfactura.nume_val, '')), 'EUR' + DO AssertaC WITH 'pozitie: codnc8', ALLTRIM(NVL(crsfactura.codnc8, '')), 'NC8' + DO AssertaC WITH 'pozitie: codcpv', ALLTRIM(NVL(crsfactura.codcpv, '')), 'CPV' +ENDPROC + + +PROCEDURE ColoanaNumeGestiune + STRTOFILE(CHR(13) + CHR(10) + '--- CAZ 4: VVANZARI_ARTICOLE expune NUME_GESTIUNE' + CHR(13) + CHR(10), gcErrLog, 1) + LOCAL lnS + lnS = goExecutor.oExecute("select column_name from all_tab_columns where owner = 'MARIUSM_AUTO' and table_name = 'VVANZARI_ARTICOLE' and column_name = 'NUME_GESTIUNE'", 'crsNG') + DO Asserta WITH 'NUME_GESTIUNE in VVANZARI_ARTICOLE', IIF(USED('crsNG'), RECCOUNT('crsNG'), 0), 1 + IF USED('crsNG') + USE IN crsNG + ENDIF + goExecutor.oReset() +ENDPROC + + +PROCEDURE Asserta + LPARAMETERS tcNume, tnGasit, tnAsteptat + IF ABS(tnGasit - tnAsteptat) < 0.0000005 + gnPass = gnPass + 1 + STRTOFILE(' OK ' + tcNume + ' = ' + TRANSFORM(tnGasit) + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE(' FAIL ' + tcNume + ': gasit ' + TRANSFORM(tnGasit) + ', asteptat ' + TRANSFORM(tnAsteptat) + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE AssertaC + LPARAMETERS tcNume, tcGasit, tcAsteptat + IF tcGasit == tcAsteptat + gnPass = gnPass + 1 + STRTOFILE(' OK ' + tcNume + ' = [' + tcGasit + ']' + CHR(13) + CHR(10), gcErrLog, 1) + ELSE + gnFail = gnFail + 1 + STRTOFILE(' FAIL ' + tcNume + ': gasit [' + tcGasit + '], asteptat [' + tcAsteptat + ']' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF +ENDPROC + + +PROCEDURE test_error_handler + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE('EROARE #' + TRANSFORM(tnErr) + ': ' + tcMsg + ' in ' + tcProg + ' linia ' + TRANSFORM(tnLine) + CHR(13) + CHR(10), gcErrLog, 1) +ENDPROC diff --git a/utile/Teste/efactura_import/test_import_zip_efactura.prg b/utile/Teste/efactura_import/test_import_zip_efactura.prg index 500adfe..4301404 100644 --- a/utile/Teste/efactura_import/test_import_zip_efactura.prg +++ b/utile/Teste/efactura_import/test_import_zip_efactura.prg @@ -18,11 +18,16 @@ SET TALK OFF PUBLIC gcUILog, gcSyncDir, gnMockRaspuns, gcTestDir, gcZipFile, gcIdInc, gcCifBenef PUBLIC poFacturiEmise, poFacturiPrimite, poFacturiTrimise, poFacturiDetalii PUBLIC loAnaf, loForm, gnPass, gnFail +PUBLIC gcTesteDir -gcTestDir = 'D:\ROA\ROACONT\COMUN\utile\Teste\efactura_import\' +* gcTestDir/gcTesteDir se deriva din calea reala a acestui .prg (SYS(16)), nu se mai +* codifica fix pe ROACONT: fisierul e partajat prin COMUN si ruleaza identic din orice +* produs (ROACONT sau ROAFACTURARE) - vezi COMUN\utile\Teste\test.prg pentru tipar. +gcTestDir = ADDBS(JUSTPATH(SYS(16))) +gcTesteDir = ADDBS(JUSTPATH(JUSTPATH(SYS(16)))) gcUILog = gcTestDir + 'test_import_zip_efactura_log.txt' gcSyncDir = gcTestDir + 'uisync_importzip\' -gcZipFile = 'D:\ROA\ROACONT\5967557693.zip' +gcZipFile = 'D:\ROA\Efactura\2026_01\MARIUSM_AUTO\PRIMITE\5967557693_5967557693.zip' gcIdInc = '5967557693' gcCifBenef = '29923675' gnMockRaspuns = 6 @@ -36,10 +41,10 @@ ON SHUTDOWN QUIT * Mock-urile se incarca INAINTE de test_init_env_auto: la nume duplicat de procedura * castiga fisierul incarcat PRIMUL (vezi docs\testare-ui-vfp.md, punctul j) -SET PROCEDURE TO ('D:\ROA\ROACONT\COMUN\utile\Teste\mock_amessagebox.prg') ADDITIVE -SET PROCEDURE TO ('D:\ROA\ROACONT\COMUN\utile\Teste\ui_harness.prg') ADDITIVE +SET PROCEDURE TO (gcTesteDir + 'mock_amessagebox.prg') ADDITIVE +SET PROCEDURE TO (gcTesteDir + 'ui_harness.prg') ADDITIVE -DO ('D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 1 +DO (gcTesteDir + 'test_init_env_auto.prg') WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 1 DO HarnessLog WITH 'INIT gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + TRANSFORM(gcS) + ' perioada=' + TRANSFORM(gnLuna) + '/' + TRANSFORM(gnAn) DO HarnessLog WITH 'FIRMA=' + TRANSFORM(gcFirma) + ' cod fiscal=' + TRANSFORM(goFirma.codfiscalfro) diff --git a/utile/Teste/facturare_unificat/check_ordine_cursor_combo.py b/utile/Teste/facturare_unificat/check_ordine_cursor_combo.py new file mode 100644 index 0000000..2fce9f3 --- /dev/null +++ b/utile/Teste/facturare_unificat/check_ordine_cursor_combo.py @@ -0,0 +1,84 @@ +""" +Verifica ca ordinea campurilor din creeaza_cursor_gol si reordoneaza +(combosql_cautare, ofacturare.vc2) e identica pe fiecare ramura (codmat/denumire) +si ca fiecare lista are 20 de campuri. Iese cu cod != 0 daca nu. +""" +import re +import sys + +PATH = r"D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2" + + +def campuri_create_cursor(bloc): + # "codmat C(100), denumire C(100), ..." -> ["codmat", "denumire", ...] + interior = bloc[bloc.index('(m.tcCursor) (') + len('(m.tcCursor) ('):bloc.rindex(')')] + nume = re.findall(r'(\w+)\s+[CN]\(', interior) + return nume + + +def campuri_select(bloc): + # "Select codmat, denumire, ... From (m.tcRaw)" -> ["codmat", "denumire", ...] + interior = bloc[len('Select '):bloc.index('From (m.tcRaw)')] + interior = re.sub(r';\s*', ' ', interior) # elimina continuarile de linie + nume = [c.strip() for c in interior.split(',') if c.strip()] + return nume + + +def extrage_ramuri(text, nume_metoda, extractor, marker_inceput, marker_sfarsit): + start = text.index('PROCEDURE ' + nume_metoda) + end = text.index('ENDPROC', start) + corp = text[start:end] + + if_pos = corp.index('If This.pFieldActiv = [codmat]') + else_pos = corp.index('Else', if_pos) + endif_pos = corp.index('Endif', else_pos) + + bloc_codmat = corp[if_pos:else_pos] + bloc_denumire = corp[else_pos:endif_pos] + + bloc_codmat = bloc_codmat[bloc_codmat.index(marker_inceput):] + bloc_codmat = bloc_codmat[:bloc_codmat.index(marker_sfarsit) + len(marker_sfarsit)] + + bloc_denumire = bloc_denumire[bloc_denumire.index(marker_inceput):] + bloc_denumire = bloc_denumire[:bloc_denumire.index(marker_sfarsit) + len(marker_sfarsit)] + + return extractor(bloc_codmat), extractor(bloc_denumire) + + +def main(): + text = open(PATH, 'rb').read().decode('cp1250') + + cg_codmat, cg_denumire = extrage_ramuri( + text, 'creeaza_cursor_gol', campuri_create_cursor, 'Create Cursor', '))') + ro_codmat, ro_denumire = extrage_ramuri( + text, 'reordoneaza', campuri_select, 'Select', 'Into Cursor (m.tcCursor)') + + erori = [] + + for eticheta, lista in [ + ('creeaza_cursor_gol/codmat', cg_codmat), + ('creeaza_cursor_gol/denumire', cg_denumire), + ('reordoneaza/codmat', ro_codmat), + ('reordoneaza/denumire', ro_denumire), + ]: + if len(lista) != 20: + erori.append('%s are %d campuri, nu 20: %s' % (eticheta, len(lista), lista)) + + if cg_codmat != ro_codmat: + erori.append('ramura codmat: creeaza_cursor_gol != reordoneaza\n %s\n %s' % (cg_codmat, ro_codmat)) + if cg_denumire != ro_denumire: + erori.append('ramura denumire: creeaza_cursor_gol != reordoneaza\n %s\n %s' % (cg_denumire, ro_denumire)) + + if erori: + print('FAIL') + for e in erori: + print(' -', e) + sys.exit(1) + + print('OK: 4 liste (2 metode x 2 ramuri), 20 campuri fiecare, ordine identica intre metode.') + print(' codmat: ', cg_codmat) + print(' denumire: ', cg_denumire) + + +if __name__ == '__main__': + main() diff --git a/utile/Teste/facturare_unificat/date_test_aviz_667.sql.txt b/utile/Teste/facturare_unificat/date_test_aviz_667.sql.txt new file mode 100644 index 0000000..31abba2 --- /dev/null +++ b/utile/Teste/facturare_unificat/date_test_aviz_667.sql.txt @@ -0,0 +1,20 @@ +-- Pregatirea sursei V1 pentru test_s6_3d_abd_pretd.prg. DOAR pe MARIUSM_AUTO@ROA_CENTRAL. +-- Nu e script de produs. +-- +-- De ce: singurul aviz nefacturat cu PRETD NULL nativ este 131, iar acela cade in Oracle +-- ("Nu au fost gasite articolele! FACT-015" in scrie_factura_avize) - defect al sursei, nu al +-- garzii noi din do_scrie_articole. Ca sa se poata arata ca V1 SCRIE un document dintr-o sursa +-- cu pretd NULL, avizul 667 (SSS 111, client 614, 1 linie, 1000 buc, nefacturat) primeste +-- PRETD NULL. PRET era 0, ceea ce ar fi deschis dialogul "totalul 0"; se pune 10. +-- +-- Valorile de dinainte (citite din baza, 01.09.2026): +-- id_vanzare_det 955 pret 0 pretd 0 lot NULL + +update vanzari_detalii + set pretd = null, + pret = 10 + where id_vanzare = 667; + +commit; + +select id_vanzare_det, cantitate, pret, pretd, lot from vanzari_detalii where id_vanzare = 667; diff --git a/utile/Teste/facturare_unificat/date_test_aviz_683.sql.txt b/utile/Teste/facturare_unificat/date_test_aviz_683.sql.txt new file mode 100644 index 0000000..a3b5625 --- /dev/null +++ b/utile/Teste/facturare_unificat/date_test_aviz_683.sql.txt @@ -0,0 +1,24 @@ +-- Pregatirea sursei pentru test_s6_3d_abd_pretd.prg. DOAR pe MARIUSM_AUTO@ROA_CENTRAL. +-- Nu e script de produs: nu se aplica la clienti, nu intra in registrul de migrari. +-- +-- De ce: in MARIUSM_AUTO nu exista niciun aviz nefacturat cu LOT completat, deci livrabilul B +-- (lot trimis de v2) nu se poate proba pe date reale. Avizul 683 (SSS 100020, client 614 +-- ROMFAST S.R.L., 4 linii, 9 bucati, nefacturat) e consumat oricum de proba, deci se completeaza +-- LOT pe liniile lui. In acelasi timp i se pune PRETD pe NULL, ca sa exercite si garda noua +-- Iif(Isnull(poArt.pretd),[NULL],...) pe traseul v2. +-- +-- Valorile de dinainte, citite din baza inainte de rulare (23:xx, 01.09.2026): +-- id_vanzare_det 979 lot NULL pretd 0 +-- id_vanzare_det 980 lot NULL pretd 0 +-- id_vanzare_det 981 lot NULL pretd 0 +-- id_vanzare_det 982 lot NULL pretd 0 + +update vanzari_detalii + set lot = 'LOT13-' || to_char(id_vanzare_det), + pretd = null + where id_vanzare = 683; + +commit; + +select id_vanzare_det, cantitate, pret, pretd, lot + from vanzari_detalii where id_vanzare = 683 order by id_vanzare_det; diff --git a/utile/Teste/facturare_unificat/lib_comparatie_documente.prg b/utile/Teste/facturare_unificat/lib_comparatie_documente.prg new file mode 100644 index 0000000..29ccba5 --- /dev/null +++ b/utile/Teste/facturare_unificat/lib_comparatie_documente.prg @@ -0,0 +1,459 @@ +*!* 01.09.2026 +*!* Biblioteca de comparatie documente v1/v2 (S6-0): fara efecte laterale, doar SELECT, nu emite +*!* nimic. Compara doua documente identificate prin SERIE_ACT + NRACT (nu ID_FACT - offset +*!* constant intre ID_FACT si ID_VANZARE, vezi docs\propunere_s6_test_flux_real.md 4.1a) pe +*!* VANZARI, VANZARI_DETALII, ACT si RUL. +*!* +*!* Functii publice (consumate de testele S6-1...S6-5): +*!* CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta) +*!* ruleaza toate cele patru comparatii de mai jos si intoarce numarul total de esecuri +*!* CompVanzari(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta) +*!* antetul (VANZARI): campurile de paritate + totalurile denormalizate, egalitate exacta +*!* CompVanzariDetalii(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta) +*!* liniile (VANZARI_DETALII), linie cu linie, sortate dupa id_articol, pret, proc_tvav, plus +*!* invariantul minim (count, sum(cantitate), sum(cantitate*pret), setul de id_jtva_coloana) +*!* CompAct(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta) +*!* multimea de randuri ACT, jonctiune pe serie_act+nract, comparata sortat (nu depinde de +*!* ordinea de inserare) +*!* CompRul(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta) +*!* multimea de randuri RUL; gol pe ambele parti = PASS, dar raportat explicit ca paritate +*!* vida/neconcludenta (RUL are randuri doar cu gnScadereStoc = 1) +*!* +*!* Fiecare functie de mai sus intoarce numarul de esecuri (0 = paritate completa pe campurile +*!* comparate) si scrie fiecare FAIL/REZUMAT in gcLog daca apelantul l-a definit PUBLIC (conventia +*!* din acest director); altfel scrie in propriul log implicit (out\lib_comparatie_documente.log). +*!* Cere conexiune Oracle deja deschisa (goExecutor functional, gnIdUtil setat de apelant) - nu +*!* deschide conexiune proprie si nu face niciun INSERT/UPDATE/DELETE/DDL. +*!* +*!* Incarcare: SET PROCEDURE TO lib_comparatie_documente ADDITIVE (dupa test_init_env_auto_*). +*!* Restul functiilor (Cdoc*) sunt suportul intern, neconsumat direct de teste. + +#DEFINE CDOC_LOG_IMPLICIT "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\lib_comparatie_documente.log" + +*---------------------------------------------------------------------------------------- +FUNCTION CompDoc + LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta + LOCAL nFail + tcEticheta = IIF(EMPTY(tcEticheta), '[fara eticheta]', tcEticheta) + DO CdocLog WITH "===== CompDoc " + tcEticheta + " : " + ALLTRIM(tcSerie1) + " " + TRANSFORM(tnNr1) + ; + " vs " + ALLTRIM(tcSerie2) + " " + TRANSFORM(tnNr2) + " =====" + nFail = 0 + nFail = nFail + CompVanzari(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta) + nFail = nFail + CompVanzariDetalii(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta) + nFail = nFail + CompAct(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta) + nFail = nFail + CompRul(tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta) + DO CdocLog WITH "TOTAL CompDoc " + tcEticheta + " esecuri=" + TRANSFORM(nFail) + RETURN nFail +ENDFUNC + +*---------------------------------------------------------------------------------------- +* VANZARI - antetul, campurile din 5.2 (paritate) + totalurile denormalizate (egalitate exacta) +FUNCTION CompVanzari + LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta + LOCAL nId1, nId2, nFail, lcCampuri, lcSql, nCnt + tcEticheta = IIF(EMPTY(tcEticheta), '[fara eticheta]', tcEticheta) + nFail = 0 + + nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1) + nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2) + IF nId1 <= 0 OR nId2 <= 0 + DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI: document negasit, serie1=" + ; + ALLTRIM(TRANSFORM(tcSerie1)) + " nr1=" + TRANSFORM(tnNr1) + " id1=" + TRANSFORM(nId1) + ; + ", serie2=" + ALLTRIM(TRANSFORM(tcSerie2)) + " nr2=" + TRANSFORM(tnNr2) + " id2=" + TRANSFORM(nId2) + RETURN 1 + ENDIF + + lcCampuri = "TIP, ID_PART, ID_GESTIUNE, ID_AGENT, ID_SECTIE, ID_SUCURSALA, ID_RUTA, ID_CTR, " + ; + "ID_COMANDA, ID_DELEGAT, ID_MASINA, IN_VALUTA, ID_VALUTA, CURS, MULTIPLICATOR, DISCOUNT, " + ; + "DISCOUNT_EVIDENTIAT, DISCOUNT_TVA, TVA_INCASARE, TEXT_ADITIONAL, LISTARE_DETALIATA, " + ; + "AFISARE_SCADENTA, COEFICIENT_K, TIP_FACTURA, TIP_SAFT, EFACTURA, EPROFORMA, ID_FACTURARE, " + ; + "ID_BENEFICIAR, NR_PERSOANE, NRINMAT, COD, ID_LUCRARE, ID_PUNCTVANZARE, VALOARE_ACHIZITIE, " + ; + "DIFTOTFTVA, DIFTOTTVA, COMANDA, CONTRACT, AVIZE, TIP_INCASAT, SERIE_INCASAT, NR_INCASAT, " + ; + "SUMA_INCASAT, SERIE_ACT, FACTURAT, TOTAL_FARA_TVA, TOTAL_TVA, TOTAL_CU_TVA, VALVAL, TVAVAL, TOTVAL" + nCnt = OCCURS(",", lcCampuri) + 1 + + lcSql = [select ] + lcCampuri + [ from vanzari where id_vanzare = ] + ALLTRIM(STR(nId1, 20, 0)) + IF goExecutor.oExecute(lcSql, 'crslibv1') < 0 + DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI: select document 1 esuat - " + goExecutor.oPrelucrareEroare() + RETURN 1 + ENDIF + lcSql = [select ] + lcCampuri + [ from vanzari where id_vanzare = ] + ALLTRIM(STR(nId2, 20, 0)) + IF goExecutor.oExecute(lcSql, 'crslibv2') < 0 + DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI: select document 2 esuat - " + goExecutor.oPrelucrareEroare() + DO CdocInchide WITH 'crslibv1' + RETURN 1 + ENDIF + + IF !USED('crslibv1') OR RECCOUNT('crslibv1') = 0 OR !USED('crslibv2') OR RECCOUNT('crslibv2') = 0 + DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI: unul din documente nu are rand in VANZARI" + nFail = 1 + ELSE + nFail = CdocComparaCampuri('crslibv1', 'crslibv2', lcCampuri, tcEticheta, ; + "VANZARI id1=" + TRANSFORM(nId1) + " id2=" + TRANSFORM(nId2)) + ENDIF + DO CdocInchide WITH 'crslibv1' + DO CdocInchide WITH 'crslibv2' + + DO CdocLog WITH "REZUMAT " + tcEticheta + " VANZARI id1=" + TRANSFORM(nId1) + " id2=" + ; + TRANSFORM(nId2) + " campuri=" + TRANSFORM(nCnt) + " esecuri=" + TRANSFORM(nFail) + RETURN nFail +ENDFUNC + +*---------------------------------------------------------------------------------------- +* VANZARI_DETALII - linie cu linie (sortate 5.3) + invariantul minim +FUNCTION CompVanzariDetalii + LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta + LOCAL nId1, nId2, nFail, lcCampuri, lcSql, nCnt1, nCnt2, i + tcEticheta = IIF(EMPTY(tcEticheta), '[fara eticheta]', tcEticheta) + nFail = 0 + nCnt1 = 0 + nCnt2 = 0 + + nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1) + nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2) + IF nId1 <= 0 OR nId2 <= 0 + DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI_DETALII: document negasit (vezi CompVanzari)" + RETURN 1 + ENDIF + + lcCampuri = "ID_ARTICOL, ID_POL, CANTITATE, PRET, PRET_CU_TVA, PROC_TVAV, DISCOUNT_UNITAR, " + ; + "ID_GESTIUNE, ID_JTVA_COLOANA, ID_JTVA_COLOANA_EX, ID_VALUTA, CONT, EXPLICATIE, SERIE, LOT, " + ; + "TAXCODE, CUSTODIE, ID_RATA, ID_CTR, ID_VANZARE_SET, PRET_ACHIZITIE, PRETD, ID_VALUTAD, DIFERENTA" + + lcSql = [select ] + lcCampuri + [ from vanzari_detalii where sters = 0 and id_vanzare = ] + ; + ALLTRIM(STR(nId1, 20, 0)) + [ order by id_articol, pret, proc_tvav] + IF goExecutor.oExecute(lcSql, 'crslibd1') < 0 + DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI_DETALII: select document 1 esuat - " + goExecutor.oPrelucrareEroare() + RETURN 1 + ENDIF + lcSql = [select ] + lcCampuri + [ from vanzari_detalii where sters = 0 and id_vanzare = ] + ; + ALLTRIM(STR(nId2, 20, 0)) + [ order by id_articol, pret, proc_tvav] + IF goExecutor.oExecute(lcSql, 'crslibd2') < 0 + DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI_DETALII: select document 2 esuat - " + goExecutor.oPrelucrareEroare() + DO CdocInchide WITH 'crslibd1' + RETURN 1 + ENDIF + + nCnt1 = IIF(USED('crslibd1'), RECCOUNT('crslibd1'), 0) + nCnt2 = IIF(USED('crslibd2'), RECCOUNT('crslibd2'), 0) + IF nCnt1 <> nCnt2 + nFail = nFail + 1 + DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI_DETALII numar de linii diferit: v1=" + ; + TRANSFORM(nCnt1) + " v2=" + TRANSFORM(nCnt2) + ELSE + FOR i = 1 TO nCnt1 + GO i IN crslibd1 + GO i IN crslibd2 + nFail = nFail + CdocComparaCampuri('crslibd1', 'crslibd2', lcCampuri, tcEticheta, ; + "VANZARI_DETALII linia " + TRANSFORM(i) + " (sortata)") + ENDFOR + ENDIF + + * invariantul minim din 5.3, chiar cand liniile nu sunt identice camp cu camp + nFail = nFail + CdocInvariantDetalii('crslibd1', nCnt1, 'crslibd2', nCnt2, tcEticheta) + + DO CdocInchide WITH 'crslibd1' + DO CdocInchide WITH 'crslibd2' + + DO CdocLog WITH "REZUMAT " + tcEticheta + " VANZARI_DETALII id1=" + TRANSFORM(nId1) + " id2=" + ; + TRANSFORM(nId2) + " linii1=" + TRANSFORM(nCnt1) + " linii2=" + TRANSFORM(nCnt2) + ; + " esecuri=" + TRANSFORM(nFail) + RETURN nFail +ENDFUNC + +*---------------------------------------------------------------------------------------- +* ACT - multimea de randuri (5.4), jonctiune pe serie_act+nract, comparata sortat +FUNCTION CompAct + LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta + LOCAL nFail, lcCampuri, lcOrder, lcSql, nCnt1, nCnt2, i + tcEticheta = IIF(EMPTY(tcEticheta), '[fara eticheta]', tcEticheta) + nFail = 0 + nCnt1 = 0 + nCnt2 = 0 + + lcCampuri = "SCD, SCC, SUMA, ID_JTVA_COLOANA, ID_SET, ID_PARTD, ID_PARTC, ID_SECTIE, " + ; + "ID_VENCHELT, ID_CTR, PROC_TVA, NEIMPOZAB, TAXCODE, EXPLICATIA4" + lcOrder = " order by " + lcCampuri + + lcSql = [select ] + lcCampuri + [ from act where sters = 0 and serie_act = '] + ALLTRIM(TRANSFORM(tcSerie1)) + ; + [' and nract = ] + ALLTRIM(STR(tnNr1, 20, 0)) + lcOrder + IF goExecutor.oExecute(lcSql, 'crsliba1') < 0 + DO CdocLog WITH "FAIL " + tcEticheta + " ACT: select document 1 esuat - " + goExecutor.oPrelucrareEroare() + RETURN 1 + ENDIF + lcSql = [select ] + lcCampuri + [ from act where sters = 0 and serie_act = '] + ALLTRIM(TRANSFORM(tcSerie2)) + ; + [' and nract = ] + ALLTRIM(STR(tnNr2, 20, 0)) + lcOrder + IF goExecutor.oExecute(lcSql, 'crsliba2') < 0 + DO CdocLog WITH "FAIL " + tcEticheta + " ACT: select document 2 esuat - " + goExecutor.oPrelucrareEroare() + DO CdocInchide WITH 'crsliba1' + RETURN 1 + ENDIF + + nCnt1 = IIF(USED('crsliba1'), RECCOUNT('crsliba1'), 0) + nCnt2 = IIF(USED('crsliba2'), RECCOUNT('crsliba2'), 0) + IF nCnt1 = 0 OR nCnt2 = 0 + nFail = nFail + 1 + DO CdocLog WITH "FAIL " + tcEticheta + " ACT: unul din documente nu are randuri (v1=" + ; + TRANSFORM(nCnt1) + " v2=" + TRANSFORM(nCnt2) + ")" + ELSE + IF nCnt1 <> nCnt2 + nFail = nFail + 1 + DO CdocLog WITH "FAIL " + tcEticheta + " ACT numar de randuri diferit: v1=" + ; + TRANSFORM(nCnt1) + " v2=" + TRANSFORM(nCnt2) + ENDIF + FOR i = 1 TO MIN(nCnt1, nCnt2) + GO i IN crsliba1 + GO i IN crsliba2 + nFail = nFail + CdocComparaCampuri('crsliba1', 'crsliba2', lcCampuri, tcEticheta, ; + "ACT rand " + TRANSFORM(i) + " (sortat)") + ENDFOR + ENDIF + + DO CdocInchide WITH 'crsliba1' + DO CdocInchide WITH 'crsliba2' + + DO CdocLog WITH "REZUMAT " + tcEticheta + " ACT randuri1=" + TRANSFORM(nCnt1) + " randuri2=" + ; + TRANSFORM(nCnt2) + " esecuri=" + TRANSFORM(nFail) + RETURN nFail +ENDFUNC + +*---------------------------------------------------------------------------------------- +* RUL - multimea de randuri (5.5); gol pe ambele parti = PASS, raportat ca paritate vida/neconcludenta +FUNCTION CompRul + LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcEticheta + LOCAL nFail, lcCampuri, lcOrder, lcSql, nCnt1, nCnt2, i + tcEticheta = IIF(EMPTY(tcEticheta), '[fara eticheta]', tcEticheta) + nFail = 0 + nCnt1 = 0 + nCnt2 = 0 + + lcCampuri = "ID_ARTICOL, ID_GESTIUNE, ID_GESTIUNEC, CANT, PRET, PRETV, PROC_TVAV, VALOARE, " + ; + "VALOAREV, VALTVA, VALTVAV, DISCUNITAR, PROC_DISC, ID_TIP_RULAJ, ID_SET, CONT, SERIE, LOT, " + ; + "TAXCODE, ID_JTVA_COLOANA" + lcOrder = " order by " + lcCampuri + + lcSql = [select ] + lcCampuri + [ from rul where sters = 0 and serie_act = '] + ALLTRIM(TRANSFORM(tcSerie1)) + ; + [' and nract = ] + ALLTRIM(STR(tnNr1, 20, 0)) + lcOrder + IF goExecutor.oExecute(lcSql, 'crslibr1') < 0 + DO CdocLog WITH "FAIL " + tcEticheta + " RUL: select document 1 esuat - " + goExecutor.oPrelucrareEroare() + RETURN 1 + ENDIF + lcSql = [select ] + lcCampuri + [ from rul where sters = 0 and serie_act = '] + ALLTRIM(TRANSFORM(tcSerie2)) + ; + [' and nract = ] + ALLTRIM(STR(tnNr2, 20, 0)) + lcOrder + IF goExecutor.oExecute(lcSql, 'crslibr2') < 0 + DO CdocLog WITH "FAIL " + tcEticheta + " RUL: select document 2 esuat - " + goExecutor.oPrelucrareEroare() + DO CdocInchide WITH 'crslibr1' + RETURN 1 + ENDIF + + nCnt1 = IIF(USED('crslibr1'), RECCOUNT('crslibr1'), 0) + nCnt2 = IIF(USED('crslibr2'), RECCOUNT('crslibr2'), 0) + + IF nCnt1 = 0 AND nCnt2 = 0 + DO CdocLog WITH "PASS " + tcEticheta + " RUL: gol pe ambele parti - paritate VIDA, NECONCLUDENTA " + ; + "(RUL are randuri doar cu gnScadereStoc = 1)" + ELSE + IF nCnt1 = 0 OR nCnt2 = 0 + nFail = nFail + 1 + DO CdocLog WITH "FAIL " + tcEticheta + " RUL: gol doar pe o parte (v1=" + TRANSFORM(nCnt1) + ; + " v2=" + TRANSFORM(nCnt2) + ") - diferenta reala, nu paritate vida" + ELSE + IF nCnt1 <> nCnt2 + nFail = nFail + 1 + DO CdocLog WITH "FAIL " + tcEticheta + " RUL numar de randuri diferit: v1=" + ; + TRANSFORM(nCnt1) + " v2=" + TRANSFORM(nCnt2) + ENDIF + FOR i = 1 TO MIN(nCnt1, nCnt2) + GO i IN crslibr1 + GO i IN crslibr2 + nFail = nFail + CdocComparaCampuri('crslibr1', 'crslibr2', lcCampuri, tcEticheta, ; + "RUL rand " + TRANSFORM(i) + " (sortat)") + ENDFOR + ENDIF + ENDIF + + DO CdocInchide WITH 'crslibr1' + DO CdocInchide WITH 'crslibr2' + + DO CdocLog WITH "REZUMAT " + tcEticheta + " RUL randuri1=" + TRANSFORM(nCnt1) + " randuri2=" + ; + TRANSFORM(nCnt2) + " esecuri=" + TRANSFORM(nFail) + RETURN nFail +ENDFUNC + +*---------------------------------------------------------------------------------------- +* Suport intern - nu se consuma direct din testele S6-1...S6-5 +*---------------------------------------------------------------------------------------- + +* gaseste id_vanzare pornind de la serie_act+numar_act; 0 = negasit, -1 = eroare Oracle +* ORDER BY id_vanzare DESC: (serie_act,numar_act) nu e garantat unic pe tot istoricul (numere +* vechi, dinainte de seria de teste, pot coincide) - apelantii cauta mereu documentul scris ACUM, +* deci cel mai mare id_vanzare e alegerea corecta (descoperit la coliziunea SSS 1001: id_vanzare +* 451 din 2009 vs. 1623 scris azi de acest test) +FUNCTION CdocGasesteIdVanzare + LPARAMETERS tcSerie, tnNr + LOCAL lcSql + lcSql = [select id_vanzare as nr from vanzari where sters = 0 and serie_act = '] + ; + ALLTRIM(TRANSFORM(tcSerie)) + [' and numar_act = ] + ALLTRIM(STR(tnNr, 20, 0)) + ; + [ order by id_vanzare desc] + RETURN CdocValoareScalara(lcSql, 'crslibidv') +ENDFUNC + +* executa un select ... as nr FROM ... si intoarce prima valoare; -1 = eroare Oracle +FUNCTION CdocValoareScalara + LPARAMETERS tcSql, tcCursorTmp + LOCAL lnRez, lnSucces, lcCur + lcCur = IIF(EMPTY(tcCursorTmp), 'crslibscalar', tcCursorTmp) + lnRez = -1 + lnSucces = goExecutor.oExecute(tcSql, lcCur) + IF lnSucces >= 0 AND USED(lcCur) + IF RECCOUNT(lcCur) > 0 + SELECT (lcCur) + GO TOP + lnRez = NVL(EVALUATE(lcCur + '.nr'), 0) + ELSE + lnRez = 0 + ENDIF + USE IN (lcCur) + ELSE + DO CdocLog WITH "SQL ESEC: " + TRANSFORM(goExecutor.oPrelucrareEroare()) + " | " + tcSql + ENDIF + RETURN lnRez +ENDFUNC + +* egalitate NULL-safe intre doua valori de cursor (numeric, caracter sau logic) +FUNCTION CdocEgal + LPARAMETERS tu1, tu2 + IF ISNULL(tu1) AND ISNULL(tu2) + RETURN .T. + ENDIF + IF ISNULL(tu1) OR ISNULL(tu2) + RETURN .F. + ENDIF + IF VARTYPE(tu1) = 'C' OR VARTYPE(tu2) = 'C' + RETURN ALLTRIM(TRANSFORM(tu1)) == ALLTRIM(TRANSFORM(tu2)) + ENDIF + RETURN tu1 = tu2 +ENDFUNC + +* compara toate campurile din tcListaCampuri (lista "camp1, camp2, ...") intre doua alias-uri +* POZITIONATE deja pe randul de comparat; logheaza fiecare FAIL si intoarce numarul de esecuri. +* Lista se primeste ca sir, nu ca array: un array trecut ca parametru intre functii isi pierde +* pentru compilator statutul de array (ambiguitate cu un apel de program), de-aici array-ul local +* construit chiar in aceasta functie. +FUNCTION CdocComparaCampuri + LPARAMETERS tcAlias1, tcAlias2, tcListaCampuri, tcEticheta, tcContext + LOCAL ARRAY laCampuri[1] + LOCAL nCnt, nFail, i, lcCamp, lu1, lu2 + nCnt = ALINES(laCampuri, tcListaCampuri, 1, ",") + nFail = 0 + FOR i = 1 TO nCnt + lcCamp = laCampuri[i] + lu1 = EVALUATE(tcAlias1 + '.' + lcCamp) + lu2 = EVALUATE(tcAlias2 + '.' + lcCamp) + IF !CdocEgal(lu1, lu2) + nFail = nFail + 1 + DO CdocLog WITH "FAIL " + tcEticheta + " " + tcContext + " camp=" + lcCamp + ; + " v1=" + TRANSFORM(lu1) + " v2=" + TRANSFORM(lu2) + ENDIF + ENDFOR + RETURN nFail +ENDFUNC + +* invariantul minim de pe VANZARI_DETALII (5.3): count(*), sum(cantitate), sum(cantitate*pret), +* setul de id_jtva_coloana - valabil chiar cand liniile nu sunt identice camp cu camp +FUNCTION CdocInvariantDetalii + LPARAMETERS tcAlias1, tnCnt1, tcAlias2, tnCnt2, tcEticheta + LOCAL nFail, nSumCant1, nSumCant2, nSumVal1, nSumVal2, lcSet1, lcSet2, lcCod + nFail = 0 + nSumCant1 = 0 + nSumVal1 = 0 + lcSet1 = '' + IF USED(tcAlias1) AND tnCnt1 > 0 + SELECT (tcAlias1) + GO TOP + SCAN + nSumCant1 = nSumCant1 + NVL(cantitate, 0) + nSumVal1 = nSumVal1 + NVL(cantitate, 0) * NVL(pret, 0) + lcCod = TRANSFORM(NVL(id_jtva_coloana, 0)) + IF !(";" + lcCod + ";" $ ";" + lcSet1) + lcSet1 = lcSet1 + lcCod + ";" + ENDIF + ENDSCAN + ENDIF + nSumCant2 = 0 + nSumVal2 = 0 + lcSet2 = '' + IF USED(tcAlias2) AND tnCnt2 > 0 + SELECT (tcAlias2) + GO TOP + SCAN + nSumCant2 = nSumCant2 + NVL(cantitate, 0) + nSumVal2 = nSumVal2 + NVL(cantitate, 0) * NVL(pret, 0) + lcCod = TRANSFORM(NVL(id_jtva_coloana, 0)) + IF !(";" + lcCod + ";" $ ";" + lcSet2) + lcSet2 = lcSet2 + lcCod + ";" + ENDIF + ENDSCAN + ENDIF + + IF !CdocEgal(ROUND(nSumCant1, 6), ROUND(nSumCant2, 6)) + nFail = nFail + 1 + DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI_DETALII invariant sum(cantitate) diferit: v1=" + ; + TRANSFORM(nSumCant1) + " v2=" + TRANSFORM(nSumCant2) + ENDIF + IF !CdocEgal(ROUND(nSumVal1, 2), ROUND(nSumVal2, 2)) + nFail = nFail + 1 + DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI_DETALII invariant sum(cantitate*pret) diferit: v1=" + ; + TRANSFORM(nSumVal1) + " v2=" + TRANSFORM(nSumVal2) + ENDIF + IF !(CdocSortSet(lcSet1) == CdocSortSet(lcSet2)) + nFail = nFail + 1 + DO CdocLog WITH "FAIL " + tcEticheta + " VANZARI_DETALII invariant set id_jtva_coloana diferit: v1=" + ; + lcSet1 + " v2=" + lcSet2 + ENDIF + RETURN nFail +ENDFUNC + +* normalizeaza un set ";"-delimitat de coduri numerice ca sa nu depinda de ordinea de aparitie +FUNCTION CdocSortSet + LPARAMETERS tcSet + LOCAL ARRAY laSet[1] + LOCAL nCnt, i, j, lcTmp, lcRez + nCnt = ALINES(laSet, tcSet, 1, ";") + IF nCnt = 0 + RETURN '' + ENDIF + FOR i = 1 TO nCnt - 1 + FOR j = i + 1 TO nCnt + IF VAL(laSet[j]) < VAL(laSet[i]) + lcTmp = laSet[i] + laSet[i] = laSet[j] + laSet[j] = lcTmp + ENDIF + ENDFOR + ENDFOR + lcRez = '' + FOR i = 1 TO nCnt + lcRez = lcRez + laSet[i] + ";" + ENDFOR + RETURN lcRez +ENDFUNC + +* elibereaza un alias daca e deschis +PROCEDURE CdocInchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +* scrie in gcLog (daca apelantul l-a definit PUBLIC) sau in logul implicit al bibliotecii +PROCEDURE CdocLog + LPARAMETERS tcMsg + LOCAL lcLog + lcLog = IIF(TYPE('gcLog') = 'C' AND !EMPTY(gcLog), gcLog, CDOC_LOG_IMPLICIT) + IF !DIRECTORY(JUSTPATH(lcLog)) + MD (JUSTPATH(lcLog)) + ENDIF + STRTOFILE(tcMsg + CHR(13) + CHR(10), lcLog, 1) +ENDPROC diff --git a/utile/Teste/facturare_unificat/mock_caut_antet.prg b/utile/Teste/facturare_unificat/mock_caut_antet.prg new file mode 100644 index 0000000..ba4170a --- /dev/null +++ b/utile/Teste/facturare_unificat/mock_caut_antet.prg @@ -0,0 +1,229 @@ +* mock_caut_antet.prg - inlocuieste dialogurile modale de cautare apelate din do_cauta_* (ocautare.prg, +* oproceduri_facturare.prg, oproceduri_comune.prg) cu functii care intorc o valoare fixa si inregistreaza +* apelul (nume + argumente) in gcMockApeluri (PUBLIC, declarat de test). Se incarca ULTIMUL cu +* SET PROCEDURE ... ADDITIVE. Valorile intoarse se controleaza prin PUBLIC gnMockIdPart (id-ul +* partenerului intors de CautPartenerContabilitate) si gnMockButon (valoarea pusa in gnButon de +* fiecare "dialog", ca in productie unde dialogul seteaza gnButon la inchidere). + +PROCEDURE MockLog + LPARAMETERS tcNume, tcArgs + IF TYPE("gcLog") = "C" + STRTOFILE("MOCK " + tcNume + CHR(13) + CHR(10), gcLog, 1) + ENDIF + IF TYPE('gcMockApeluri') = 'C' + gcMockApeluri = gcMockApeluri + tcNume + "(" + tcArgs + ")" + CHR(13) + CHR(10) + ENDIF + IF TYPE('gnMockButon') = 'N' + gnButon = gnMockButon + ENDIF +ENDPROC + +FUNCTION MockArgs + LPARAMETERS tnCount, t1, t2, t3, t4, t5, t6, t7 + LOCAL lcA, i + lcA = "" + FOR i = 1 TO tnCount + lcA = lcA + IIF(i > 1, ",", "") + TRANSFORM(EVALUATE("t" + TRANSFORM(i))) + ENDFOR + RETURN lcA +ENDFUNC + +PROCEDURE CautPartenerContabilitate + LPARAMETERS toHash + LOCAL loR + DO MockLog WITH "CautPartenerContabilitate", "cTitlu=" + TRANSFORM(toHash.GetValue('cTitlu')) + ";cCont=" + TRANSFORM(toHash.GetValue('cCont')) + ";dDataDoc=" + TRANSFORM(toHash.GetValue('dDataDoc')) + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_part", IIF(TYPE('gnMockIdPart') = 'N', gnMockIdPart, 0)) + ADDPROPERTY(loR, "denumire", "PARTENER MOCK") + ADDPROPERTY(loR, "cod_fiscal", "RO1234567") + RETURN loR +ENDPROC + +FUNCTION caut_avize + LPARAMETERS tnIdClient + LOCAL lcXml + DO MockLog WITH "caut_avize", MockArgs(PCOUNT(), tnIdClient) + CREATE CURSOR crsMockAvize (id_vanzare N(10), id_comanda N(10), serie_act C(10), numar_act N(10)) + INSERT INTO crsMockAvize VALUES (101, 0, "AV", 7) + INSERT INTO crsMockAvize VALUES (102, 555, "AV", 8) + CURSORTOXML("crsMockAvize", "lcXml", 1, 0, 0, "1") + USE IN crsMockAvize + RETURN lcXml +ENDFUNC + +FUNCTION caut_comanda_clienti + LPARAMETERS tnIdClient + LOCAL loR + DO MockLog WITH "caut_comanda_clienti", MockArgs(PCOUNT(), tnIdClient) + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_comanda", "301") + ADDPROPERTY(loR, "nr_comanda", "CMD-301 ") + ADDPROPERTY(loR, "id_part", tnIdClient) + ADDPROPERTY(loR, "nume", "PARTENER MOCK") + RETURN loR +ENDFUNC + +FUNCTION caut_comanda_client + LPARAMETERS tnIdClient + LOCAL loR + DO MockLog WITH "caut_comanda_client", MockArgs(PCOUNT(), tnIdClient) + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_comanda", "302") + ADDPROPERTY(loR, "nr_comanda", "CMD-302 ") + ADDPROPERTY(loR, "id_part", tnIdClient) + ADDPROPERTY(loR, "nume", "PARTENER MOCK") + RETURN loR +ENDFUNC + +FUNCTION caut_comanda_gestiune + LPARAMETERS tnIdGest + LOCAL loR + DO MockLog WITH "caut_comanda_gestiune", MockArgs(PCOUNT(), tnIdGest) + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_comanda", "303") + ADDPROPERTY(loR, "nr_comanda", "CMD-303 ") + ADDPROPERTY(loR, "id_part", tnIdGest) + ADDPROPERTY(loR, "nume", "GESTIUNE MOCK") + RETURN loR +ENDFUNC + +FUNCTION caut_contract_facturare + LPARAMETERS tnIdClient, tcTipuri + LOCAL lcXml + DO MockLog WITH "caut_contract_facturare", MockArgs(PCOUNT(), tnIdClient, tcTipuri) + CREATE CURSOR crsMockCtr (id_ctr N(10), contract C(20), scadenta_incasare N(5), afisare_scadenta N(1), opt_facturare N(2)) + INSERT INTO crsMockCtr VALUES (401, "CTR-401", 15, 1, 3) + INSERT INTO crsMockCtr VALUES (402, "CTR-402", 30, 0, 4) + CURSORTOXML("crsMockCtr", "lcXml", 1, 0, 0, "1") + USE IN crsMockCtr + RETURN lcXml +ENDFUNC + +FUNCTION caut_facturi_client + LPARAMETERS tnIdClient + LOCAL loR + DO MockLog WITH "caut_facturi_client", MockArgs(PCOUNT(), tnIdClient) + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_fact", 501) + ADDPROPERTY(loR, "serie_act", "FA") + ADDPROPERTY(loR, "nract", 77) + RETURN loR +ENDFUNC + +FUNCTION caut_facturi_multiple_client + LPARAMETERS tnIdClient, tnInValuta, tnIdValuta, tlMultiple + LOCAL lcXml + DO MockLog WITH "caut_facturi_multiple_client", MockArgs(PCOUNT(), tnIdClient, tnInValuta, tnIdValuta, tlMultiple) + CREATE CURSOR crsMockFact (id_vanzare N(10), serie_act C(10), numar_act N(10)) + INSERT INTO crsMockFact VALUES (601, "FA", 11) + INSERT INTO crsMockFact VALUES (602, "", 12) + CURSORTOXML("crsMockFact", "lcXml", 1, 0, 0, "1") + USE IN crsMockFact + RETURN lcXml +ENDFUNC + +FUNCTION caut_fdoc + LOCAL loR + DO MockLog WITH "caut_fdoc", "" + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_fdoc", 9) + ADDPROPERTY(loR, "fel_document", "FEL MOCK") + RETURN loR +ENDFUNC + +FUNCTION caut_gestiune + LPARAMETERS t1, t2 + LOCAL loR + DO MockLog WITH "caut_gestiune", MockArgs(PCOUNT(), t1, t2) + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_gestiune", 701) + ADDPROPERTY(loR, "nume_gestiune", "GESTIUNE INIT MOCK") + RETURN loR +ENDFUNC + +FUNCTION caut_gestiune_sursa + LPARAMETERS tcTipuri + LOCAL loR + DO MockLog WITH "caut_gestiune_sursa", MockArgs(PCOUNT(), tcTipuri) + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_gestiune", 702) + ADDPROPERTY(loR, "nume_gestiune", "GESTIUNE SURSA MOCK") + RETURN loR +ENDFUNC + +FUNCTION caut_gestiune_dest + LPARAMETERS tnIdGest, tcTipuri + LOCAL loR + DO MockLog WITH "caut_gestiune_dest", MockArgs(PCOUNT(), tnIdGest, tcTipuri) + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_gestiune", 703) + ADDPROPERTY(loR, "nume_gestiune", "GESTIUNE DEST MOCK") + ADDPROPERTY(loR, "id_tipgest", 4) + ADDPROPERTY(loR, "Cont", "371") + ADDPROPERTY(loR, "acont", NULL) + RETURN loR +ENDFUNC + +FUNCTION caut_locatie_restaurant + LOCAL loR + DO MockLog WITH "caut_locatie_restaurant", "" + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_rest_locatie", "801") + ADDPROPERTY(loR, "locatie", "LOCATIE MOCK") + RETURN loR +ENDFUNC + +PROCEDURE caut_lucrare + LPARAMETERS t1, t2, t3 + LOCAL loR + DO MockLog WITH "caut_lucrare", MockArgs(PCOUNT(), t1, t2, t3) + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_lucrare", 901) + ADDPROPERTY(loR, "nrord", "LUCR-901") + RETURN loR +ENDPROC + +PROCEDURE caut_politici_curente_util + LOCAL loR + DO MockLog WITH "caut_politici_curente_util", "" + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_pol", 1001) + ADDPROPERTY(loR, "nume", "POLITICA MOCK") + RETURN loR +ENDPROC + +FUNCTION caut_sectie + LPARAMETERS t1, t2, t3, t4, t5 + LOCAL loR + DO MockLog WITH "caut_sectie", MockArgs(PCOUNT(), t1, t2, t3, t4, t5) + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_sectie", 1101) + ADDPROPERTY(loR, "sectie", "SECTIE MOCK") + RETURN loR +ENDFUNC + +FUNCTION caut_valuta + LPARAMETERS t1, t2, t3 + LOCAL loR + DO MockLog WITH "caut_valuta", MockArgs(PCOUNT(), t1, t2, t3) + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_valuta", 2) + ADDPROPERTY(loR, "nume_val", "EUR") + RETURN loR +ENDFUNC + +FUNCTION caut_venchelt + LPARAMETERS t1, t2, t3, t4, t5, t6, t7 + LOCAL loR + DO MockLog WITH "caut_venchelt", MockArgs(PCOUNT(), t1, t2, t3, t4, t5, t6, t7) + loR = CREATEOBJECT("Empty") + ADDPROPERTY(loR, "id_venchelt", 1201) + ADDPROPERTY(loR, "explicatie", "VENIT MOCK") + RETURN loR +ENDFUNC + +PROCEDURE VerificaCodFiscal + LPARAMETERS toDate, tnOptiune, toPartener + DO MockLog WITH "VerificaCodFiscal", "denumire=" + TRANSFORM(toDate.denumire) + ";cod_fiscal=" + TRANSFORM(toDate.cod_fiscal) + ";tip=" + TRANSFORM(toDate.tip_verificare) + ";opt=" + TRANSFORM(tnOptiune) + RETURN 1 +ENDPROC diff --git a/utile/Teste/facturare_unificat/mock_cursor_articole.prg b/utile/Teste/facturare_unificat/mock_cursor_articole.prg new file mode 100644 index 0000000..48b6149 --- /dev/null +++ b/utile/Teste/facturare_unificat/mock_cursor_articole.prg @@ -0,0 +1,69 @@ +* mock_cursor_articole.prg - suportul headless al lui test_s3_4_cursor_articole.prg. +* oExecutorMock (subclasa de test a lui oexecutor) intercepteaza DOAR apelul pe cursorul crsarticole: +* jurnalizeaza SQL-ul in gcMockSql, construieste un cursor sintetic dupa gcMockMod (PLIN / PLIN2 = si +* crsarticole1 pentru contracte / GOL / FARA = niciun cursor) si intoarce gnMockSucces cu nEroare = +* gnMockEroare. Orice alt apel (citeste_cursuri_zi) merge la executorul real, prin This.oReal. +* vizualizeaza_curs e inlocuita ca sa nu deschida formularul de cursuri la esecul Oracle -20005; se +* incarca ULTIMA cu SET PROCEDURE ... ADDITIVE, ca sa castige la rezolutia de nume. +* Publicele asteptate de la test: gcMockSql, gcMockMod, gnMockSucces, gnMockEroare, gcMockCurs. + +DEFINE CLASS oExecutorMock AS oexecutor + oReal = NULL + + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect + IF !(UPPER(ALLTRIM(TRANSFORM(tcCursor))) == 'CRSARTICOLE') + RETURN This.oReal.oExecute(tcSql, tcCursor) + ENDIF + gcMockSql = gcMockSql + TRANSFORM(tcSql) + CHR(13) + CHR(10) + This.nEroare = gnMockEroare + This.nSucces = gnMockSucces + DO CreeazaArticole WITH gcMockMod + RETURN gnMockSucces + ENDPROC + + FUNCTION oPrelucrareEroare + RETURN "MOCK eroare Oracle " + TRANSFORM(This.nEroare) + ENDFUNC +ENDDEFINE + +* cursorul sintetic de articole: campurile citite de blocul testat (gestionabil, curs/nume_val/id_valuta/ +* multiplicator/tip_valuta pentru crscursuri, nume_lista_preturi/id_pol pentru crspolitici, id_gestiune/ +* nume_gestiune pentru crsgestiunidest) plus campurile luate cu Scatter pe ramura tnTip = 30 +PROCEDURE CreeazaArticole + LPARAMETERS tcMod + IF USED('crsarticole') + USE IN crsarticole + ENDIF + IF USED('crsarticole1') + USE IN crsarticole1 + ENDIF + IF tcMod == "FARA" + RETURN + ENDIF + CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), id_gestiune N(20), nume_gestiune C(100), ; + cont C(4), um C(10), id_valuta N(10), gestionabil N(1), tip_valuta N(1), curs N(20,4), ; + multiplicator N(10), codmat C(100), preta N(20,4), pretd N(20,4), id_valuta_d N(15), ; + denumire C(100), pretftva N(20,4), pretctva N(20,4), cantitate N(20,4), tvav N(20,4), ; + proc_tvav N(20,4), preturi_cu_tva N(1), nume_val C(20), nume_lista_preturi C(100), id_pol N(20)) + IF tcMod == "GOL" + RETURN + ENDIF + INSERT INTO crsarticole VALUES (1, 11, 21, "GEST A", "371", "BUC", 1, 1, 1, 4.9, 1, "CM1", ; + 10, 11, 1, "Articol A", 100, 119, 2, 19, 1.19, 0, "EUR", "LISTA A", 31) + INSERT INTO crsarticole VALUES (2, 12, 22, "GEST B", "371", "BUC", 2, 0, 1, 5.1, 1, "CM2", ; + 20, 21, 2, "Articol B", 200, 238, 3, 38, 1.19, 0, "USD", "LISTA B", 32) + GO TOP IN crsarticole + IF tcMod == "PLIN2" + CREATE CURSOR crsarticole1 (id_ctr N(20), numar_contract C(100), data D NULL, numar C(50) NULL) + INSERT INTO crsarticole1 VALUES (41, "CTR A", DATE(2026, 1, 1), "A1") + INSERT INTO crsarticole1 VALUES (42, "CTR B", DATE(2026, 2, 1), "B1") + GO TOP IN crsarticole1 + ENDIF +ENDPROC + +* fara formularul de cursuri in headless - jurnalizeaza doar ca a fost chemata +PROCEDURE vizualizeaza_curs + LPARAMETERS tdDataCurs + gcMockCurs = gcMockCurs + "vizualizeaza_curs(" + TRANSFORM(tdDataCurs) + ")" + CHR(13) + CHR(10) +ENDPROC diff --git a/utile/Teste/facturare_unificat/mock_cursor_preturi.prg b/utile/Teste/facturare_unificat/mock_cursor_preturi.prg new file mode 100644 index 0000000..5cd9eb8 --- /dev/null +++ b/utile/Teste/facturare_unificat/mock_cursor_preturi.prg @@ -0,0 +1,49 @@ +* mock_cursor_preturi.prg - suport headless pentru test_s4_3b_combosql_filtrat.prg. +* oExecutorMockPret (subclasa de test a lui oexecutor) intercepteaza DOAR apelurile pe cursoarele +* brute ale cautarii in linie (crsCodmatRaw / crsDenumireRaw, adica {call ... cursor_preturi ...}): +* jurnalizeaza SQL-ul in gcMockSql si construieste un cursor sintetic dupa structura lui +* cursor_preturi (24 coloane). Orice alt apel (cCboGestiune -> VNOM_GESTIUNI, oAntetFacturare etc.) +* merge la executorul real, prin This.oReal. Se incarca cu SET PROCEDURE ... ADDITIVE dupa harness. +* Publicele asteptate de la test: gcMockSql, gnMockSucces, gnMockEroare. + +DEFINE CLASS oExecutorMockPret AS oexecutor + oReal = NULL + + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect + LOCAL lcCur + lcCur = UPPER(ALLTRIM(TRANSFORM(tcCursor))) + IF lcCur == 'CRSCODMATRAW' OR lcCur == 'CRSDENUMIRERAW' + gcMockSql = gcMockSql + TRANSFORM(tcSql) + CHR(13) + CHR(10) + DO CreeazaRaw WITH lcCur + This.nEroare = gnMockEroare + This.nSucces = gnMockSucces + RETURN gnMockSucces + ENDIF + RETURN This.oReal.oExecute(tcSql, tcCursor) + ENDPROC + + FUNCTION oPrelucrareEroare + RETURN "MOCK eroare Oracle " + TRANSFORM(This.nEroare) + ENDFUNC +ENDDEFINE + +* cursorul brut sintetic: aceeasi ordine de coloane ca {call pack_facturare.cursor_preturi(...)} +* (24 coloane); campurile cerute de reordonarea locala (codmat/denumire/um/pret/proc_tvav/...). +PROCEDURE CreeazaRaw + LPARAMETERS tcCur + IF USED(tcCur) + USE IN (tcCur) + ENDIF + CREATE CURSOR (tcCur) (id_c N(20), id_articol N(20), lot C(20) NULL, serie C(20) NULL, ; + id_pol N(20), id_valuta N(10), nume_lista_preturi C(100), discount_unitar N(20,4), ; + discount_unitar_val N(20,4), codmat C(100), codbare C(50), denumire C(100), um C(10), ; + gestionabil N(1), cantitate N(20,4), proc_tvav N(20,4), preturi_cu_tva N(1), ; + curs N(20,4), multiplicator N(10), pret N(20,4), pret_val N(20,4), tip_valuta N(1), ; + nume_val C(20), modificabil N(1)) + INSERT INTO (tcCur) VALUES (1, 11, NULL, NULL, 31, 1, "LISTA A", 0, 0, ; + "CM1", "CB1", "Articol A", "BUC", 1, 100, 1.19, 0, 4.9, 1, 100, 100, 1, "RON", 1) + INSERT INTO (tcCur) VALUES (2, 12, NULL, NULL, 32, 1, "LISTA B", 0, 0, ; + "CM2", "CB2", "Articol B", "BUC", 0, 200, 1.19, 0, 4.9, 1, 200, 200, 1, "RON", 1) + GO TOP IN (tcCur) +ENDPROC diff --git a/utile/Teste/facturare_unificat/mock_generator_numere.prg b/utile/Teste/facturare_unificat/mock_generator_numere.prg new file mode 100644 index 0000000..3c88702 --- /dev/null +++ b/utile/Teste/facturare_unificat/mock_generator_numere.prg @@ -0,0 +1,72 @@ +* mock_generator_numere.prg - oGeneratorMock, subclasa de test a lui oGeneratorNumere (oserii_numere.prg) care NU +* atinge Oracle: creeaza_cursor_serii construieste un cursor local de serii (FACTURA 5 / PROFORMA 23 -> 3 = cu serie si +* plaje, serii diferite; BON FISCAL 3 -> 2 = fara serie, cu plaje), aloca_numar intoarce un contor local (PUBLIC +* gnMockNumar), dezaloca_numar pune numarul pe 0; toate jurnalizeaza in gcMockApeluri (PUBLIC, declarat de test). +* Se incarca cu SET PROCEDURE ... ADDITIVE dupa harness (are nevoie de oserii_numere.prg pentru clasa parinte). + +*---------------------------------------------------------------------------------------- +* generator de numere fara Oracle (serii locale, alocare/dezalocare jurnalizate) +DEFINE CLASS oGeneratorMock AS oGeneratorNumere + * seriile: FACTURA (5) si PROFORMA (23) -> 3 (cu serie si plaje, serii diferite), BON FISCAL (3) -> 2 (fara + * serie, cu plaje); cursorul are aceleasi campuri citite de getSerieCursor/getLungimeSerie/aloca_numar + FUNCTION creeaza_cursor_serii + LPARAMETERS tnIdTipDoc + LOCAL lcCursor, lnRezultat, lcAlias + lcAlias = ALIAS() + lcCursor = [crsseriitemp] + ALLTRIM(STR(tnIdTipDoc)) + IF USED(lcCursor) + USE IN (lcCursor) + ENDIF + CREATE CURSOR (lcCursor) (id_serie N(10), serie C(10), lungime N(3)) + DO CASE + CASE tnIdTipDoc = 23 + INSERT INTO (lcCursor) VALUES (9023, "PRO", 5) + lnRezultat = 3 + CASE tnIdTipDoc = 3 + INSERT INTO (lcCursor) VALUES (9003, "", 5) + lnRezultat = 2 + OTHERWISE + INSERT INTO (lcCursor) VALUES (9005, "FAC", 5) + lnRezultat = 3 + ENDCASE + GO TOP IN (lcCursor) + This.paPlaje(tnIdTipDoc, 2) = lcCursor + This.paPlaje(tnIdTipDoc, 3) = (MOD(lnRezultat, 2) = 1) + This.paPlaje(tnIdTipDoc, 4) = (lnRezultat >= 2) + gcMockApeluri = gcMockApeluri + "creeaza_cursor_serii(" + TRANSFORM(tnIdTipDoc) + ") -> " + TRANSFORM(lnRezultat) + CHR(13) + CHR(10) + IF !EMPTY(lcAlias) + SELECT (lcAlias) + ENDIF + RETURN lnRezultat + ENDFUNC + + FUNCTION aloca_numar + LPARAMETERS tnIdTipDoc, tnIdGestiune + LOCAL lcCursor, lnIdSerie, lcAlias + gnMockNumar = gnMockNumar + 1 + lnIdSerie = NULL + IF !ISNULL(This.paPlaje(tnIdTipDoc, 2)) + lcCursor = This.paPlaje(tnIdTipDoc, 2) + IF USED(lcCursor) + lcAlias = ALIAS() + SELECT (lcCursor) + lnIdSerie = id_serie + IF !EMPTY(lcAlias) + SELECT (lcAlias) + ENDIF + ENDIF + ENDIF + This.paPlaje(tnIdTipDoc, 1) = gnMockNumar + This.paPlaje(tnIdTipDoc, 5) = lnIdSerie + gcMockApeluri = gcMockApeluri + "aloca_numar(" + TRANSFORM(tnIdTipDoc) + ") -> " + TRANSFORM(gnMockNumar) + CHR(13) + CHR(10) + RETURN gnMockNumar + ENDFUNC + + PROCEDURE dezaloca_numar + LPARAMETERS tnIdTipDoc + gcMockApeluri = gcMockApeluri + "dezaloca_numar(" + TRANSFORM(tnIdTipDoc) + ") numar=" + TRANSFORM(This.paPlaje(tnIdTipDoc, 1)) + CHR(13) + CHR(10) + IF !ISNULL(This.paPlaje(tnIdTipDoc, 2)) + This.paPlaje(tnIdTipDoc, 1) = 0 + ENDIF + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_unificat/mock_validare_antet.prg b/utile/Teste/facturare_unificat/mock_validare_antet.prg new file mode 100644 index 0000000..4e36dae --- /dev/null +++ b/utile/Teste/facturare_unificat/mock_validare_antet.prg @@ -0,0 +1,29 @@ +* mock_validare_antet.prg - pentru test_s3_validare_antet.prg: inlocuieste amessagebox si facturi_duplicate +* (ambele din oproceduri_comune.prg) cu functii care inregistreaza apelul (text + tip + titlu, respectiv +* cont + serie + numar) in gcMockApeluri (PUBLIC, declarat de test) si intorc valori programate: +* amessagebox -> gnMockRaspuns (PUBLIC; implicit 6) +* facturi_duplicate -> gcMockDuplicat (PUBLIC; implicit "" = fara dubluri; netrivial = simuleaza dubluri) +* Se pune PRIMUL in SET PROCEDURE (la nume duplicat castiga primul fisier din lista). + +PROCEDURE MockJurnal + LPARAMETERS tcLinie + IF TYPE('gcMockApeluri') = 'C' + gcMockApeluri = gcMockApeluri + tcLinie + CHR(13) + CHR(10) + ENDIF +ENDPROC + +FUNCTION amessagebox + LPARAMETERS tcMessage, tnDialogBoxType, tcTitle, tcFont, tnTimeOut, tnTimeoutValue + LOCAL lnRaspuns + lnRaspuns = IIF(TYPE('gnMockRaspuns') = 'N', gnMockRaspuns, 6) + DO MockJurnal WITH "amessagebox([" + STRTRAN(TRANSFORM(tcMessage), CHR(13), "|") + "]," + TRANSFORM(tnDialogBoxType) + ",[" + TRANSFORM(tcTitle) + "]) -> " + TRANSFORM(lnRaspuns) + RETURN lnRaspuns +ENDFUNC + +FUNCTION facturi_duplicate + LPARAMETERS tcCont, tnIdFact, tcSerie, tnNumar, tcAltele + LOCAL lcR + lcR = IIF(TYPE('gcMockDuplicat') = 'C', gcMockDuplicat, "") + DO MockJurnal WITH "facturi_duplicate(" + TRANSFORM(tcCont) + "," + TRANSFORM(tnIdFact) + ",[" + TRANSFORM(tcSerie) + "]," + TRANSFORM(tnNumar) + ") -> [" + lcR + "]" + RETURN lcR +ENDFUNC diff --git a/utile/Teste/facturare_unificat/probe_campuri_crsarticole.prg b/utile/Teste/facturare_unificat/probe_campuri_crsarticole.prg new file mode 100644 index 0000000..1ccf389 --- /dev/null +++ b/utile/Teste/facturare_unificat/probe_campuri_crsarticole.prg @@ -0,0 +1,58 @@ +* probe_campuri_crsarticole.prg +* READ-ONLY: listeaza structura si prima linie a cursor_preturi(tnTip=22), ca sa gasesc campurile +* de pret pentru un test ulterior (fara nicio scriere in Oracle). +SET SAFETY OFF +SET TALK OFF +LOCAL lcLog +lcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_campuri_crsarticole.log" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), lcLog) +ON ERROR DO ProbeErr 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 + STRTOFILE("EROARE: conectare Oracle esuata" + CHR(13)+CHR(10), lcLog, 1) + QUIT +ENDIF + +LOCAL lcSql, lnOk +PRIVATE pdZiCurs, pnTip, pnIdValuta, pnIdGestiuneInit, pnLuna, pnAn, pnIdUtil, pnIdSucursala +pdZiCurs = {^2026-08-10} +pnTip = 22 +pnIdValuta = NULL +pnIdGestiuneInit = NULL +pnLuna = 8 +pnAn = 2026 +pnIdUtil = -3 +pnIdSucursala = 167 + +lcSql = [{call ] + gcS + [.pack_facturare.cursor_preturi(?pdZiCurs,?pnTip,?pnIdValuta,?pnIdGestiuneInit,?pnLuna,?pnAn,?pnIdUtil,?pnIdSucursala)}] +lnOk = goExecutor.oExecute(lcSql, 'crsprobe') +IF lnOk < 0 + STRTOFILE("EROARE: " + goExecutor.oPrelucrareEroare() + CHR(13)+CHR(10), lcLog, 1) +ELSE + LOCAL laF[1], lnCate, i + lnCate = AFIELDS(laF, 'crsprobe') + STRTOFILE("Reccount=" + TRANSFORM(RECCOUNT('crsprobe')) + " campuri=" + TRANSFORM(lnCate) + CHR(13)+CHR(10), lcLog, 1) + FOR i = 1 TO lnCate + STRTOFILE(" " + laF[i,1] + " " + laF[i,2] + "(" + TRANSFORM(laF[i,3]) + "," + TRANSFORM(laF[i,4]) + ")" + CHR(13)+CHR(10), lcLog, 1) + ENDFOR + IF RECCOUNT('crsprobe') > 0 + SELECT crsprobe + GO TOP + LOCAL lcLinie + lcLinie = '' + FOR i = 1 TO lnCate + lcLinie = lcLinie + laF[i,1] + "=[" + TRANSFORM(EVALUATE(laF[i,1])) + "] " + ENDFOR + STRTOFILE(lcLinie + CHR(13)+CHR(10), lcLog, 1) + ENDIF + USE IN crsprobe +ENDIF + +STRTOFILE("END " + TTOC(DATETIME()) + CHR(13)+CHR(10), lcLog, 1) +QUIT + +PROCEDURE ProbeErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE("ON ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg + CHR(13)+CHR(10), "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_campuri_crsarticole.log", 1) +ENDPROC diff --git a/utile/Teste/facturare_unificat/probe_emitere_reala.prg b/utile/Teste/facturare_unificat/probe_emitere_reala.prg new file mode 100644 index 0000000..b742e42 --- /dev/null +++ b/utile/Teste/facturare_unificat/probe_emitere_reala.prg @@ -0,0 +1,72 @@ +* probe_emitere_reala.prg +* Proba READ-ONLY (fara scriere, fara alocare de numere): verifica daca cursor_preturi +* intoarce randuri pentru clientul RAJA (id_part=463) cu poDate.tip=5 (FACTURA), ca sa decida +* daca CreeazaDocument din test_s3b_emitere_reala.prg poate folosi tnTip=5 direct, sau daca +* trebuie sa refoloseasca tiparul tnTip=22 (deja dovedit in creeaza_documente_s8.prg) cu +* poDate.nIdTipDoc suprascris pe 5. +SET SAFETY OFF +SET TALK OFF +LOCAL lcLog +lcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_emitere_reala.log" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), lcLog) +ON ERROR DO ProbeErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +PUBLIC gcS +gcS = 'MARIUSM_AUTO' +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 + STRTOFILE("EROARE: conectare Oracle esuata" + CHR(13)+CHR(10), lcLog, 1) + QUIT +ENDIF +STRTOFILE("Oracle conectat, gnHandle=" + TRANSFORM(gnHandle) + CHR(13)+CHR(10), lcLog, 1) + +LOCAL lcSql, lnOk +PRIVATE pdZiCurs, pnTip, pnIdValuta, pnIdGestiuneInit, pnLuna, pnAn, pnIdUtil, pnIdSucursala +pdZiCurs = {^2026-08-10} +pnIdValuta = NULL +pnIdGestiuneInit = NULL +pnLuna = 8 +pnAn = 2026 +pnIdUtil = -3 +pnIdSucursala = NULL + +LOCAL ARRAY laTipuri[5], laSucursale[5] +laTipuri[1] = 1 +laTipuri[2] = 2 +laTipuri[3] = 3 +laTipuri[4] = 4 +laTipuri[5] = 22 +laSucursale[1] = 167 +laSucursale[2] = 167 +laSucursale[3] = 167 +laSucursale[4] = 167 +laSucursale[5] = 167 +LOCAL lnIdx +FOR lnIdx = 1 TO 5 + pnTip = laTipuri[lnIdx] + pnIdSucursala = laSucursale[lnIdx] + lcSql = [{call ] + gcS + [.pack_facturare.cursor_preturi(?pdZiCurs,?pnTip,?pnIdValuta,?pnIdGestiuneInit,?pnLuna,?pnAn,?pnIdUtil,?pnIdSucursala)}] + lnOk = goExecutor.oExecute(lcSql, 'crsprobe') + IF lnOk < 0 + STRTOFILE("tip=" + TRANSFORM(pnTip) + " sucursala=" + TRANSFORM(NVL(pnIdSucursala,-1)) + " EROARE: " + goExecutor.oPrelucrareEroare() + CHR(13)+CHR(10), lcLog, 1) + ELSE + STRTOFILE("tip=" + TRANSFORM(pnTip) + " sucursala=" + TRANSFORM(NVL(pnIdSucursala,-1)) + " OK, Reccount=" + TRANSFORM(RECCOUNT('crsprobe')) + CHR(13)+CHR(10), lcLog, 1) + IF RECCOUNT('crsprobe') > 0 + SELECT crsprobe + GO TOP + STRTOFILE(" prima linie: id_articol=" + TRANSFORM(NVL(id_articol,-1)) + " denumire=" + TRANSFORM(NVL(denumire,'')) + ; + " id_valuta=" + TRANSFORM(NVL(id_valuta,-1)) + " tip_valuta=" + TRANSFORM(NVL(tip_valuta,-1)) + CHR(13)+CHR(10), lcLog, 1) + ENDIF + IF USED('crsprobe') + USE IN crsprobe + ENDIF + ENDIF +ENDFOR + +STRTOFILE("END " + TTOC(DATETIME()) + CHR(13)+CHR(10), lcLog, 1) +QUIT + +PROCEDURE ProbeErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE("ON ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg + CHR(13)+CHR(10), "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_emitere_reala.log", 1) +ENDPROC diff --git a/utile/Teste/facturare_unificat/probe_named_notation_odbc.prg b/utile/Teste/facturare_unificat/probe_named_notation_odbc.prg new file mode 100644 index 0000000..dede8c7 --- /dev/null +++ b/utile/Teste/facturare_unificat/probe_named_notation_odbc.prg @@ -0,0 +1,108 @@ +* probe_named_notation_odbc.prg +* Verifica daca driverul ODBC Oracle folosit de acest produs (prin goExecutor -> SQLExec, acelasi +* drum ca productia, NU sqlplus) accepta notatia cu nume (param=>valoare) in interiorul escape-ului +* {call ...}, asa cum e folosita in S4g (COMUN\clase\ofacturare.vc2, docs\raport_s4g_vfp.md) pentru +* al 29-lea argument V_CONT_VENIT. +* +* Metoda: procedura de test proprie, minimala, creata si stearsa in schema MARIUSM_AUTO. Procedura +* nu scrie nimic - ridica mereu RAISE_APPLICATION_ERROR cu parametrii primiti inclusi in text, asa +* ca reusita apelului {call} (ajuns pana in PL/SQL) e vizibila direct in mesajul de eroare capturat +* de goExecutor.cEroare, fara sa fie nevoie de parametri OUT sau de scriere de date. Doua apeluri: +* unul pur pozitional (control), unul cu ultimul argument in named notation (cazul S4g). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_named_notation_odbc.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_named_notation_odbc.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +CLOSE DATABASES + +PUBLIC gcLog, gcCaz +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_named_notation_odbc.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 = "" +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" + +LOCAL lcProc, lnSucces, lcSql + +lcProc = "wip13_test_named_notation_odbc" + +*---------------------------------------------------------------------------------------- +* setup: procedura de test, minimala, doar ridica eroare cu parametrii primiti - nimic scris +gcCaz = "[setup] " +lcSql = "CREATE OR REPLACE PROCEDURE " + lcProc + "(p1 IN NUMBER, p2 IN NUMBER, p3 IN VARCHAR2 DEFAULT 'DEFAULT_VAL') AS" + ; + " BEGIN RAISE_APPLICATION_ERROR(-20999, 'GOT p1=' || p1 || ' p2=' || p2 || ' p3=' || NVL(p3,'NULL')); END;" +lnSucces = goExecutor.oExecute(lcSql) +DO AfLog WITH "CREATE PROCEDURE: lnSucces=" + TRANSFORM(lnSucces) + " eroare=" + goExecutor.cEroare +IF lnSucces < 0 + DO AfLog WITH "STOP: nu s-a putut crea procedura de test - verdict NECONCLUDENT" + DO Final +ENDIF + +*---------------------------------------------------------------------------------------- +* control: apel pur pozitional, acelasi drum (goExecutor -> SQLExec -> ODBC -> Oracle) +gcCaz = "[pozitional] " +lcSql = "{call " + lcProc + "(1,2,'posval')}" +lnSucces = goExecutor.oExecute(lcSql) +DO AfLog WITH "POZITIONAL sql=[" + lcSql + "] lnSucces=" + TRANSFORM(lnSucces) + " nEroare=" + TRANSFORM(goExecutor.nEroare) + " eroare=[" + goExecutor.cEroare + "]" +LOCAL llPozitionalOk +llPozitionalOk = "GOT p1=1 p2=2 p3=posval" $ goExecutor.cEroare + +*---------------------------------------------------------------------------------------- +* cazul S4g: ultimul argument in named notation, dupa argumente pozitionale +gcCaz = "[named-notation] " +lcSql = "{call " + lcProc + "(1,2,P3=>'namedval')}" +lnSucces = goExecutor.oExecute(lcSql) +DO AfLog WITH "NAMED sql=[" + lcSql + "] lnSucces=" + TRANSFORM(lnSucces) + " nEroare=" + TRANSFORM(goExecutor.nEroare) + " eroare=[" + goExecutor.cEroare + "]" +LOCAL llNamedOk +llNamedOk = "GOT p1=1 p2=2 p3=namedval" $ goExecutor.cEroare + +*---------------------------------------------------------------------------------------- +* teardown: sterge procedura de test, indiferent de rezultat +gcCaz = "[teardown] " +lnSucces = goExecutor.oExecute("DROP PROCEDURE " + lcProc) +DO AfLog WITH "DROP PROCEDURE: lnSucces=" + TRANSFORM(lnSucces) + " eroare=" + goExecutor.cEroare + +*---------------------------------------------------------------------------------------- +DO AfLog WITH "CONTROL (pozitional) OK=" + TRANSFORM(llPozitionalOk) +DO AfLog WITH "NAMED NOTATION OK=" + TRANSFORM(llNamedOk) +IF llPozitionalOk AND llNamedOk + DO AfLog WITH "VERDICT: MERGE - named notation acceptata de driverul ODBC in interiorul {call ...}" +ELSE + IF !llPozitionalOk + DO AfLog WITH "VERDICT: NECONCLUDENT - nici apelul pur pozitional (control) nu a ajuns curat in PL/SQL" + ELSE + DO AfLog WITH "VERDICT: NU MERGE - named notation respinsa/alterata de driverul ODBC (control a mers, named nu)" + ENDIF +ENDIF + +DO Final + +*---------------------------------------------------------------------------------------- +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 + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/probe_run.ps1 b/utile/Teste/facturare_unificat/probe_run.ps1 new file mode 100644 index 0000000..dfbf56b --- /dev/null +++ b/utile/Teste/facturare_unificat/probe_run.ps1 @@ -0,0 +1,78 @@ +# probe_run.ps1 - lansator minimal, fara capturi, pentru probe_totaluri.prg. +# Precompileaza izolat (_precompile.ps1), lanseaza .fxp cu fereastra impinsa off-screen +# (SWP_NOACTIVATE), asteapta out\probe_totaluri.log (semnal final scris de proba), apoi +# opreste procesul. O singura rulare vfp9.exe per apel. +$ErrorActionPreference = 'Stop' +$TestDir = $PSScriptRoot +$TestPrg = Join-Path $TestDir 'probe_totaluri.prg' +$TestFxp = Join-Path $TestDir 'probe_totaluri.fxp' +$OutLog = Join-Path $TestDir 'out\probe_totaluri.log' +$SyncDir = Join-Path $TestDir 'uisync_probe' +$DoneFile = Join-Path $SyncDir 'done.txt' +$Vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' +$Precompile = Join-Path (Split-Path $TestDir -Parent) '_precompile.ps1' + +Add-Type @" +using System; +using System.Runtime.InteropServices; +public class Win32UiProbe { + [DllImport("user32.dll")] + public static extern bool SetWindowPos(IntPtr hWnd, IntPtr hWndInsertAfter, int X, int Y, int cx, int cy, uint uFlags); + [DllImport("user32.dll")] + public static extern bool IsWindow(IntPtr hWnd); + public static readonly IntPtr HWND_BOTTOM = new IntPtr(1); + public const uint SWP_NOSIZE = 0x0001; + public const uint SWP_NOACTIVATE = 0x0010; +} +"@ +function Push-Offscreen([IntPtr]$Hwnd) { + if ($Hwnd -eq [IntPtr]::Zero -or -not [Win32UiProbe]::IsWindow($Hwnd)) { return } + [Win32UiProbe]::SetWindowPos($Hwnd, [Win32UiProbe]::HWND_BOTTOM, -4000, 0, 0, 0, ([Win32UiProbe]::SWP_NOSIZE -bor [Win32UiProbe]::SWP_NOACTIVATE)) | Out-Null +} +function Stop-VfpProprii([string]$Marker) { + Get-CimInstance Win32_Process -Filter "Name='vfp9.exe'" -ErrorAction SilentlyContinue | ForEach-Object { + if ($_.CommandLine -and $_.CommandLine.ToLower().Contains($Marker.ToLower())) { + Stop-Process -Id $_.ProcessId -Force -ErrorAction SilentlyContinue + } + } +} + +if (-not (Test-Path (Join-Path $TestDir 'out'))) { New-Item -ItemType Directory -Path (Join-Path $TestDir 'out') | Out-Null } +if (-not (Test-Path $SyncDir)) { New-Item -ItemType Directory -Path $SyncDir | Out-Null } +Get-ChildItem -Path $SyncDir -File -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue +if (Test-Path $OutLog) { Remove-Item $OutLog -Force } + +Stop-VfpProprii $TestDir +Start-Sleep -Milliseconds 500 + +Write-Host "Precompilez: $Precompile -Prg $TestPrg" +$pc = Start-Process powershell -WindowStyle Hidden -ArgumentList @('-ExecutionPolicy','Bypass','-File', "`"$Precompile`"", '-Prg', "`"$TestPrg`"") -Wait -PassThru +Start-Sleep -Seconds 2 +Stop-VfpProprii $TestDir +Start-Sleep -Seconds 2 +if (-not (Test-Path $TestFxp)) { Write-Warning "Nu s-a generat $TestFxp"; exit 1 } + +Write-Host "Lansez VFP: $Vfp -A $TestFxp" +$proc = Start-Process -FilePath $Vfp -ArgumentList @('-A', "`"$TestFxp`"") -PassThru +$hwnd = [IntPtr]::Zero +$deadline = (Get-Date).AddSeconds(150) +$doneSeen = $false +while ((Get-Date) -lt $deadline) { + if (-not $proc.HasExited) { + $proc.Refresh() + if ($hwnd -eq [IntPtr]::Zero -and $proc.MainWindowHandle -ne [IntPtr]::Zero) { $hwnd = $proc.MainWindowHandle } + Push-Offscreen $hwnd + } + if (Test-Path $DoneFile) { $doneSeen = $true; break } + if ($proc.HasExited) { break } + Start-Sleep -Milliseconds 500 +} +if ($doneSeen) { + Write-Host "done.txt detectat: $((Get-Content $DoneFile -Raw).Trim())" +} else { + Write-Warning "TIMEOUT sau proces iesit fara done.txt." +} +Start-Sleep -Milliseconds 800 +if ($proc -and -not $proc.HasExited) { try { $proc.Kill() } catch {} } +Stop-VfpProprii $TestDir +Write-Host "GATA." diff --git a/utile/Teste/facturare_unificat/probe_s4g_e2e_positional.prg b/utile/Teste/facturare_unificat/probe_s4g_e2e_positional.prg new file mode 100644 index 0000000..d34d205 --- /dev/null +++ b/utile/Teste/facturare_unificat/probe_s4g_e2e_positional.prg @@ -0,0 +1,208 @@ +* probe_s4g_e2e_positional.prg +* Proba end-to-end (S4g, reparatie pozitionala): apel real prin goExecutor catre +* pack_facturare.adauga_articol_factura, cu argumentele 28/29 pozitionale asa cum le scrie +* acum COMUN\clase\ofacturare.vc2 (do_scrie_articole, ambele clase). Verifica ca apelul +* AJUNGE in PL/SQL (nu doar ca sirul se construieste corect) si ca V_CONT_VENIT (poz. 29) +* ajunge in VANZARI_DETALII_TEMP.CONT_VENIT. Tranzactie cu ROLLBACK, zero date consumate. +* +* Rulare: vfp9.exe -A -T "...\probe_s4g_e2e_positional.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_s4g_e2e_positional.log + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +CLOSE DATABASES + +PUBLIC gcLog, gcCaz +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_s4g_e2e_positional.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 = "" +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" + +PRIVATE lnSucces, lcSql, lnIdArticol, lnIdTemp1, lnIdTemp2, lnIdTemp3, lcContAsteptat, lcContObtinut1, lcContObtinut2, lcContObtinut3, ; + lnTransOriginal, lnCantObtinut1, lnCantObtinut2, lnCantObtinut3 + +*---------------------------------------------------------------------------------------- +* confirmare diagnostic: VANZARI_DETALII_TEMP e GTT cu ON COMMIT DELETE ROWS +gcCaz = "[diag-gtt] " +lnSucces = goExecutor.oExecute([select temporary, duration from user_tables where table_name = 'VANZARI_DETALII_TEMP'],[crsgtt]) +IF lnSucces >= 0 AND USED('crsgtt') AND RECCOUNT('crsgtt') = 1 + DO AfLog WITH "DIAG user_tables VANZARI_DETALII_TEMP: temporary=[" + ALLTRIM(crsgtt.temporary) + "] duration=[" + ALLTRIM(NVL(crsgtt.duration,'')) + "]" + DO Assert WITH ALLTRIM(crsgtt.temporary) == "Y" AND ALLTRIM(NVL(crsgtt.duration,'')) == "SYS$TRANSACTION", ; + "VANZARI_DETALII_TEMP e GTT ON COMMIT DELETE ROWS (TEMPORARY=Y, DURATION=SYS$TRANSACTION)" +ELSE + DO AfLog WITH "DIAG user_tables: lnSucces=" + TRANSFORM(lnSucces) + " used=" + TRANSFORM(USED('crsgtt')) +ENDIF +IF USED('crsgtt') + USE IN crsgtt +ENDIF + +* tranzactie manuala, ca sa nu piarda autocommit-ul randul din GTT (ON COMMIT DELETE ROWS) +* inainte ca SELECT-ul de verificare sa apuce sa-l citeasca; se restaureaza la iesire (Final) +lnTransOriginal = SQLGetprop(goExecutor.nHandle,"Transactions") +DO AfLog WITH "DIAG Transactions inainte de proba=" + TRANSFORM(lnTransOriginal) +SQLSetprop(goExecutor.nHandle,"Transactions",2) + +*---------------------------------------------------------------------------------------- +* date reale de ancora: un articol si o coloana JTVA valida, plus contul de venit derivat +* (aceeasi formula pe care o cablaza VFP - reprodusa aici direct pe date, nu prin apel la +* deriva_cont_venit_fara_pol, ca sa nu depinda de alt fisier .prg pentru proba) +gcCaz = "[setup] " +lnSucces = goExecutor.oExecute([select id_articol from nom_articole where id_articol > 0 and rownum = 1],[crsart]) +DO Assert WITH lnSucces >= 0 AND USED('crsart') AND RECCOUNT('crsart') = 1, "articol de ancora gasit" +lnIdArticol = 0 +IF USED('crsart') AND RECCOUNT('crsart') = 1 + lnIdArticol = crsart.id_articol +ENDIF +IF USED('crsart') + USE IN crsart +ENDIF + +lnSucces = goExecutor.oExecute([select nvl((select cont_venit from vcoresp_cont_venchelt where cont = 'ZZ_INEXISTENT' and cont_venit is not null),] + ; + [case when substr('ZZ_INEXISTENT',1,1) in ('6','7') then 'ZZ_INEXISTENT' else '704' end) as cont_venit from dual],[crscv]) +lcContAsteptat = "704" +IF USED('crscv') + USE IN crscv +ENDIF + +lnIdTemp1 = -999901 +lnIdTemp2 = -999902 +lnIdTemp3 = -999903 + +*---------------------------------------------------------------------------------------- +* (a) linie FARA id_pol -> id_pol=NULL, cont_venit pozitional pe locul 29 = '704' +gcCaz = "[a-fara-id_pol] " +lcSql = [begin pack_facturare.adauga_articol_factura(] + Transform(lnIdTemp1) + [,] + Transform(lnIdArticol) + ; + [,'','',NULL,-1000,0,0,NULL,0,3,0,1,10,0,NULL,1,1,176,NULL,NULL,0,NULL,NULL,] + Transform(gnIdUtil) + ; + [,NULL,NULL,NULL,'] + lcContAsteptat + ['); end;] +lnSucces = goExecutor.oExecute(lcSql) +DO AfLog WITH "(a) sql=[" + lcSql + "] lnSucces=" + TRANSFORM(lnSucces) + " nEroare=" + TRANSFORM(goExecutor.nEroare) + " eroare=[" + goExecutor.cEroare + "]" +DO Assert WITH lnSucces >= 0, "(a) apelul RPC trece (ajunge in PL/SQL, fara eroare ODBC/PLSQL)" + +lcContObtinut1 = "?" +IF lnSucces >= 0 + LOCAL lnDiagSucces + lnDiagSucces = goExecutor.oExecute([select id_temp, nvl(cont_venit,'') as cont_venit from vanzari_detalii_temp where id_temp < 0],[crsdiag]) + DO AfLog WITH "DIAG toate id_temp<0: lnSucces=" + TRANSFORM(lnDiagSucces) + " used=" + TRANSFORM(USED('crsdiag')) + " reccount=" + IIF(USED('crsdiag'),TRANSFORM(RECCOUNT('crsdiag')),"n/a") + IF USED('crsdiag') + SELECT crsdiag + SCAN + DO AfLog WITH "DIAG rand: id_temp=" + TRANSFORM(crsdiag.id_temp) + " cont_venit=" + ALLTRIM(crsdiag.cont_venit) + ENDSCAN + USE IN crsdiag + ENDIF + DO AfLog WITH "DIAG SQLGetprop Transactions=" + TRANSFORM(SQLGetprop(goExecutor.nHandle,"Transactions")) + " nHandle=" + TRANSFORM(goExecutor.nHandle) + + lnSucces = goExecutor.oExecute([select nvl(cont_venit,'') as cont_venit, nvl(cantitate,-1) as cantitate from vanzari_detalii_temp where id_temp = ] + Transform(lnIdTemp1),[crsverif1]) + DO AfLog WITH "(a) verif: lnSucces=" + TRANSFORM(lnSucces) + " used=" + TRANSFORM(USED('crsverif1')) + " reccount=" + IIF(USED('crsverif1'),TRANSFORM(RECCOUNT('crsverif1')),"n/a") + " eroare=[" + goExecutor.cEroare + "]" + lnCantObtinut1 = -1 + IF lnSucces >= 0 AND USED('crsverif1') AND RECCOUNT('crsverif1') = 1 + lcContObtinut1 = ALLTRIM(crsverif1.cont_venit) + lnCantObtinut1 = crsverif1.cantitate + ENDIF + IF USED('crsverif1') + USE IN crsverif1 + ENDIF +ENDIF +DO Assert WITH lcContObtinut1 == lcContAsteptat, "(a) CONT_VENIT in VANZARI_DETALII_TEMP = [" + lcContAsteptat + "], obtinut [" + lcContObtinut1 + "]" +DO Assert WITH lnCantObtinut1 = 10, "(a) CANTITATE (aliniere pozitionala, poz. 14) = 10, obtinut [" + TRANSFORM(lnCantObtinut1) + "]" + +*---------------------------------------------------------------------------------------- +* (b) linie CU id_pol -> id_pol populat, cont_venit pozitional pe locul 29 = NULL explicit +gcCaz = "[b-cu-id_pol] " +lcSql = [begin pack_facturare.adauga_articol_factura(] + Transform(lnIdTemp2) + [,] + Transform(lnIdArticol) + ; + [,'','',63,-1000,0,0,NULL,0,3,0,1,10,0,NULL,1,1,176,NULL,NULL,0,NULL,NULL,] + Transform(gnIdUtil) + ; + [,NULL,NULL,NULL,NULL); end;] +lnSucces = goExecutor.oExecute(lcSql) +DO AfLog WITH "(b) sql=[" + lcSql + "] lnSucces=" + TRANSFORM(lnSucces) + " nEroare=" + TRANSFORM(goExecutor.nEroare) + " eroare=[" + goExecutor.cEroare + "]" +DO Assert WITH lnSucces >= 0, "(b) apelul RPC trece (ajunge in PL/SQL, fara eroare ODBC/PLSQL)" + +lcContObtinut2 = "?" +IF lnSucces >= 0 + lnSucces = goExecutor.oExecute([select nvl(cont_venit,'') as cont_venit, nvl(cantitate,-1) as cantitate from vanzari_detalii_temp where id_temp = ] + Transform(lnIdTemp2),[crsverif2]) + DO AfLog WITH "(b) verif: lnSucces=" + TRANSFORM(lnSucces) + " used=" + TRANSFORM(USED('crsverif2')) + " reccount=" + IIF(USED('crsverif2'),TRANSFORM(RECCOUNT('crsverif2')),"n/a") + " eroare=[" + goExecutor.cEroare + "]" + lnCantObtinut2 = -1 + IF lnSucces >= 0 AND USED('crsverif2') AND RECCOUNT('crsverif2') = 1 + lcContObtinut2 = ALLTRIM(crsverif2.cont_venit) + lnCantObtinut2 = crsverif2.cantitate + ENDIF + IF USED('crsverif2') + USE IN crsverif2 + ENDIF +ENDIF +DO Assert WITH lcContObtinut2 == "", "(b) CONT_VENIT ramane NULL (comportament neschimbat), obtinut [" + lcContObtinut2 + "]" +DO Assert WITH lnCantObtinut2 = 10, "(b) CANTITATE (aliniere pozitionala, poz. 14) = 10, obtinut [" + TRANSFORM(lnCantObtinut2) + "]" + +*---------------------------------------------------------------------------------------- +* (c) linie de RATA reala (id_articol=NULL SI id_pol=NULL deodata) - combinatia gasita in +* productie pe VANZARI_DETALII pentru liniile financiare scrise de do_adauga_rata, sursa +* PACK_FACTURARE.cursor_contract (ramura CTR_SCADENTAR, "NULL AS ID_POL" + "null as id_articol") +gcCaz = "[c-rata-fara-articol-si-pol] " +lcSql = [begin pack_facturare.adauga_articol_factura(] + Transform(lnIdTemp3) + ; + [,NULL,'','',NULL,-1000,0,0,NULL,0,3,0,1,10,0,NULL,1,1,176,NULL,NULL,0,NULL,NULL,] + Transform(gnIdUtil) + ; + [,NULL,NULL,NULL,'] + lcContAsteptat + ['); end;] +lnSucces = goExecutor.oExecute(lcSql) +DO AfLog WITH "(c) sql=[" + lcSql + "] lnSucces=" + TRANSFORM(lnSucces) + " nEroare=" + TRANSFORM(goExecutor.nEroare) + " eroare=[" + goExecutor.cEroare + "]" +DO Assert WITH lnSucces >= 0, "(c) apelul RPC trece cu id_articol=NULL si id_pol=NULL (ajunge in PL/SQL, fara eroare ODBC/PLSQL)" + +lcContObtinut3 = "?" +IF lnSucces >= 0 + lnSucces = goExecutor.oExecute([select nvl(cont_venit,'') as cont_venit, nvl(cantitate,-1) as cantitate from vanzari_detalii_temp where id_temp = ] + Transform(lnIdTemp3),[crsverif3]) + DO AfLog WITH "(c) verif: lnSucces=" + TRANSFORM(lnSucces) + " used=" + TRANSFORM(USED('crsverif3')) + " reccount=" + IIF(USED('crsverif3'),TRANSFORM(RECCOUNT('crsverif3')),"n/a") + " eroare=[" + goExecutor.cEroare + "]" + lnCantObtinut3 = -1 + IF lnSucces >= 0 AND USED('crsverif3') AND RECCOUNT('crsverif3') = 1 + lcContObtinut3 = ALLTRIM(crsverif3.cont_venit) + lnCantObtinut3 = crsverif3.cantitate + ENDIF + IF USED('crsverif3') + USE IN crsverif3 + ENDIF +ENDIF +DO Assert WITH lcContObtinut3 == lcContAsteptat, "(c) CONT_VENIT in VANZARI_DETALII_TEMP = [" + lcContAsteptat + "], obtinut [" + lcContObtinut3 + "]" +DO Assert WITH lnCantObtinut3 = 10, "(c) CANTITATE (aliniere pozitionala, poz. 14) = 10, obtinut [" + TRANSFORM(lnCantObtinut3) + "]" + +*---------------------------------------------------------------------------------------- +gcCaz = "[rollback] " +lnSucces = goExecutor.oExecute("ROLLBACK") +DO AfLog WITH "ROLLBACK: lnSucces=" + TRANSFORM(lnSucces) + " eroare=" + goExecutor.cEroare + +SQLSetprop(goExecutor.nHandle,"Transactions",lnTransOriginal) +DO AfLog WITH "DIAG Transactions restaurat la=" + TRANSFORM(SQLGetprop(goExecutor.nHandle,"Transactions")) + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + DO AfLog WITH "PASS: " + gcCaz + tcMsg + ELSE + 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 + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/probe_s6_3_surse.prg b/utile/Teste/facturare_unificat/probe_s6_3_surse.prg new file mode 100644 index 0000000..bf4bc55 --- /dev/null +++ b/utile/Teste/facturare_unificat/probe_s6_3_surse.prg @@ -0,0 +1,198 @@ +* probe_s6_3_surse.prg - alege sursele pentru S6-3 (paritate v1/v2 pe AVIZ tip 4 si RETUR tip 8) +* din MARIUSM_AUTO. Nu emite nimic, nu aloca numere: doar SELECT + apelurile de cursor pe care le +* face incarca_cursor_articole (pack_facturare.cursor_avize si pack_facturare.cursor_retur). +* Sunt necesare DOUA surse distincte per tip: prima emitere consuma sursa (avizul se marcheaza +* facturat, cantitatea de retur se epuizeaza), deci v1 si v2 nu pot pleca din acelasi document. +* Clientii cu 'CLIENT' in nume se exclud: valideaza_antet le deschide dialogul "in loc de BON FISCAL". +* Rulare: vfp9.exe -A -T probe_s6_3_surse.prg + +SET SAFETY OFF +SET TALK OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_s6_3_surse.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) + +*-- poDate + pnTotalDiscountAvize la nivelul programului principal: cursor_avize primeste +*-- ?@pnTotalDiscountAvize prin referinta, iar oExecute il rezolva din stiva apelantului. +PRIVATE poDate, pnTotalDiscountAvize +poDate = NULL +pnTotalDiscountAvize = 0 + +ON ERROR DO PsLog WITH 'ON ERROR ' + TRANSFORM(ERROR()) + ' [' + PROGRAM() + ':' + TRANSFORM(LINENO()) + '] ' + MESSAGE() +ON SHUTDOWN QUIT + +TRY + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + 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 PsLog WITH 'EROARE: conectare Oracle esuata' + QUIT + ENDIF + SQLSETPROP(gnHandle, "QueryTimeOut", 45) + IF !actualizeaza_optiuni_program() + DO PsLog WITH 'EROARE: actualizeaza_optiuni_program()' + QUIT + ENDIF + gnScadereStoc = 0 + gnFactSeturi = 0 + gnIdSucursala = 167 + goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]) + gnIdUtil = 8 + goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) + DO PsLog WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + ' gnAn=' + TRANSFORM(gnAn) + ; + ' gnLuna=' + TRANSFORM(gnLuna) + ' gl406=' + TRANSFORM(TYPE('gl406') = 'L' AND gl406) + DO PsLog WITH 'gcCondSucursala=[' + TRANSFORM(gcCondSucursala) + ']' + + poDate = CREATEOBJECT('empty') + ADDPROPERTY(poDate, 'listaid', '') + ADDPROPERTY(poDate, 'in_valuta', 0) + + DO PsLog WITH CHR(13) + CHR(10) + '===== AVIZE NEFACTURATE (sursa tip 4) =====' + DO SondaAvize + + DO PsLog WITH CHR(13) + CHR(10) + '===== FACTURI RETURNABILE (sursa tip 8, lei) =====' + DO SondaRetur + + DO PsLog WITH CHR(13) + CHR(10) + 'END ' + TTOC(DATETIME()) +CATCH TO loExc + DO PsLog WITH 'CATCH ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' ' + loExc.Message + ; + ' Proc=' + loExc.Procedure + ':' + TRANSFORM(loExc.LineNo) +ENDTRY + +QUIT + +*================================================================================== +* Avizele nefacturate, grupate pe client - filtrul e cel din caut_avize +* (oproceduri_facturare.prg:2038): tip in (21,22,26,42), facturat = 0, plus gcCondSucursala. +PROCEDURE SondaAvize + LOCAL lnQ, lcLista, lnI, lnLinii, lnNeg, lnGest, lnClienti + lnQ = goExecutor.oExecute([select a.id_part, p.nume, count(*) as nr ] + ; + [from vanzari a, nom_parteneri p ] + ; + [where a.id_part = p.id_part and a.sters = 0 and a.tip in (21,22,26,42) and a.facturat = 0 ] + ; + STRTRAN(gcCondSucursala, [id_sucursala], [a.id_sucursala]) + ; + [ and upper(p.nume) not like '%CLIENT%' group by a.id_part, p.nume order by 3 desc], 'crsAvClienti') + IF lnQ < 0 OR !USED('crsAvClienti') + DO PsLog WITH 'EROARE lista clienti cu avize: ' + TRANSFORM(goExecutor.oPrelucrareEroare()) + RETURN + ENDIF + lnClienti = RECCOUNT('crsAvClienti') + DO PsLog WITH 'clienti cu avize nefacturate (fara CLIENT in nume) = ' + TRANSFORM(lnClienti) + IF lnClienti = 0 + RETURN + ENDIF + + lnI = 0 + SELECT crsAvClienti + SCAN WHILE lnI < 12 + lnI = lnI + 1 + LOCAL lnIdPart, lcNume + lnIdPart = crsAvClienti.id_part + lcNume = ALLTRIM(NVL(crsAvClienti.nume, '')) + *-- lista de id_vanzare exact ca in do_cauta_avize (ofacturare_antet.prg:73-77) + DO Inchide WITH 'crsAvDoc' + IF goExecutor.oExecute([select a.id_vanzare, a.serie_act, a.numar_act, a.tip ] + ; + [from vanzari a where a.sters = 0 and a.tip in (21,22,26,42) and a.facturat = 0 ] + ; + STRTRAN(gcCondSucursala, [id_sucursala], [a.id_sucursala]) + ; + [ and a.id_part = ] + TRANSFORM(lnIdPart) + [ order by a.id_vanzare], 'crsAvDoc') < 0 + DO PsLog WITH ' client ' + TRANSFORM(lnIdPart) + ': EROARE avize' + SELECT crsAvClienti + LOOP + ENDIF + lcLista = cursor2lista('crsAvDoc', 'id_vanzare', ',') + poDate.listaid = lcLista + pnTotalDiscountAvize = 0 + DO Inchide WITH 'crsartav' + lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}], 'crsartav') + lnLinii = IIF(lnQ >= 0 AND USED('crsartav'), RECCOUNT('crsartav'), -1) + lnNeg = 0 + lnGest = 0 + IF lnLinii > 0 + SELECT crsartav + COUNT FOR cantitate < 0 TO lnNeg + COUNT FOR NVL(gestionabil, 0) = 1 TO lnGest + ENDIF + DO PsLog WITH ' client ' + TRANSFORM(lnIdPart) + ' [' + lcNume + '] avize=' + ; + TRANSFORM(RECCOUNT('crsAvDoc')) + ' listaid=[' + lcLista + '] -> cursor_avize linii=' + ; + TRANSFORM(lnLinii) + ' negative=' + TRANSFORM(lnNeg) + ' gestionabile=' + TRANSFORM(lnGest) + ; + ' discountAvize=' + TRANSFORM(pnTotalDiscountAvize) + DO Inchide WITH 'crsartav' + DO Inchide WITH 'crsAvDoc' + SELECT crsAvClienti + ENDSCAN + DO Inchide WITH 'crsAvClienti' +ENDPROC + +*================================================================================== +* Facturile din care se poate face retur - filtrul e cel din caut_facturi_multiple_client +* (oproceduri_facturare.prg:2110): fact_vfacturi, tip in (...), in_valuta = 0. +PROCEDURE SondaRetur + LOCAL lnQ, lnI, lnLinii, lnNeg, lnGest, lnTotal + lnQ = goExecutor.oExecute([select f.id_vanzare, f.id_part, p.nume, f.serie_act, f.numar_act, f.tip ] + ; + [from fact_vfacturi f, nom_parteneri p ] + ; + [where f.id_part = p.id_part and f.sters = 0 and f.tip in (1,2,3,4,5,6,10,-1,-2,-3,-4,-11) ] + ; + [and f.in_valuta = 0 ] + STRTRAN(gcCondSucursala, [id_sucursala], [f.id_sucursala]) + ; + [ and upper(p.nume) not like '%CLIENT%' order by f.id_vanzare desc], 'crsRetLista') + IF lnQ < 0 OR !USED('crsRetLista') + DO PsLog WITH 'EROARE lista facturi returnabile: ' + TRANSFORM(goExecutor.oPrelucrareEroare()) + RETURN + ENDIF + lnTotal = RECCOUNT('crsRetLista') + DO PsLog WITH 'facturi returnabile in lei (fara CLIENT in nume) = ' + TRANSFORM(lnTotal) + IF lnTotal = 0 + RETURN + ENDIF + + lnI = 0 + SELECT crsRetLista + SCAN WHILE lnI < 20 + lnI = lnI + 1 + LOCAL lnIdVz, lnIdPart2, lcNume2, lcSerie2, lnNr2 + lnIdVz = crsRetLista.id_vanzare + lnIdPart2 = crsRetLista.id_part + lcNume2 = ALLTRIM(NVL(crsRetLista.nume, '')) + lcSerie2 = ALLTRIM(NVL(crsRetLista.serie_act, '')) + lnNr2 = NVL(crsRetLista.numar_act, 0) + poDate.listaid = ALLTRIM(TRANSFORM(lnIdVz)) + poDate.in_valuta = 0 + DO Inchide WITH 'crsartret' + lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_retur(?poDate.in_valuta,?poDate.listaid,?gnIdUtil)}], 'crsartret') + lnLinii = IIF(lnQ >= 0 AND USED('crsartret'), RECCOUNT('crsartret'), -1) + lnNeg = 0 + lnGest = 0 + IF lnLinii > 0 + SELECT crsartret + COUNT FOR cantitate < 0 TO lnNeg + COUNT FOR NVL(gestionabil, 0) = 1 TO lnGest + ENDIF + DO PsLog WITH ' factura ' + TRANSFORM(lnIdVz) + ' (' + lcSerie2 + ' ' + TRANSFORM(lnNr2) + ') client ' + ; + TRANSFORM(lnIdPart2) + ' [' + lcNume2 + '] -> cursor_retur linii=' + TRANSFORM(lnLinii) + ; + ' negative=' + TRANSFORM(lnNeg) + ' gestionabile=' + TRANSFORM(lnGest) + DO Inchide WITH 'crsartret' + SELECT crsRetLista + ENDSCAN + DO Inchide WITH 'crsRetLista' +ENDPROC + +*================================================================================== +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE PsLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC diff --git a/utile/Teste/facturare_unificat/probe_s6_3_surse.ps1 b/utile/Teste/facturare_unificat/probe_s6_3_surse.ps1 new file mode 100644 index 0000000..b4adef3 --- /dev/null +++ b/utile/Teste/facturare_unificat/probe_s6_3_surse.ps1 @@ -0,0 +1,21 @@ +$ErrorActionPreference = 'Stop' +$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat' +$prg = Join-Path $dir 'probe_s6_3_surse.prg' +$log = Join-Path $dir 'out\probe_s6_3_surse.log' +$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' + +$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*probe_s6_3_surse*' } +if ($viu) { "Ruleaza deja (PID " + ($viu.ProcessId -join ',') + ")"; exit 1 } + +Set-Location $dir +Remove-Item (Join-Path $dir 'probe_s6_3_surse.FXP') -ErrorAction SilentlyContinue +Remove-Item $log -ErrorAction SilentlyContinue + +$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru +"lansat PID " + $p.Id +$null = $p.WaitForExit(240000) +if (-not $p.HasExited) { + "ATARNAT dupa 240s - omor instanta" + Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*probe_s6_3_surse*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force } +} +if (Test-Path $log) { Get-Content $log } else { "Log inexistent: $log" } diff --git a/utile/Teste/facturare_unificat/probe_s8_surse.prg b/utile/Teste/facturare_unificat/probe_s8_surse.prg new file mode 100644 index 0000000..d346615 --- /dev/null +++ b/utile/Teste/facturare_unificat/probe_s8_surse.prg @@ -0,0 +1,112 @@ +* probe_s8_surse.prg - alege sursele pentru test_s8_cablare_incarcare (comanda tip 3 din +* MARIUSM_AUTO): una obisnuita si una cu linie de discount (cantitate negativa). +* Cheama direct pack_facturare.cursor_comanda, exact cum o face incarca_cursor_articole. +* Rulare: vfp9.exe -A -T probe_s8_surse.prg + +SET SAFETY OFF +SET TALK OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_s8_surse.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) + +ON ERROR DO PsLog WITH 'ON ERROR ' + TRANSFORM(ERROR()) + ' [' + PROGRAM() + ':' + TRANSFORM(LINENO()) + '] ' + MESSAGE() +ON SHUTDOWN QUIT + +TRY + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + 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 PsLog WITH 'EROARE: conectare Oracle esuata' + QUIT + ENDIF + SQLSETPROP(gnHandle, "QueryTimeOut", 45) + IF !actualizeaza_optiuni_program() + DO PsLog WITH 'EROARE: actualizeaza_optiuni_program()' + QUIT + ENDIF + gnScadereStoc = 0 + gnIdSucursala = 167 + goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]) + gnIdUtil = 8 + goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) + DO PsLog WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + + LOCAL lnQ + lnQ = goExecutor.oExecute([select c.id_comanda, c.nr_comanda, c.id_part, p.nume ] + ; + [from comenzi c, nom_parteneri p where c.id_part = p.id_part ] + ; + [order by c.id_comanda desc], 'crsCom') + IF lnQ < 0 OR !USED('crsCom') + DO PsLog WITH 'EROARE lista comenzi: ' + TRANSFORM(goExecutor.oPrelucrareEroare()) + QUIT + ENDIF + DO PsLog WITH 'comenzi total=' + TRANSFORM(RECCOUNT('crsCom')) + + PRIVATE poDate + poDate = CREATEOBJECT('empty') + ADDPROPERTY(poDate, 'zi_curs', DATE()) + ADDPROPERTY(poDate, 'tip', 3) + ADDPROPERTY(poDate, 'listaid', '') + + LOCAL lnI, lnNeg, lnGest, lnCnt, lcLinie, lnCandidati + lnCandidati = 0 + SELECT crsCom + GO TOP + SCAN WHILE lnCandidati < 60 + lnCandidati = lnCandidati + 1 + poDate.listaid = ALLTRIM(TRANSFORM(crsCom.id_comanda)) + lcLinie = 'id_comanda=' + PADR(poDate.listaid, 8) + ' nr=' + PADR(ALLTRIM(TRANSFORM(crsCom.nr_comanda)), 10) + ; + ' client=' + PADR(ALLTRIM(NVL(crsCom.nume, '')), 30) + IF USED('crsart') + USE IN crsart + ENDIF + lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_comanda(?poDate.zi_curs,?poDate.tip,?poDate.listaid,?gnIdUtil)}], 'crsart') + IF lnQ < 0 + DO PsLog WITH lcLinie + ' -> EROARE ' + TRANSFORM(goExecutor.oPrelucrareEroare()) + ELSE + lnCnt = RECCOUNT('crsart') + lnNeg = 0 + lnGest = 0 + IF lnCnt > 0 + SELECT crsart + COUNT FOR cantitate < 0 TO lnNeg + COUNT FOR NVL(gestionabil, 0) = 1 TO lnGest + ENDIF + DO PsLog WITH lcLinie + ' -> linii=' + TRANSFORM(lnCnt) + ' negative=' + TRANSFORM(lnNeg) + ' gestionabile=' + TRANSFORM(lnGest) + ENDIF + SELECT crsCom + ENDSCAN + + *-- structura cursorului, o singura data, pe ultima comanda cu linii + IF USED('crsart') AND RECCOUNT('crsart') > 0 + LOCAL ARRAY laF[1] + LOCAL lnF, lcS + lnF = AFIELDS(laF, 'crsart') + lcS = '' + FOR lnI = 1 TO lnF + lcS = lcS + laF[lnI, 1] + ' ' + ENDFOR + DO PsLog WITH 'CAMPURI crsarticole: ' + lcS + ENDIF + + DO PsLog WITH 'END ' + TTOC(DATETIME()) +CATCH TO loExc + DO PsLog WITH 'CATCH ' + TRANSFORM(loExc.ErrorNo) + ' ' + loExc.Message + ' [' + loExc.Procedure + ':' + TRANSFORM(loExc.LineNo) + ']' +ENDTRY + +QUIT + +PROCEDURE PsLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC diff --git a/utile/Teste/facturare_unificat/probe_s8_surse.ps1 b/utile/Teste/facturare_unificat/probe_s8_surse.ps1 new file mode 100644 index 0000000..f8d717e --- /dev/null +++ b/utile/Teste/facturare_unificat/probe_s8_surse.ps1 @@ -0,0 +1,21 @@ +$ErrorActionPreference = 'Stop' +$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat' +$prg = Join-Path $dir 'probe_s8_surse.prg' +$log = Join-Path $dir 'out\probe_s8_surse.log' +$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' + +$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*probe_s8_surse*' } +if ($viu) { "Ruleaza deja (PID " + ($viu.ProcessId -join ',') + ")"; exit 1 } + +Set-Location $dir +Remove-Item (Join-Path $dir 'probe_s8_surse.FXP') -ErrorAction SilentlyContinue +Remove-Item $log -ErrorAction SilentlyContinue + +$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru +"lansat PID " + $p.Id +$null = $p.WaitForExit(240000) +if (-not $p.HasExited) { + "ATARNAT dupa 240s - omor instanta" + Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*probe_s8_surse*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force } +} +if (Test-Path $log) { Get-Content $log } else { "Log inexistent: $log" } diff --git a/utile/Teste/facturare_unificat/probe_stare_finala.prg b/utile/Teste/facturare_unificat/probe_stare_finala.prg new file mode 100644 index 0000000..fa3c5c1 --- /dev/null +++ b/utile/Teste/facturare_unificat/probe_stare_finala.prg @@ -0,0 +1,32 @@ +SET SAFETY OFF +SET TALK OFF +LOCAL lcLog +lcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_stare_finala.log" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), lcLog) +ON ERROR DO PErr 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 + STRTOFILE("EROARE conectare" + CHR(13)+CHR(10), lcLog, 1) + QUIT +ENDIF +gnIdUtil = 8 +gnIdSucursala = 167 +PRIVATE poGeneratorNumere +poGeneratorNumere = CREATEOBJECT('oGeneratorNumere') +poGeneratorNumere.ResetNumere() +LOCAL ARRAY laTip[3] +laTip[1] = 3 +laTip[2] = 16 +laTip[3] = 26 +LOCAL i, lnRezSerii +FOR i = 1 TO 3 + lnRezSerii = poGeneratorNumere.creeaza_cursor_serii(laTip[i]) + STRTOFILE("tip=" + TRANSFORM(laTip[i]) + " rezultat_serii=" + TRANSFORM(lnRezSerii) + ; + " paPlaje(tip,1)=" + TRANSFORM(NVL(poGeneratorNumere.paPlaje(laTip[i],1),-999)) + CHR(13)+CHR(10), lcLog, 1) +ENDFOR +STRTOFILE("END " + TTOC(DATETIME()) + CHR(13)+CHR(10), lcLog, 1) +QUIT +PROCEDURE PErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + STRTOFILE("ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg + CHR(13)+CHR(10), "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_stare_finala.log", 1) +ENDPROC diff --git a/utile/Teste/facturare_unificat/probe_totaluri.prg b/utile/Teste/facturare_unificat/probe_totaluri.prg new file mode 100644 index 0000000..3e60391 --- /dev/null +++ b/utile/Teste/facturare_unificat/probe_totaluri.prg @@ -0,0 +1,378 @@ +* test_s3b_dupa_ui.prg +* UI VIZIBIL: capturi "DUPA" pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2), dupa +* aplatizarea chenarelor (BorderWidth=0 pe containere, confirmata in binar). Copie a +* test_s3b_referinta_ui.prg cu ACELASI mediu / aceiasi 4 pasi / aceleasi etichete de pas, dar cu +* iesirile in fisiere separate (nu suprascrie referinta) ca sa poata fi comparate una langa alta. +* +* Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_dupa_ui.ps1 (timeout >= 300s) +* Log: facturare_unificat\probe_totaluri_log.txt ; capturi in screenshots_dupa\ ; +* geometrie in out\geom_dupa_.tsv + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcUILog, gcSyncDir, gnFail, gnPass +gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\probe_totaluri_log.txt" +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_probe\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) +gnFail = 0 +gnPass = 0 +PUBLIC gcRaport +gcRaport = "" +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out") + MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out" +ENDIF + +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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnScadereStoc = 0 +* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel - +* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist" +IF !USED('saft_tip_facturi') + update_saft_tip_facturi() +ENDIF + +PRIVATE poDate, poGeneratorNumere, loForm, lcTsv, lcRaportFile +lcRaportFile = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_dupa_raport.txt" + +* document nou: poDate.incasat ramane 0 la construire - identic Scenariul A din test_s3b_incasare_nealocare.prg +poDate = CREATEOBJECT("oDateFactura", 25000, 1) +poDate.nIdTipDoc = 5 +poDate.totalctva = 1000 +DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + " poDate.incasat=" + TRANSFORM(poDate.incasat) +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") +poGeneratorNumere.ResetNumere() +DO ProbaSerii WITH poDate.nIdTipDoc +poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + +loForm = CREATEOBJECT('frm_facturare_articole2') +DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" +IF VARTYPE(loForm) <> 'O' + DO Final +ENDIF +DO Assert WITH ObjExists(loForm, 'opt_incasat'), "opt_incasat prezent (poDate.tip intre 1 si 4, deci grupul de incasare exista)" + +loForm.WindowType = 0 +loForm.Show() +loForm.WindowState = 2 +DOEVENTS FORCE + +* PROBA aseaza_totaluri(): dovada daca metoda ruleaza si daca scrierile ei sunt anulate ulterior +LOCAL lcC, loErr, lcAntePost +PRIVATE pcProbeLog +pcProbeLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\probe_totaluri.log" +STRTOFILE("PROBA aseaza_totaluri - " + TTOC(DATETIME()) + CHR(13) + CHR(10), pcProbeLog) + +DO ProbeDumpBanda WITH loForm, "INAINTE" + +TRY + loForm.aseaza_totaluri() + STRTOFILE("aseaza_totaluri() a rulat FARA eroare" + CHR(13) + CHR(10), pcProbeLog, 1) +CATCH TO loErr + STRTOFILE("aseaza_totaluri() a ARUNCAT eroare: " + loErr.Message + " la linia " + TRANSFORM(loErr.LineNo) + " in " + loErr.Procedure + CHR(13) + CHR(10), pcProbeLog, 1) +ENDTRY + +DOEVENTS FORCE + +DO ProbeDumpBanda WITH loForm, "DUPA (imediat, fara alt eveniment)" + +STRTOFILE("ltotaluri_asezate=" + TRANSFORM(loForm.ltotaluri_asezate) + CHR(13) + CHR(10), pcProbeLog, 1) + +WITH loForm.clb_total_baza.lb_explicatie + lcC = "lb_explicatie: Caption=[" + .Caption + "] AutoSize=" + TRANSFORM(.AutoSize) + " Width=" + TRANSFORM(.Width) + ; + " FontName=" + .FontName + " FontSize=" + TRANSFORM(.FontSize) + " FontBold=" + TRANSFORM(.FontBold) + ; + " TXTWIDTH=" + TRANSFORM(TXTWIDTH(ALLTRIM(.Caption), .FontName, .FontSize, IIF(.FontBold, "B", ""))) + ; + " FONTMETRIC(6)=" + TRANSFORM(FONTMETRIC(6, .FontName, .FontSize, IIF(.FontBold, "B", ""))) + ; + " PRODUS+4=" + TRANSFORM(CEILING(TXTWIDTH(ALLTRIM(.Caption), .FontName, .FontSize, IIF(.FontBold, "B", "")) * FONTMETRIC(6, .FontName, .FontSize, IIF(.FontBold, "B", ""))) + 4) + STRTOFILE(lcC + CHR(13) + CHR(10), pcProbeLog, 1) +ENDWITH + +WITH loForm.clb_total_baza.lb_nume_nat + lcC = "lb_nume_nat: Caption=[" + .Caption + "] AutoSize=" + TRANSFORM(.AutoSize) + " Width=" + TRANSFORM(.Width) + ; + " FontName=" + .FontName + " FontSize=" + TRANSFORM(.FontSize) + " FontBold=" + TRANSFORM(.FontBold) + ; + " TXTWIDTH=" + TRANSFORM(TXTWIDTH(ALLTRIM(.Caption), .FontName, .FontSize, IIF(.FontBold, "B", ""))) + ; + " FONTMETRIC(6)=" + TRANSFORM(FONTMETRIC(6, .FontName, .FontSize, IIF(.FontBold, "B", ""))) + ; + " PRODUS+4=" + TRANSFORM(CEILING(TXTWIDTH(ALLTRIM(.Caption), .FontName, .FontSize, IIF(.FontBold, "B", "")) * FONTMETRIC(6, .FontName, .FontSize, IIF(.FontBold, "B", ""))) + 4) + STRTOFILE(lcC + CHR(13) + CHR(10), pcProbeLog, 1) +ENDWITH + +* al doilea apel direct - daca DUPA1 ramane pe valorile vechi, verificam daca inca o rulare produce alta geometrie +* (adica scrierile ei ies, dar sunt suprascrise de altceva DUPA ce iese din metoda, nu ignorate de la inceput) +TRY + loForm.aseaza_totaluri() +CATCH TO loErr + STRTOFILE("al doilea apel a ARUNCAT eroare: " + loErr.Message + CHR(13) + CHR(10), pcProbeLog, 1) +ENDTRY +DO ProbeDumpBanda WITH loForm, "DUPA AL DOILEA APEL (fara DOEVENTS intre)" + +DOEVENTS FORCE +DO ProbeDumpBanda WITH loForm, "DUPA AL DOILEA APEL + DOEVENTS FORCE" + +* PEMSTATUS: confirma daca ltotaluri_asezate exista cu adevarat ca membru pe instanta +STRTOFILE("PEMSTATUS ltotaluri_asezate (5=property)=" + TRANSFORM(PEMSTATUS(loForm, 'ltotaluri_asezate', 5)) + CHR(13) + CHR(10), pcProbeLog, 1) + +* Ipoteza Anchor: un resize REAL de fereastra (WindowState 2->0->2, ca la Show() initial) +* reseteaza Left/Width ale containerelor ancorate DUPA ce codul din Resize() le-a scris? +loForm.WindowState = 0 +DOEVENTS FORCE +loForm.WindowState = 2 +DOEVENTS FORCE +DO ProbeDumpBanda WITH loForm, "DUPA WindowState 2->0->2 (resize real de fereastra)" + +DO AfLog WITH "Proba scrisa in " + pcProbeLog + +STRTOFILE(gcRaport, lcRaportFile) +DO AfLog WITH "Raport geometrie scris in " + lcRaportFile + +* nicio alocare de numar nu s-a facut (opt_incasat.Value neschimbat) - Release direct, fara curatenie +loForm.Release() +RELEASE loForm + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE DumpSiAnalizeaza + * Parcurge Thisform.Objects (top-level, fara recursie in containere), scrie .tsv cu + * Name/Class/Left/Top/Width/Height/Visible pentru fiecare obiect cu geometrie, apoi + * calculeaza suprapuneri (2D), iesire din zona utila a formularului si perechi lipite + * (<4px) pe orizontala/verticala, doar intre controale Visible=.T. Adauga sectiunea la gcRaport. + LPARAMETERS toForm, tcEticheta, tcTsvPath + LOCAL i, j, loO, lcOut, lnN, lnCount, llVis + LOCAL ARRAY laN[400], laC[400], laL[400], laT[400], laW[400], laH[400], laV[400] + lnN = 0 + lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(13) + CHR(10) + lnCount = toForm.Objects.Count + FOR i = 1 TO lnCount + loO = toForm.Objects(i) + IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' AND lnN < 400 + llVis = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) + lnN = lnN + 1 + laN[lnN] = loO.Name + laC[lnN] = loO.Class + laL[lnN] = loO.Left + laT[lnN] = loO.Top + laW[lnN] = loO.Width + laH[lnN] = loO.Height + laV[lnN] = llVis + lcOut = lcOut + loO.Name + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + TRANSFORM(llVis) + CHR(13) + CHR(10) + ENDIF + ENDFOR + STRTOFILE(lcOut, tcTsvPath) + DO AfLog WITH "GEOMETRIE [" + tcEticheta + "]: " + TRANSFORM(lnN) + " controale cu geometrie din " + TRANSFORM(lnCount) + " obiecte totale -> " + tcTsvPath + + LOCAL lnAL, lnAT, lnAR, lnAB, lnBL, lnBT, lnBR, lnBB, lnOvX, lnOvY, lnGap + LOCAL lcSectiune + lcSectiune = "=== " + tcEticheta + " (forma " + TRANSFORM(toForm.Width) + "x" + TRANSFORM(toForm.Height) + ") ===" + CHR(13) + CHR(10) + FOR i = 1 TO lnN + IF !laV[i] + LOOP + ENDIF + lnAL = laL[i] + lnAT = laT[i] + lnAR = laL[i] + laW[i] + lnAB = laT[i] + laH[i] + IF lnAL < 0 OR lnAT < 0 OR lnAR > toForm.Width OR lnAB > toForm.Height + lcSectiune = lcSectiune + "IESIT: " + laN[i] + " (" + laC[i] + ") Left=" + TRANSFORM(lnAL) + " Top=" + TRANSFORM(lnAT) + " Right=" + TRANSFORM(lnAR) + " Bottom=" + TRANSFORM(lnAB) + CHR(13) + CHR(10) + ENDIF + FOR j = i + 1 TO lnN + IF !laV[j] + LOOP + ENDIF + lnBL = laL[j] + lnBT = laT[j] + lnBR = laL[j] + laW[j] + lnBB = laT[j] + laH[j] + lnOvX = MIN(lnAR, lnBR) - MAX(lnAL, lnBL) + lnOvY = MIN(lnAB, lnBB) - MAX(lnAT, lnBT) + IF lnOvX > 0 AND lnOvY > 0 + lcSectiune = lcSectiune + "SUPRAPUNERE: " + laN[i] + " (" + laC[i] + ") x " + laN[j] + " (" + laC[j] + ") " + TRANSFORM(lnOvX) + "x" + TRANSFORM(lnOvY) + "px" + CHR(13) + CHR(10) + ELSE + IF lnOvY > 0 AND lnOvX <= 0 AND -lnOvX < 4 + lnGap = -lnOvX + lcSectiune = lcSectiune + "LIPIT-ORIZ: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10) + ENDIF + IF lnOvX > 0 AND lnOvY <= 0 AND -lnOvY < 4 + lnGap = -lnOvY + lcSectiune = lcSectiune + "LIPIT-VERT: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10) + ENDIF + ENDIF + ENDFOR + ENDFOR + gcRaport = gcRaport + lcSectiune + CHR(13) + CHR(10) +ENDPROC + +PROCEDURE DumpGrilaRecursiv + * Harta de geometrie recursiva: coboara in .Objects pe oricate niveluri (containere compozite + * clb_tx_simplu / ct_clb_cautare / etc.), scrie Name ca traseu punctat de la formular + * (Ct_clb_agent.clb_tx_cautare.Lb_simplu1), plus AbsLeft/AbsTop absolute fata de formular + * si Caption/Value taiat la 40 caractere - necesare ca sa se detecteze suprapunerile si + * textele taiate din interiorul containerelor, invizibile in harta plata geom_dupa_*.tsv. + LPARAMETERS toForm, tcTsvPath + LOCAL lcOut + lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(9) + "AbsLeft" + CHR(9) + "AbsTop" + CHR(9) + "Caption" + CHR(13) + CHR(10) + lcOut = lcOut + ColectGrila(toForm, "", 0, 0, 0, .T.) + STRTOFILE(lcOut, tcTsvPath) + DO AfLog WITH "GEOMETRIE-GRILA: scris " + tcTsvPath +ENDPROC + +FUNCTION ColectGrila + * Recursie pe .Objects (nu PEMSTATUS) - garda Type('loO.Left')='N' fiindca nu orice membru + * are geometrie (separatoare, columns de grid etc. nu ajung aici, gridurile nu au .Objects). + * coloana Visible e vizibilitatea EFECTIVA (proprie AND a parintelui) - un copil dintr-un + * container ascuns are Visible propriu .T. dar nu se deseneaza. + LPARAMETERS toContainer, tcPrefix, tnParentAbsLeft, tnParentAbsTop, tnDepth, tlParentVisEff + LOCAL i, loO, lcName, lnAbsL, lnAbsT, lcCaption, llVisEff, lcVisTxt, lcOut + IF tnDepth > 15 + RETURN "" + ENDIF + lcOut = "" + FOR i = 1 TO toContainer.Objects.Count + loO = toContainer.Objects(i) + IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' + lcName = IIF(EMPTY(tcPrefix), loO.Name, tcPrefix + "." + loO.Name) + lnAbsL = tnParentAbsLeft + loO.Left + lnAbsT = tnParentAbsTop + loO.Top + lcCaption = "" + IF TYPE('loO.Caption') = 'C' + lcCaption = loO.Caption + ELSE + IF TYPE('loO.Value') = 'C' + lcCaption = loO.Value + ENDIF + ENDIF + lcCaption = STRTRAN(lcCaption, CHR(9), " ") + lcCaption = LEFT(lcCaption, 40) + llVisEff = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) AND tlParentVisEff + lcVisTxt = TRANSFORM(llVisEff) + lcOut = lcOut + lcName + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + lcVisTxt + CHR(9) + TRANSFORM(lnAbsL) + CHR(9) + TRANSFORM(lnAbsT) + CHR(9) + lcCaption + CHR(13) + CHR(10) + IF TYPE('loO.Objects.Count') = 'N' + lcOut = lcOut + ColectGrila(loO, lcName, lnAbsL, lnAbsT, tnDepth + 1, llVisEff) + ENDIF + ENDIF + ENDFOR + RETURN lcOut +ENDFUNC + +PROCEDURE ProbeDumpBanda + * Logheaza Left/Width pentru cele sase containere ale benzii de totaluri, cu eticheta data. + LPARAMETERS toForm, tcEticheta + LOCAL lcL, laNume[6], i + laNume[1] = "clb_total_baza" + laNume[2] = "clb_discount_articole" + laNume[3] = "clb_discount" + laNume[4] = "clb_motiv_discount" + laNume[5] = "clb_total_tva" + laNume[6] = "clb_total_factura" + lcL = "--- " + tcEticheta + " ---" + CHR(13) + CHR(10) + FOR i = 1 TO 6 + lcL = lcL + laNume[i] + " Left=" + TRANSFORM(EVALUATE("toForm." + laNume[i] + ".Left")) + ; + " Width=" + TRANSFORM(EVALUATE("toForm." + laNume[i] + ".Width")) + ; + " Anchor=" + TRANSFORM(EVALUATE("toForm." + laNume[i] + ".Anchor")) + CHR(13) + CHR(10) + ENDFOR + STRTOFILE(lcL, pcProbeLog, 1) +ENDPROC + +PROCEDURE ProbaSerii + * apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor + * ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului + LPARAMETERS tnIdTipDoc + LOCAL lnOk, laErr[1], i, lcSql + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + FOR i = 1 TO 3 + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii") + IF lnOk > 0 + DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii")) + USE IN (SELECT("crsprobaserii")) + EXIT + ELSE + AERROR(laErr) + DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5]) + ENDIF + ENDFOR +ENDPROC + +FUNCTION ObjExists + * cautare recursiva: controalele mutate in containere nu mai sunt in Objects direct + LPARAMETERS toContainer, tcName + LOCAL i, loO + FOR i = 1 TO toContainer.Objects.Count + loO = toContainer.Objects(i) + IF UPPER(loO.Name) == UPPER(tcName) + RETURN .T. + ENDIF + IF TYPE('loO.Objects.Count') = 'N' + IF ObjExists(loO, tcName) + RETURN .T. + ENDIF + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO AfLog WITH "PASS: " + tcMsg + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL: " + tcMsg + ENDIF +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + DO HarnessDone WITH 'done' + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/proceduri_test_args.prg b/utile/Teste/facturare_unificat/proceduri_test_args.prg new file mode 100644 index 0000000..eb92d66 --- /dev/null +++ b/utile/Teste/facturare_unificat/proceduri_test_args.prg @@ -0,0 +1,19 @@ +*!* 31.08.2026 +*!* subagent masuratoare argumente +*!* rutine de proba pentru masurarea comportamentului VFP la argumente in plus, apelate din alt fisier (IN) + +PROCEDURE rutina_noparam_ext +lcVal = '' +IF PARAMETERS() >= 1 + lcVal = TRANSFORM(p1) +ENDIF +RETURN 'noparam_ext OK, PARAMETERS()=' + TRANSFORM(PARAMETERS()) + +PROCEDURE rutina_1p_ext +LPARAMETERS p1 +RETURN '1p_ext OK, p1=' + TRANSFORM(p1) + ', PARAMETERS()=' + TRANSFORM(PARAMETERS()) + +FUNCTION rutina_2p_ext +LPARAMETERS p1, p2 +lcP2 = IIF(VARTYPE(p2) = 'L' AND ISNULL(p2), 'NULL', IIF(VARTYPE(p2)='L', TRANSFORM(p2) + '(bool.F=lipsa)', TRANSFORM(p2))) +RETURN '2p_ext OK, p1=' + TRANSFORM(p1) + ', p2=' + lcP2 + ', VARTYPE(p2)=' + VARTYPE(p2) + ', PARAMETERS()=' + TRANSFORM(PARAMETERS()) diff --git a/utile/Teste/facturare_unificat/ruleaza_suita.ps1 b/utile/Teste/facturare_unificat/ruleaza_suita.ps1 new file mode 100644 index 0000000..9e69dc8 --- /dev/null +++ b/utile/Teste/facturare_unificat/ruleaza_suita.ps1 @@ -0,0 +1,32 @@ +param([Parameter(Mandatory=$true)][string]$Nume, [int]$TimeoutMs = 300000) + +$ErrorActionPreference = 'Stop' +$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat' +$prg = Join-Path $dir ($Nume + '.prg') +$log = Join-Path $dir ('out\' + $Nume + '.log') +$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' + +if (-not (Test-Path $prg)) { "Nu exista $prg"; exit 1 } + +$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like ('*' + $Nume + '*') } +if ($viu) { + "Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua." + exit 1 +} + +Set-Location $dir +Remove-Item (Join-Path $dir ($Nume + '.FXP')) -ErrorAction SilentlyContinue +Remove-Item $log -ErrorAction SilentlyContinue + +$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru +"lansat PID " + $p.Id +$null = $p.WaitForExit($TimeoutMs) +if (-not $p.HasExited) { + "ATARNAT dupa " + [int]($TimeoutMs/1000) + "s - omor instanta (filtrat pe CommandLine)" + Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like ('*' + $Nume + '*') } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force } +} +if (Test-Path $log) { + Get-Content $log +} else { + "Log inexistent: $log" +} diff --git a/utile/Teste/facturare_unificat/test_decizia7_plafon_grid.prg b/utile/Teste/facturare_unificat/test_decizia7_plafon_grid.prg new file mode 100644 index 0000000..0346c85 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_decizia7_plafon_grid.prg @@ -0,0 +1,445 @@ +* test_decizia7_plafon_grid.prg +* Headless: decizia 7 - plafonul Rol B (tipurile 1,22,29,23) validat la editarea cantitatii +* in grid, frm_facturare_articole2 (v2), eveniment grd_factura.cCantitate.Text1.Valid +* (COMUN\clase\ofacturare.vc2, dupa grd_factura.cCodMat.cboCodmat.LostFocus). +* +* Executa direct METODA REALA (nu recalcul in paralel): instantiaza frm_facturare_articole2, +* seteaza cantitatea veche pe randul din crsfactura si This.Value (cantitatea noua) pe +* controlul real din grid, apoi apeleaza loForm.grd_factura.cCantitate.Text1.Valid() ca functie. +* NU se foloseste This.OldValue: sub -A -T (si, s-a verificat, si pe un textbox obisnuit, +* non-grid) PEMSTATUS/AMEMBERS nu-l listeaza si scrierea directa arunca eroare 1734 - This.OldValue +* nu e o proprietate reflectabila/setabila din afara ciclului real de focus. Garda din cod +* foloseste de aceea crsfactura.cantitate (valoarea veche, inca nescrisa la momentul Valid, cf. +* deciziei orchestratorului) pentru comparatia "s-a schimbat cantitatea?", nu This.OldValue. +* Plafonul e citit LIVE din Oracle (pack_facturare.plafon_disponibil_articol, id_articol=315554536) +* chiar de metoda testata - testul NU recalculeaza plafonul separat, doar il citeste o data la +* inceput ca sa aleaga cantitati sigur sub / sigur peste (marja 100, impotriva driftului intre +* citiri - vezi docs\raport_s4_2.md §6.3 vs. valoarea gasita live aici, deja diferita cu +3). +* +* CAPCANA platita: setarea directa a This.Value pe un control legat prin ControlSource face +* write-through IMEDIAT in crsfactura.cantitate (verificat cu un probe dedicat - nu exista sesiune +* reala de editare in afara unui ciclu real de focus tastat, deci nu exista buffer amanat). Fara +* corectie, garda vedea mereu This.Value = crsfactura.cantitate (ambele = valoarea noua) si nu se +* declansa niciodata. Ordinea corecta, aplicata mai jos: seteaza This.Value (noua cantitate), APOI +* REPLACE cantitate WITH IN crsfactura - reface exact starea din Valid() real +* (This.Value = nou, crsfactura.cantitate = vechi), fara sa atinga This.Value. +* +* Sase cazuri (C1-C4 initiale + C5/C6 adaugate la review-ul codului comis, care a gasit doi +* defecti reali - vezi docs\raport_decizia_7_implementare.md §9): +* C1. Sub plafon (tip=1, gestionabil=1): Valid() nu refuza (rezultat <> .F.), nicio caseta de +* mesaj, gnErr=0; simuleaza commit-ul cadrului (REPLACE cu This.Value) si verifica +* crsfactura.cantitate = valoarea noua; verifica si ca pointerul ramane pe randul editat. +* C2. Peste plafon (tip=1, gestionabil=1): Valid() intoarce exact .F., crsfactura.cantitate +* RAMANE valoarea veche (nescrisa), caseta afisata cu Thisform.cmesaj_cantitate; verifica +* si ca pointerul ramane pe randul editat. +* C3. Neregresie tip disjunct (tip=3, in afara {1,22,29,23}): cantitate uriasa (peste orice +* plafon plauzibil) trece neconditionat, fara nicio caseta de mesaj (dovada ca garda nu +* s-a declansat deloc, deci nici apelul Oracle). +* C4. Neregresie gestionabil=0 (tip=1): aceeasi cantitate uriasa trece neconditionat, fara +* caseta de mesaj (garda gestionabil=1 nu se declanseaza). +* C5. Doua articole DIFERITE pe aceeasi factura: editarea articolului A la o cantitate mica +* nu trebuie sa refuze desi articolul B (needitat) are o cantitate uriasa - prinde +* tautologia "id_articol = crsfactura.id_articol" din FOR-ul CALCULATE original. +* C6. Acelasi articol pe doua linii: suma celor doua linii peste plafon refuza (C6a), sub +* plafon trece (C6b), fara sa numere randul editat de doua ori; verifica in ambele +* subcazuri ca pointerul ramane pe randul editat dupa Valid(). +* +* Sablon urmat: test_s4c_discount_grid.prg (harness identic, acelasi env auto). mock_amessagebox.prg +* incarcat PRIMUL in SET PROCEDURE (la nume duplicat castiga primul fisier din lista). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_decizia7_plafon_grid.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_decizia7_plafon_grid.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO (schema/instanta CONTAFIN_ORACLE); gnIdUtil = 8, gnIdSucursala = 167, +* gnScadereStoc = 1. id_articol=315554536 (acelasi din raport_s4_2.md §6), plafon citit live la rulare. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gnScadereStoc, gcMockUltimMesaj, gnMockUltimTip, gnIdArticolTest, gnPlafonLive +gnScadereStoc = 1 +gnIdArticolTest = 315554536 +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_decizia7_plafon_grid.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockUltimMesaj = "" +gnMockUltimTip = 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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProc +gnIdUtil = 8 +gnIdSucursala = 167 +goExecutor.oExecute([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala) + +*-- plafon live, citit o singura data - alege cantitatile de test, nu recalculeaza rezultatul Valid() +LOCAL lcSqlPlafon +lcSqlPlafon = [SELECT pack_facturare.plafon_disponibil_articol(] + Alltrim(Str(gnIdArticolTest)) + [,] + ; + Alltrim(Str(gnLuna)) + [,] + Alltrim(Str(gnAn)) + [,8,167,NULL,NULL) AS plafon FROM dual] +IF goExecutor.oExecute(lcSqlPlafon, 'crsplafonlive') < 0 + DO AfLog WITH "FAIL: plafon live " + goExecutor.oPrelucrareEroare() + DO Final +ENDIF +gnPlafonLive = crsplafonlive.plafon +Use In (Select('crsplafonlive')) +DO AfLog WITH "plafon live pentru id_articol=" + Transform(gnIdArticolTest) + " = " + Transform(gnPlafonLive) + +PRIVATE poDate +poDate = NULL + +DO TestC1 +DO TestC2 +DO TestC3 +DO TestC4 +DO TestC5 +DO TestC6 + +DO Final + +*---------------------------------------------------------------------------------------- +* C1: sub plafon - Valid() nu refuza, nicio caseta, commit-ul simulat scrie noua cantitate. +PROCEDURE TestC1 + LOCAL loForm, lnVechi, lnNou, llRezultat + + gcCaz = "[C1: sub plafon] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 1 + + lnVechi = 1 + lnNou = Int(gnPlafonLive / 2) + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL PLAFON", ; + cantitate WITH lnVechi, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1 + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1)" + + loForm.grd_factura.cCantitate.Text1.Value = lnNou + *-- setarea directa a lui .Value scrie imediat in crsfactura (write-through, fara sesiune + *-- reala de editare) - restaureaza campul la valoarea veche ca sa reproduca exact starea + *-- din Valid() real (This.Value = nou, crsfactura.cantitate = vechi) + SELECT crsfactura + REPLACE cantitate WITH lnVechi IN crsfactura + gcMockUltimMesaj = "" + llRezultat = loForm.grd_factura.cCantitate.Text1.Valid() + + DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")" + DO Assert WITH llRezultat <> .F., "Valid() nu refuza sub plafon (plafon=" + Transform(gnPlafonLive) + ", cerut=" + Transform(lnNou) + ")" + DO Assert WITH Empty(gcMockUltimMesaj), "nicio caseta de mesaj sub plafon (primit: [" + gcMockUltimMesaj + "])" + DO Assert WITH Recno('crsfactura') = 1, "pointerul ramane pe randul editat dupa Valid() cu succes (obtinut: " + Transform(Recno('crsfactura')) + ")" + + SELECT crsfactura + GO TOP IN crsfactura + REPLACE cantitate WITH lnNou IN crsfactura + DO Assert WITH crsfactura.cantitate = lnNou, "cantitate scrisa dupa commit simulat (obtinut: " + Transform(crsfactura.cantitate) + ")" + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* C2: peste plafon - Valid() refuza (.F. exact), crsfactura.cantitate ramane valoarea veche, +* caseta afisata cu Thisform.cmesaj_cantitate. +PROCEDURE TestC2 + LOCAL loForm, lnVechi, lnNou, llRezultat + + gcCaz = "[C2: peste plafon] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 1 + + lnVechi = 1 + lnNou = gnPlafonLive + 100 + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL PLAFON", ; + cantitate WITH lnVechi, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1 + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1)" + + loForm.grd_factura.cCantitate.Text1.Value = lnNou + SELECT crsfactura + REPLACE cantitate WITH lnVechi IN crsfactura + gcMockUltimMesaj = "" + llRezultat = loForm.grd_factura.cCantitate.Text1.Valid() + + DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")" + DO Assert WITH llRezultat = .F., "Valid() refuza peste plafon (plafon=" + Transform(gnPlafonLive) + ", cerut=" + Transform(lnNou) + ")" + DO Assert WITH 'Acest articol nu este pe stoc!' $ gcMockUltimMesaj, "caseta cu Thisform.cmesaj_cantitate (primit: [" + gcMockUltimMesaj + "])" + DO Assert WITH Recno('crsfactura') = 1, "pointerul ramane pe randul editat dupa Valid() cu refuz (obtinut: " + Transform(Recno('crsfactura')) + ")" + + SELECT crsfactura + GO TOP IN crsfactura + DO Assert WITH crsfactura.cantitate = lnVechi, "cantitate NESCHIMBATA la refuz (obtinut: " + Transform(crsfactura.cantitate) + ")" + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* C3: neregresie tip disjunct (tip=3, Rol A) - cantitate uriasa trece neconditionat, garda +* nu se declanseaza (nicio caseta de mesaj). +PROCEDURE TestC3 + LOCAL loForm, lnVechi, lnNou, llRezultat + + gcCaz = "[C3: neregresie tip=3] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 3 + + lnVechi = 1 + lnNou = gnPlafonLive + 1000000 + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL PLAFON", ; + cantitate WITH lnVechi, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1 + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=3)" + + loForm.grd_factura.cCantitate.Text1.Value = lnNou + SELECT crsfactura + REPLACE cantitate WITH lnVechi IN crsfactura + gcMockUltimMesaj = "" + llRezultat = loForm.grd_factura.cCantitate.Text1.Valid() + + DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")" + DO Assert WITH llRezultat <> .F., "Valid() nu refuza pe tip disjunct (tip=3)" + DO Assert WITH Empty(gcMockUltimMesaj), "garda plafon nu s-a declansat pe tip=3 (primit: [" + gcMockUltimMesaj + "])" + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* C4: neregresie gestionabil=0 (tip=1) - cantitate uriasa trece neconditionat, garda +* gestionabil=1 nu se declanseaza (nicio caseta de mesaj). +PROCEDURE TestC4 + LOCAL loForm, lnVechi, lnNou, llRezultat + + gcCaz = "[C4: neregresie gestionabil=0] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 1 + + lnVechi = 1 + lnNou = gnPlafonLive + 1000000 + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL PLAFON", ; + cantitate WITH lnVechi, gestionabil WITH 0, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1 + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1, gestionabil=0)" + + loForm.grd_factura.cCantitate.Text1.Value = lnNou + SELECT crsfactura + REPLACE cantitate WITH lnVechi IN crsfactura + gcMockUltimMesaj = "" + llRezultat = loForm.grd_factura.cCantitate.Text1.Valid() + + DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")" + DO Assert WITH llRezultat <> .F., "Valid() nu refuza pe gestionabil=0" + DO Assert WITH Empty(gcMockUltimMesaj), "garda plafon nu s-a declansat pe gestionabil=0 (primit: [" + gcMockUltimMesaj + "])" + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* C5: doua articole DIFERITE pe aceeasi factura - articolul B (alt id_articol, cantitate uriasa, +* needitat) nu trebuie sa intre in suma articolului A (cel editat). Prinde tautologia +* "id_articol = crsfactura.id_articol" din FOR-ul CALCULATE (mereu .T. in scanul CALCULATE). +PROCEDURE TestC5 + LOCAL loForm, lnNou, llRezultat + + gcCaz = "[C5: doua articole diferite] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 1 + + lnNou = 5 + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A", ; + cantitate WITH 1, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1 + APPEND BLANK + REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 888888888, denumire WITH "ARTICOL B", ; + cantitate WITH 50000, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1 + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1, 2 articole)" + + SELECT crsfactura + GO 1 IN crsfactura + loForm.grd_factura.cCantitate.Text1.Value = lnNou + SELECT crsfactura + GO 1 IN crsfactura + REPLACE cantitate WITH 1 IN crsfactura + gcMockUltimMesaj = "" + llRezultat = loForm.grd_factura.cCantitate.Text1.Valid() + + DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")" + DO Assert WITH llRezultat <> .F., "Valid() nu refuza A (5, mult sub plafonul " + Transform(gnPlafonLive) + ") desi B are 50000 pe alt articol" + DO Assert WITH Empty(gcMockUltimMesaj), "nicio caseta - suma NU trebuie sa includa articolul B (primit: [" + gcMockUltimMesaj + "])" + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* C6: acelasi articol pe doua linii - randul needitat (100) plus randul editat trebuie sa +* refuze peste plafon si sa treaca sub plafon, fara sa numere randul editat de doua ori +* (verifica excluderea Recno() <> lnRecnoCrt cu filtrul de id_articol corect). +PROCEDURE TestC6 + LOCAL loForm, lnNou, llRezultat + + gcCaz = "[C6a: acelasi articol, 2 linii, peste plafon] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 1 + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A linia 1", ; + cantitate WITH 100, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1 + APPEND BLANK + REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A linia 2", ; + cantitate WITH 1, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1 + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=1, acelasi articol pe 2 linii)" + + *-- C6a: editez linia 2 la o valoare care duce totalul (100 + noua) peste plafon + lnNou = gnPlafonLive + 100 + SELECT crsfactura + GO 2 IN crsfactura + loForm.grd_factura.cCantitate.Text1.Value = lnNou + SELECT crsfactura + GO 2 IN crsfactura + REPLACE cantitate WITH 1 IN crsfactura + gcMockUltimMesaj = "" + llRezultat = loForm.grd_factura.cCantitate.Text1.Valid() + + DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")" + DO Assert WITH llRezultat = .F., "Valid() refuza cand suma celor 2 linii (100+" + Transform(lnNou) + ") depaseste plafonul " + Transform(gnPlafonLive) + DO Assert WITH Recno('crsfactura') = 2, "pointerul ramane pe linia 2 dupa refuz (obtinut: " + Transform(Recno('crsfactura')) + ")" + + loForm.Release() + RELEASE loForm + + gcCaz = "[C6b: acelasi articol, 2 linii, sub plafon] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 1 + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A linia 1", ; + cantitate WITH 100, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1 + APPEND BLANK + REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH gnIdArticolTest, denumire WITH "ARTICOL A linia 2", ; + cantitate WITH 1, gestionabil WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1 + + loForm = CREATEOBJECT('frm_facturare_articole2') + + *-- C6b: editez linia 2 la o valoare care lasa totalul (100 + noua) sub plafon + lnNou = 5000 + SELECT crsfactura + GO 2 IN crsfactura + loForm.grd_factura.cCantitate.Text1.Value = lnNou + SELECT crsfactura + GO 2 IN crsfactura + REPLACE cantitate WITH 1 IN crsfactura + gcMockUltimMesaj = "" + llRezultat = loForm.grd_factura.cCantitate.Text1.Valid() + + DO Assert WITH gnErr = 0, "fara eroare VFP (gcErr: " + gcErr + ")" + DO Assert WITH llRezultat <> .F., "Valid() nu refuza cand suma celor 2 linii (100+" + Transform(lnNou) + ") ramane sub plafonul " + Transform(gnPlafonLive) + DO Assert WITH Recno('crsfactura') = 2, "pointerul ramane pe linia 2 dupa succes (obtinut: " + Transform(Recno('crsfactura')) + ")" + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip + LOCAL lnIdSet + + DO Inchide WITH 'crsfactura' + SELECT 0 + DO creeaza_facturacrs WITH 'crsfactura' + + gcErr = "" + gnErr = 0 + gcMockUltimMesaj = "" + gnMockUltimTip = 0 + + lnIdSet = 29000 + tnTip + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 79 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.id_valuta = 1 + poDate.in_valuta = 0 +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_jtva_v2_constatare.prg b/utile/Teste/facturare_unificat/test_jtva_v2_constatare.prg new file mode 100644 index 0000000..3f51fd4 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_jtva_v2_constatare.prg @@ -0,0 +1,145 @@ +* test_jtva_v2_constatare.prg +* Headless, read-only, fara formulare, fara emitere: constatare pe date deja existente in +* MARIUSM_AUTO@ROA_CENTRAL despre tiparul ID_JTVA_COLOANA/PROC_TVA/TAXCODE gol pe documentele +* emise de frm_facturare_articole2 (v2), gasit in S6-2 pe comanda SSS656/id_vanzare=1114. +* Nu emite nimic, doar SELECT. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_jtva_v2_constatare.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_jtva_v2_constatare.log + +SET SAFETY OFF +SET TALK OFF +CLOSE DATABASES + +PUBLIC gcLog +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_jtva_v2_constatare.log" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog) + +TRY + 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 JLog WITH 'EROARE: conectare Oracle esuata' + DO JFinal + ENDIF + DO JLog WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + + DO JLog WITH CHR(13) + CHR(10) + '===== 1. cele 4 documente cunoscute (VANZARI + rezumat VANZARI_DETALII + rezumat ACT) =====' + DO Raporteaza WITH 1111 + DO Raporteaza WITH 1112 + DO Raporteaza WITH 1113 + DO Raporteaza WITH 1114 + + DO JLog WITH CHR(13) + CHR(10) + '===== 2. esantion productie recenta (v1), serie <> SSS, tip in (2,3), ordonat id_vanzare desc =====' + LOCAL lcSql + lcSql = [select id_vanzare, tip, id_part, serie_act, numar_act as nract, total_fara_tva, total_tva from vanzari ] + ; + [where serie_act <> 'SSS' and tip in (2,3) and rownum <= 15 order by id_vanzare desc] + IF goExecutor.oExecute(lcSql, 'crsesantion') < 0 + DO JLog WITH 'EROARE esantion productie: ' + goExecutor.oPrelucrareEroare() + ELSE + SELECT crsesantion + SCAN + DO Raporteaza WITH id_vanzare + ENDSCAN + USE IN crsesantion + ENDIF + + DO JLog WITH CHR(13) + CHR(10) + '===== 3. documente istorice ale clientilor 2873 si 2874 (test decisiv client vs formular) =====' + lcSql = [select id_vanzare, tip, id_part, serie_act, numar_act as nract, total_fara_tva, total_tva from vanzari ] + ; + [where id_part in (2873,2874) and rownum <= 20 order by id_part, id_vanzare desc] + IF goExecutor.oExecute(lcSql, 'crsclienti') < 0 + DO JLog WITH 'EROARE esantion clienti: ' + goExecutor.oPrelucrareEroare() + ELSE + SELECT crsclienti + SCAN + DO Raporteaza WITH id_vanzare + ENDSCAN + USE IN crsclienti + ENDIF + + DO JFinal + +CATCH TO loExc + DO JLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ; + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + DO JFinal +ENDTRY + +QUIT + +*---------------------------------------------------------------------------------------- +* Raporteaza: pentru un id_vanzare dat, scrie in log randul VANZARI relevant, rezumatul +* VANZARI_DETALII (jonctiune pe id_vanzare) si rezumatul ACT (jonctiune pe serie_act+nract). +PROCEDURE Raporteaza + LPARAMETERS tnIdVanzare + LOCAL lcSql, lcSerieAct, lnNract, lcJtvaSet, lcTaxSet + + lcSql = [select id_vanzare, tip, id_part, serie_act, numar_act as nract, total_fara_tva, total_tva, ] + ; + [total_cu_tva from vanzari where id_vanzare = ] + TRANSFORM(tnIdVanzare) + IF goExecutor.oExecute(lcSql, 'crsv') < 0 + DO JLog WITH 'EROARE VANZARI id_vanzare=' + TRANSFORM(tnIdVanzare) + ': ' + goExecutor.oPrelucrareEroare() + RETURN + ENDIF + IF !USED('crsv') OR RECCOUNT('crsv') = 0 + DO JLog WITH 'VANZARI id_vanzare=' + TRANSFORM(tnIdVanzare) + ' NEGASIT' + IF USED('crsv') + USE IN crsv + ENDIF + RETURN + ENDIF + SELECT crsv + lcSerieAct = ALLTRIM(NVL(serie_act, '')) + lnNract = NVL(nract, 0) + DO JLog WITH 'VANZARI id_vanzare=' + TRANSFORM(tnIdVanzare) + ' tip=' + TRANSFORM(tip) + ; + ' id_part=' + TRANSFORM(id_part) + ' serie_act=' + lcSerieAct + ' nract=' + TRANSFORM(lnNract) + ; + ' total_fara_tva=' + TRANSFORM(total_fara_tva) + ' total_tva=' + TRANSFORM(total_tva) + ; + ' total_cu_tva=' + TRANSFORM(total_cu_tva) + USE IN crsv + + * rezumat VANZARI_DETALII (jonctiune pe id_vanzare) + lcSql = [select count(*) as nlinii, sum(nvl(proc_tvav,0)) as sumproc, ] + ; + [min(nvl(id_jtva_coloana,-1)) as minjtva, max(nvl(id_jtva_coloana,-1)) as maxjtva, ] + ; + [sum(case when id_jtva_coloana is null then 1 else 0 end) as njtvanull, ] + ; + [sum(case when taxcode is null then 1 else 0 end) as ntaxnull from vanzari_detalii ] + ; + [where sters = 0 and id_vanzare = ] + TRANSFORM(tnIdVanzare) + IF goExecutor.oExecute(lcSql, 'crsd') < 0 + DO JLog WITH ' EROARE VANZARI_DETALII: ' + goExecutor.oPrelucrareEroare() + ELSE + SELECT crsd + DO JLog WITH ' VANZARI_DETALII linii=' + TRANSFORM(nlinii) + ' sum_proc_tvav=' + TRANSFORM(sumproc) + ; + ' id_jtva_coloana[min,max]=[' + TRANSFORM(minjtva) + ',' + TRANSFORM(maxjtva) + ']' + ; + ' linii_jtva_null=' + TRANSFORM(njtvanull) + ' linii_taxcode_null=' + TRANSFORM(ntaxnull) + USE IN crsd + ENDIF + + * rezumat ACT (jonctiune pe serie_act+nract) + IF EMPTY(lcSerieAct) OR lnNract = 0 + DO JLog WITH ' ACT: fara serie_act/nract, sarit' + RETURN + ENDIF + lcSql = [select count(*) as nlinii, sum(nvl(suma,0)) as sumasuma, ] + ; + [min(nvl(id_jtva_coloana,-1)) as minjtva, max(nvl(id_jtva_coloana,-1)) as maxjtva, ] + ; + [sum(case when id_jtva_coloana is null then 1 else 0 end) as njtvanull, ] + ; + [sum(nvl(proc_tva,0)) as sumproctva, ] + ; + [sum(case when taxcode is null then 1 else 0 end) as ntaxnull from act where sters = 0 ] + ; + [and serie_act = '] + lcSerieAct + [' and nract = ] + TRANSFORM(lnNract) + IF goExecutor.oExecute(lcSql, 'crsa') < 0 + DO JLog WITH ' EROARE ACT: ' + goExecutor.oPrelucrareEroare() + ELSE + SELECT crsa + DO JLog WITH ' ACT linii=' + TRANSFORM(nlinii) + ' suma=' + TRANSFORM(sumasuma) + ; + ' id_jtva_coloana[min,max]=[' + TRANSFORM(minjtva) + ',' + TRANSFORM(maxjtva) + ']' + ; + ' linii_jtva_null=' + TRANSFORM(njtvanull) + ' sum_proc_tva=' + TRANSFORM(sumproctva) + ; + ' linii_taxcode_null=' + TRANSFORM(ntaxnull) + USE IN crsa + ENDIF +ENDPROC + +PROCEDURE JLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE JFinal + DO JLog WITH 'END ' + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_q8_numar_ars.prg b/utile/Teste/facturare_unificat/test_q8_numar_ars.prg new file mode 100644 index 0000000..f4f1257 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_q8_numar_ars.prg @@ -0,0 +1,346 @@ +* test_q8_numar_ars.prg +* Headless: verifica reparatia Q8 (decizia 69, amendata 21.08.2026) - garda "s-a schimbat tipul documentului?" +* trebuie sa ruleze INAINTE de alocarea numarului (_cbbase1.LostFocus()) in do_schimba_tipdoc, DOAR pe calea +* unificata (frm_facturare_articole2). Pe calea veche (frm_date_factura), Marius a decis sa se lase +* comportamentul preexistent (numarul se arde la simpla intrare-iesire din combo-ul de tip) - vezi +* docs\raport_q8_numar_ars.md. Generatorul e oGeneratorMock (mock_generator_numere.prg, subclasa de test a +* lui oGeneratorNumere) - NU atinge Oracle, jurnalizeaza aloca_numar/dezaloca_numar/creeaza_cursor_serii in +* gcMockApeluri. NU se consuma numere reale din serii. +* +* REZULTAT ASTEPTAT (declarat inainte de rulare): +* A. FARA schimbare de tip (combo pus pe aceeasi valoare ca poDate.nIdTipDoc), in doua situatii (A1/A2): +* - frm_date_factura (calea veche, nereparata): ALOC#1 ruleaza inaintea garzii, indiferent de +* poDate.nract la intrare - poDate.nract SE ARDE (devine numarul alocat de mock), gcMockApeluri +* NU ramane gol (comportament preexistent, pastrat intentionat). +* - frm_facturare_articole2 (calea unificata, reparata): garda ruleaza prima - poDate.nract ramane +* neschimbat, gcMockApeluri ramane gol. +* B. CU schimbare reala de tip (FACTURA(5) -> PROFORMA(23)), pe ambele forme: poDate.nIdTipDoc = 23, +* gcMockApeluri contine dezaloca_numar(5), creeaza_cursor_serii(23) si aloca_numar(23); poDate.nract <> 0 +* la final (pe calea veche mai apare si o pereche redundanta aloca_numar(5)/dezaloca_numar(5) din ALOC#1 - +* tolerata, testul verifica prezenta secventei, nu absenta altor apeluri). +* C. Amprentele (nIdTipDoc, nract, gcMockApeluri) DIFERA intentionat intre frm_date_factura si +* frm_facturare_articole2, pentru A1/A2/B - dovada ca cele doua cai NU mai sunt unificate pe Q8 (decizia +* lui Marius de a lasa calea veche neatinsa). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_q8_numar_ars.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_q8_numar_ars.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockNumar +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_q8_numar_ars.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) +gnFail = 0 +gnPass = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockNumar = 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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg" +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + +PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest +plVizibil = .F. +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") +DO Assert WITH VARTYPE(poGeneratorNumere) = 'O' AND poGeneratorNumere.Class == "Ogeneratormock", "generator mock instantiat" +poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +* --- A1: fara schimbare, nract=0 la intrare (cazul din verif_nract_do_cauta.md) --- +DO CazFaraSchimbare WITH 'frm_date_factura', "FACTURA", 0 +DO CazFaraSchimbare WITH 'frm_facturare_articole2', "FACTURA", 0 + +* --- A2: fara schimbare, nract deja alocat (neregresie) --- +DO CazFaraSchimbare WITH 'frm_date_factura', "FACTURA", 777 +DO CazFaraSchimbare WITH 'frm_facturare_articole2', "FACTURA", 777 + +* --- B: schimbare reala FACTURA -> PROFORMA --- +DO CazCuSchimbare WITH 'frm_date_factura', "FACTURA", "PROFORMA" +DO CazCuSchimbare WITH 'frm_facturare_articole2', "FACTURA", "PROFORMA" + +* --- C: paritate amprente intre cele doua forme, pe fiecare caz --- +DO Paritate WITH "FACTURA", 0 +DO Paritate WITH "FACTURA", 777 +DO ParitateSchimbare WITH "FACTURA", "PROFORMA" + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE CazFaraSchimbare + LPARAMETERS tcClasa, tcFel, tnNractInitial + LOCAL loF, loCombo, lnIdTipDoc + gcCaz = "[FaraSchimbare " + tcClasa + " " + tcFel + " nract0=" + TRANSFORM(tnNractInitial) + "] " + lnIdTipDoc = IdTipDoc(tcFel) + + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 25001, 1) + poDate.nIdTipDoc = lnIdTipDoc + poGeneratorNumere.ResetNumere() + gnMockNumar = 100 + gcMockApeluri = "" + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + poDate.dataact = DATE(gnAn, gnLuna, 1) + poDate.dataireg = poDate.dataact + poDate.id_client = 0 + poDate.nract = tnNractInitial + gcErr = "" + + loF = CREATEOBJECT(tcClasa) + DO Assert WITH VARTYPE(loF) = 'O', "CREATEOBJECT " + tcClasa + " reusit" + IF VARTYPE(loF) <> 'O' + RETURN + ENDIF + IF tcClasa == 'frm_date_factura' + loCombo = loF.ct_clb_fdoc._combobox1 + ELSE + loCombo = loF.clb_fdoc.cboFdoc + ENDIF + loCombo.Value = tcFel && aceeasi valoare - fara schimbare de tip + + gcMockApeluri = "" + gcErr = "" + loF.do_schimba_tipdoc() + + IF tcClasa == 'frm_date_factura' + && calea veche: nereparata, decizia lui Marius din 21.08.2026 - numarul se arde la intrare-iesire din combo + DO Assert WITH poDate.nract <> tnNractInitial, "poDate.nract ars la intrare-iesire din combo (preexistent), a ramas " + TRANSFORM(poDate.nract) + DO Assert WITH !EMPTY(gcMockApeluri), "apel generator preexistent (numarul se arde) - jurnal gol, neasteptat" + ELSE + DO Assert WITH poDate.nract = tnNractInitial, "poDate.nract neschimbat (" + TRANSFORM(tnNractInitial) + "), a ramas " + TRANSFORM(poDate.nract) + DO Assert WITH EMPTY(gcMockApeluri), "niciun apel generator (aloca/dezaloca/creeaza_cursor_serii), gasit: " + STRTRAN(gcMockApeluri, CHR(13) + CHR(10), " | ") + ENDIF + DO Assert WITH poDate.nIdTipDoc = lnIdTipDoc, "nIdTipDoc neschimbat" + DO Assert WITH EMPTY(gcErr), "fara erori VFP: " + gcErr + + loF.Release() + RELEASE loF +ENDPROC + +PROCEDURE CazCuSchimbare + LPARAMETERS tcClasa, tcDin, tcIn + LOCAL loF, loCombo, lnIdTipDocDin, lnIdTipDocIn + gcCaz = "[CuSchimbare " + tcClasa + " " + tcDin + "->" + tcIn + "] " + lnIdTipDocDin = IdTipDoc(tcDin) + lnIdTipDocIn = IdTipDoc(tcIn) + + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 25001, 1) + poDate.nIdTipDoc = lnIdTipDocDin + poGeneratorNumere.ResetNumere() + gnMockNumar = 100 + gcMockApeluri = "" + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + poDate.dataact = DATE(gnAn, gnLuna, 1) + poDate.dataireg = poDate.dataact + poDate.id_client = 0 + poDate.nract = 555 && numar deja alocat pe tipul vechi, ca sa verific dezaloca_numar(vechi) + gcErr = "" + + loF = CREATEOBJECT(tcClasa) + DO Assert WITH VARTYPE(loF) = 'O', "CREATEOBJECT " + tcClasa + " reusit" + IF VARTYPE(loF) <> 'O' + RETURN + ENDIF + IF tcClasa == 'frm_date_factura' + loCombo = loF.ct_clb_fdoc._combobox1 + ELSE + loCombo = loF.clb_fdoc.cboFdoc + ENDIF + loCombo.Value = tcIn + + gcMockApeluri = "" + gcErr = "" + loF.do_schimba_tipdoc() + + DO Assert WITH poDate.nIdTipDoc = lnIdTipDocIn, "nIdTipDoc = " + TRANSFORM(lnIdTipDocIn) + " dupa schimbare, e " + TRANSFORM(poDate.nIdTipDoc) + DO Assert WITH ("dezaloca_numar(" + TRANSFORM(lnIdTipDocDin) + ")") $ gcMockApeluri, "dezaloca_numar(" + TRANSFORM(lnIdTipDocDin) + ") in jurnal" + DO Assert WITH ("creeaza_cursor_serii(" + TRANSFORM(lnIdTipDocIn) + ")") $ gcMockApeluri, "creeaza_cursor_serii(" + TRANSFORM(lnIdTipDocIn) + ") in jurnal" + DO Assert WITH ("aloca_numar(" + TRANSFORM(lnIdTipDocIn) + ")") $ gcMockApeluri, "aloca_numar(" + TRANSFORM(lnIdTipDocIn) + ") in jurnal" + DO Assert WITH poDate.nract <> 0, "poDate.nract alocat (<>0) dupa schimbare" + DO Assert WITH EMPTY(gcErr), "fara erori VFP: " + gcErr + DO AfLog WITH " " + gcCaz + "GENERATOR: " + STRTRAN(gcMockApeluri, CHR(13) + CHR(10), " | ") + + loF.Release() + RELEASE loF +ENDPROC + +PROCEDURE Paritate + LPARAMETERS tcFel, tnNractInitial + LOCAL lcVechi, lcNou + gcCaz = "[Paritate FaraSchimbare " + tcFel + " nract0=" + TRANSFORM(tnNractInitial) + "] " + lcVechi = AmprentaFaraSchimbare('frm_date_factura', tcFel, tnNractInitial) + lcNou = AmprentaFaraSchimbare('frm_facturare_articole2', tcFel, tnNractInitial) + && calea veche pastreaza bug-ul preexistent (Marius, 21.08.2026) - amprentele trebuie sa DIFERE + IF lcVechi <> lcNou + gnPass = gnPass + 1 + DO AfLog WITH "OK " + gcCaz + "amprente diverg intentionat (vechi arde numarul, nou nu):" + DO AfLog WITH " vechi: " + STRTRAN(lcVechi, CHR(13) + CHR(10), " | ") + DO AfLog WITH " nou : " + STRTRAN(lcNou, CHR(13) + CHR(10), " | ") + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL " + gcCaz + "amprente identice (asteptat: sa difere)" + ENDIF +ENDPROC + +PROCEDURE ParitateSchimbare + LPARAMETERS tcDin, tcIn + LOCAL lcVechi, lcNou + gcCaz = "[Paritate CuSchimbare " + tcDin + "->" + tcIn + "] " + lcVechi = AmprentaCuSchimbare('frm_date_factura', tcDin, tcIn) + lcNou = AmprentaCuSchimbare('frm_facturare_articole2', tcDin, tcIn) + && calea veche pastreaza ALOC#1 (pereche redundanta aloca/dezaloca pe tipul vechi) - amprentele trebuie sa DIFERE + IF lcVechi <> lcNou + gnPass = gnPass + 1 + DO AfLog WITH "OK " + gcCaz + "amprente diverg intentionat (vechi are alocare/dezalocare redundanta):" + DO AfLog WITH " vechi: " + STRTRAN(lcVechi, CHR(13) + CHR(10), " | ") + DO AfLog WITH " nou : " + STRTRAN(lcNou, CHR(13) + CHR(10), " | ") + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL " + gcCaz + "amprente identice (asteptat: sa difere)" + ENDIF +ENDPROC + +FUNCTION AmprentaFaraSchimbare + LPARAMETERS tcClasa, tcFel, tnNractInitial + LOCAL loF, loCombo, lcA, lnIdTipDoc + lnIdTipDoc = IdTipDoc(tcFel) + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 25001, 1) + poDate.nIdTipDoc = lnIdTipDoc + poGeneratorNumere.ResetNumere() + gnMockNumar = 100 + gcMockApeluri = "" + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + poDate.dataact = DATE(gnAn, gnLuna, 1) + poDate.dataireg = poDate.dataact + poDate.id_client = 0 + poDate.nract = tnNractInitial + gcErr = "" + + loF = CREATEOBJECT(tcClasa) + IF VARTYPE(loF) <> 'O' + RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr + ENDIF + IF tcClasa == 'frm_date_factura' + loCombo = loF.ct_clb_fdoc._combobox1 + ELSE + loCombo = loF.clb_fdoc.cboFdoc + ENDIF + loCombo.Value = tcFel + + gcMockApeluri = "" + gcErr = "" + loF.do_schimba_tipdoc() + + lcA = "nract=" + TRANSFORM(poDate.nract) + CHR(13) + CHR(10) + lcA = lcA + "nidtipdoc=" + TRANSFORM(poDate.nIdTipDoc) + CHR(13) + CHR(10) + lcA = lcA + "GENERATOR:" + CHR(13) + CHR(10) + gcMockApeluri + lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr + + loF.Release() + RELEASE loF + RETURN lcA +ENDFUNC + +FUNCTION AmprentaCuSchimbare + LPARAMETERS tcClasa, tcDin, tcIn + LOCAL loF, loCombo, lcA + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 25001, 1) + poDate.nIdTipDoc = IdTipDoc(tcDin) + poGeneratorNumere.ResetNumere() + gnMockNumar = 100 + gcMockApeluri = "" + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + poDate.dataact = DATE(gnAn, gnLuna, 1) + poDate.dataireg = poDate.dataact + poDate.id_client = 0 + poDate.nract = 555 + gcErr = "" + + loF = CREATEOBJECT(tcClasa) + IF VARTYPE(loF) <> 'O' + RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr + ENDIF + IF tcClasa == 'frm_date_factura' + loCombo = loF.ct_clb_fdoc._combobox1 + ELSE + loCombo = loF.clb_fdoc.cboFdoc + ENDIF + loCombo.Value = tcIn + + gcMockApeluri = "" + gcErr = "" + loF.do_schimba_tipdoc() + + lcA = "nidtipdoc=" + TRANSFORM(poDate.nIdTipDoc) + CHR(13) + CHR(10) + lcA = lcA + "nract_alocat=" + TRANSFORM(poDate.nract <> 0) + CHR(13) + CHR(10) + lcA = lcA + "GENERATOR:" + CHR(13) + CHR(10) + gcMockApeluri + lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr + + loF.Release() + RELEASE loF + RETURN lcA +ENDFUNC + +FUNCTION IdTipDoc + LPARAMETERS tcFel + RETURN IIF(tcFel == "PROFORMA", 23, IIF(tcFel == "BON FISCAL", 3, 5)) +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + CHR(13) + CHR(10) +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s13_mesaj_cota_lipsa.prg b/utile/Teste/facturare_unificat/test_s13_mesaj_cota_lipsa.prg new file mode 100644 index 0000000..99299d3 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s13_mesaj_cota_lipsa.prg @@ -0,0 +1,291 @@ +* test_s13_mesaj_cota_lipsa.prg +* Headless: do_adauga_tot semnaleaza, la finalul adaugarii in masa, liniile a caror cota de TVA nu +* are coloana de jurnal (explicatie TVA) in perioada de lucru - in loc sa le lase sa cada abia la +* scriere, in Oracle, cu "Nu a fost gasita cota de TVA! (FACT-013 : )". +* +* Nomenclatorul e cel REAL, citit din MARIUSM_AUTO@ROA_CENTRAL prin update_jtva_coloane([JV], ...) +* si filtrat exact ca in ofacturare.prg:237 (ramura tva_incasare = 0). Perioada de lucru se fixeaza +* pe 2026/08, unde COTE_TVA are 0/11/19/21 - deci 19% GASESTE coloana, iar 24% NU. +* +* crsarticole se construieste direct (ca in test_s4e_0_adauga_articol.prg): do_adauga_tot citeste +* doar cursorul, nu gridul. Ce se probeaza e traseul real do_adauga_tot -> do_adauga_articol -> +* do_initializeaza_articol -> crsfactura, nu incarcarea candidatilor. +* +* CAZ_A (v2, mixt): doua articole, unul pe 19% si unul pe 24% -> un singur mesaj, care numeste +* articolul de 24% si cota lui, nu si pe cel de 19%; ambele linii RAMAN in crsfactura. +* CAZ_B (v2, curat): doua articole pe 19% -> niciun mesaj. +* CAZ_C (v1, mixt): acelasi scenariu ca A, pe frm_facturare_articole (copia veche a metodei). +* +* amessagebox e mocat (mock_validare_antet.prg, pus PRIMUL in SET PROCEDURE) - textul complet al +* mesajului ajunge in gcMockApeluri, cu CHR(13) transformat in "|". +* +* SET TABLEPROMPT OFF e obligatoriu: fara el, un fisier lipsa (saft_taxtable.dbf) scoate dialogul +* modal "Open" din do_adauga_articol si rularea pare agatata la nesfarsit, fara nimic in log. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s13_mesaj_cota_lipsa.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s13_mesaj_cota_lipsa.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 0; gnAn/gnLuna = 2026/08. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF += SYS(2335, 0) +SET TABLEPROMPT OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET NULLDISPLAY TO '' + +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s13_mesaj_cota_lipsa.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +ON ERROR DO CtErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +DO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\test_init_env_auto_roafacturare.prg" WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 +IF TYPE('gnHandle') <> 'N' OR gnHandle <= 0 + DO CtLog WITH "FAIL: conexiune Oracle esuata" + DO Final +ENDIF +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc +IF !actualizeaza_optiuni_program() + DO CtLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 0 +DO CtLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +*-- nomenclatorul real, filtrat exact ca in ofacturare.prg:237 (ramura tva_incasare = 0) +update_jtva_coloane([JV], [jtva_coloane_temp]) +update_saft_taxtable() +SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane +DO CtLog WITH "jtva_coloane reccount=" + TRANSFORM(RECCOUNT('jtva_coloane')) +SELECT jtva_coloane +SET FILTER TO +LOCATE FOR cota_tva = 19 +DO Assert WITH FOUND(), "premisa: cota 19 ARE coloana de jurnal in 2026/08" +LOCATE FOR cota_tva = 24 +DO Assert WITH !FOUND(), "premisa: cota 24 NU are coloana de jurnal in 2026/08" + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poDate = NULL +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") + +DO CazMixt WITH 'frm_facturare_articole2', "[CAZ_A v2 mixt] " +DO CazCurat WITH 'frm_facturare_articole2', "[CAZ_B v2 curat] " +DO CazMixt WITH 'frm_facturare_articole', "[CAZ_C v1 mixt] " + +DO Final + +*---------------------------------------------------------------------------------------- +* Un articol pe 19% (are coloana) si unul pe 24% (nu are) -> exact un mesaj, care numeste doar +* articolul de 24%. Ambele linii raman pe document. +PROCEDURE CazMixt + LPARAMETERS tcClasa, tcCaz + LOCAL loForm, lnRecDupa + gcCaz = tcCaz + DO CtLog WITH "PAS: " + gcCaz + tcClasa + + DO Reseteaza WITH 3 + DO CreeazaCrsArticole + INSERT INTO crsarticole VALUES (1, 401, "ARTICOL COTA 19", 5, 0, 0, 100, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM401", "", "RON") + INSERT INTO crsarticole VALUES (2, 402, "ARTICOL COTA 24", 3, 0, 0, 200, 0, 1.24, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM402", "", "RON") + GO TOP IN crsarticole + + loForm = CREATEOBJECT(tcClasa) + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject " + tcClasa + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + gcErr = "" + gnErr = 0 + gcMockApeluri = "" + loForm.do_adauga_tot() + DO CtLog WITH " mesaje: " + CHR(13) + CHR(10) + gcMockApeluri + + DO Assert WITH "explicatie de TVA" $ gcMockApeluri, "mesajul agregat a fost afisat" + DO Assert WITH "pentru 1 linii" $ gcMockApeluri, "mesajul numara exact o linie" + DO Assert WITH "ARTICOL COTA 24" $ gcMockApeluri, "mesajul numeste articolul de 24%" + DO Assert WITH "24.00%" $ gcMockApeluri, "mesajul numeste cota 24.00%" + DO Assert WITH !("ARTICOL COTA 19" $ gcMockApeluri), "mesajul NU semnaleaza articolul de 19%" + DO Assert WITH RECCOUNT('crsfactura') = 2, "ambele linii raman pe document (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")" + + IF USED('crsfactura') + lnRecDupa = RECNO('crsfactura') + DO Assert WITH BETWEEN(lnRecDupa, 1, RECCOUNT('crsfactura')), ; + "pozitia in crsfactura e restaurata, nu EOF (Recno=" + TRANSFORM(lnRecDupa) + ")" + SELECT crsfactura + LOCATE FOR id_articol = 402 + DO Assert WITH FOUND() AND NVL(id_jtva_coloana, 0) = 0, "linia de 24% a ramas fara id_jtva_coloana" + LOCATE FOR id_articol = 401 + DO Assert WITH FOUND() AND NVL(id_jtva_coloana, 0) > 0, "linia de 19% si-a gasit coloana" + ENDIF + + DO Inchide WITH 'crsarticole' + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* Doar cote valabile -> niciun mesaj (cazul normal nu se deranjeaza). +PROCEDURE CazCurat + LPARAMETERS tcClasa, tcCaz + LOCAL loForm + gcCaz = tcCaz + DO CtLog WITH "PAS: " + gcCaz + tcClasa + + DO Reseteaza WITH 3 + DO CreeazaCrsArticole + INSERT INTO crsarticole VALUES (1, 411, "ARTICOL BUN UNU", 5, 0, 0, 100, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM411", "", "RON") + INSERT INTO crsarticole VALUES (2, 412, "ARTICOL BUN DOI", 3, 0, 0, 200, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM412", "", "RON") + GO TOP IN crsarticole + + loForm = CREATEOBJECT(tcClasa) + IF VARTYPE(loForm) <> 'O' + DO Assert WITH .F., "Createobject " + tcClasa + RETURN + ENDIF + + gcErr = "" + gnErr = 0 + gcMockApeluri = "" + loForm.do_adauga_tot() + DO CtLog WITH " mesaje: [" + gcMockApeluri + "]" + + DO Assert WITH !("explicatie de TVA" $ gcMockApeluri), "niciun mesaj pe cazul normal" + DO Assert WITH RECCOUNT('crsfactura') = 2, "ambele linii adaugate (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")" + + DO Inchide WITH 'crsarticole' + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE CreeazaCrsArticole + SELECT 0 + CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ; + gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ; + preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ; + Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; + codmat C(50), codbare C(50), nume_val C(20)) +ENDPROC + +PROCEDURE Reseteaza + LPARAMETERS tnTip + LOCAL lnIdSet + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + DO Inchide WITH 'saft_tip_facturi' + SELECT 0 + + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcErr = "" + gnErr = 0 + gnMockRaspuns = 6 + gcMockDuplicat = "" + + lnIdSet = 26000 + tnTip + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 78 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_valuta = 1 + poDate.in_valuta = 0 + poDate.listaid = "1" + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO CtLog WITH "PASS: " + gcCaz + tcMsg + ELSE + gnFail = gnFail + 1 + DO CtLog WITH "FAIL: " + gcCaz + tcMsg + ENDIF +ENDPROC + +PROCEDURE CtLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE CtErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO CtLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO CtLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO CtLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3_4_cursor_articole.prg b/utile/Teste/facturare_unificat/test_s3_4_cursor_articole.prg new file mode 100644 index 0000000..7d09b58 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3_4_cursor_articole.prg @@ -0,0 +1,534 @@ +* test_s3_4_cursor_articole.prg +* Headless: dovedeste ca extragerea constructiei cursorului de articole din bucla procedurii factureaza +* (COMUN\programe\ofacturare.prg:261-438, starea dinaintea S3-4a) intr-o functie globala +* (incarca_cursor_articole, COMUN\programe\ofacturare.prg) e o REFACTORIZARE PURA: pe aceleasi +* intrari, cele doua implementari lasa in urma exact aceleasi cursoare (structura + continut), acelasi +* rezultat, acelasi SQL trimis la Oracle, aceleasi apeluri de generator, acelasi dialog si aceleasi erori. +* +* Implementarea de REFERINTA (PROCEDURE BlocVechi, la finalul fisierului) e o copie VERBATIM a blocului +* din backup (COMUN\programe\ofacturare.pre_s3_4a.bak.prg:261-438), dedentata cu doua taburi, plus o +* singura linie de marcaj (glVechiArticole = .T.) pe pozitia ELSE-ului "am articole" - exact acolo unde +* functia noua pune loRezultat.lArticole = .T. Generata mecanic, nu transcrisa de mana. +* +* Oracle NU se atinge pe calea articolelor: goExecutor e inlocuit temporar cu oExecutorMock, care +* intercepteaza doar apelul pe cursorul crsarticole (jurnalizeaza SQL-ul si construieste un cursor +* sintetic controlat de test) si trimite orice alt apel la executorul real (citeste_cursuri_zi ramane +* real). Generatorul de numere e oGeneratorMock, vizualizeaza_curs e mock. NU se consuma numere reale. +* +* REZULTAT ASTEPTAT (declarat inainte de rulare): +* A. Pentru fiecare caz, amprenta VECHI == amprenta NOU. Amprenta cuprinde: rezultatul (nSucces, +* cCursor, lArticole), formularul de articole ales de apelant (lcObject), cursoarele crsarticole, +* crsarticole1, crsfactura, crscursuri, crspolitici, crscontracte, crsgestiunidest, crsCtrTemp +* (deschis/nu, reccount, structura, continut), aliasul selectat la iesire, poDate.Curs / +* .multiplicator / .id_agent, jurnalul generatorului, SQL-ul trimis, ultimul dialog, erorile VFP. +* B. Cazuri: toate cele 12 ramuri ale Do Case-ului pe tnTip (inclusiv copierea si ramura fara potrivire), +* ambele valori pentru in_valuta, eProforma = 1, cele doua esecuri (Oracle -20005 si alta eroare) si +* cursorul gol. +* C. SQL-ul jurnalizat e nevid si identic intre cele doua implementari pe fiecare ramura - dovada ca +* Do Case-ul a fost mutat neschimbat. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_4_cursor_articole.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_4_cursor_articole.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockNumar +PUBLIC gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs, gcMockUltimMesaj, gnMockUltimTip +PUBLIC glVechiArticole, gnVechiSucces, gcVechiCursor, gcVechiObject, goExecutorReal +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_4_cursor_articole.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) +gnFail = 0 +gnPass = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockNumar = 0 +gcMockSql = "" +gnMockSucces = 1 +gnMockEroare = 0 +gcMockMod = "PLIN" +gcMockCurs = "" +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +glVechiArticole = .F. +gnVechiSucces = 0 +gcVechiCursor = "" +gcVechiObject = "" +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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_articole.prg", ; + &lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg" +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + +* jtva_coloane_temp e nevoie ramurii tnTip = 30 (update_jtva_coloane), la fel ca in factureaza +DO AfLog WITH "PAS: update_jtva_coloane" +update_jtva_coloane([JV], [jtva_coloane_temp]) +DO AfLog WITH "PAS: jtva_coloane_temp gata" + +PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") +poDateGestiuneDest = CREATEOBJECT("oDateGestiune") +poDate = NULL + +goExecutorReal = goExecutor +goExecutor = CREATEOBJECT("oExecutorMock") +goExecutor.oReal = goExecutorReal + +* --- ramurile Do Case-ului pe tnTip (eticheta = ramura acoperita) --- +DO Caz WITH 1, .F., "PLIN", 1, 0, 0, 0, "lista de preturi" +DO Caz WITH 22, .F., "PLIN", 1, 0, 0, 0, "lista de preturi" +DO Caz WITH 5, .F., "PLIN", 1, 0, 1, 0, "lista de preturi, in valuta" +DO Caz WITH 29, .F., "PLIN", 1, 0, 0, 0, "lista de preturi" +DO Caz WITH 7, .F., "PLIN", 1, 0, 0, 0, "lista de preturi" +DO Caz WITH 10, .F., "PLIN", 1, 0, 0, 0, "lista de preturi" +DO Caz WITH 23, .F., "PLIN", 1, 0, 0, 0, "lista de preturi" +DO Caz WITH 2, .F., "PLIN2", 1, 0, 0, 0, "contract" +DO Caz WITH 26, .F., "PLIN2", 1, 0, 0, 0, "contract" +DO Caz WITH 6, .F., "PLIN2", 1, 0, 0, 0, "contract" +DO Caz WITH 52, .F., "PLIN", 1, 0, 1, 0, "contract in valuta" +DO Caz WITH 3, .F., "PLIN", 1, 0, 0, 0, "comanda" +DO Caz WITH 21, .F., "PLIN", 1, 0, 0, 0, "comanda" +DO Caz WITH 25, .F., "PLIN", 1, 0, 0, 0, "comanda" +DO Caz WITH 28, .F., "PLIN", 1, 0, 0, 0, "comanda" +DO Caz WITH 42, .F., "PLIN", 1, 0, 0, 0, "comanda" +DO Caz WITH 47, .F., "PLIN", 1, 0, 0, 0, "comanda" +DO Caz WITH 4, .F., "PLIN", 1, 0, 0, 0, "avize" +DO Caz WITH 41, .F., "PLIN", 1, 0, 0, 0, "gestiune (transfer subunitati)" +DO Caz WITH 30, .F., "PLIN", 1, 0, 0, 0, "aviz din NIR" +DO Caz WITH 27, .F., "PLIN", 1, 0, 0, 0, "lucrare (crsgestiunidest)" +DO Caz WITH 8, .F., "PLIN", 1, 0, 0, 0, "retur" +DO Caz WITH 9, .F., "PLIN", 1, 0, 0, 0, "retur" +DO Caz WITH 24, .F., "PLIN", 1, 0, 0, 0, "aviz retur" +DO Caz WITH 45, .F., "PLIN", 1, 0, 0, 0, "preturi pe locatie" +DO Caz WITH 48, .F., "PLIN", 1, 0, 0, 0, "articole k" +DO Caz WITH 49, .F., "PLIN", 1, 0, 0, 0, "articole k" +DO Caz WITH 1, .T., "PLIN", 1, 0, 0, 0, "copiere document" +DO Caz WITH 99, .F., "PLIN", 1, 0, 0, 0, "fara ramura in Do Case" + +* --- variante pe acelasi tnTip --- +DO Caz WITH 1, .F., "PLIN", 1, 0, 0, 1, "proforma (gestionabil = 0)" +DO Caz WITH 1, .F., "GOL", 1, 0, 0, 0, "cursor gol" +DO Caz WITH 1, .F., "FARA", -1, 20005, 0, 0, "esec Oracle -20005" +DO Caz WITH 1, .F., "FARA", -1, 1400, 0, 0, "esec Oracle, alta eroare" +* contract fara al doilea cursor (crsarticole1) nu se poate testa headless: VFP deschide dialogul +* "locate file" cand aliasul lipseste in Select ... From (lcCursor + [1]) - comportament preexistent + +DO Final + +*---------------------------------------------------------------------------------------- +* implementarea de REFERINTA - copie verbatim a blocului din ofacturare.pre_s3_4a.bak.prg:261-438 +PROCEDURE BlocVechi + LPARAMETERS tnTip, tlCopiere + LOCAL lcCursor, lcObject, lcSqlCursor, lnSucces, loArticole, llCopiere + llCopiere = tlCopiere + glVechiArticole = .F. + +Do Case + Case m.llCopiere + lcSqlCursor = [{call pack_facturare.cursor_retur_document(?poDate.in_valuta,?poDate.listaid,1,?poDate.eProforma,?gnIdUtil)}] + + *!* modificare v 2.0.93 ; modificare v 2.0.95 : am adaugat 49 + Case Inlist(tnTip, 48, 49) + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_articole_k(?poDate.zi_curs,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + *!* modificare v 2.0.93 ^ + *!* modificare v 2.0.87 + Case tnTip = 45 + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + [?poDate.listaid,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + *!* modificare v 2.0.87 ^ + Case Inlist(tnTip, 1, 22, 5, 29, 7, 10, 23) && lista de preturi + && modificare v 2.0.56 : am adaugat 10 + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + [?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + Case Inlist(tnTip, 2, 26, 6, 52) && contract + poDate.id_agent = 0 + *!* modificare v 2.0.67 + *!* lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_contract(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + *!* [?poDate.listaid,?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?@pnTipFacturare,] + ; + *!* [?@poDate.id_agent,?@poDate.nume_agent)}] + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_contract(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + [?poDate.listaid,?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala,?@poDate.id_agent,?@poDate.nume_agent)}] + *!* modificare v 2.0.67 ^ + Case Inlist(tnTip, 3, 21, 25, 28, 42, 47) && comenzi + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_comanda(?poDate.zi_curs,?poDate.tip,?poDate.listaid,?gnIdUtil)}] + Case tnTip = 4 && din avize + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}] + Case Inlist(tnTip, 41) && transfer intre subunitati pe baza de lista de preturi + retur transfer + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_gestiune(?poDate.zi_curs,?poDate.id_pol,] + ; + [?poDate.id_client,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + Case tnTip = 30 && transfer intre subunitati pe baza de NIR + lcSqlCursor = [{call pack_facturare.cursor_aviz_nir(?poDate.id_client,?poDate.id_furnizor,?poDate.nrfactachi,?gnIdSucursala)}] + *!* modificare v 2.0.90 ^ + Case tnTip = 27 + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_lucrare(?poDate.zi_curs,?poDate.id_client,] + ; + [?poDate.id_lucrare,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + *!* modificare v 2.0.56 + Case Inlist(tnTip, 8, 9, 24) && 8,9 = facturi de retur, 24 = aviz retur + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_retur(?poDate.in_valuta,?poDate.listaid,?gnIdUtil)}] +Endcase + +lcCursor = [crsarticole] +lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor) + +If lnSucces < 0 + AMESSAGEBOX(goExecutor.oPrelucrareEroare(), 16, "Eroare") + If goExecutor.nEroare = 20005 + vizualizeaza_curs(poDate.zi_curs) + ENDIF + *!* nu inchid crsCtrTemp + *!* modificare v 2.0.56 + *!* poGeneratorNumere.dezaloca_numar(pnIdTipDoc) + *!* modificare v 2.0.56 ^ + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) && 29.03.2021 deblochez numarul ca sa il pot reda pe acelasi cand se reincarca formularul +Else + If Reccount(lcCursor) = 0 And (!Used(lcCursor + '1') Or (Used(lcCursor + '1') And Reccount(lcCursor + '1') = 0)) + AMESSAGEBOX("Nu exista articole pentru optiunile alese!", 48, "Atentie") + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + + Use In (SELECT('crsCtrTemp')) + ELSE + glVechiArticole = .T. + + * Daca este o proforma, consider toate articolele negestionabile, pentru a nu mai alege din stoc + * 12.03.2021 + IF poDate.eProforma = 1 + UPDATE (m.lcCursor) SET gestionabil = 0 + GO TOP IN (m.lcCursor) + ENDIF + + creeaza_facturacrs([crsfactura]) + + If tnTip = 30 && Aviz din NIR + * populez factura cu articolele din NIR + Local lcIdJtva + Select (lcCursor) + Scan + Scatter Name loArticole Memo + Select crsfactura + update_jtva_coloane([JV], 'CrsCotaTva', 0) + Select CrsCotaTva + Locate For cota_tva = (loArticole.proc_tvav * 100 - 100) + If Found() + lcIdJtva = id_jtva_coloana + Else + lcIdJtva = Null + Endif + Use In CrsCotaTva + + Insert Into crsfactura ; + (id_c, id_temp, id_articol, id_gestiune, Cont, um, ; + id_valuta, gestionabil, tip_valuta, Curs, multiplicator, id_jtva_coloana, codmat, ; + pret_achizitie, pretd, id_valuta_d, denumire, pretftva, pretctva, valftva, valtva, valctva, ; + cantitate, discountftva, discountctva, valdiscountftva, valdiscounttva, ; + valdiscountctva, valdiminuatftva, valdiminuattva, valdiminuatctva, proc_tvav, cu_tva, serie, ; + id_set_fact, explicatie, id_pol, id_ctr ) ; + Values (; + loArticole.id_c, loArticole.id_c, loArticole.id_articol, loArticole.id_gestiune, loArticole.Cont, loArticole.um, ; + loArticole.id_valuta, loArticole.gestionabil, loArticole.tip_valuta, loArticole.Curs, ; + loArticole.multiplicator, lcIdJtva, Nvl(loArticole.codmat, ' '), ; + loArticole.preta, loArticole.pretd, loArticole.id_valuta_d, loArticole.denumire, ; + loArticole.pretftva, loArticole.pretctva, ; + Round(loArticole.cantitate * loArticole.pretftva, gnpc), ; + Round(loArticole.cantitate * loArticole.tvav, gnpc), ; + Round(loArticole.cantitate * loArticole.pretctva, gnpc), ; + loArticole.cantitate, 0, 0, 0, 0, ; + 0, Round(loArticole.cantitate * loArticole.pretftva, gnpc), Round(loArticole.cantitate * loArticole.tvav, gnpc), ; + Round(loArticole.cantitate * loArticole.pretctva, gnpc), loArticole.proc_tvav, loArticole.preturi_cu_tva, '', ; + Null, '', Null, Null) + + Select (lcCursor) + Endscan + Release lcIdJtva + Select crsfactura + Release loArticole + + ENDIF && tnTip = 30 + + If tnTip = 27 + lcObject = [frm_avizare_lucrare] + Create Cursor crsgestiunidest(id_gestiune N(20), nume_gestiune c(100)) + Select crsgestiunidest + Append Blank + Replace id_gestiune With - 9999, nume_gestiune With '' + Insert Into crsgestiunidest(id_gestiune, nume_gestiune) ; + Select Distinct id_gestiune, nume_gestiune From (lcCursor) Order By nume_gestiune + Else + Local llFacturareNoua + llFacturareNoua = (Type('plFacturareNoua') = 'L' And m.plFacturareNoua) + lcObject = IIF(m.llFacturareNoua, [frm_facturare_articole2], [frm_facturare_articole]) + Endif + *!* modificare v 2.0.67 + *!* Endif + *!* modificare v 2.0.67 ^ + *!* modificare v 2.0.56 + *!* If Type('crsarticole.curs')<>'U' + *!* Select Distinct Curs,nume_val From crsArticole With (Buffering = .T.) Where tip_valuta = 1 Into Cursor crscursuri + *!* If poDate.in_valuta = 1 + *!* Select crscursuri + *!* poDate.Curs = Curs + *!* Endif + If poDate.in_valuta = 1 + Select Distinct Curs, nume_val, id_valuta, multiplicator From (lcCursor) With (Buffering = .T.) Where tip_valuta = 1 Order By nume_val Into Cursor crscursuri + Select crscursuri + poDate.Curs = Curs + poDate.multiplicator = multiplicator + Else + citeste_cursuri_zi(poDate.zi_curs) + If Reccount('crscursuri') = 0 + Use In crscursuri + Endif + *!* modificare v 2.0.56 ^ + Endif + + If Type(lcCursor + '.nume_lista_preturi') <> 'U' + Create Cursor crspolitici (id_pol N(20), nume_lista_preturi c(100)) + Select crspolitici + *!* modificare v 2.0.77 + *!* Append Blank + *!* Replace id_pol With -9999,nume_lista_preturi With '' + Insert Into crspolitici(id_pol, nume_lista_preturi) Values (-9999, '') + *!* modificare v 2.0.77 ^ + Insert Into crspolitici(id_pol, nume_lista_preturi) ; + Select Distinct id_pol, nume_lista_preturi From (lcCursor) Order By nume_lista_preturi + Endif + + *!* modificare v 2.0.67 + If Inlist(tnTip, 2, 6, 26) + Create Cursor crscontracte(id_ctr N(20), numar_contract c(100), Data d Null, numar c(50) Null) + Select crscontracte + Append Blank + Replace id_ctr With - 9999, numar_contract With '' + Insert Into crscontracte(id_ctr, numar_contract, Data, numar) ; + Select Distinct id_ctr, numar_contract, Data, numar From (lcCursor + [1]) Order By Data, numar + Endif + *!* modificare v 2.0.67 ^ + Endif + Endif + gnVechiSucces = lnSucces + gcVechiCursor = IIF(TYPE('lcCursor') = 'C', lcCursor, '') + gcVechiObject = IIF(TYPE('lcObject') = 'C', lcObject, '') +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz + LPARAMETERS tnTip, tlCopiere, tcMod, tnSucces, tnEroare, tnInValuta, tnEProforma, tcEticheta + LOCAL lcVechi, lcNou, lcSqlVechi, lcSqlNou, loRez + gcCaz = "[tip=" + TRANSFORM(tnTip) + IIF(tlCopiere, " copiere", "") + " " + tcMod + ; + " succes=" + TRANSFORM(tnSucces) + " eroare=" + TRANSFORM(tnEroare) + ; + " valuta=" + TRANSFORM(tnInValuta) + " proforma=" + TRANSFORM(tnEProforma) + ; + " " + tcEticheta + "] " + DO AfLog WITH "PAS: " + gcCaz + + DO Reseteaza WITH tnTip, tcMod, tnSucces, tnEroare, tnInValuta, tnEProforma + DO BlocVechi WITH tnTip, tlCopiere + lcSqlVechi = gcMockSql + lcVechi = Amprenta(gnVechiSucces, gcVechiCursor, glVechiArticole, gcVechiObject) + + DO Reseteaza WITH tnTip, tcMod, tnSucces, tnEroare, tnInValuta, tnEProforma + loRez = incarca_cursor_articole(tnTip, tlCopiere, poGeneratorNumere) + lcSqlNou = gcMockSql + IF VARTYPE(loRez) <> 'O' + gnFail = gnFail + 1 + DO AfLog WITH "FAIL " + gcCaz + "incarca_cursor_articole nu a intors obiect: " + gcErr + RETURN + ENDIF + lcNou = Amprenta(loRez.nSucces, loRez.cCursor, loRez.lArticole, ObiectNou(tnTip, loRez.lArticole)) + + IF lcVechi == lcNou + gnPass = gnPass + 1 + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL " + gcCaz + "amprente diferite:" + DO AfLog WITH "--- VECHI ---" + DO AfLog WITH lcVechi + DO AfLog WITH "--- NOU ---" + DO AfLog WITH lcNou + ENDIF + + DO Assert WITH lcSqlVechi == lcSqlNou, "SQL identic; vechi=[" + STRTRAN(lcSqlVechi, CHR(13) + CHR(10), " ") + "] nou=[" + STRTRAN(lcSqlNou, CHR(13) + CHR(10), " ") + "]" + DO Assert WITH !EMPTY(lcSqlNou), "SQL jurnalizat nevid" + DO Assert WITH TRANSFORM(loRez.cSql) + CHR(13) + CHR(10) == lcSqlNou, "loRez.cSql = SQL-ul trimis executorului" + DO Assert WITH loRez.nSucces = tnSucces, "loRez.nSucces = " + TRANSFORM(tnSucces) + DO Assert WITH loRez.cCursor == [crsarticole], "loRez.cCursor = crsarticole" + DO Assert WITH loRez.lArticole = (tcMod == "PLIN" OR tcMod == "PLIN2"), "loRez.lArticole = " + TRANSFORM(tcMod == "PLIN" OR tcMod == "PLIN2") +ENDPROC + +*---------------------------------------------------------------------------------------- +FUNCTION Amprenta + LPARAMETERS tnSucces, tcCursor, tlArticole, tcObject + LOCAL lcA, lcCRLF + lcCRLF = CHR(13) + CHR(10) + lcA = "REZ: succes=" + TRANSFORM(tnSucces) + " cursor=" + TRANSFORM(tcCursor) + ; + " articole=" + TRANSFORM(tlArticole) + " obiect=" + TRANSFORM(tcObject) + lcCRLF + lcA = lcA + "ALIAS=" + TRANSFORM(ALIAS()) + lcCRLF + lcA = lcA + "poDate: curs=" + TRANSFORM(poDate.Curs) + " mult=" + TRANSFORM(poDate.multiplicator) + ; + " id_agent=" + TRANSFORM(poDate.id_agent) + " nract=" + TRANSFORM(poDate.nract) + ; + " gestionabil_proforma=" + TRANSFORM(poDate.eProforma) + lcCRLF + lcA = lcA + DumpCursor('crsarticole') + DumpCursor('crsarticole1') + DumpCursor('crsfactura') + ; + DumpCursor('crscursuri') + DumpCursor('crspolitici') + DumpCursor('crscontracte') + ; + DumpCursor('crsgestiunidest') + DumpCursor('crsCtrTemp') + lcA = lcA + "GENERATOR:" + lcCRLF + gcMockApeluri + lcA = lcA + "DIALOG: [" + TRANSFORM(gcMockUltimMesaj) + "] tip=" + TRANSFORM(gnMockUltimTip) + lcCRLF + lcA = lcA + "CURS:" + lcCRLF + gcMockCurs + lcA = lcA + "ERORI:" + lcCRLF + gcErr + RETURN lcA +ENDFUNC + +*---------------------------------------------------------------------------------------- +FUNCTION DumpCursor + LPARAMETERS tcAlias + LOCAL lcA, lnRec, lnSel, i, j, lcCRLF + LOCAL ARRAY laF[1, 1] + lcCRLF = CHR(13) + CHR(10) + IF !USED(tcAlias) + RETURN "[" + tcAlias + "] inchis" + lcCRLF + ENDIF + lnSel = SELECT() + SELECT (tcAlias) + lnRec = RECNO() + lcA = "[" + tcAlias + "] rec=" + TRANSFORM(RECCOUNT()) + " recno=" + TRANSFORM(lnRec) + ; + " campuri=" + TRANSFORM(FCOUNT()) + lcCRLF + =AFIELDS(laF) + FOR i = 1 TO ALEN(laF, 1) + lcA = lcA + " " + ALLTRIM(laF[i, 1]) + " " + laF[i, 2] + TRANSFORM(laF[i, 3]) + "," + TRANSFORM(laF[i, 4]) + lcCRLF + ENDFOR + SCAN + lcA = lcA + " |" + FOR j = 1 TO FCOUNT() + lcA = lcA + TRANSFORM(EVALUATE(FIELD(j))) + "|" + ENDFOR + lcA = lcA + lcCRLF + ENDSCAN + IF lnRec > 0 AND lnRec <= RECCOUNT() + GO lnRec + ENDIF + SELECT (lnSel) + RETURN lcA +ENDFUNC + +*---------------------------------------------------------------------------------------- +* ce ramane in factureaza dupa extragere: alegerea formularului de articole (linia :439 de azi) +FUNCTION ObiectNou + LPARAMETERS tnTip, tlArticole + LOCAL llFacturareNoua + IF !tlArticole + RETURN '' + ENDIF + IF tnTip = 27 + RETURN [frm_avizare_lucrare] + ENDIF + llFacturareNoua = (TYPE('plFacturareNoua') = 'L' AND m.plFacturareNoua) + RETURN IIF(m.llFacturareNoua, [frm_facturare_articole2], [frm_facturare_articole]) +ENDFUNC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip, tcMod, tnSucces, tnEroare, tnInValuta, tnEProforma + LOCAL lnIdSet + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + SELECT 0 + + gcMockMod = tcMod + gnMockSucces = tnSucces + gnMockEroare = tnEroare + gcMockSql = "" + gcMockCurs = "" + gcMockUltimMesaj = "" + gnMockUltimTip = 0 + gcErr = "" + gnMockNumar = 100 + glVechiArticole = .F. + gnVechiSucces = 0 + gcVechiCursor = "" + gcVechiObject = "" + + lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10 + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.nIdTipDoc = IIF(tnTip < 21 OR INLIST(tnTip, 45, 48, 49, 51, 52), 5, 6) + poDate.tip = tnTip + poDate.zi_curs = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.zi_curs + poDate.dataireg = poDate.zi_curs + poDate.in_valuta = tnInValuta + poDate.eProforma = tnEProforma + poDate.id_valuta = 1 + poDate.listaid = '1' + poDate.id_gestiune_init = 1 + poDate.id_pol = 1 + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_lucrare = 1 + poDate.nract = 0 + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ")" + CHR(13) + CHR(10) +ENDPROC + +PROCEDURE Final + IF TYPE('goExecutorReal') = 'O' + goExecutor = goExecutorReal + ENDIF + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3_4b_incarca_articole.prg b/utile/Teste/facturare_unificat/test_s3_4b_incarca_articole.prg new file mode 100644 index 0000000..a08c4d8 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3_4b_incarca_articole.prg @@ -0,0 +1,503 @@ +* test_s3_4b_incarca_articole.prg +* Headless: do_incarca_articole pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) - metoda +* noua, inerta pana la S3-4c, care valideaza antetul si apeleaza incarca_cursor_articole (S3-4a) +* direct din scope-ul formularului, unde poDate/poGeneratorNumere sunt Private-urile lui factureaza. +* +* Spre deosebire de testele S3-1..S3-3, crsfactura NU e populat dinainte - doar structura goala +* (creeaza_facturacrs), pentru ca grd_factura.Column1.ControlSource e calificat ("crsFactura.denumire"), +* legat la Createobject: fara alias-ul deschis (macar gol), Createobject arunca eroarea 13 "Alias +* 'CRSFACTURA' is not found" - constatare pe cod, nu presupunere. do_incarca_articole e cel care +* (re)populeaza cursorul. +* +* Cazuri: +* A. antet valid (tip 30, aviz din NIR - singura ramura in care incarca_cursor_articole populeaza +* crsfactura direct, nu doar structura goala) -> Return .T., Reccount('crsfactura')>0, +* o.lArticoleIncarcate=.T., but_incarca_articole.Visible=.F., grd_factura.RecordSource='crsfactura'. +* B. antet invalid (dataireg gol) -> Return .F., crsfactura ramane gol, lArticoleIncarcate=.F. +* C. incarca_cursor_articole esueaza (executor mock cu eroare) -> Return .F., crsfactura ramane gol, +* lArticoleIncarcate=.F., but_incarca_articole.Visible ramane .T. +* D. antet valid, document in valuta (tip 5 -> poDate.in_valuta=1 in Init) -> dupa succes, butonul +* but_cursuri (care a inlocuit gridul de cursuri, mutat in frm_cursuri_valutare) devine Enabled, +* pe crscursuri populat exclusiv din crsarticole mockuit (determinist). +* Pentru toate cazurile, but_cursuri exista dar porneste dezactivat la Createobject (Init, +* crscursuri inca inexistent). B/C se opresc devreme (Return .F. inaintea liniei care +* recalculeaza Enabled) -> ramane dezactivat determinist. A (tip 30, fara valuta) nu forteaza +* in_valuta, dar citeste_cursuri_zi merge pe Oracle real (necontrolabil in test) - se verifica +* invariantul Enabled==(Used si Reccount(crscursuri)>0), nu o valoare fixa. +* +* S3-4d (bug #16 pe calea plFacturareNoua, docs\nota_executie_s3_4.md:320-367) - PROCEDURE CazReincercare, +* pe ACEEASI instanta de formular, antet cu valori distincte (tip 30/AVIZ, ca la C): +* E. esecul executorului (ca la C) nu distruge antetul: dupa Return .F., aceeasi instanta (amprenta +* SYS(1272,loForm) neschimbata) si toate campurile de antet capturate inainte raman identice, +* lArticoleIncarcate=.F., but_incarca_articole.Visible=.T. (se poate reincerca). +* F. comutare mock pe succes si reincercare pe ACEEASI instanta -> Return .T., crsfactura populat, +* lArticoleIncarcate=.T., butonul ascuns, antetul tot neschimbat fata de valorile initiale. +* G. numarul nu se arde a doua oara: do_incarca_articole apeleaza necondiotionat poGeneratorNumere.verifica_numar +* inaintea lui incarca_cursor_articole (ofacturare.vc2:18058-18060) - pe cod, nici verifica_numar +* (oserii_numere.prg:227, doar dezaloca daca numarul nu se potriveste cu paPlaje) nici incarca_cursor_articole +* (ofacturare.prg:513-519, doar dezaloca pe eroare/cursor gol) nu apeleaza aloca_numar - pe tot +* traseul E+F se asearta 0 apeluri aloca_numar in gcMockApeluri (ContaLinii); dezaloca_numar se observa +* 1 data (din ramura de eroare a lui E, mostenita neschimbata din codul vechi) - fapt masurat, nu defect +* (niciun numar nou nu s-a alocat la reincercare). +* +* fix do_sterge (docs\verif_referinte_moarte_articole2.md, ofacturare.vc2:18894-18968) - PROCEDURE +* CazSterge, pe o instanta cu crsfactura populat (2 randuri, cazul A): +* H1. do_sterge() pe primul rand (raman randuri) -> fara ERROR, Reccount('crsfactura') scade cu 1. +* H2. do_sterge() pe ultimul rand ramas -> fara ERROR, Reccount('crsfactura') = 0. Inainte de fix, +* ambele ramuri de focus final loveau Thisform.txtArticoleLista/txtArticole/grd_contracte - +* controale absente pe frm_facturare_articole2. +* +* Oracle NU se atinge pe calea articolelor/generatorului: goExecutor -> oExecutorMock, poGeneratorNumere +* -> oGeneratorMock (mock_cursor_articole.prg / mock_generator_numere.prg, ca in test_s3_4_cursor_articole). +* amessagebox/facturi_duplicate -> mock_validare_antet.prg (oAntetFacturare.valideaza_antet ruleaza REAL). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_4b_incarca_articole.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_4b_incarca_articole.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs +PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_4b_incarca_articole.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) +gnFail = 0 +gnPass = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockNumar = 0 +gcMockSql = "" +gnMockSucces = 1 +gnMockEroare = 0 +gcMockMod = "PLIN" +gcMockCurs = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_articole.prg", ; + &lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg" +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +* seriile de facturi/avize sunt pe utilizator in MARIUSM_AUTO: utilizatorul 8 are plaja activa +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +* gridextras.vcx / _cb_base.vcx sunt referite din ofacturare.vcx cu cale relativa sau cu clasa +* rezolvata doar din exe/IDE (grd_factura.cCodMat.cboCodmat) - trebuie inregistrate explicit headless +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +* jtva_coloane_temp, ca in factureaza / test_s3_4_cursor_articole - ramura tnTip = 30 din +* incarca_cursor_articole foloseste update_jtva_coloane +update_jtva_coloane([JV], [jtva_coloane_temp]) + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") +poDate = NULL + +goExecutorReal = goExecutor +goExecutor = CREATEOBJECT("oExecutorMock") +goExecutor.oReal = goExecutorReal + +DO Caz WITH "A_ANTET_VALID" +DO Caz WITH "B_ANTET_INVALID" +DO Caz WITH "C_CURSOR_ESUEAZA" +DO Caz WITH "D_ANTET_VALID_VALUTA" +DO CazReincercare +DO CazSterge + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz + LPARAMETERS tcCaz + LOCAL loForm, llRezultat + gcCaz = "[" + tcCaz + "] " + DO AfLog WITH "PAS: " + gcCaz + + DO Reseteaza WITH tcCaz + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + DO Assert WITH PEMSTATUS(loForm, 'lArticoleIncarcate', 5), "lArticoleIncarcate materializata" + DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate = .F. la Createobject" + DO Assert WITH ObjExists(loForm, 'but_incarca_articole'), "but_incarca_articole prezent" + DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole vizibil la Createobject" + * crscursuri nu exista inca la Init - but_cursuri exista in Objects, dar porneste dezactivat; + * PEMSTATUS ramane .T. si dupa RemoveObject, deci proba reala de prezenta e ObjExists + DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent la Createobject" + DO Assert WITH !loForm.but_cursuri.Enabled, "but_cursuri dezactivat la Createobject" + * grd_factura.Column1.ControlSource e calificat ("crsFactura.denumire") - crsfactura trebuie sa + * existe (structura goala, creeaza_facturacrs) chiar la Createobject, altfel eroare 13 la legare; + * "fara articole incarcate" se verifica prin Reccount = 0, nu prin alias inchis + DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura deschis dar gol inainte de do_incarca_articole" + + llRezultat = loForm.do_incarca_articole() + + DO CASE + CASE tcCaz == "A_ANTET_VALID" + DO Assert WITH llRezultat, "Return .T. pe antet valid" + DO Assert WITH USED('crsfactura'), "crsfactura deschis dupa succes" + DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') > 0, "crsfactura populat dupa succes" + DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. dupa succes" + DO Assert WITH !loForm.but_incarca_articole.Visible, "but_incarca_articole invizibil dupa succes" + DO Assert WITH UPPER(loForm.grd_factura.RecordSource) == 'CRSFACTURA', "grd_factura.RecordSource = crsfactura" + * tip 30 nu forteaza poDate.in_valuta=1 - starea butonului de cursuri trebuie sa ramana in + * acord cu starea reala a lui crscursuri (populat sau nu de citeste_cursuri_zi), nu presupusa + * fix pe .F. + DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent dupa succes (fara valuta)" + DO Assert WITH loForm.but_cursuri.Enabled == (USED('crscursuri') AND RECCOUNT('crscursuri') > 0), "but_cursuri.Enabled in acord cu starea lui crscursuri" + CASE tcCaz == "B_ANTET_INVALID" + DO Assert WITH !llRezultat, "Return .F. pe antet invalid" + DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura tot gol dupa antet invalid" + DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate tot .F. dupa antet invalid" + DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole tot vizibil dupa antet invalid" + DO Assert WITH "Nu ati completat data inregistrarii!" $ gcMockApeluri, "mesajul de validare a fost dat" + * Return .F. e devreme, inaintea liniei care recalculeaza Enabled - butonul ramane dezactivat + DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent dupa antet invalid" + DO Assert WITH !loForm.but_cursuri.Enabled, "but_cursuri tot dezactivat dupa antet invalid" + CASE tcCaz == "C_CURSOR_ESUEAZA" + DO Assert WITH !llRezultat, "Return .F. pe esec cursor articole" + DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura tot gol dupa esec cursor" + DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate tot .F. dupa esec cursor" + DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole tot vizibil dupa esec cursor" + DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent dupa esec cursor" + DO Assert WITH !loForm.but_cursuri.Enabled, "but_cursuri tot dezactivat dupa esec cursor" + CASE tcCaz == "D_ANTET_VALID_VALUTA" + DO Assert WITH llRezultat, "Return .T. pe antet valid, document in valuta" + DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. dupa succes (valuta)" + DO Assert WITH USED('crscursuri') AND RECCOUNT('crscursuri') > 0, "crscursuri populat dupa succes (valuta)" + DO Assert WITH ObjExists(loForm, 'but_cursuri'), "but_cursuri prezent dupa succes (valuta)" + DO Assert WITH loForm.but_cursuri.Enabled, "but_cursuri activat dupa succes (valuta)" + ENDCASE + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* S3-4d, E+F+G: acelasi formular, doua apeluri do_incarca_articole (esec apoi reincercare cu succes) - +* nu foloseste Reseteaza/Caz (care recreeaza poDate/loForm la fiecare caz) ca sa dovedeasca persistenta +* aceleiasi instante si a antetului intre cele doua apeluri. +PROCEDURE CazReincercare + LOCAL loForm, llR1, llR2, lcAmprenta + LOCAL ldDataIreg, ldZiCurs, lnIdClient, lnIdFurnizor, lcSerieAct, lnNract, lnIdValuta, lnNrFactAchi, lcFdoc, lnIdFdoc + LOCAL lnAlocaNumar, lnDezalocaNumar + + gcCaz = "[E_ANTET_SUPRAVIETUIESTE] " + DO AfLog WITH "PAS: " + gcCaz + + * Reseteaza pe un tcCaz oarecare (cade pe OTHERWISE -> tip 30, mod PLIN) - antetul si mock-ul de + * eroare se suprascriu imediat mai jos, cu valori distincte fata de A/B/C/D + DO Reseteaza WITH "E_ANTET_SUPRAVIETUIESTE" + + poDate.dataireg = DATE(gnAn, gnLuna, 15) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_client = 42 + poDate.id_furnizor = 7 + poDate.serie_act = "EFG" + poDate.nract = 555 + poDate.id_valuta = 3 + poDate.nrfactachi = 9 + poDate.fdoc = "NOTA HANDOFF" + poDate.id_fdoc = 2 + + * fortez esecul cursorului de articole, ca la C_CURSOR_ESUEAZA + gcMockMod = "FARA" + gnMockSucces = -1 + gnMockEroare = 1400 + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + lcAmprenta = SYS(1272, loForm) + + ldDataIreg = poDate.dataireg + ldZiCurs = poDate.zi_curs + lnIdClient = poDate.id_client + lnIdFurnizor = poDate.id_furnizor + lcSerieAct = poDate.serie_act + lnNract = poDate.nract + lnIdValuta = poDate.id_valuta + lnNrFactAchi = poDate.nrfactachi + lcFdoc = poDate.fdoc + lnIdFdoc = poDate.id_fdoc + + * marcheaza inceputul ferestrei de masurare pentru G (apelurile generatorului pe tot traseul E+F) + gcMockApeluri = "" + + llR1 = loForm.do_incarca_articole() + + DO Assert WITH !llR1, "Return .F. pe esecul executorului" + DO Assert WITH SYS(1272, loForm) == lcAmprenta, "aceeasi instanta de formular dupa esec (amprenta neschimbata)" + DO Assert WITH poDate.dataireg == ldDataIreg, "dataireg neschimbata dupa esec" + DO Assert WITH poDate.zi_curs == ldZiCurs, "zi_curs neschimbata dupa esec" + DO Assert WITH poDate.id_client == lnIdClient, "id_client neschimbat dupa esec" + DO Assert WITH poDate.id_furnizor == lnIdFurnizor, "id_furnizor neschimbat dupa esec" + DO Assert WITH poDate.serie_act == lcSerieAct, "serie_act neschimbata dupa esec" + DO Assert WITH poDate.nract == lnNract, "nract neschimbat dupa esec" + DO Assert WITH poDate.id_valuta == lnIdValuta, "id_valuta neschimbat dupa esec" + DO Assert WITH poDate.nrfactachi == lnNrFactAchi, "nrfactachi neschimbat dupa esec" + DO Assert WITH poDate.fdoc == lcFdoc, "fdoc neschimbat dupa esec" + DO Assert WITH poDate.id_fdoc == lnIdFdoc, "id_fdoc neschimbat dupa esec" + DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate = .F. dupa esec" + DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole vizibil dupa esec (se poate reincerca)" + DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura tot gol dupa esec" + + gcCaz = "[F_REINCERCARE_REUSESTE] " + DO AfLog WITH "PAS: " + gcCaz + gcMockMod = "PLIN" + gnMockSucces = 1 + gnMockEroare = 0 + + llR2 = loForm.do_incarca_articole() + + DO Assert WITH llR2, "Return .T. la reincercare" + DO Assert WITH SYS(1272, loForm) == lcAmprenta, "aceeasi instanta de formular dupa reincercare (amprenta neschimbata)" + DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') > 0, "crsfactura populat dupa reincercare" + DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. dupa reincercare" + DO Assert WITH !loForm.but_incarca_articole.Visible, "but_incarca_articole ascuns dupa reincercare" + DO Assert WITH poDate.dataireg == ldDataIreg, "dataireg neschimbata dupa reincercare" + DO Assert WITH poDate.zi_curs == ldZiCurs, "zi_curs neschimbata dupa reincercare" + DO Assert WITH poDate.id_client == lnIdClient, "id_client neschimbat dupa reincercare" + DO Assert WITH poDate.id_furnizor == lnIdFurnizor, "id_furnizor neschimbat dupa reincercare" + DO Assert WITH poDate.serie_act == lcSerieAct, "serie_act neschimbata dupa reincercare" + DO Assert WITH poDate.nract == lnNract, "nract neschimbat dupa reincercare" + DO Assert WITH poDate.id_valuta == lnIdValuta, "id_valuta neschimbat dupa reincercare" + DO Assert WITH poDate.nrfactachi == lnNrFactAchi, "nrfactachi neschimbat dupa reincercare" + DO Assert WITH poDate.fdoc == lcFdoc, "fdoc neschimbat dupa reincercare" + DO Assert WITH poDate.id_fdoc == lnIdFdoc, "id_fdoc neschimbat dupa reincercare" + + gcCaz = "[G_NUMAR_NU_SE_ARDE] " + DO AfLog WITH "PAS: " + gcCaz + lnAlocaNumar = ContaLinii(gcMockApeluri, "aloca_numar(") + lnDezalocaNumar = ContaLinii(gcMockApeluri, "dezaloca_numar(") + DO AfLog WITH gcCaz + "apeluri generator pe traseul E+F: " + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), " | ") + DO Assert WITH lnAlocaNumar = 0, "aloca_numar NU e apelat pe traseul E+F (niciun numar nou la reincercare) - observat " + TRANSFORM(lnAlocaNumar) + DO AfLog WITH gcCaz + "dezaloca_numar observat de " + TRANSFORM(lnDezalocaNumar) + " ori pe traseul E+F (din ramura de eroare a lui incarca_cursor_articole la E, neschimbata de S3-4a/b - comportament curent, nu defect)" + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* fix do_sterge (docs\verif_referinte_moarte_articole2.md): metoda incheia focusul pe +* Thisform.txtArticoleLista/txtArticole/grd_contracte - controale absente pe frm_facturare_articole2, +* deci orice stergere de articol arunca "membru inexistent" (ON ERROR global marcheaza gnFail, nu +* trece tacut). Proba centrala: EMPTY(gcErr) dupa fiecare apel. Doua sub-cazuri, pe aceeasi instanta, +* populata cu 2 randuri (mock PLIN din mock_cursor_articole.prg): stergerea unui rand cu randuri +* ramase (Reccount('crsfactura')>0) si stergerea ultimului rand (Reccount ajunge la 0). +PROCEDURE CazSterge + LOCAL loForm + + gcCaz = "[H_STERGE]" + DO AfLog WITH "PAS: " + gcCaz + + DO Reseteaza WITH "A_ANTET_VALID" + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + DO Assert WITH loForm.do_incarca_articole(), "do_incarca_articole reuseste (precondimtie do_sterge)" + DO Assert WITH RECCOUNT('crsfactura') = 2, "crsfactura are 2 randuri dupa incarcare (precondimtie)" + + gnMockRaspuns = 6 + gcErr = "" + SELECT crsfactura + GO TOP + loForm.do_sterge() + + DO Assert WITH EMPTY(gcErr), "H1: do_sterge nu arunca eroare cu randuri ramase - " + gcErr + DO Assert WITH RECCOUNT('crsfactura') = 1, "H1: un rand a fost sters (ramane 1 din 2)" + + gcErr = "" + SELECT crsfactura + GO TOP + loForm.do_sterge() + + DO Assert WITH EMPTY(gcErr), "H2: do_sterge nu arunca eroare la ultimul rand (Reccount ajunge la 0) - " + gcErr + DO Assert WITH RECCOUNT('crsfactura') = 0, "H2: ultimul rand a fost sters (Reccount = 0)" + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* numara liniile din tcTexto (jurnalul gcMockApeluri, separat pe linii CHR(13)+CHR(10)) care incep +* efectiv cu tcPrefix - simplul "$" ar confunda "aloca_numar(" cu "dezaloca_numar(" (substring) +FUNCTION ContaLinii + LPARAMETERS tcTexto, tcPrefix + LOCAL ARRAY laLinii[1] + LOCAL lnI, lnN, lnCont + lnCont = 0 + IF EMPTY(tcTexto) + RETURN 0 + ENDIF + lnN = ALINES(laLinii, tcTexto) + FOR lnI = 1 TO lnN + IF LEFT(ALLTRIM(laLinii[lnI]), LEN(tcPrefix)) == tcPrefix + lnCont = lnCont + 1 + ENDIF + ENDFOR + RETURN lnCont +ENDFUNC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tcCaz + LOCAL lnIdSet, lnTip + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + SELECT 0 + + * grd_factura.Column1.ControlSource e calificat ("crsFactura.denumire", nu "denumire") - Createobject + * leaga acest control chiar la instantiere si arunca eroarea 13 daca alias-ul nu exista inca; se + * creeaza structura GOALA (0 randuri), la fel ca first pasul din incarca_cursor_articole + DO creeaza_facturacrs WITH 'crsfactura' + * grd_factura.cGestiune e legat la crsFactura.gestiune, camp inexistent in creeaza_facturacrs + * (are nume_gestiune) - ca in test_s3_controale.prg + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcMockSql = "" + gcMockCurs = "" + gcErr = "" + gnMockNumar = 100 + gnMockRaspuns = 6 + gcMockDuplicat = "" + + DO CASE + CASE tcCaz == "C_CURSOR_ESUEAZA" + gcMockMod = "FARA" + gnMockSucces = -1 + gnMockEroare = 1400 + OTHERWISE + gcMockMod = "PLIN" + gnMockSucces = 1 + gnMockEroare = 0 + ENDCASE + + * tip 5 (lista de preturi) forteaza poDate.in_valuta=1 in oDateFactura::Init (ofacturare_comun.prg:248) + * - singurul mod headless, fara mock suplimentar, de a obtine cazul "document in valuta" + lnTip = IIF(tcCaz == "D_ANTET_VALID_VALUTA", 5, 30) + lnIdSet = 25000 + lnTip - 1 + gnScadereStoc * 10 + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, lnTip) + IF lnTip = 30 + poDate.nIdTipDoc = 6 && AVIZ, ca in factureaza pentru tnTip = 30 + ENDIF + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 77 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + * valideaza_antet (ofacturare_antet.prg:787) cere id_valuta cand !llAviz si in_valuta=1 - doar + * cazul D (tip 5) intra pe aceasta ramura, dar setarea e inofensiva si pentru celelalte cazuri + poDate.id_valuta = 1 + + IF tcCaz == "B_ANTET_INVALID" + poDate.dataireg = {} + ENDIF + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +FUNCTION ObjExists + * prezenta reala in colectia Objects (nu doar PEMSTATUS, care ramane .T. si dupa RemoveObject + * pe o proprietate mostenita din parinte) + LPARAMETERS toForm, tcName + LOCAL i + FOR i = 1 TO toForm.Objects.Count + IF UPPER(toForm.Objects(i).Name) == UPPER(tcName) + RETURN .T. + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + IF TYPE('goExecutorReal') = 'O' + goExecutor = goExecutorReal + ENDIF + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3_controale.prg b/utile/Teste/facturare_unificat/test_s3_controale.prg new file mode 100644 index 0000000..7c9ff39 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3_controale.prg @@ -0,0 +1,199 @@ +* test_s3_controale.prg +* Headless: controalele de antet adaugate pe frm_facturare_articole2 exista dupa Createobject, +* iar frm_date_factura (calea veche, neatinsa) le are in continuare. +* +* Rezultat asteptat (declarat inainte de rulare), pe poDate tip 1, gnScadereStoc = 0 (fara gestiune +* sursa: Init-ul de antet elimina Ct_clb_gestiune_init pe tip 1, deci dupa pasul 1 acesta e ABSENT): +* frm_facturare_articole2: Clb_dataireg, Ct_clb_politici_preturi(*), txtCodFiscal, lblCodFiscal, +* txtSoldLei, lblSoldLei, But_verifica1 -> PEMSTATUS(...,5) = .T. +* Ct_clb_gestiune_init -> prezent DOAR daca Init-ul de antet (pasul 1) nu e inca portat; dupa +* pasul 1 e eliminat pe tip 1 (ca pe frm_date_factura). Se logheaza, nu se asserteaza. +* (*) dupa pasul 1, pe factura Ct_clb_politici_preturi e eliminat (control doar de aviz). +* Clb_dataireg.Text_simplu1.ControlSource = 'poDate.dataireg' +* Prezenta = apartenenta la colectia Objects (PEMSTATUS/TYPE raman .T. dupa RemoveObject). +* frm_date_factura (acelasi poDate): Clb_dataireg, txtCodFiscal, lblCodFiscal, txtSoldLei, +* lblSoldLei, But_verifica1 -> .T.; Ct_clb_gestiune_init -> .F. (eliminat de Init pe tip 1). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_controale.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_controale.log + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_controale.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) +gnFail = 0 +gnPass = 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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnScadereStoc = 0 +* seriile de facturi (tipdoc 5) sunt pe utilizator in MARIUSM_AUTO: utilizatorul 8 are plaja activa 2010-2099 +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + " gnScadentaAutomata=" + TRANSFORM(gnScadentaAutomata) + +PRIVATE poDate, poGeneratorNumere, plVizibil +plVizibil = .F. +DO AfLog WITH "creez poDate" +poDate = CREATEOBJECT("oDateFactura", 25000, 1) +DO AfLog WITH "poDate creat" +poDate.nIdTipDoc = 5 +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") +poGeneratorNumere.ResetNumere() +DO AfLog WITH "generator creat" +DO ProbaSerii WITH poDate.nIdTipDoc +poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) +DO AfLog WITH "poDate tip=1 rezultat_serii=" + TRANSFORM(poDate.rezultat_serii) + " ultim amessagebox=[" + gcMockUltimMesaj + "]" +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +* grd_factura.cGestiune e legat la crsFactura.gestiune, camp inexistent in creeaza_facturacrs (nume_gestiune) +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa (..\utile\gridextras), rezolvabila doar din exe/IDE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e definita in _cb_base.vcx +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +LOCAL loNou, loVechi, lcC +DO AfLog WITH "creez frm_facturare_articole2" +* clasa REALA (nu subclasa: pe o subclasa RemoveObject nu scoate membrii definiti in parinte). +* Atentie: metoda Error a prototipului face SET STEP ON - orice eroare in Init deschide debugger-ul +* si blocheaza rularea headless; diagnosticul se face atunci cu o subclasa cu Error care logheaza. +loNou = CREATEOBJECT('frm_facturare_articole2') +DO Assert WITH VARTYPE(loNou) = 'O', "Createobject frm_facturare_articole2" +IF VARTYPE(loNou) = 'O' + LOCAL laC[6], i + laC[1] = "Clb_dataireg" + laC[2] = "txtCodFiscal" + laC[3] = "lblCodFiscal" + laC[4] = "txtSoldLei" + laC[5] = "lblSoldLei" + laC[6] = "But_verifica1" + FOR i = 1 TO 6 + DO Assert WITH ObjExists(loNou, laC[i]), "nou: " + laC[i] + " prezent" + ENDFOR + DO AfLog WITH "nou: Ct_clb_gestiune_init prezent=" + TRANSFORM(ObjExists(loNou, 'Ct_clb_gestiune_init')) + ; + " Ct_clb_politici_preturi prezent=" + TRANSFORM(ObjExists(loNou, 'Ct_clb_politici_preturi')) + DO Assert WITH loNou.Clb_dataireg.Text_simplu1.ControlSource == 'poDate.dataireg', "nou: Clb_dataireg.ControlSource" + DO Assert WITH loNou.Clb_dataireg.Top >= 30, "nou: Clb_dataireg sub bara de titlu (Top=" + TRANSFORM(loNou.Clb_dataireg.Top) + ")" + DO Assert WITH PEMSTATUS(loNou, 'cgestiune_init', 5) AND PEMSTATUS(loNou, 'lcopiere', 5) AND PEMSTATUS(loNou, 'nid_tip', 5) ; + AND PEMSTATUS(loNou, 'nsoldlei', 5) AND PEMSTATUS(loNou, 'nsoldvaluta', 5) AND PEMSTATUS(loNou, 'ntip', 5), "nou: proprietati *p: materializate" + * C6: Error nu mai face SET STEP ON - o eroare provocata nu blocheaza rularea + LOCAL llErr + llErr = .F. + TRY + loNou.metoda_inexistenta_s3() + CATCH + llErr = .T. + ENDTRY + DO Assert WITH llErr, "C6: eroarea provocata (metoda inexistenta) a fost prinsa, fara blocaj" + loNou.Error(1, 'test', 1) + DO Assert WITH .T., "C6: apel direct o.Error(1,'test',1) a revenit" + loNou.Release() + RELEASE loNou +ENDIF + +loVechi = CREATEOBJECT('frm_date_factura') +DO Assert WITH VARTYPE(loVechi) = 'O', "Createobject frm_date_factura" +IF VARTYPE(loVechi) = 'O' + FOR i = 1 TO 6 + DO Assert WITH ObjExists(loVechi, laC[i]), "vechi: " + laC[i] + " prezent" + ENDFOR + DO Assert WITH !ObjExists(loVechi, 'Ct_clb_gestiune_init'), "vechi: Ct_clb_gestiune_init eliminat pe tip 1" + loVechi.Release() + RELEASE loVechi +ENDIF + +DO Final + +PROCEDURE ProbaSerii + * apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor + * ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului + LPARAMETERS tnIdTipDoc + LOCAL lnOk, laErr[1], i, lcSql + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + FOR i = 1 TO 3 + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii") + IF lnOk > 0 + DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii")) + USE IN (SELECT("crsprobaserii")) + EXIT + ELSE + AERROR(laErr) + DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5]) + ENDIF + ENDFOR +ENDPROC + +FUNCTION ObjExists + * prezenta reala in colectia Objects, cautare recursiva - controalele pot fi in containere + LPARAMETERS toContainer, tcName + LOCAL i, loO + FOR i = 1 TO toContainer.Objects.Count + loO = toContainer.Objects(i) + IF UPPER(loO.Name) == UPPER(tcName) + RETURN .T. + ENDIF + IF TYPE('loO.Objects.Count') = 'N' + IF ObjExists(loO, tcName) + RETURN .T. + ENDIF + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO AfLog WITH "PASS: " + tcMsg + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL: " + tcMsg + ENDIF +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3_do_cauta.prg b/utile/Teste/facturare_unificat/test_s3_do_cauta.prg new file mode 100644 index 0000000..a90f578 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3_do_cauta.prg @@ -0,0 +1,401 @@ +* test_s3_do_cauta.prg +* Headless: paritatea cautarilor de antet (do_cauta_* + do_verifica) intre calea veche (frm_date_factura / +* frm_date_aviz, metode in .vcx) si formularul unificat (frm_facturare_articole2 -> oAntetFacturare din +* ofacturare_antet.prg), cu dialogurile modale inlocuite de mock_caut_antet.prg si amessagebox de +* mock_amessagebox.prg. +* +* REZULTAT ASTEPTAT (declarat inainte de rulare): +* A. Pentru fiecare caz (metoda, tip, varianta) se construieste ACELASI poDate de doua ori (oDateFactura + +* aceleasi valori de intrare), se creeaza formularul vechi pe primul si unificatul pe al doilea, se +* apeleaza metoda pe fiecare si se compara amprenta: toate proprietatile poDate (AMEMBERS, camp cu camp, +* TRANSFORM), proprietatile de formular scrise de metode (nSoldLei, nSoldValuta, cgestiune_init, tooltip +* client), lista apelurilor catre dialoguri (nume + argumente - dovedeste ramura aleasa si parametrii: +* ex. caut_contract_facturare(id) pe factura vs (id,[3,4]) pe aviz; cCont 4111 / 357 / 461 la client), +* mesajele amessagebox (text + tip) si erorile VFP (numar + mesaj). Asteptat: IDENTIC pe toate cazurile, cu +* exceptia lui poDate.nract cand la Init calea veche a ars deja un numar (cascada de LostFocus) si unificatul +* nu - acolo se verifica tiparul (vechi>0, nou=0, neschimbat de metoda) si se normalizeaza doar acea cheie. +* B. Cazuri (tip -> metode), variante: NORMAL (id_client real), IDCLIENT0 (id_client = 0 -> mesaj "Nu ati +* ales clientul!" / "gestiunea"), SAMECLIENT (dialogul intoarce acelasi id_client -> listaid/descriere NU +* se golesc pe factura), BUTON0 (dialogul seteaza gnButon = 0 -> lucrare/sectie/venchelt pe factura +* pun Null, pe aviz (lucrare/sectie) pastreaza valoarea intoarsa), VALUTA0 (tip 9 fara valuta -> mesaj): +* - factura: 1: client(NORMAL,SAMECLIENT), fdoc, lucrare(NORMAL,BUTON0), sectie(NORMAL,BUTON0), +* venchelt(NORMAL,BUTON0), responsabil, verifica, altele(=nimic); 2: altele(->contract), contract(IDCLIENT0), +* gestiune_init; 3: client, altele(->comanda), comanda(IDCLIENT0); 4: altele(->avize), avize(IDCLIENT0); +* 5: valuta; 7: altele(->factura), factura(IDCLIENT0); 8: altele(->facturi); 9: facturi(VALUTA0,NORMAL); +* 45: altele(->locatii), locatii. +* - aviz: 21: client, altele(->comanda), comanda, lucrare(NORMAL,BUTON0), sectie(BUTON0), venchelt(BUTON0), +* responsabil, gestiune_init, fdoc; 22: client; 23: client, altele(->gestiune_dest), gestiune_dest(IDCLIENT0), +* politica; 24: altele(->avize); 25: client, comanda; 26: altele(->contract), contract; 28: client; +* 41: client, gestiune_dest; 42: client. +* C. Netestabil headless: focusul de dupa cautare (SetFocus fara Show - daca ridica eroare, eroarea e parte +* din amprenta si trebuie sa fie identica pe ambele cai); selectia reala din dialog (mock cu valoare fixa); +* raspunsul Oracle la pack_facturare.cauta_date_comanda (real, acelasi pe ambele cai). +* D. Neregresie calea veche: test_s3_neregresie_vechi.prg CURENT vs BACKUP (amprenta Init) - separat. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_do_cauta.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_do_cauta.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (seriile pe utilizator); gnScadereStoc = 1; rezultat_serii +* real (creeaza_cursor_serii, numarul se dezaloca dupa fiecare caz) ca sa existe clb_serie_act pe ambele. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockIdPart, gnMockButon, gcBaza, gnDivergenteQ8 +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_do_cauta.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) +gnFail = 0 +gnPass = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockIdPart = 0 +gnMockButon = 1 +gnDivergenteQ8 = 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 +* la nume duplicat castiga PRIMUL fisier din lista SET PROCEDURE, nu ultimul: mock-urile se pun in fata +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_caut_antet.prg", &lcProc +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnScadereStoc=" + TRANSFORM(gnScadereStoc) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +* dovada ca ofacturare_antet.prg e incarcat de harness si ca mock-urile castiga rezolutia +DO Assert WITH TYPE('CREATEOBJECT("oAntetFacturare")') = 'O', "oAntetFacturare instantiabil (ofacturare_antet.prg in SET PROCEDURE)" +LOCAL loMock +loMock = caut_fdoc() +DO Assert WITH VARTYPE(loMock) = 'O' AND loMock.fel_document == "FEL MOCK", "mock caut_fdoc activ" +DO AfLog WITH "asertiuni initiale: pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " erori=[" + gcErr + "]" +gcErr = "" + +PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest +plVizibil = .F. +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") +poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +* doi clienti reali (GetSoldClient si cauta_date_comanda cer id-uri existente) +PUBLIC gnIdClient1, gnIdClient2 +gnIdClient1 = 0 +gnIdClient2 = 0 +IF SQLEXEC(gnHandle, "select min(id_part) as id1, max(id_part) as id2 from nom_parteneri", "crsclient") > 0 + gnIdClient1 = NVL(crsclient.id1, 0) + gnIdClient2 = NVL(crsclient.id2, 0) + USE IN crsclient +ENDIF +DO AfLog WITH "clienti de test: " + TRANSFORM(gnIdClient1) + " / " + TRANSFORM(gnIdClient2) + +* ---- factura ---- +DO Caz WITH 1, "do_cauta_client", "NORMAL" +DO Caz WITH 1, "do_cauta_client", "SAMECLIENT" +DO Caz WITH 1, "do_cauta_fdoc", "NORMAL" +DO Caz WITH 1, "do_cauta_lucrare", "NORMAL" +DO Caz WITH 1, "do_cauta_lucrare", "BUTON0" +DO Caz WITH 1, "do_cauta_sectie", "NORMAL" +DO Caz WITH 1, "do_cauta_sectie", "BUTON0" +DO Caz WITH 1, "do_cauta_venchelt", "NORMAL" +DO Caz WITH 1, "do_cauta_venchelt", "BUTON0" +DO Caz WITH 1, "do_cauta_responsabil", "NORMAL" +DO Caz WITH 1, "do_verifica", "NORMAL" +DO Caz WITH 1, "do_cauta_altele", "NORMAL" +DO Caz WITH 2, "do_cauta_altele", "NORMAL" +DO Caz WITH 2, "do_cauta_contract", "IDCLIENT0" +DO Caz WITH 2, "do_cauta_gestiune_init", "NORMAL" +DO Caz WITH 3, "do_cauta_client", "NORMAL" +DO Caz WITH 3, "do_cauta_altele", "NORMAL" +DO Caz WITH 3, "do_cauta_comanda", "IDCLIENT0" +DO Caz WITH 4, "do_cauta_altele", "NORMAL" +DO Caz WITH 4, "do_cauta_avize", "IDCLIENT0" +DO Caz WITH 5, "do_cauta_valuta", "NORMAL" +DO Caz WITH 7, "do_cauta_altele", "NORMAL" +DO Caz WITH 7, "do_cauta_factura", "IDCLIENT0" +DO Caz WITH 8, "do_cauta_altele", "NORMAL" +DO Caz WITH 9, "do_cauta_facturi", "VALUTA0" +DO Caz WITH 9, "do_cauta_facturi", "NORMAL" +DO Caz WITH 45, "do_cauta_altele", "NORMAL" +DO Caz WITH 45, "do_cauta_locatii", "NORMAL" +* ---- aviz ---- +DO Caz WITH 21, "do_cauta_client", "NORMAL" +DO Caz WITH 21, "do_cauta_altele", "NORMAL" +DO Caz WITH 21, "do_cauta_comanda", "NORMAL" +DO Caz WITH 21, "do_cauta_lucrare", "NORMAL" +DO Caz WITH 21, "do_cauta_lucrare", "BUTON0" +DO Caz WITH 21, "do_cauta_sectie", "BUTON0" +DO Caz WITH 21, "do_cauta_venchelt", "BUTON0" +DO Caz WITH 21, "do_cauta_responsabil", "NORMAL" +DO Caz WITH 21, "do_cauta_gestiune_init", "NORMAL" +DO Caz WITH 21, "do_cauta_fdoc", "NORMAL" +DO Caz WITH 22, "do_cauta_client", "NORMAL" +DO Caz WITH 23, "do_cauta_client", "NORMAL" +DO Caz WITH 23, "do_cauta_altele", "NORMAL" +DO Caz WITH 23, "do_cauta_gestiune_dest", "IDCLIENT0" +DO Caz WITH 23, "do_cauta_politica", "NORMAL" +DO Caz WITH 24, "do_cauta_altele", "NORMAL" +DO Caz WITH 25, "do_cauta_client", "NORMAL" +DO Caz WITH 25, "do_cauta_comanda", "NORMAL" +DO Caz WITH 26, "do_cauta_altele", "NORMAL" +DO Caz WITH 26, "do_cauta_contract", "NORMAL" +DO Caz WITH 28, "do_cauta_client", "NORMAL" +DO Caz WITH 41, "do_cauta_client", "NORMAL" +DO Caz WITH 41, "do_cauta_gestiune_dest", "NORMAL" +DO Caz WITH 42, "do_cauta_client", "NORMAL" + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz + LPARAMETERS tnTip, tcMetoda, tcVar + LOCAL llAviz, lcVechi, lcNou, lcBazaVechi, lcBazaNou, lcExclus + llAviz = INLIST(tnTip, 21, 22, 23, 24, 25, 26, 28, 29, 41, 42, 47) + gcCaz = "[tip=" + TRANSFORM(tnTip) + " " + tcMetoda + " " + tcVar + "] " + lcVechi = Amprenta(tnTip, llAviz, IIF(llAviz, 'frm_date_aviz', 'frm_date_factura'), tcMetoda, tcVar) + lcBazaVechi = gcBaza + lcNou = Amprenta(tnTip, llAviz, 'frm_facturare_articole2', tcMetoda, tcVar) + lcBazaNou = gcBaza + * proprietatile poDate care difera deja dupa Init (inainte de apel) tin de Init (focus headless), nu de + * metoda testata: cand e exact divergenta Q8 (nract ars la Init pe calea veche) se verifica tiparul si se + * normalizeaza in loc sa se excluda, ca sa ramana comparat tot restul amprentei, inclusiv nract dupa apel + lcExclus = CheiDiferite(lcBazaVechi, lcBazaNou) + IF !EMPTY(lcExclus) + DO AfLog WITH " > " + gcCaz + "INIT-DIF (Q8, normalizat, nu exclus): " + lcExclus + lcVechi = NormalizeazaInitDifQ8(lcVechi, lcNou, lcBazaVechi, lcBazaNou, lcExclus) + ENDIF + IF lcVechi == lcNou + gnPass = gnPass + 1 + DO AfLog WITH "OK " + gcCaz + TRANSFORM(OCCURS(CHR(10), lcVechi)) + " linii amprenta" + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL " + gcCaz + "amprente diferite:" + DO DifLinii WITH lcVechi, lcNou + ENDIF +ENDPROC + +FUNCTION NormalizeazaInitDifQ8 + * Q8: pe calea veche, cascada de LostFocus de la Init arde un numar inainte ca metoda testata sa ruleze; + * pe calea unificata nu se aloca nimic. Se verifica tiparul (nu doar cheia nract, ci si valorile) si ca + * metoda testata nu mai atinge nract pe nicio cale, apoi se normalizeaza doar nract, restul ramane comparat. + LPARAMETERS tcVechi, tcNou, tcBazaVechi, tcBazaNou, tcExclus + LOCAL lnBazaVechi, lnBazaNou, lnFinalVechi, lnFinalNou, lcVechiNorm + + DO Assert WITH tcExclus == "poDate.nract=(vechi " + ValoareCheieDC(tcBazaVechi, "poDate.nract") + " / nou " + ValoareCheieDC(tcBazaNou, "poDate.nract") + "), ", "Q8: singura cheie care difera la Init e poDate.nract, nu altceva" + + lnBazaVechi = VAL(ValoareCheieDC(tcBazaVechi, "poDate.nract")) + lnBazaNou = VAL(ValoareCheieDC(tcBazaNou, "poDate.nract")) + DO Assert WITH lnBazaVechi > 0, "Q8: la Init, pe calea veche nract e deja ars (cascada de LostFocus)" + DO Assert WITH lnBazaNou = 0, "Q8: la Init, pe calea unificata nract ramane 0" + + lnFinalVechi = VAL(ValoareCheieDC(tcVechi, "poDate.nract")) + lnFinalNou = VAL(ValoareCheieDC(tcNou, "poDate.nract")) + DO Assert WITH lnFinalVechi = lnBazaVechi, "Q8: metoda testata nu mai modifica nract pe calea veche fata de Init" + DO Assert WITH lnFinalNou = lnBazaNou, "Q8: metoda testata nu mai modifica nract pe calea unificata fata de Init" + + gnDivergenteQ8 = gnDivergenteQ8 + 1 + DO AfLog WITH "DIVERGENTA-ASTEPTATA (Q8): " + gcCaz + "la Init, calea veche a ars deja un numar (nract=" + TRANSFORM(lnBazaVechi) + "), unificatul nu a alocat nimic (nract=0); neschimbat de metoda testata" + + lcVechiNorm = STRTRAN(tcVechi, "poDate.nract=" + TRANSFORM(lnFinalVechi) + CHR(13) + CHR(10), "poDate.nract=" + TRANSFORM(lnFinalNou) + CHR(13) + CHR(10), 1, 1) + RETURN lcVechiNorm +ENDFUNC + +FUNCTION ValoareCheieDC + * valoarea unei chei "cheie=valoare" dintr-o amprenta poDate, cautata linie cu linie + LPARAMETERS tcAmprenta, tcCheie + LOCAL laL[1], lnL, i + lnL = ALINES(laL, tcAmprenta) + FOR i = 1 TO lnL + IF LEFT(laL[i], LEN(tcCheie) + 1) == tcCheie + "=" + RETURN SUBSTR(laL[i], LEN(tcCheie) + 2) + ENDIF + ENDFOR + RETURN "" +ENDFUNC + +FUNCTION Amprenta + LPARAMETERS tnTip, tlAviz, tcClasa, tcMetoda, tcVar + LOCAL loF, lcA, lcCmd + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip, tnTip) + poDate.nIdTipDoc = IIF(tlAviz, poDate.nIdTipDocAvizExpeditie, poDate.nIdTipDocFactura) + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + poDate.dataact = DATE(gnAn, gnLuna, 1) + poDate.dataireg = poDate.dataact + poDate.id_client = IIF(tcVar == "IDCLIENT0", 0, gnIdClient1) + poDate.nume_client = IIF(tcVar == "IDCLIENT0", "", "CLIENT INITIAL") + poDate.listaid = "999" + poDate.descriere = "DESCRIERE INITIALA" + poDate.text_aditional = "TEXT INITIAL" + IF tnTip = 9 + poDate.id_valuta = IIF(tcVar == "VALUTA0", 0, 2) + ENDIF + gnMockIdPart = IIF(tcVar == "SAMECLIENT", gnIdClient1, gnIdClient2) + gnMockButon = IIF(tcVar == "BUTON0", 0, 1) + gnButon = 1 + poDateGestiuneDest.Reset() + gcErr = "" + gcMockApeluri = "" + gcMockUltimMesaj = "" + gnMockUltimTip = 0 + + DO AfLog WITH " > " + gcCaz + "creez " + tcClasa + loF = CREATEOBJECT(tcClasa) + IF VARTYPE(loF) <> 'O' + RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr + ENDIF + gcErr = "" + * focusul pleaca de pe controlul lasat de Init inainte de apel: pe frm_date_factura Init lasa focusul pe + * combo-ul fdoc, al carui LostFocus (do_schimba_tipdoc -> clb_serie_act.genereazaNumar) ar scrie poDate.nract + * la primul SetFocus din metoda testata; efectul tine de evenimentele formularului, nu de metoda. + * Doar pe factura: pe aviz vechiul nu are combo, iar pe unificat Clb_dataact.LostFocus ar scrie datascad (S3-3) + IF !tlAviz + loF.clb_dataact.SetFocus() + ENDIF + gcBaza = AmprentaPoDate() + gcMockApeluri = "" + gcErr = "" + lcCmd = "loF." + tcMetoda + "()" + DO AfLog WITH " > " + gcCaz + "apelez " + lcCmd + &lcCmd + DO AfLog WITH " > " + gcCaz + "apel incheiat" + lcA = "metoda=" + tcMetoda + CHR(13) + CHR(10) + lcA = lcA + AmprentaPoDate() + * soldul exista doar pe frm_date_factura si pe unificat; pe aviz unificatul nu trebuie sa-l scrie + IF PEMSTATUS(loF, "nSoldLei", 5) + IF tlAviz + DO Assert WITH loF.nSoldLei = 0 AND loF.nSoldValuta = 0, "pe aviz nSoldLei/nSoldValuta raman 0 (" + tcClasa + ")" + DO AfLog WITH " > " + gcCaz + "sold pe " + tcClasa + ": " + TRANSFORM(loF.nSoldLei) + "/" + TRANSFORM(loF.nSoldValuta) + ELSE + lcA = lcA + "form.nSoldLei=" + TRANSFORM(loF.nSoldLei) + CHR(13) + CHR(10) + lcA = lcA + "form.nSoldValuta=" + TRANSFORM(loF.nSoldValuta) + CHR(13) + CHR(10) + ENDIF + ENDIF + lcA = lcA + "form.cgestiune_init=" + TRANSFORM(loF.cgestiune_init) + CHR(13) + CHR(10) + lcA = lcA + "form.tooltip_client=" + TRANSFORM(loF.Ct_clb_nume_client.clb_TX_CAUTARE.text_SIMPLU1.ToolTipText) + CHR(13) + CHR(10) + lcA = lcA + "gest_dest=" + TRANSFORM(poDateGestiuneDest.id_gestiune) + "|" + TRANSFORM(poDateGestiuneDest.id_tipgest) + "|" + TRANSFORM(poDateGestiuneDest.Cont) + "|" + TRANSFORM(poDateGestiuneDest.acont) + CHR(13) + CHR(10) + lcA = lcA + "gnButon=" + TRANSFORM(gnButon) + CHR(13) + CHR(10) + lcA = lcA + "APELURI:" + CHR(13) + CHR(10) + gcMockApeluri + lcA = lcA + "MESAJ=" + gcMockUltimMesaj + "|" + TRANSFORM(gnMockUltimTip) + CHR(13) + CHR(10) + lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr + loF.Release() + RELEASE loF + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + ENDIF + RETURN lcA +ENDFUNC + +FUNCTION AmprentaPoDate + LOCAL laM[1], lnN, i, lcA, lcV + lcA = "" + lnN = AMEMBERS(laM, poDate, 0) + ASORT(laM) + FOR i = 1 TO lnN + IF TYPE("poDate." + laM[i]) $ "CNDTLY" + lcV = TRANSFORM(EVALUATE("poDate." + laM[i])) + ELSE + lcV = "<" + TYPE("poDate." + laM[i]) + ">" + ENDIF + lcA = lcA + "poDate." + LOWER(laM[i]) + "=" + lcV + CHR(13) + CHR(10) + ENDFOR + RETURN lcA +ENDFUNC + +FUNCTION CheiDiferite + * cheile (poDate.x=) ale liniilor care difera intre doua amprente poDate, cu valorile, separate prin virgula + LPARAMETERS tcV, tcN + LOCAL laV[1], laN[1], lnV, lnN, i, lcChei, lcCheie, lcLinie + lnV = ALINES(laV, tcV) + lnN = ALINES(laN, tcN) + lcChei = "" + FOR i = 1 TO MAX(lnV, lnN) + IF i > lnV OR i > lnN OR !(laV[i] == laN[i]) + lcLinie = IIF(i <= lnV, laV[i], laN[i]) + lcCheie = LEFT(lcLinie, AT("=", lcLinie)) + IF !(lcCheie + "(" $ lcChei) + lcChei = lcChei + lcCheie + "(vechi " + IIF(i <= lnV, SUBSTR(laV[i], LEN(lcCheie) + 1), "") ; + + " / nou " + IIF(i <= lnN, SUBSTR(laN[i], LEN(lcCheie) + 1), "") + "), " + ENDIF + ENDIF + ENDFOR + RETURN lcChei +ENDFUNC + +FUNCTION FaraChei + * scoate dintr-o amprenta liniile a caror cheie (pana la =) apare in lista de chei + LPARAMETERS tcA, tcChei + LOCAL laL[1], lnL, i, lcR, lnEq + lnL = ALINES(laL, tcA) + lcR = "" + FOR i = 1 TO lnL + lnEq = AT("=", laL[i]) + IF lnEq = 0 OR !(LEFT(laL[i], lnEq) + "(" $ tcChei) + lcR = lcR + laL[i] + CHR(13) + CHR(10) + ENDIF + ENDFOR + RETURN lcR +ENDFUNC + +PROCEDURE DifLinii + LPARAMETERS tcV, tcN + LOCAL laV[1], laN[1], lnV, lnN, i, lnMax + lnV = ALINES(laV, tcV) + lnN = ALINES(laN, tcN) + lnMax = MAX(lnV, lnN) + FOR i = 1 TO lnMax + IF i > lnV OR i > lnN OR !(laV[i] == laN[i]) + DO AfLog WITH " vechi: " + IIF(i <= lnV, laV[i], "") + DO AfLog WITH " nou : " + IIF(i <= lnN, laN[i], "") + ENDIF + ENDFOR +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + CHR(13) + CHR(10) +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " divergente-asteptate(Q8)=" + TRANSFORM(gnDivergenteQ8) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3_init_antet.prg b/utile/Teste/facturare_unificat/test_s3_init_antet.prg new file mode 100644 index 0000000..1f280e7 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3_init_antet.prg @@ -0,0 +1,351 @@ +* test_s3_init_antet.prg +* Headless: paritatea antetului dupa Init intre calea veche (frm_date_factura / frm_date_aviz) si +* formularul unificat (frm_facturare_articole2), pe acelasi poDate, pentru toate tipurile de document. +* +* REZULTAT ASTEPTAT (declarat inainte de rulare, derivat din Do Case-urile din Init-urile sursa, +* ofacturare.vc2 frm_date_factura.Init si frm_date_aviz.Init; "prezent" = apartenenta la colectia +* Objects a formularului - dupa RemoveObject, PEMSTATUS(...,5) si TYPE() raman .T./'O'): +* +* A. Paritate completa vechi vs unificat, pentru fiecare control de antet al formularului-sursa +* (mapare de nume: Ct_clb_fdoc -> clb_fdoc, Clb_serie_act -> Clb_serie_act1), pe +* gnScadereStoc in {0,1} x tip factura {1,2,3,4,5,7,8,9,10,45,48,49,52} x tip aviz +* {21,22,23,24,25,26,28,29,41,42,47} x rezultat_serii {valoarea reala din Oracle, 0 fortat}. +* Asteptat: prezenta identica pe toate; etichetele ct_clb_altele / ct_clb_nume_client identice cand +* Init le seteaza (23/25/41); eticheta implicita a clientului difera prin proiectare: "Nume client" pe +* vechi, "Client" pe prototip (ADD OBJECT, inventarul S1) - se asserteaza "Client" pe unificat. +* B. Esantion declarat explicit (din cod): +* - factura tip 1, gnScadereStoc=0: eliminate ct_clb_gestiune_init, ct_clb_responsabil, ct_clb_altele, +* ct_clb_valuta (in_valuta=0); prezente clb_dataireg, clb_dataact, clb_data_scadenta, clb_zi_curs, +* clb_nract, ct_clb_nume_client, ct_clb_venchelt, ct_clb_sectie, ct_clb_lucrare, ed_tx_simplu1. +* - factura tip 2, gnScadereStoc=0: ct_clb_altele prezent cu eticheta "Nr. contract". +* - factura tip 8: clb_zi_curs eliminat. +* - factura tip 5 (in_valuta=1): ct_clb_valuta prezent. +* - aviz tip 22, gnScadereStoc=0: eliminate ct_clb_responsabil, ct_clb_gestiune_init, +* ct_clb_politici_preturi, ct_clb_altele. +* - aviz tip 23: ct_clb_venchelt eliminat; etichete "Gestiune sursa" (client) / "Gestiune destinatie" (altele); +* ct_clb_politici_preturi prezent. +* - aviz tip 41: Lb_titlu_alb_b121.Caption = "RETUR TRANSFER" pe ambele; etichete "Retur de la" / "Retur la". +* - aviz tip 21, gnScadereStoc=1: ct_clb_gestiune_init prezent (ramane pe 21,25,26,28,42,47). +* C. Pe unificat, in plus fata de sursa: +* - factura: Ct_clb_politici_preturi ABSENT; aviz: txtCodFiscal, lblCodFiscal, txtSoldLei, lblSoldLei, +* But_verifica1 ABSENTE; aviz: clb_fdoc.cboFdoc.Enabled = .F. si Value = "AVIZ". +* - Clb_serie_act1.nid_tipdoc = poDate.nIdTipDoc (6 pe aviz, nu 5 din ADD OBJECT) cand e prezent. +* - Createobject pe aviz NU cade (cboFdoc.Init cu nIdTipDocAvizExpeditie). +* - tip 1 cu id_client real: nSoldLei/nSoldValuta identice cu frm_date_factura. +* D. Neregresie calea veche: test_s3_neregresie_vechi.prg (acelasi inventar rulat numai pe vechi, +* comparat cu backup-ul .pre_s3_1.bak.vcx). +* +* Netestabil headless: focusul final (SetFocus fara Show) - ramane pentru testul UI. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_init_antet.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_init_antet.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; seriile de facturi (tipdoc 5) sunt pe utilizator -> gnIdUtil = 8. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gcCaz +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_init_antet.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) +gnFail = 0 +gnPass = 0 +gcCaz = "" +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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnScadentaAutomata=" + TRANSFORM(gnScadentaAutomata) +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa (..\utile\gridextras), rezolvabila doar din exe/IDE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + +PRIVATE poDate, poGeneratorNumere, plVizibil +plVizibil = .F. +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +* grd_factura.cGestiune e legat la crsFactura.gestiune, camp inexistent in creeaza_facturacrs (nume_gestiune) +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +* un client real pentru cazul id_client <> 0 (GetSoldClient) +LOCAL lnIdClient +lnIdClient = 0 +IF SQLEXEC(gnHandle, "select min(id_part) as id_part from nom_parteneri", "crsclient") > 0 + lnIdClient = NVL(crsclient.id_part, 0) + USE IN crsclient +ENDIF +DO AfLog WITH "id_client de test=" + TRANSFORM(lnIdClient) + +LOCAL laFact[13], laAviz[11], lnStoc, i, lnTip, lnSerii, lcSerii +laFact[1] = 1 +laFact[2] = 2 +laFact[3] = 3 +laFact[4] = 4 +laFact[5] = 5 +laFact[6] = 7 +laFact[7] = 8 +laFact[8] = 9 +laFact[9] = 10 +laFact[10] = 45 +laFact[11] = 48 +laFact[12] = 49 +laFact[13] = 52 +laAviz[1] = 21 +laAviz[2] = 22 +laAviz[3] = 23 +laAviz[4] = 24 +laAviz[5] = 25 +laAviz[6] = 26 +laAviz[7] = 28 +laAviz[8] = 29 +laAviz[9] = 41 +laAviz[10] = 42 +laAviz[11] = 47 + +FOR lnStoc = 0 TO 1 + gnScadereStoc = lnStoc + FOR lnSerii = 1 TO 2 + lcSerii = IIF(lnSerii = 1, "real", "0") + FOR i = 1 TO 13 + DO Caz WITH laFact[i], .F., lcSerii, 0 + ENDFOR + FOR i = 1 TO 11 + DO Caz WITH laAviz[i], .T., lcSerii, 0 + ENDFOR + ENDFOR +ENDFOR +* cazul cu client real (sold) +gnScadereStoc = 0 +IF lnIdClient <> 0 + DO Caz WITH 1, .F., "real", lnIdClient +ENDIF + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz + LPARAMETERS tnTip, tlAviz, tcSerii, tnIdClient + LOCAL loVechi, loNou, lcVechi, lnCtrl, lcCtrl, lcCtrlNou, llV, llN, lcEtV, lcEtN + gcCaz = "[tip=" + TRANSFORM(tnTip) + " stoc=" + TRANSFORM(gnScadereStoc) + " serii=" + tcSerii + IIF(tnIdClient <> 0, " client=" + TRANSFORM(tnIdClient), "") + "] " + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip - 1 + gnScadereStoc * 10, tnTip) + poDate.nIdTipDoc = IIF(tlAviz, 6, 5) + IF tnIdClient <> 0 + poDate.id_client = tnIdClient + ENDIF + poGeneratorNumere.ResetNumere() + IF tcSerii = "real" + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + ELSE + poDate.rezultat_serii = 0 + ENDIF + DO AfLog WITH gcCaz + "in_valuta=" + TRANSFORM(poDate.in_valuta) + " rezultat_serii=" + TRANSFORM(poDate.rezultat_serii) + " amessagebox=[" + gcMockUltimMesaj + "]" + gcMockUltimMesaj = "" + + lcVechi = IIF(tlAviz, 'frm_date_aviz', 'frm_date_factura') + loVechi = CREATEOBJECT(lcVechi) + IF VARTYPE(loVechi) <> 'O' + DO Assert WITH .F., "Createobject " + lcVechi + RETURN + ENDIF + loNou = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loNou) <> 'O' + DO Assert WITH .F., "Createobject frm_facturare_articole2" + loVechi.Release() + RETURN + ENDIF + + * A. paritate prezenta pe controalele formularului-sursa + LOCAL laCtrl[21] + IF tlAviz + lnCtrl = 14 + laCtrl[1] = "Clb_dataireg" + laCtrl[2] = "Clb_dataact" + laCtrl[3] = "Clb_zi_curs" + laCtrl[4] = "Ct_clb_fdoc" + laCtrl[5] = "Clb_serie_act" + laCtrl[6] = "Clb_nract" + laCtrl[7] = "Ct_clb_nume_client" + laCtrl[8] = "Ct_clb_altele" + laCtrl[9] = "Ct_clb_gestiune_init" + laCtrl[10] = "Ct_clb_politici_preturi" + laCtrl[11] = "Ct_clb_venchelt" + laCtrl[12] = "Ct_clb_sectie" + laCtrl[13] = "Ct_clb_responsabil" + laCtrl[14] = "Ct_clb_lucrare" + ELSE + lnCtrl = 21 + laCtrl[1] = "Clb_dataireg" + laCtrl[2] = "Clb_dataact" + laCtrl[3] = "Clb_data_scadenta" + laCtrl[4] = "Clb_zi_curs" + laCtrl[5] = "Ct_clb_fdoc" + laCtrl[6] = "Clb_serie_act" + laCtrl[7] = "Clb_nract" + laCtrl[8] = "Ct_clb_nume_client" + laCtrl[9] = "txtCodFiscal" + laCtrl[10] = "lblCodFiscal" + laCtrl[11] = "txtSoldLei" + laCtrl[12] = "lblSoldLei" + laCtrl[13] = "But_verifica1" + laCtrl[14] = "Ct_clb_altele" + laCtrl[15] = "Ct_clb_gestiune_init" + laCtrl[16] = "Ct_clb_valuta" + laCtrl[17] = "Ct_clb_venchelt" + laCtrl[18] = "Ct_clb_sectie" + laCtrl[19] = "Ct_clb_responsabil" + laCtrl[20] = "Ct_clb_lucrare" + laCtrl[21] = "Ed_tx_simplu1" + ENDIF + FOR i = 1 TO lnCtrl + lcCtrl = laCtrl[i] + lcCtrlNou = ICASE(lcCtrl == "Ct_clb_fdoc", "clb_fdoc", lcCtrl == "Clb_serie_act", "Clb_serie_act1", lcCtrl) + llV = ObjExists(loVechi, lcCtrl) + llN = ObjExists(loNou, lcCtrlNou) + DO Assert WITH llV = llN, "prezenta " + lcCtrl + " vechi=" + TRANSFORM(llV) + " nou=" + TRANSFORM(llN) + ENDFOR + * etichete + IF ObjExists(loVechi, "Ct_clb_altele") AND ObjExists(loNou, "Ct_clb_altele") + lcEtV = loVechi.Ct_clb_altele.clb_tx_cautare.Lb_simplu1.Caption + lcEtN = loNou.Ct_clb_altele.clb_tx_cautare.Lb_simplu1.Caption + DO Assert WITH lcEtV == lcEtN, "eticheta altele vechi=[" + lcEtV + "] nou=[" + lcEtN + "]" + ENDIF + IF ObjExists(loVechi, "Ct_clb_nume_client") AND ObjExists(loNou, "Ct_clb_nume_client") + lcEtV = loVechi.Ct_clb_nume_client.clb_tx_cautare.Lb_simplu1.Caption + lcEtN = loNou.Ct_clb_nume_client.clb_tx_cautare.Lb_simplu1.Caption + IF lcEtV == "Nume client" + * eticheta implicita difera prin proiectare (prototip: "Client"); Init n-a schimbat-o + DO Assert WITH lcEtN == "Client", "eticheta client implicita nou=[" + lcEtN + "] asteptat [Client]" + ELSE + DO Assert WITH lcEtV == lcEtN, "eticheta client vechi=[" + lcEtV + "] nou=[" + lcEtN + "]" + ENDIF + ENDIF + * nid_tip + DO Assert WITH loNou.nid_tip = poDate.tip AND loVechi.nid_tip = poDate.tip, "nid_tip = poDate.tip" + + * C. specific unificat + IF tlAviz + DO Assert WITH !ObjExists(loNou, "txtCodFiscal") AND !ObjExists(loNou, "lblCodFiscal") AND !ObjExists(loNou, "txtSoldLei") ; + AND !ObjExists(loNou, "lblSoldLei") AND !ObjExists(loNou, "But_verifica1"), "aviz: controalele de client/sold eliminate" + DO Assert WITH !loNou.clb_fdoc.cboFdoc.Enabled, "aviz: cboFdoc dezactivat" + DO Assert WITH ALLTRIM(loNou.clb_fdoc.cboFdoc.Value) == "AVIZ", "aviz: cboFdoc.Value=[" + TRANSFORM(loNou.clb_fdoc.cboFdoc.Value) + "]" + IF tnTip = 41 + DO Assert WITH loNou.Lb_titlu_alb_b121.Caption == "RETUR TRANSFER" AND loVechi.Lb_titlu_alb_b121.Caption == "RETUR TRANSFER", ; + "aviz 41: titlu nou=[" + loNou.Lb_titlu_alb_b121.Caption + "] vechi=[" + loVechi.Lb_titlu_alb_b121.Caption + "]" + ENDIF + ELSE + DO Assert WITH !ObjExists(loNou, "Ct_clb_politici_preturi"), "factura: Ct_clb_politici_preturi eliminat" + DO Assert WITH loNou.clb_fdoc.cboFdoc.Enabled, "factura: cboFdoc activ" + IF tnIdClient <> 0 + DO Assert WITH loNou.nSoldLei = loVechi.nSoldLei AND loNou.nSoldValuta = loVechi.nSoldValuta, ; + "sold client nou=" + TRANSFORM(loNou.nSoldLei) + "/" + TRANSFORM(loNou.nSoldValuta) + " vechi=" + TRANSFORM(loVechi.nSoldLei) + "/" + TRANSFORM(loVechi.nSoldValuta) + ENDIF + ENDIF + IF ObjExists(loNou, "Clb_serie_act1") + DO Assert WITH loNou.Clb_serie_act1.nid_tipdoc = poDate.nIdTipDoc, "Clb_serie_act1.nid_tipdoc=" + TRANSFORM(loNou.Clb_serie_act1.nid_tipdoc) + " asteptat " + TRANSFORM(poDate.nIdTipDoc) + ENDIF + + * B. esantionul declarat explicit + DO CASE + CASE !tlAviz AND tnTip = 1 AND gnScadereStoc = 0 + DO Assert WITH !ObjExists(loNou, "Ct_clb_gestiune_init") AND !ObjExists(loNou, "Ct_clb_responsabil") AND !ObjExists(loNou, "Ct_clb_altele") AND !ObjExists(loNou, "Ct_clb_valuta"), "B: tip 1 eliminate gestiune_init/responsabil/altele/valuta" + DO Assert WITH ObjExists(loNou, "Clb_dataireg") AND ObjExists(loNou, "Clb_dataact") AND ObjExists(loNou, "Clb_data_scadenta") AND ObjExists(loNou, "Clb_zi_curs") ; + AND ObjExists(loNou, "Clb_nract") AND ObjExists(loNou, "Ct_clb_nume_client") AND ObjExists(loNou, "Ct_clb_venchelt") AND ObjExists(loNou, "Ct_clb_sectie") ; + AND ObjExists(loNou, "Ct_clb_lucrare") AND ObjExists(loNou, "Ed_tx_simplu1"), "B: tip 1 prezente restul" + CASE !tlAviz AND tnTip = 2 AND gnScadereStoc = 0 + DO Assert WITH ObjExists(loNou, "Ct_clb_altele") AND loNou.Ct_clb_altele.clb_tx_cautare.Lb_simplu1.Caption == "Nr. contract", "B: tip 2 altele = Nr. contract" + CASE !tlAviz AND tnTip = 8 + DO Assert WITH !ObjExists(loNou, "Clb_zi_curs"), "B: tip 8 clb_zi_curs eliminat" + CASE !tlAviz AND tnTip = 5 + DO Assert WITH ObjExists(loNou, "Ct_clb_valuta"), "B: tip 5 ct_clb_valuta prezent" + CASE tlAviz AND tnTip = 22 AND gnScadereStoc = 0 + DO Assert WITH !ObjExists(loNou, "Ct_clb_responsabil") AND !ObjExists(loNou, "Ct_clb_gestiune_init") AND !ObjExists(loNou, "Ct_clb_politici_preturi") AND !ObjExists(loNou, "Ct_clb_altele"), "B: tip 22 eliminate responsabil/gestiune_init/politici/altele" + CASE tlAviz AND tnTip = 23 + DO Assert WITH !ObjExists(loNou, "Ct_clb_venchelt") AND ObjExists(loNou, "Ct_clb_politici_preturi"), "B: tip 23 venchelt eliminat, politici prezent" + DO Assert WITH loNou.Ct_clb_nume_client.clb_tx_cautare.Lb_simplu1.Caption == "Gestiune sursa" AND loNou.Ct_clb_altele.clb_tx_cautare.Lb_simplu1.Caption == "Gestiune destinatie", "B: tip 23 etichete gestiune sursa/destinatie" + CASE tlAviz AND tnTip = 41 + DO Assert WITH loNou.Ct_clb_nume_client.clb_tx_cautare.Lb_simplu1.Caption == "Retur de la" AND loNou.Ct_clb_altele.clb_tx_cautare.Lb_simplu1.Caption == "Retur la", "B: tip 41 etichete retur" + CASE tlAviz AND tnTip = 21 AND gnScadereStoc = 1 + DO Assert WITH ObjExists(loNou, "Ct_clb_gestiune_init"), "B: tip 21 stoc=1 gestiune_init prezent" + ENDCASE + + loNou.Release() + loVechi.Release() + RELEASE loNou, loVechi + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + ENDIF +ENDPROC + +FUNCTION ObjExists + * prezenta reala in colectia Objects, cautare recursiva - controalele pot fi in containere + LPARAMETERS toContainer, tcName + LOCAL i, loO + FOR i = 1 TO toContainer.Objects.Count + loO = toContainer.Objects(i) + IF UPPER(loO.Name) == UPPER(tcName) + RETURN .T. + ENDIF + IF TYPE('loO.Objects.Count') = 'N' + IF ObjExists(loO, tcName) + RETURN .T. + ENDIF + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + * preexistent pe calea veche, vizibil doar fiindca testul tine formularul vechi viu cand Init-ul unificat muta + * focusul: _combobox1.LostFocus -> do_schimba_tipdoc -> clb_serie_act eliminat la rezultat_serii=0 (1925) + IF tnErr = 1925 AND UPPER(tcProg) == "FRM_DATE_FACTURA.DO_SCHIMBA_TIPDOC" AND "CLB_SERIE_ACT" $ UPPER(tcMsg) + DO AfLog WITH "PREEXISTENT (vechi, neconsiderat) " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg + RETURN + ENDIF + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3_neregresie_vechi.prg b/utile/Teste/facturare_unificat/test_s3_neregresie_vechi.prg new file mode 100644 index 0000000..15ea88c --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3_neregresie_vechi.prg @@ -0,0 +1,162 @@ +* test_s3_neregresie_vechi.prg +* Headless: amprenta antetului dupa Init NUMAI pe calea veche (frm_date_factura / frm_date_aviz), +* pe toate tipurile, scrisa intr-un fisier text; rulat o data pe binarul curent (CURENT) si o data +* pe backup-ul ofacturare.pre_s3_1.bak.vcx (BACKUP), in lansari separate. Asteptat: cele doua +* fisiere de amprenta sunt IDENTICE (diff gol) - clasele-sursa nu au fost atinse. +* +* Amprenta per caz: controale prezente (colectia Objects), etichetele altele/client, nid_tip, +* clb_serie_act.nid_tipdoc, Height. +* +* Rulare (cate o lansare per apel): +* vfp9.exe -A -T "...\test_s3_neregresie_vechi.prg" CURENT +* vfp9.exe -A -T "...\test_s3_neregresie_vechi.prg" BACKUP +* Iesire: ...\out\neregresie_vechi_CURENT.txt / neregresie_vechi_BACKUP.txt, log neregresie_vechi_.log + +LPARAMETERS tcMod +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +tcMod = UPPER(ALLTRIM(IIF(EMPTY(tcMod), "CURENT", tcMod))) +PUBLIC gcLog, gcOut, gnFail +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\neregresie_vechi_" + tcMod + ".log" +gcOut = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\neregresie_vechi_" + tcMod + ".txt" +IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out") + MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out" +ENDIF +STRTOFILE("START " + tcMod + " " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog) +STRTOFILE("", gcOut) +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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) + +IF tcMod = "BACKUP" + RELEASE CLASSLIB "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vcx" + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.pre_s3_1.bak.vcx" ADDITIVE +ENDIF +DO AfLog WITH "CLASSLIB ofacturare: " + IIF("OFACTURARE.PRE_S3_1.BAK.VCX" $ UPPER(SET("CLASSLIB")), "BACKUP", "CURENT") + +PRIVATE poDate, poGeneratorNumere, plVizibil +plVizibil = .F. +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + +LOCAL laFact[13], laAviz[11], lnStoc, i, lnSerii, lcSerii +laFact[1] = 1 +laFact[2] = 2 +laFact[3] = 3 +laFact[4] = 4 +laFact[5] = 5 +laFact[6] = 7 +laFact[7] = 8 +laFact[8] = 9 +laFact[9] = 10 +laFact[10] = 45 +laFact[11] = 48 +laFact[12] = 49 +laFact[13] = 52 +laAviz[1] = 21 +laAviz[2] = 22 +laAviz[3] = 23 +laAviz[4] = 24 +laAviz[5] = 25 +laAviz[6] = 26 +laAviz[7] = 28 +laAviz[8] = 29 +laAviz[9] = 41 +laAviz[10] = 42 +laAviz[11] = 47 + +FOR lnStoc = 0 TO 1 + gnScadereStoc = lnStoc + FOR lnSerii = 1 TO 2 + lcSerii = IIF(lnSerii = 1, "real", "0") + FOR i = 1 TO 13 + DO Caz WITH laFact[i], .F., lcSerii + ENDFOR + FOR i = 1 TO 11 + DO Caz WITH laAviz[i], .T., lcSerii + ENDFOR + ENDFOR +ENDFOR +DO Final + +PROCEDURE Caz + LPARAMETERS tnTip, tlAviz, tcSerii + LOCAL loVechi, lcVechi, lcAmprenta, i, lcCaz + lcCaz = "[tip=" + TRANSFORM(tnTip) + " stoc=" + TRANSFORM(gnScadereStoc) + " serii=" + tcSerii + "]" + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip - 1 + gnScadereStoc * 10, tnTip) + poDate.nIdTipDoc = IIF(tlAviz, 6, 5) + poGeneratorNumere.ResetNumere() + IF tcSerii = "real" + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + ELSE + poDate.rezultat_serii = 0 + ENDIF + lcVechi = IIF(tlAviz, 'frm_date_aviz', 'frm_date_factura') + loVechi = CREATEOBJECT(lcVechi) + IF VARTYPE(loVechi) <> 'O' + gnFail = gnFail + 1 + DO AfLog WITH "FAIL " + lcCaz + " Createobject " + lcVechi + RETURN + ENDIF + lcAmprenta = lcCaz + " in_valuta=" + TRANSFORM(poDate.in_valuta) + " rezultat_serii=" + TRANSFORM(poDate.rezultat_serii) + " obj=" + FOR i = 1 TO loVechi.Objects.Count + lcAmprenta = lcAmprenta + loVechi.Objects(i).Name + "," + ENDFOR + IF ObjExists(loVechi, "Ct_clb_altele") + lcAmprenta = lcAmprenta + " altele=[" + loVechi.Ct_clb_altele.clb_tx_cautare.Lb_simplu1.Caption + "]" + ENDIF + IF ObjExists(loVechi, "Ct_clb_nume_client") + lcAmprenta = lcAmprenta + " client=[" + loVechi.Ct_clb_nume_client.clb_tx_cautare.Lb_simplu1.Caption + "]" + ENDIF + IF ObjExists(loVechi, "Clb_serie_act") + lcAmprenta = lcAmprenta + " serie.nid_tipdoc=" + TRANSFORM(loVechi.Clb_serie_act.nid_tipdoc) + ENDIF + lcAmprenta = lcAmprenta + " nid_tip=" + TRANSFORM(loVechi.nid_tip) + " Height=" + TRANSFORM(loVechi.Height) + STRTOFILE(lcAmprenta + CHR(13) + CHR(10), gcOut, 1) + loVechi.Release() + RELEASE loVechi + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + ENDIF +ENDPROC + +FUNCTION ObjExists + LPARAMETERS toForm, tcName + LOCAL i + FOR i = 1 TO toForm.Objects.Count + IF UPPER(toForm.Objects(i).Name) == UPPER(tcName) + RETURN .T. + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE AfLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL fail=" + TRANSFORM(gnFail) + " randuri amprenta=" + TRANSFORM(ALINES(laX, FILETOSTR(gcOut))) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3_tipdoc.prg b/utile/Teste/facturare_unificat/test_s3_tipdoc.prg new file mode 100644 index 0000000..70258c5 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3_tipdoc.prg @@ -0,0 +1,362 @@ +* test_s3_tipdoc.prg +* Headless: paritatea lui do_schimba_tipdoc intre calea veche (frm_date_factura, metoda in .vcx) si formularul +* unificat (frm_facturare_articole2.do_schimba_tipdoc -> oAntetFacturare.alege_tipdoc / schimba_tipdoc din +* ofacturare_antet.prg + efectele pe controale ramase in .vcx). Generatorul de numere e o SUBCLASA de test a lui +* oGeneratorNumere (oGeneratorMock, mock_generator_numere.prg) care NU atinge Oracle la alocare/dezalocare: aloca_numar +* intoarce un contor local si jurnalizeaza apelul; dezaloca_numar jurnalizeaza si pune numarul pe 0; +* creeaza_cursor_serii construieste un cursor local de serii (FACTURA/PROFORMA cu serie+plaje, BON FISCAL fara +* serie cu plaje) - fara Oracle (pe MARIUSM_AUTO proforma n-are plaje si goExecutor deschide un dialog real). +* NU se consuma numere reale din serii. +* +* REZULTAT ASTEPTAT (declarat inainte de rulare): +* A. Pentru fiecare caz (fel initial -> fel ales) se construieste ACELASI poDate (tip 1, nIdTipDoc = FACTURA), +* se creeaza formularul vechi / unificatul, se pune valoarea in combo (ct_clb_fdoc._combobox1 / clb_fdoc.cboFdoc) +* si se apeleaza do_schimba_tipdoc(). Se compara amprenta: poDate.nIdTipDoc, eProforma, eBonFiscal, id_fdoc, +* fdoc, serie_act, nract, rezultat_serii, starea controlului serie (nid_tipdoc, nTip, vizibilitati), jurnalul +* generatorului (aloca/dezaloca, in ordine, cu tipul de document) si erorile VFP. +* A2. Calea veche pastreaza un apel neconditionat catre _cbbase1.LostFocus() inaintea garzii de schimbare de tip +* (bug preexistent, lasat constient); calea unificata nu mai are acest apel. Efectul e o divergenta cu tipar +* fix: fara schimbare de tip, calea veche arde un numar suplimentar iar unificatul nu aloca nimic; cu schimbare +* de tip, calea veche contine in plus perechea aloca_numar(tip vechi)/dezaloca_numar(tip vechi) inaintea garzii, +* iar numarul final e mai mare cu exact 1 fata de unificat. Testul normalizeaza aceasta divergenta (o verifica +* explicit, cu asertiuni, apoi o scoate din amprenta) si compara restul IDENTIC - vezi NormalizeazaFaraSchimbare +* / NormalizeazaCuSchimbare mai jos. Daca divergenta iese din acest tipar, normalizarea nu se potriveste si +* testul PICA. +* B. Cazuri: FACTURA->FACTURA (fara schimbare: nIdTipDoc ramane 5, dar _cbbase1.LostFocus() se apeleaza +* neconditionat pe calea veche - regenerarea numarului e divergenta asteptata A2, nu identitate), +* FACTURA->PROFORMA (nIdTipDoc 23), FACTURA->BON FISCAL (nIdTipDoc 3), PROFORMA->FACTURA (pornind cu +* nIdTipDoc 23), BON FISCAL->PROFORMA. +* C. Asteptat in plus, declarat: dupa FACTURA->PROFORMA poDate.nIdTipDoc = poDate.nIdTipDocProforma = 23 pe +* ambele; dupa ->BON FISCAL = 3; jurnalul contine dezaloca_numar(tip vechi) inainte de alocarea pe tipul nou. +* D. Netestabil headless: secventa reala LostFocus/Valid la iesirea din combo (test_s3_tipdoc_ui.prg). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_tipdoc.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_tipdoc.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockNumar, gnDivergenteQ8 +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_tipdoc.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) +gnFail = 0 +gnPass = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockNumar = 0 +gnDivergenteQ8 = 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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", &lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg" +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +DO Assert WITH TYPE('CREATEOBJECT("oAntetFacturare")') = 'O', "oAntetFacturare instantiabil" + +PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest +plVizibil = .F. +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") +DO Assert WITH VARTYPE(poGeneratorNumere) = 'O' AND poGeneratorNumere.Class == "Ogeneratormock", "generator mock instantiat (subclasa oGeneratorNumere)" +poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +DO Caz WITH "FACTURA", "FACTURA" +DO Caz WITH "FACTURA", "PROFORMA" +DO Caz WITH "FACTURA", "BON FISCAL" +DO Caz WITH "PROFORMA", "FACTURA" +DO Caz WITH "BON FISCAL", "PROFORMA" + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz + LPARAMETERS tcDin, tcIn + LOCAL lcVechi, lcNou, lnAsteptat, lcVechiNorm, lnTipVechi, lnTipNou + gcCaz = "[" + tcDin + " -> " + tcIn + "] " + lcVechi = Amprenta('frm_date_factura', tcDin, tcIn) + lcNou = Amprenta('frm_facturare_articole2', tcDin, tcIn) + lnTipVechi = IdTipDoc(tcDin) + lnTipNou = IdTipDoc(tcIn) + + IF tcDin == tcIn + lcVechiNorm = NormalizeazaFaraSchimbare(lcVechi, lcNou, lnTipVechi) + ELSE + lcVechiNorm = NormalizeazaCuSchimbare(lcVechi, lcNou, lnTipVechi, lnTipNou) + ENDIF + + IF lcVechiNorm == lcNou + gnPass = gnPass + 1 + DO AfLog WITH "OK " + gcCaz + "amprente identice dupa normalizarea divergentei Q8 (" + TRANSFORM(OCCURS(CHR(10), lcNou)) + " linii)" + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL " + gcCaz + "amprente diferite dupa normalizare (divergenta neasteptata):" + DO DifLinii WITH lcVechiNorm, lcNou + ENDIF + lnAsteptat = IdTipDoc(tcIn) + DO Assert WITH ("poDate.nidtipdoc=" + TRANSFORM(lnAsteptat) + CHR(13)) $ lcVechi, "asteptat nIdTipDoc=" + TRANSFORM(lnAsteptat) + " dupa schimbare" + IF !(tcDin == tcIn) + DO Assert WITH ("dezaloca_numar(" + TRANSFORM(IdTipDoc(tcDin)) + ")") $ lcVechi, "asteptat dezaloca_numar pe tipul vechi " + TRANSFORM(IdTipDoc(tcDin)) + ENDIF +ENDPROC + +FUNCTION NormalizeazaFaraSchimbare + * Q8, fara schimbare de tip: calea veche arde un numar la intrare-iesire din combo, unificatul nu aloca nimic + LPARAMETERS tcVechi, tcNou, tnTip + LOCAL lcJurnalVechi, lcJurnalNou, lnNractVechi, lnNractNou, lcVechiNorm + + lcJurnalVechi = Jurnal(tcVechi) + lcJurnalNou = Jurnal(tcNou) + lnNractVechi = VAL(ValoareCheie(tcVechi, "poDate.nract")) + lnNractNou = VAL(ValoareCheie(tcNou, "poDate.nract")) + + DO Assert WITH lnNractNou = 0, "Q8: pe calea unificata nract ramane neatins la intrare-iesire fara schimbare de tip" + DO Assert WITH EMPTY(lcJurnalNou), "Q8: pe calea unificata jurnalul generatorului ramane gol fara schimbare de tip" + DO Assert WITH lnNractVechi > 0, "Q8: pe calea veche nract se arde la intrare-iesire din combo, chiar fara schimbare de tip" + DO Assert WITH OCCURS("aloca_numar(" + TRANSFORM(tnTip) + ") -> ", lcJurnalVechi) = 1, "Q8: pe calea veche se aloca exact un numar, pe tipul curent " + TRANSFORM(tnTip) + ", la intrare-iesire fara schimbare de tip" + + gnDivergenteQ8 = gnDivergenteQ8 + 1 + DO AfLog WITH "DIVERGENTA-ASTEPTATA (Q8): " + gcCaz + "fara schimbare de tip, calea veche arde numarul (nract=" + TRANSFORM(lnNractVechi) + "), unificatul nu aloca nimic (nract=0)" + + lcVechiNorm = InlocuiesteJurnal(tcVechi, "") + lcVechiNorm = STRTRAN(lcVechiNorm, "poDate.nract=" + TRANSFORM(lnNractVechi) + CHR(13) + CHR(10), "poDate.nract=0" + CHR(13) + CHR(10), 1, 1) + RETURN lcVechiNorm +ENDFUNC + +FUNCTION NormalizeazaCuSchimbare + * Q8, cu schimbare de tip: calea veche are in plus perechea aloca_numar(tip vechi)/dezaloca_numar(tip vechi) + * inaintea garzii, iar numarul final e mai mare cu exact 1 fata de unificat + LPARAMETERS tcVechi, tcNou, tnTipVechi, tnTipNou + LOCAL lcJurnalVechi, lnNractVechi, lnNractNou, lcMarcaj, lnPozAloc, lnN + LOCAL lcLiniaAloc, lcLiniaDezaloc, lcBloc, lcJurnalRedus, lcLiniaAlocFinalaVechi, lcLiniaAlocFinalaNou, lcVechiNorm + + lcJurnalVechi = Jurnal(tcVechi) + lnNractVechi = VAL(ValoareCheie(tcVechi, "poDate.nract")) + lnNractNou = VAL(ValoareCheie(tcNou, "poDate.nract")) + + lcMarcaj = "aloca_numar(" + TRANSFORM(tnTipVechi) + ") -> " + lnPozAloc = AT(lcMarcaj, lcJurnalVechi) + DO Assert WITH lnPozAloc > 0, "Q8: perechea redundanta aloca_numar(tip vechi) prezenta pe calea veche" + IF lnPozAloc = 0 + RETURN tcVechi && divergenta neasteptata, comparatia finala ramane nenormalizata si pica + ENDIF + + lnN = VAL(SUBSTR(lcJurnalVechi, lnPozAloc + LEN(lcMarcaj))) + lcLiniaAloc = lcMarcaj + TRANSFORM(lnN) + CHR(13) + CHR(10) + lcLiniaDezaloc = "dezaloca_numar(" + TRANSFORM(tnTipVechi) + ") numar=" + TRANSFORM(lnN) + CHR(13) + CHR(10) + lcBloc = lcLiniaAloc + lcLiniaDezaloc + DO Assert WITH (lcBloc $ lcJurnalVechi), "Q8: perechea aloca_numar/dezaloca_numar pe tipul vechi " + TRANSFORM(tnTipVechi) + " apare adiacent, in aceasta ordine" + + lcJurnalRedus = STRTRAN(lcJurnalVechi, lcBloc, "", 1, 1) + + lcLiniaAlocFinalaVechi = "aloca_numar(" + TRANSFORM(tnTipNou) + ") -> " + TRANSFORM(lnNractVechi) + CHR(13) + CHR(10) + lcLiniaAlocFinalaNou = "aloca_numar(" + TRANSFORM(tnTipNou) + ") -> " + TRANSFORM(lnNractNou) + CHR(13) + CHR(10) + DO Assert WITH lnNractVechi = lnNractNou + 1, "Q8: numarul final pe calea veche (" + TRANSFORM(lnNractVechi) + ") e cu exact 1 mai mare decat pe calea unificata (" + TRANSFORM(lnNractNou) + ")" + DO Assert WITH (lcLiniaAlocFinalaVechi $ lcJurnalRedus), "Q8: dupa scoaterea perechii redundante, ultima alocare e pe tipul nou " + TRANSFORM(tnTipNou) + " cu numarul " + TRANSFORM(lnNractVechi) + + lcJurnalRedus = STRTRAN(lcJurnalRedus, lcLiniaAlocFinalaVechi, lcLiniaAlocFinalaNou, 1, 1) + + gnDivergenteQ8 = gnDivergenteQ8 + 1 + DO AfLog WITH "DIVERGENTA-ASTEPTATA (Q8): " + gcCaz + "calea veche contine in plus perechea aloca_numar(" + TRANSFORM(tnTipVechi) + ")/dezaloca_numar(" + TRANSFORM(tnTipVechi) + ") inaintea garzii; numar final " + TRANSFORM(lnNractVechi) + " (veche) vs " + TRANSFORM(lnNractNou) + " (unificat)" + + lcVechiNorm = InlocuiesteJurnal(tcVechi, lcJurnalRedus) + lcVechiNorm = STRTRAN(lcVechiNorm, "poDate.nract=" + TRANSFORM(lnNractVechi) + CHR(13) + CHR(10), "poDate.nract=" + TRANSFORM(lnNractNou) + CHR(13) + CHR(10), 1, 1) + RETURN lcVechiNorm +ENDFUNC + +FUNCTION ValoareCheie + * valoarea unei chei "cheie=valoare" dintr-o amprenta, cautata linie cu linie + LPARAMETERS tcAmprenta, tcCheie + LOCAL laL[1], lnL, i + lnL = ALINES(laL, tcAmprenta) + FOR i = 1 TO lnL + IF LEFT(laL[i], LEN(tcCheie) + 1) == tcCheie + "=" + RETURN SUBSTR(laL[i], LEN(tcCheie) + 2) + ENDIF + ENDFOR + RETURN "" +ENDFUNC + +FUNCTION Jurnal + * liniile jurnalului generatorului (intre GENERATOR: si ERORI:) dintr-o amprenta + LPARAMETERS tcAmprenta + LOCAL laL[1], lnL, i, lnStart, lnStop, lcR + lnL = ALINES(laL, tcAmprenta) + lnStart = 0 + lnStop = 0 + FOR i = 1 TO lnL + IF laL[i] == "GENERATOR:" + lnStart = i + 1 + ENDIF + IF laL[i] == "ERORI:" AND lnStart > 0 + lnStop = i - 1 + EXIT + ENDIF + ENDFOR + lcR = "" + FOR i = lnStart TO lnStop + lcR = lcR + laL[i] + CHR(13) + CHR(10) + ENDFOR + RETURN lcR +ENDFUNC + +FUNCTION InlocuiesteJurnal + * inlocuieste in amprenta continutul dintre GENERATOR: si ERORI: cu jurnalul dat + LPARAMETERS tcAmprenta, tcJurnalNou + LOCAL laL[1], lnL, i, lnStart, lnStop, lcR + lnL = ALINES(laL, tcAmprenta) + lnStart = 0 + lnStop = 0 + FOR i = 1 TO lnL + IF laL[i] == "GENERATOR:" + lnStart = i + 1 + ENDIF + IF laL[i] == "ERORI:" AND lnStart > 0 + lnStop = i - 1 + EXIT + ENDIF + ENDFOR + lcR = "" + FOR i = 1 TO lnStart - 1 + lcR = lcR + laL[i] + CHR(13) + CHR(10) + ENDFOR + lcR = lcR + tcJurnalNou + FOR i = lnStop + 1 TO lnL + lcR = lcR + laL[i] + CHR(13) + CHR(10) + ENDFOR + RETURN lcR +ENDFUNC + +FUNCTION IdTipDoc + LPARAMETERS tcFel + RETURN IIF(tcFel == "PROFORMA", 23, IIF(tcFel == "BON FISCAL", 3, 5)) +ENDFUNC + +FUNCTION Amprenta + LPARAMETERS tcClasa, tcDin, tcIn + LOCAL loF, lcA, loCombo, loSerie + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 25001, 1) + poDate.nIdTipDoc = IdTipDoc(tcDin) + poGeneratorNumere.ResetNumere() + gnMockNumar = 100 + gcMockApeluri = "" + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + poDate.dataact = DATE(gnAn, gnLuna, 1) + poDate.dataireg = poDate.dataact + poDate.id_client = 0 + gcErr = "" + + DO AfLog WITH " > " + gcCaz + "creez " + tcClasa + " (rezultat_serii=" + TRANSFORM(poDate.rezultat_serii) + ")" + loF = CREATEOBJECT(tcClasa) + IF VARTYPE(loF) <> 'O' + RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr + ENDIF + gcErr = "" + gcMockApeluri = "" + IF tcClasa == 'frm_date_factura' + loCombo = loF.ct_clb_fdoc._combobox1 + ELSE + loCombo = loF.clb_fdoc.cboFdoc + ENDIF + lcA = "combo.initial=" + TRANSFORM(loCombo.Value) + CHR(13) + CHR(10) + loCombo.Value = tcIn + lcA = lcA + "combo.ales=" + TRANSFORM(loCombo.Value) + CHR(13) + CHR(10) + lcA = lcA + "INIT: nidtipdoc=" + TRANSFORM(poDate.nIdTipDoc) + " nract=" + TRANSFORM(poDate.nract) + " serie=" + TRANSFORM(poDate.serie_act) + CHR(13) + CHR(10) + gcMockApeluri = "" + gcErr = "" + DO AfLog WITH " > " + gcCaz + "apelez " + tcClasa + ".do_schimba_tipdoc()" + loF.do_schimba_tipdoc() + lcA = lcA + "poDate.nidtipdoc=" + TRANSFORM(poDate.nIdTipDoc) + CHR(13) + CHR(10) + lcA = lcA + "poDate.eproforma=" + TRANSFORM(poDate.eProforma) + CHR(13) + CHR(10) + lcA = lcA + "poDate.ebonfiscal=" + TRANSFORM(poDate.eBonFiscal) + CHR(13) + CHR(10) + lcA = lcA + "poDate.id_fdoc=" + TRANSFORM(poDate.id_fdoc) + CHR(13) + CHR(10) + lcA = lcA + "poDate.fdoc=" + TRANSFORM(poDate.fdoc) + CHR(13) + CHR(10) + lcA = lcA + "poDate.serie_act=" + TRANSFORM(poDate.serie_act) + CHR(13) + CHR(10) + lcA = lcA + "poDate.nract=" + TRANSFORM(poDate.nract) + CHR(13) + CHR(10) + lcA = lcA + "poDate.rezultat_serii=" + TRANSFORM(poDate.rezultat_serii) + CHR(13) + CHR(10) + IF tcClasa == 'frm_date_factura' + loSerie = IIF(PEMSTATUS(loF, 'clb_serie_act', 5), loF.clb_serie_act, NULL) + ELSE + loSerie = IIF(PEMSTATUS(loF, 'clb_serie_act1', 5), loF.clb_serie_act1, NULL) + ENDIF + IF VARTYPE(loSerie) = 'O' + lcA = lcA + "serie.nid_tipdoc=" + TRANSFORM(loSerie.nid_tipdoc) + " nTip=" + TRANSFORM(loSerie.nTip) ; + + " cb.vis=" + TRANSFORM(loSerie._cbbase1.Visible) + " tx.vis=" + TRANSFORM(loSerie.text_simplu1.Visible) ; + + " cb.val=" + TRANSFORM(loSerie._cbbase1.Value) + CHR(13) + CHR(10) + ELSE + lcA = lcA + "serie=" + CHR(13) + CHR(10) + ENDIF + lcA = lcA + "GENERATOR:" + CHR(13) + CHR(10) + gcMockApeluri + lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr + loF.Release() + RELEASE loF + RETURN lcA +ENDFUNC + +PROCEDURE DifLinii + LPARAMETERS tcV, tcN + LOCAL laV[1], laN[1], lnV, lnN, i, lnMax + lnV = ALINES(laV, tcV) + lnN = ALINES(laN, tcN) + lnMax = MAX(lnV, lnN) + FOR i = 1 TO lnMax + IF i > lnV OR i > lnN OR !(laV[i] == laN[i]) + DO AfLog WITH " vechi: " + IIF(i <= lnV, laV[i], "") + DO AfLog WITH " nou : " + IIF(i <= lnN, laN[i], "") + ENDIF + ENDFOR +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + CHR(13) + CHR(10) +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " divergente-asteptate(Q8)=" + TRANSFORM(gnDivergenteQ8) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC + diff --git a/utile/Teste/facturare_unificat/test_s3_tipdoc_ui.prg b/utile/Teste/facturare_unificat/test_s3_tipdoc_ui.prg new file mode 100644 index 0000000..a067232 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3_tipdoc_ui.prg @@ -0,0 +1,237 @@ +* test_s3_tipdoc_ui.prg +* UI VIZIBIL (harness ui_harness.prg + vfp_ui_harness.ps1, fereastra off-screen, capturi PrintWindow, FARA input +* real - doar SetFocus programatic, care declanseaza secventa reala LostFocus/Valid intre controale): ce nu e +* testabil headless din S3-3, pe frm_facturare_articole2 (unificat) si, pentru paritate, pe frm_date_factura (vechi). +* Oracle doar pentru mediu (harness, optiuni, setari document); seriile/numerele prin mock_generator_numere.prg (fara +* Oracle); dialogurile de cautare prin mock_caut_antet.prg; amessagebox prin mock_amessagebox.prg. +* +* REZULTAT ASTEPTAT (declarat inainte de rulare), pe fiecare formular (vechi, apoi unificat), tip 1, FACTURA: +* pas0 deschidere: Show() reuseste; ActiveControl dupa Init = combo-ul felului de document (vechi: _combobox1, +* unificat: cboFdoc) - regula din Init (in_valuta=0 -> focus pe fdoc). +* pas1 schimbare FACTURA -> PROFORMA prin combo + mutarea focusului pe clb_dataact (vechi si unificat: cboFdoc.LostFocus - Valid NU se declanseaza la SetFocus programatic, masurat S3-3 +* -> do_schimba_tipdoc): poDate.nIdTipDoc = 23, serie_act = 'PRO' (serie reinitializata), nract realocat +* (jurnal: dezaloca_numar(5) ... aloca_numar(23)); identic pe ambele. +* pas2 intrare si iesire din combo FARA schimbare: nIdTipDoc ramane 23; _cbbase1.LostFocus() e apelat neconditionat, dar cu +* numarul deja alocat pe aceeasi serie genereazaNumar nu realoca (jurnal gol) - IDENTIC cu calea veche, documentat. +* pas3 iesire din serie (focus pe _cbbase1, apoi pe clb_nract): genereazaNumar -> verifica_serie pe aceeasi serie +* (paPlaje id_serie = cursor) -> fara realocare daca numarul e deja alocat; jurnal identic pe ambele. +* pas4 cautare client prin lupa (img_cautare.Click -> do_apeleaza -> do_cauta_client, dialog = mock): poDate.id_client +* = gnMockIdPart si ActiveControl.Name dupa cautare identic intre vechi si unificat. +* pas5 inchidere prin do_renunt(). +* Se compara amprentele vechi vs unificat pe fiecare pas (cu maparea numelor _combobox1 <-> cboFdoc). +* Daca SetFocus programatic nu declanseaza LostFocus/Valid in mediul harness-ului (fereastra fara focus de sistem), +* testul o spune (FAIL cu jurnal gol pe pas1) - nu se simuleaza nimic prin input real. +* +* Rulare: powershell -ExecutionPolicy Bypass -File test_s3_tipdoc_ui.ps1 (din facturare_unificat\) +* Log: facturare_unificat\test_s3_tipdoc_ui_log.txt ; capturi in screenshots_tipdoc\ + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcUILog, gcSyncDir, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockNumar, gnMockIdPart, gnMockButon +gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_tipdoc_ui_log.txt" +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) +gnFail = 0 +gnPass = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockNumar = 0 +gnMockIdPart = 0 +gnMockButon = 1 +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_caut_antet.prg", &lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + +PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest +plVizibil = .F. +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") +poDateGestiuneDest = CREATEOBJECT("oDateGestiune") +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp +PUBLIC gnIdClient1 +gnIdClient1 = 0 +IF SQLEXEC(gnHandle, "select max(id_part) as id1 from nom_parteneri", "crsclient") > 0 + gnIdClient1 = NVL(crsclient.id1, 0) + USE IN crsclient +ENDIF +gnMockIdPart = gnIdClient1 + +PUBLIC gaAmpr[2, 6] +STORE "" TO gaAmpr +LOCAL lnF, lcClasa, loF, loCombo, loSerie, lnPas +FOR lnF = 1 TO 2 + lcClasa = IIF(lnF = 1, 'frm_date_factura', 'frm_facturare_articole2') + gcCaz = "[" + lcClasa + "] " + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 25001, 1) + poDate.nIdTipDoc = poDate.nIdTipDocFactura + poGeneratorNumere.ResetNumere() + gnMockNumar = 100 + gcMockApeluri = "" + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + poDate.dataact = DATE(gnAn, gnLuna, 1) + poDate.dataireg = poDate.dataact + poDate.id_client = 0 + gcErr = "" + loF = CREATEOBJECT(lcClasa) + IF VARTYPE(loF) <> 'O' + DO AfLog WITH "FAIL " + gcCaz + "CREATEOBJECT esuat: " + gcErr + gnFail = gnFail + 1 + LOOP + ENDIF + loF.WindowType = 0 + loF.Show() + DOEVENTS FORCE + * pas0 + gaAmpr[lnF, 1] = "ActiveControl=" + Nume(loF) + " nIdTipDoc=" + TRANSFORM(poDate.nIdTipDoc) + " serie=" + TRANSFORM(poDate.serie_act) + " nract=" + TRANSFORM(poDate.nract) + " err=[" + gcErr + "]" + DO AfLog WITH "PAS0 " + gcCaz + gaAmpr[lnF, 1] + DO HarnessStep WITH (lnF - 1) * 6 + 0, lcClasa + ' deschis', 5 + * pas1: FACTURA -> PROFORMA + IF lnF = 1 + loCombo = loF.ct_clb_fdoc._combobox1 + ELSE + loCombo = loF.clb_fdoc.cboFdoc + ENDIF + gcErr = "" + gcMockApeluri = "" + loCombo.SetFocus() + loCombo.Value = "PROFORMA" + loF.clb_dataact.SetFocus() + DOEVENTS FORCE + gaAmpr[lnF, 2] = "ActiveControl=" + Nume(loF) + " nIdTipDoc=" + TRANSFORM(poDate.nIdTipDoc) + " serie=" + TRANSFORM(poDate.serie_act) + " nract=" + TRANSFORM(poDate.nract) + " rez=" + TRANSFORM(poDate.rezultat_serii) + " jurnal=" + Plat(gcMockApeluri) + " err=[" + gcErr + "]" + DO AfLog WITH "PAS1 " + gcCaz + gaAmpr[lnF, 2] + DO HarnessStep WITH (lnF - 1) * 6 + 1, 'FACTURA -> PROFORMA', 5 + * pas2: intrare/iesire fara schimbare + gcErr = "" + gcMockApeluri = "" + loCombo.SetFocus() + loF.clb_dataact.SetFocus() + DOEVENTS FORCE + gaAmpr[lnF, 3] = "ActiveControl=" + Nume(loF) + " nIdTipDoc=" + TRANSFORM(poDate.nIdTipDoc) + " serie=" + TRANSFORM(poDate.serie_act) + " nract=" + TRANSFORM(poDate.nract) + " jurnal=" + Plat(gcMockApeluri) + " err=[" + gcErr + "]" + DO AfLog WITH "PAS2 " + gcCaz + gaAmpr[lnF, 3] + DO HarnessStep WITH (lnF - 1) * 6 + 2, 'combo fara schimbare', 5 + * pas3: iesire din serie + IF lnF = 1 + loSerie = loF.clb_serie_act + ELSE + loSerie = loF.clb_serie_act1 + ENDIF + gcErr = "" + gcMockApeluri = "" + loSerie._cbbase1.SetFocus() + loF.clb_nract.SetFocus() + DOEVENTS FORCE + gaAmpr[lnF, 4] = "ActiveControl=" + Nume(loF) + " nIdTipDoc=" + TRANSFORM(poDate.nIdTipDoc) + " serie=" + TRANSFORM(poDate.serie_act) + " nract=" + TRANSFORM(poDate.nract) + " jurnal=" + Plat(gcMockApeluri) + " err=[" + gcErr + "]" + DO AfLog WITH "PAS3 " + gcCaz + gaAmpr[lnF, 4] + DO HarnessStep WITH (lnF - 1) * 6 + 3, 'iesire din serie', 5 + * pas4: cautare client prin lupa (dialog = mock) + gcErr = "" + gcMockApeluri = "" + loF.ct_clb_nume_client.img_cautare.Click() + DOEVENTS FORCE + gaAmpr[lnF, 5] = "ActiveControl=" + Nume(loF) + " id_client=" + TRANSFORM(poDate.id_client) + " nume=" + TRANSFORM(poDate.nume_client) + " apeluri=" + Plat(gcMockApeluri) + " err=[" + gcErr + "]" + DO AfLog WITH "PAS4 " + gcCaz + gaAmpr[lnF, 5] + DO HarnessStep WITH (lnF - 1) * 6 + 4, 'cautare client', 5 + * pas5: inchidere + gcErr = "" + loF.do_renunt() + DOEVENTS FORCE + gaAmpr[lnF, 6] = "inchis=" + TRANSFORM(VARTYPE(loF) <> 'O') + " err=[" + gcErr + "]" + DO AfLog WITH "PAS5 " + gcCaz + gaAmpr[lnF, 6] + IF VARTYPE(loF) = 'O' + loF.Release() + ENDIF + RELEASE loF + DO HarnessStep WITH (lnF - 1) * 6 + 5, 'inchis', 5 +ENDFOR + +* comparatia vechi vs unificat, cu maparea numelor +LOCAL i, lcV, lcN +FOR i = 1 TO 6 + gcCaz = "[pas" + TRANSFORM(i - 1) + "] " + lcV = STRTRAN(UPPER(gaAmpr[1, i]), "_COMBOBOX1", "CBOFDOC") + lcN = UPPER(gaAmpr[2, i]) + IF lcV == lcN + gnPass = gnPass + 1 + DO AfLog WITH "OK " + gcCaz + "identic" + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL " + gcCaz + "difera:" + CHR(13) + CHR(10) + " vechi: " + lcV + CHR(13) + CHR(10) + " nou : " + lcN + ENDIF +ENDFOR +* asteptarile declarate, pe unificat +gcCaz = "[asteptat unificat] " +DO Assert WITH "ACTIVECONTROL=CBOFDOC" $ UPPER(gaAmpr[2, 1]), "pas0: focus initial pe cboFdoc" +DO Assert WITH "nIdTipDoc=23" $ gaAmpr[2, 2] AND "serie=PRO" $ gaAmpr[2, 2] AND "aloca_numar(23)" $ gaAmpr[2, 2] AND "dezaloca_numar(5)" $ gaAmpr[2, 2], "pas1: PROFORMA, serie PRO, numar realocat" +DO Assert WITH "nIdTipDoc=23" $ gaAmpr[2, 3], "pas2: tip neschimbat" +DO Assert WITH ("id_client=" + TRANSFORM(gnIdClient1)) $ gaAmpr[2, 5], "pas4: id_client din dialogul (mock) de client" +DO Final + +*---------------------------------------------------------------------------------------- +FUNCTION Nume + LPARAMETERS toF + LOCAL lcN + lcN = "" + IF VARTYPE(toF.ActiveControl) = 'O' + lcN = toF.ActiveControl.Name + ENDIF + RETURN lcN +ENDFUNC + +FUNCTION Plat + LPARAMETERS tcS + RETURN STRTRAN(STRTRAN(tcS, CHR(13) + CHR(10), "; "), CHR(10), "; ") +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL: " + gcCaz + tcMsg + ENDIF +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " @" + tcProg + ":" + TRANSFORM(tnLine) + "; " +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + DO HarnessDone WITH 'done' + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3_tipdoc_ui.ps1 b/utile/Teste/facturare_unificat/test_s3_tipdoc_ui.ps1 new file mode 100644 index 0000000..05693a8 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3_tipdoc_ui.ps1 @@ -0,0 +1,12 @@ +# test_s3_tipdoc_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru test_s3_tipdoc_ui.prg. +# Rulare: powershell -ExecutionPolicy Bypass -File test_s3_tipdoc_ui.ps1 (timeout recomandat >= 600s) +# 12 pasi: 0-5 pe frm_date_factura (vechi), 6-11 pe frm_facturare_articole2 (unificat). Fereastra vfp9 e mutata +# off-screen de harness, capturile se fac cu PrintWindow, fara input real (masina e partajata). +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_s3_tipdoc_ui.prg') ` + -Steps @('vechi_deschis','vechi_proforma','vechi_fara_schimbare','vechi_iesire_serie','vechi_cautare_client','vechi_inchis', ` + 'nou_deschis','nou_proforma','nou_fara_schimbare','nou_iesire_serie','nou_cautare_client','nou_inchis') ` + -SyncDir (Join-Path $Teste 'uisync') ` + -ShotsDir (Join-Path $Teste 'screenshots_tipdoc') diff --git a/utile/Teste/facturare_unificat/test_s3_validare_antet.prg b/utile/Teste/facturare_unificat/test_s3_validare_antet.prg new file mode 100644 index 0000000..fc8bb32 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3_validare_antet.prg @@ -0,0 +1,343 @@ +* test_s3_validare_antet.prg +* Headless: paritatea validarii antetului (inainte_de_do_termin) intre calea veche (frm_date_factura / +* frm_date_aviz) si formularul unificat (frm_facturare_articole2 -> oAntetFacturare.valideaza_antet din +* ofacturare_antet.prg). amessagebox si facturi_duplicate sunt inlocuite de mock_validare_antet.prg (jurnal +* al apelurilor + raspuns programat), deci nu se atinge Oracle la verificarea dublurilor. +* +* REZULTAT ASTEPTAT (declarat inainte de rulare): +* A. Pentru fiecare caz (tip, stricaciune) se construieste ACELASI poDate valid, i se strica EXACT campul +* cazului, se creeaza formularul vechi si unificatul si se apeleaza inainte_de_do_termin() pe fiecare. +* Se compara: jurnalul apelurilor (mesaj + tip + titlu; facturi_duplicate cu contul), valoarea intoarsa +* si erorile VFP. Pe unificat, cand antetul TRECE, metoda continua cu validarea articolelor existenta in +* prototip (cursor crsfactura gol -> "Nu ati ales articolele ..." si Return .F.); de aceea pentru cazurile +* care trec se compara separat: pe vechi inainte_de_do_termin() = .T., pe unificat +* oAntet.valideaza_antet(form) = .T. si jurnalul unificat = jurnalul vechi + mesajul de articole. +* B. Cazuri obligatorii (nota S3, Pasul 3): dataireg gol (1 si 21); id_client gol pe 1 (mesaj) si pe 21 +* (fara mesaj - trece); id_pol gol pe 23 (mesaj) si pe 21 (fara); listaid gol pe 2 ("contractul") si pe +* 26 ("contractul"); duplicat pe cont 4111 (tip 1) vs 418 (tip 21) - se verifica ARGUMENTUL primit de +* facturi_duplicate prin mock. Plus: fiecare Case din ambele surse, ordinea (doua campuri stricate -> +* mesajul primului Case), copierea (lCopiere), avertismentul "CLIENT ... BON FISCAL" pe factura. +* C. Asteptat: toate cazurile IDENTIC (mesaj, tip, titlu, ordine, Return) intre vechi si unificat; contul +* din facturi_duplicate = '4111' pe factura, '418' pe aviz. +* D. Netestabil headless: SetFocus pe controlul invalid (fara Show). Daca ridica eroare (ex. 1925 pe un control +* eliminat de Init), eroarea e parte din amprenta si trebuie sa fie identica pe ambele cai - inclusiv pe +* unificat, unde vine din oAntet prin metoda formularului (asta cere ca frm_facturare_articole2 sa NU aiba +* override Error: un Error cu cod, chiar DoDefault(), o inghitea - C6 bis). Asert explicit pe tip 1 +* COPIERE_DESCR_GOL. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3_validare_antet.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_validare_antet.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr, gcMockApeluri, gnMockRaspuns, gcMockDuplicat +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3_validare_antet.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) +gnFail = 0 +gnPass = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", &lcProc +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnScadereStoc=" + TRANSFORM(gnScadereStoc) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +DO Assert WITH TYPE('CREATEOBJECT("oAntetFacturare")') = 'O', "oAntetFacturare instantiabil" +gcMockApeluri = "" +facturi_duplicate('X', 0, '', 0, '') +DO Assert WITH "facturi_duplicate(X" $ gcMockApeluri, "mock facturi_duplicate activ" +gcMockApeluri = "" +amessagebox("proba", 48, "T") +DO Assert WITH "amessagebox([proba]" $ gcMockApeluri, "mock amessagebox activ" +DO AfLog WITH "asertiuni initiale: pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " erori=[" + gcErr + "]" +gcErr = "" + +PRIVATE poDate, poGeneratorNumere, plVizibil, poDateGestiuneDest +plVizibil = .F. +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") +poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +PUBLIC gnIdClient1 +gnIdClient1 = 0 +IF SQLEXEC(gnHandle, "select min(id_part) as id1 from nom_parteneri", "crsclient") > 0 + gnIdClient1 = NVL(crsclient.id1, 0) + USE IN crsclient +ENDIF +DO AfLog WITH "client de test: " + TRANSFORM(gnIdClient1) + +* ---- cazuri: tip, stricaciune, asteptat (TRECE = antetul trece; altfel fragmentul de mesaj asteptat) ---- +DO Caz WITH 1, "VALID", "TRECE" +DO Caz WITH 21, "VALID", "TRECE" +DO Caz WITH 1, "DATAIREG_GOL", "Nu ati completat data inregistrarii!" +DO Caz WITH 21, "DATAIREG_GOL", "Nu ati completat data inregistrarii!" +DO Caz WITH 1, "DATAACT_GOL", "Nu ati completat data documentului!" +DO Caz WITH 21, "DATAACT_GOL", "Nu ati completat data documentului!" +DO Caz WITH 1, "DATASCAD_GOL", "Nu ati completat data scadenta!" +DO Caz WITH 21, "DATASCAD_GOL", "TRECE" +DO Caz WITH 1, "IDFDOC_GOL", "Nu ati ales felul documentului!" +DO Caz WITH 21, "IDFDOC_GOL", "Nu ati ales felul documentului!" +DO Caz WITH 5, "ZICURS_GOL", "Nu ati completat ziua cursului valutar!" +DO Caz WITH 5, "IDVALUTA_GOL", "Nu ati completat valuta!" +DO Caz WITH 1, "NRACT_GOL", "Nu ati completat numarul documentului!" +DO Caz WITH 21, "NRACT_GOL", "Nu ati completat numarul documentului!" +DO Caz WITH 1, "DATAIREG_ALTA_LUNA", "Data inregistrarii trebuie sa fie din luna" +DO Caz WITH 21, "DATAIREG_ALTA_LUNA", "Data inregistrarii trebuie sa fie din luna" +DO Caz WITH 1, "DATASCAD_MICA", "Data scadenta trebuie sa fie mai mare" +DO Caz WITH 1, "DATAACT_MARE", "Data documentului trebuie sa fie mai mica" +DO Caz WITH 21, "DATAACT_MARE", "Data documentului trebuie sa fie mai mica" +DO Caz WITH 1, "IDCLIENT_GOL", "Nu ati ales clientul!" +DO Caz WITH 21, "IDCLIENT_GOL", "TRECE" +DO Caz WITH 7, "DESCRIERE_GOL", "Nu ati ales factura!" +DO Caz WITH 8, "DESCRIERE_GOL", "Nu ati ales factura/facturile pentru care se face returul!" +DO Caz WITH 1, "COPIERE_DESCR_GOL", "Nu ati ales factura de copiat!" +DO Caz WITH 21, "COPIERE_DESCR_GOL", "Nu ati ales avizul de copiat!" +DO Caz WITH 2, "LISTAID_GOL", "Nu ati ales contractul!" +DO Caz WITH 3, "LISTAID_GOL", "Nu ati ales comanda!" +DO Caz WITH 4, "LISTAID_GOL", "Nu ati ales avizul!" +DO Caz WITH 45, "LISTAID_GOL", "Nu ati ales locatia!" +DO Caz WITH 1, "LISTAID_GOL", "TRECE" +DO Caz WITH 26, "LISTAID_GOL", "Nu ati ales contractul!" +DO Caz WITH 21, "LISTAID_GOL", "Nu ati ales comanda!" +DO Caz WITH 23, "LISTAID_GOL", "Nu ati ales gestiunea destinatie!" +DO Caz WITH 41, "LISTAID_GOL", "Nu ati ales gestiunea catre care se face returul!" +DO Caz WITH 22, "LISTAID_GOL", "TRECE" +DO Caz WITH 23, "IDPOL_GOL", "Nu ati ales politica de preturi!" +DO Caz WITH 41, "IDPOL_GOL", "Nu ati ales politica de preturi!" +DO Caz WITH 21, "IDPOL_GOL", "TRECE" +DO Caz WITH 1, "DOUA_DATAIREG_NRACT", "Nu ati completat data inregistrarii!" +DO Caz WITH 21, "DOUA_DATAIREG_NRACT", "Nu ati completat data inregistrarii!" +DO Caz WITH 1, "DUPLICAT_NU", "Facturi dublate" +DO Caz WITH 21, "DUPLICAT_NU", "Avize dublate" +DO Caz WITH 1, "DUPLICAT_DA", "TRECE" +DO Caz WITH 21, "DUPLICAT_DA", "TRECE" +DO Caz WITH 1, "CLIENT_DIVERSI_NU", "in loc de BON FISCAL" +DO Caz WITH 1, "CLIENT_DIVERSI_DA", "TRECE" + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz + LPARAMETERS tnTip, tcStrica, tcAsteptat + LOCAL llAviz, lcVechi, lcNou, llTrece, lcCont + llAviz = INLIST(tnTip, 21, 22, 23, 24, 25, 26, 28, 29, 41, 42, 47) + llTrece = (tcAsteptat == "TRECE") + gcCaz = "[tip=" + TRANSFORM(tnTip) + " " + tcStrica + "] " + lcVechi = Amprenta(tnTip, llAviz, IIF(llAviz, 'frm_date_aviz', 'frm_date_factura'), tcStrica, llTrece) + lcNou = Amprenta(tnTip, llAviz, 'frm_facturare_articole2', tcStrica, llTrece) + IF lcVechi == lcNou + gnPass = gnPass + 1 + DO AfLog WITH "OK " + gcCaz + TRANSFORM(OCCURS(CHR(10), lcVechi)) + " linii amprenta" + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL " + gcCaz + "amprente diferite:" + DO DifLinii WITH lcVechi, lcNou + ENDIF + * asteptarea declarata: mesajul (sau trecerea) si contul la dubluri + IF llTrece + DO Assert WITH "RETURN=.T." $ lcVechi, "asteptat: antetul trece (Return .T. pe vechi)" + lcCont = IIF(llAviz, "facturi_duplicate(418,", "facturi_duplicate(4111,") + DO Assert WITH lcCont $ lcVechi, "asteptat: " + lcCont + " in jurnal" + ELSE + DO Assert WITH tcAsteptat $ lcVechi, "asteptat mesajul [" + tcAsteptat + "] in jurnal" + DO Assert WITH "RETURN=.F." $ lcVechi, "asteptat: Return .F." + ENDIF +ENDPROC + +FUNCTION Amprenta + LPARAMETERS tnTip, tlAviz, tcClasa, tcStrica, tlTrece + LOCAL loF, lcA, llR, llAntet, lcJurnalAntet + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip, tnTip) + poDate.nIdTipDoc = IIF(tlAviz, poDate.nIdTipDocAvizExpeditie, poDate.nIdTipDocFactura) + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + * antet valid + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.datascad = poDate.dataact + 1 + poDate.zi_curs = poDate.dataact + IF EMPTY(NVL(poDate.id_fdoc, 0)) + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + ENDIF + poDate.nract = 77 + poDate.serie_act = "TST" + poDate.id_client = gnIdClient1 + poDate.nume_client = "PARTENER TEST" + poDate.listaid = "999" + poDate.descriere = "DESCRIERE INITIALA" + poDate.id_pol = 3 + IF poDate.in_valuta = 1 + poDate.id_valuta = 2 + poDate.nume_valuta = "EUR" + ENDIF + gnMockRaspuns = 6 + gcMockDuplicat = "" + * stricaciunea cazului + DO CASE + CASE tcStrica == "VALID" + CASE tcStrica == "DATAIREG_GOL" + poDate.dataireg = {} + CASE tcStrica == "DATAACT_GOL" + poDate.dataact = {} + CASE tcStrica == "DATASCAD_GOL" + poDate.datascad = {} + CASE tcStrica == "IDFDOC_GOL" + poDate.id_fdoc = 0 + CASE tcStrica == "ZICURS_GOL" + poDate.zi_curs = {} + CASE tcStrica == "IDVALUTA_GOL" + poDate.id_valuta = 0 + CASE tcStrica == "NRACT_GOL" + poDate.nract = 0 + CASE tcStrica == "DATAIREG_ALTA_LUNA" + poDate.dataireg = GOMONTH(DATE(gnAn, gnLuna, 1), 1) + poDate.dataact = poDate.dataireg + poDate.datascad = poDate.dataact + 1 + CASE tcStrica == "DATASCAD_MICA" + poDate.datascad = poDate.dataact - 1 + CASE tcStrica == "DATAACT_MARE" + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + 1 + poDate.datascad = poDate.dataact + 1 + CASE tcStrica == "IDCLIENT_GOL" + poDate.id_client = 0 + CASE tcStrica == "DESCRIERE_GOL" OR tcStrica == "COPIERE_DESCR_GOL" + poDate.descriere = "" + CASE tcStrica == "LISTAID_GOL" + poDate.listaid = "" + CASE tcStrica == "IDPOL_GOL" + poDate.id_pol = 0 + CASE tcStrica == "DOUA_DATAIREG_NRACT" + poDate.dataireg = {} + poDate.nract = 0 + CASE tcStrica == "DUPLICAT_NU" + gcMockDuplicat = "DUBLURA TEST 1" + gnMockRaspuns = 7 + CASE tcStrica == "DUPLICAT_DA" + gcMockDuplicat = "DUBLURA TEST 1" + gnMockRaspuns = 6 + CASE tcStrica == "CLIENT_DIVERSI_NU" + poDate.nume_client = "CLIENTI DIVERSI" + gnMockRaspuns = 7 + CASE tcStrica == "CLIENT_DIVERSI_DA" + poDate.nume_client = "CLIENTI DIVERSI" + gnMockRaspuns = 6 + ENDCASE + gcErr = "" + gcMockApeluri = "" + + DO AfLog WITH " > " + gcCaz + "creez " + tcClasa + loF = CREATEOBJECT(tcClasa) + IF VARTYPE(loF) <> 'O' + RETURN "CREATEOBJECT " + tcClasa + " ESUAT" + CHR(13) + CHR(10) + gcErr + ENDIF + IF tcStrica == "COPIERE_DESCR_GOL" + loF.lCopiere = .T. + ENDIF + gcErr = "" + gcMockApeluri = "" + lcA = "" + IF tlTrece AND tcClasa == 'frm_facturare_articole2' + * pe unificat antetul trece si se continua cu articolele: se izoleaza validarea de antet + llAntet = loF.oAntet.valideaza_antet(loF) + lcJurnalAntet = gcMockApeluri + lcA = "RETURN=" + TRANSFORM(llAntet) + CHR(13) + CHR(10) + "JURNAL:" + CHR(13) + CHR(10) + lcJurnalAntet + lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr + gcMockApeluri = "" + gcErr = "" + llR = loF.inainte_de_do_termin() + DO Assert WITH llR = .F. AND "Nu ati ales articolele" $ gcMockApeluri, "unificat: dupa antet valid se ajunge la validarea articolelor (crsfactura gol)" + * erorile corpului de articole (prototip, perimetrul S4: ex. grd_articole inexistent) se logheaza, nu se compara + DO AfLog WITH " > " + gcCaz + "unificat inainte_de_do_termin: " + TRANSFORM(llR) + " | " + STRTRAN(gcMockApeluri, CHR(13) + CHR(10), " ") + " | erori articole: " + STRTRAN(gcErr, CHR(13) + CHR(10), "; ") + gcErr = "" + ELSE + llR = loF.inainte_de_do_termin() + lcA = "RETURN=" + TRANSFORM(llR) + CHR(13) + CHR(10) + "JURNAL:" + CHR(13) + CHR(10) + gcMockApeluri + IF tcClasa == 'frm_facturare_articole2' AND tnTip = 1 AND tcStrica == "COPIERE_DESCR_GOL" + * ct_clb_altele e eliminat de Init pe tip 1 (gnScadereStoc=1, fara copiere): SetFocus da 1925 pe ambele + * cai; pe unificat eroarea vine din oAntet prin metoda formularului si trebuie sa ajunga la ON ERROR + * (fara override Error pe frm_facturare_articole2) + DO Assert WITH "1925" $ gcErr, "eroarea din oAntet apelat prin inainte_de_do_termin ajunge la ON ERROR" + ENDIF + lcA = lcA + "ERORI:" + CHR(13) + CHR(10) + gcErr + ENDIF + loF.Release() + RELEASE loF + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + ENDIF + RETURN lcA +ENDFUNC + +PROCEDURE DifLinii + LPARAMETERS tcV, tcN + LOCAL laV[1], laN[1], lnV, lnN, i, lnMax + lnV = ALINES(laV, tcV) + lnN = ALINES(laN, tcN) + lnMax = MAX(lnV, lnN) + FOR i = 1 TO lnMax + IF i > lnV OR i > lnN OR !(laV[i] == laN[i]) + DO AfLog WITH " vechi: " + IIF(i <= lnV, laV[i], "") + DO AfLog WITH " nou : " + IIF(i <= lnN, laN[i], "") + ENDIF + ENDFOR +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + CHR(13) + CHR(10) +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3b_dupa_ui.prg b/utile/Teste/facturare_unificat/test_s3b_dupa_ui.prg new file mode 100644 index 0000000..f59412e --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3b_dupa_ui.prg @@ -0,0 +1,342 @@ +* test_s3b_dupa_ui.prg +* UI VIZIBIL: capturi "DUPA" pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2), dupa +* aplatizarea chenarelor (BorderWidth=0 pe containere, confirmata in binar). Copie a +* test_s3b_referinta_ui.prg cu ACELASI mediu / aceiasi 4 pasi / aceleasi etichete de pas, dar cu +* iesirile in fisiere separate (nu suprascrie referinta) ca sa poata fi comparate una langa alta. +* +* Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_dupa_ui.ps1 (timeout >= 300s) +* Log: facturare_unificat\test_s3b_dupa_ui_log.txt ; capturi in screenshots_dupa\ ; +* geometrie in out\geom_dupa_.tsv + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcUILog, gcSyncDir, gnFail, gnPass +gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_dupa_ui_log.txt" +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_dupa\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) +gnFail = 0 +gnPass = 0 +PUBLIC gcRaport +gcRaport = "" +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out") + MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out" +ENDIF + +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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnScadereStoc = 0 +* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel - +* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist" +IF !USED('saft_tip_facturi') + update_saft_tip_facturi() +ENDIF + +PRIVATE poDate, poGeneratorNumere, loForm, lcTsv, lcRaportFile +lcRaportFile = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_dupa_raport.txt" + +* document nou: poDate.incasat ramane 0 la construire - identic Scenariul A din test_s3b_incasare_nealocare.prg +poDate = CREATEOBJECT("oDateFactura", 25000, 1) +poDate.nIdTipDoc = 5 +poDate.totalctva = 1000 +DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + " poDate.incasat=" + TRANSFORM(poDate.incasat) +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") +poGeneratorNumere.ResetNumere() +DO ProbaSerii WITH poDate.nIdTipDoc +poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + +loForm = CREATEOBJECT('frm_facturare_articole2') +DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" +IF VARTYPE(loForm) <> 'O' + DO Final +ENDIF +DO Assert WITH ObjExists(loForm, 'opt_incasat'), "opt_incasat prezent (poDate.tip intre 1 si 4, deci grupul de incasare exista)" + +loForm.WindowType = 0 +loForm.Show() +loForm.WindowState = 2 +DOEVENTS FORCE + +* pas0: stare initiala dupa Createobject - ambele acordeoane plaite (lalte_date_deschis=.F., lincasare_deschis=.F. by design) +DO AfLog WITH "PAS0 stare initiala: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_dupa_stare_initiala.tsv" +DO DumpSiAnalizeaza WITH loForm, "stare initiala (ambele plaite)", lcTsv +DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_stare_initiala.tsv" +DO HarnessStep WITH 0, 'stare_initiala', 6 + +* pas1: Alte date deschis - caseta se seteaza INAINTE de comutare (metoda citeste caseta) +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +DO AfLog WITH "PAS1 alte date deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_dupa_alte_date.tsv" +DO DumpSiAnalizeaza WITH loForm, "Alte date deschis", lcTsv +DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_alte_date.tsv" +DO HarnessStep WITH 1, 'alte_date_deschis', 6 + +* pas2: Alte date inchis la loc, Incasare deschis +* bifarea casetei aloca o chitanta reala in MARIUSM_AUTO - vezi curatenia de dinainte de Release +loForm.chk_alte_date.Value = 0 +loForm.do_comuta_alte_date() +loForm.chk_incasare.Value = 1 +loForm.do_comuta_incasare() +DOEVENTS FORCE +DO AfLog WITH "PAS2 incasare deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_dupa_incasare.tsv" +DO DumpSiAnalizeaza WITH loForm, "Incasare deschis", lcTsv +DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_incasare.tsv" +DO HarnessStep WITH 2, 'incasare_deschis', 6 + +* pas3: Alte date deschis din nou - ambele deschise simultan +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +DO AfLog WITH "PAS3 ambele deschise: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_dupa_ambele.tsv" +DO DumpSiAnalizeaza WITH loForm, "Ambele deschise", lcTsv +DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_ambele.tsv" +DO HarnessStep WITH 3, 'ambele_deschise', 6 + +STRTOFILE(gcRaport, lcRaportFile) +DO AfLog WITH "Raport geometrie scris in " + lcRaportFile + +* curatenie obligatorie: bifarea casetei la pasul 2 a alocat o chitanta reala in MARIUSM_AUTO, +* iar debifarea ruleaza ramura "fara incasare", care dezaloca 16/3/26 +loForm.chk_incasare.Value = 0 +loForm.do_comuta_incasare() +DO Assert WITH loForm.nmod_incasare() = 1, "dupa curatenie: nmod_incasare()=1 (fara incasare)" +loForm.Release() +RELEASE loForm + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE DumpSiAnalizeaza + * Parcurge Thisform.Objects (top-level, fara recursie in containere) - dupa S7 NU mai vede cele + * 30 de controale mutate in ct_document/ct_contabilitate/ct_livrare/ct_incasare; harta completa + * e cea scrisa de DumpGrilaRecursiv. Scrie .tsv cu + * Name/Class/Left/Top/Width/Height/Visible pentru fiecare obiect cu geometrie, apoi + * calculeaza suprapuneri (2D), iesire din zona utila a formularului si perechi lipite + * (<4px) pe orizontala/verticala, doar intre controale Visible=.T. Adauga sectiunea la gcRaport. + LPARAMETERS toForm, tcEticheta, tcTsvPath + LOCAL i, j, loO, lcOut, lnN, lnCount, llVis + LOCAL ARRAY laN[400], laC[400], laL[400], laT[400], laW[400], laH[400], laV[400] + lnN = 0 + lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(13) + CHR(10) + lnCount = toForm.Objects.Count + FOR i = 1 TO lnCount + loO = toForm.Objects(i) + IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' AND lnN < 400 + llVis = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) + lnN = lnN + 1 + laN[lnN] = loO.Name + laC[lnN] = loO.Class + laL[lnN] = loO.Left + laT[lnN] = loO.Top + laW[lnN] = loO.Width + laH[lnN] = loO.Height + laV[lnN] = llVis + lcOut = lcOut + loO.Name + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + TRANSFORM(llVis) + CHR(13) + CHR(10) + ENDIF + ENDFOR + STRTOFILE(lcOut, tcTsvPath) + DO AfLog WITH "GEOMETRIE [" + tcEticheta + "]: " + TRANSFORM(lnN) + " controale cu geometrie din " + TRANSFORM(lnCount) + " obiecte totale -> " + tcTsvPath + + LOCAL lnAL, lnAT, lnAR, lnAB, lnBL, lnBT, lnBR, lnBB, lnOvX, lnOvY, lnGap + LOCAL lcSectiune + lcSectiune = "=== " + tcEticheta + " (forma " + TRANSFORM(toForm.Width) + "x" + TRANSFORM(toForm.Height) + ") ===" + CHR(13) + CHR(10) + FOR i = 1 TO lnN + IF !laV[i] + LOOP + ENDIF + lnAL = laL[i] + lnAT = laT[i] + lnAR = laL[i] + laW[i] + lnAB = laT[i] + laH[i] + IF lnAL < 0 OR lnAT < 0 OR lnAR > toForm.Width OR lnAB > toForm.Height + lcSectiune = lcSectiune + "IESIT: " + laN[i] + " (" + laC[i] + ") Left=" + TRANSFORM(lnAL) + " Top=" + TRANSFORM(lnAT) + " Right=" + TRANSFORM(lnAR) + " Bottom=" + TRANSFORM(lnAB) + CHR(13) + CHR(10) + ENDIF + FOR j = i + 1 TO lnN + IF !laV[j] + LOOP + ENDIF + lnBL = laL[j] + lnBT = laT[j] + lnBR = laL[j] + laW[j] + lnBB = laT[j] + laH[j] + lnOvX = MIN(lnAR, lnBR) - MAX(lnAL, lnBL) + lnOvY = MIN(lnAB, lnBB) - MAX(lnAT, lnBT) + IF lnOvX > 0 AND lnOvY > 0 + lcSectiune = lcSectiune + "SUPRAPUNERE: " + laN[i] + " (" + laC[i] + ") x " + laN[j] + " (" + laC[j] + ") " + TRANSFORM(lnOvX) + "x" + TRANSFORM(lnOvY) + "px" + CHR(13) + CHR(10) + ELSE + IF lnOvY > 0 AND lnOvX <= 0 AND -lnOvX < 4 + lnGap = -lnOvX + lcSectiune = lcSectiune + "LIPIT-ORIZ: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10) + ENDIF + IF lnOvX > 0 AND lnOvY <= 0 AND -lnOvY < 4 + lnGap = -lnOvY + lcSectiune = lcSectiune + "LIPIT-VERT: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10) + ENDIF + ENDIF + ENDFOR + ENDFOR + gcRaport = gcRaport + lcSectiune + CHR(13) + CHR(10) +ENDPROC + +PROCEDURE DumpGrilaRecursiv + * Harta de geometrie recursiva: coboara in .Objects pe oricate niveluri (containere compozite + * clb_tx_simplu / ct_clb_cautare / etc.), scrie Name ca traseu punctat de la formular + * (Ct_clb_agent.clb_tx_cautare.Lb_simplu1), plus AbsLeft/AbsTop absolute fata de formular + * si Caption/Value taiat la 40 caractere - necesare ca sa se detecteze suprapunerile si + * textele taiate din interiorul containerelor, invizibile in harta plata geom_dupa_*.tsv. + LPARAMETERS toForm, tcTsvPath + LOCAL lcOut + lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(9) + "AbsLeft" + CHR(9) + "AbsTop" + CHR(9) + "Caption" + CHR(13) + CHR(10) + lcOut = lcOut + ColectGrila(toForm, "", 0, 0, 0, .T.) + STRTOFILE(lcOut, tcTsvPath) + DO AfLog WITH "GEOMETRIE-GRILA: scris " + tcTsvPath +ENDPROC + +FUNCTION ColectGrila + * Recursie pe .Objects (nu PEMSTATUS) - garda Type('loO.Left')='N' fiindca nu orice membru + * are geometrie (separatoare, columns de grid etc. nu ajung aici, gridurile nu au .Objects). + * coloana Visible e vizibilitatea EFECTIVA (proprie AND a parintelui) - un copil dintr-un + * container ascuns are Visible propriu .T. dar nu se deseneaza. + LPARAMETERS toContainer, tcPrefix, tnParentAbsLeft, tnParentAbsTop, tnDepth, tlParentVisEff + LOCAL i, loO, lcName, lnAbsL, lnAbsT, lcCaption, llVisEff, lcVisTxt, lcOut + IF tnDepth > 15 + RETURN "" + ENDIF + lcOut = "" + FOR i = 1 TO toContainer.Objects.Count + loO = toContainer.Objects(i) + IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' + lcName = IIF(EMPTY(tcPrefix), loO.Name, tcPrefix + "." + loO.Name) + lnAbsL = tnParentAbsLeft + loO.Left + lnAbsT = tnParentAbsTop + loO.Top + lcCaption = "" + IF TYPE('loO.Caption') = 'C' + lcCaption = loO.Caption + ELSE + IF TYPE('loO.Value') = 'C' + lcCaption = loO.Value + ENDIF + ENDIF + lcCaption = STRTRAN(lcCaption, CHR(9), " ") + lcCaption = LEFT(lcCaption, 40) + llVisEff = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) AND tlParentVisEff + lcVisTxt = TRANSFORM(llVisEff) + lcOut = lcOut + lcName + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + lcVisTxt + CHR(9) + TRANSFORM(lnAbsL) + CHR(9) + TRANSFORM(lnAbsT) + CHR(9) + lcCaption + CHR(13) + CHR(10) + IF TYPE('loO.Objects.Count') = 'N' + lcOut = lcOut + ColectGrila(loO, lcName, lnAbsL, lnAbsT, tnDepth + 1, llVisEff) + ENDIF + ENDIF + ENDFOR + RETURN lcOut +ENDFUNC + +PROCEDURE ProbaSerii + * apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor + * ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului + LPARAMETERS tnIdTipDoc + LOCAL lnOk, laErr[1], i, lcSql + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + FOR i = 1 TO 3 + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii") + IF lnOk > 0 + DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii")) + USE IN (SELECT("crsprobaserii")) + EXIT + ELSE + AERROR(laErr) + DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5]) + ENDIF + ENDFOR +ENDPROC + +FUNCTION ObjExists + * Cautare RECURSIVA: dupa S7 controalele de sub grila nu mai sunt in Thisform.Objects, ci in + * containerele lor - o cautare plata ar raporta tacut "lipseste". + LPARAMETERS toContainer, tcName + LOCAL i, loO + FOR i = 1 TO toContainer.Objects.Count + loO = toContainer.Objects(i) + IF UPPER(loO.Name) == UPPER(tcName) + RETURN .T. + ENDIF + IF TYPE('loO.Objects.Count') = 'N' + IF ObjExists(loO, tcName) + RETURN .T. + ENDIF + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO AfLog WITH "PASS: " + tcMsg + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL: " + tcMsg + ENDIF +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + DO HarnessDone WITH 'done' + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3b_dupa_ui.ps1 b/utile/Teste/facturare_unificat/test_s3b_dupa_ui.ps1 new file mode 100644 index 0000000..293ee19 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3b_dupa_ui.ps1 @@ -0,0 +1,12 @@ +# test_s3b_dupa_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru +# test_s3b_dupa_ui.prg. Capturi "DUPA" pe frm_facturare_articole2 (ofacturare.vc2), dupa +# aplatizarea chenarelor - aceiasi 4 pasi si aceleasi nume de fisiere PNG ca la referinta, dar in +# folder separat (screenshots_dupa\), ca sa nu suprascrie screenshots_referinta\. +# Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_dupa_ui.ps1 (timeout >= 300s) +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_s3b_dupa_ui.prg') ` + -Steps @('stare_initiala','alte_date_deschis','incasare_deschis','ambele_deschise') ` + -SyncDir (Join-Path $Teste 'uisync_dupa') ` + -ShotsDir (Join-Path $Teste 'screenshots_dupa') diff --git a/utile/Teste/facturare_unificat/test_s3b_emitere_paritate_2.prg b/utile/Teste/facturare_unificat/test_s3b_emitere_paritate_2.prg new file mode 100644 index 0000000..db254aa --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3b_emitere_paritate_2.prg @@ -0,0 +1,807 @@ +* test_s3b_emitere_paritate_2.prg +* Continuare a test_s3b_emitere_reala.prg (docs\raport_s3b_emitere_reala.md) si a notei care l-a +* corectat (docs\nota_verificare_emitere_reala.md): acolo singura combinatie care a scris REAL in +* VANZARI a fost tnTip=22 (AVIZ) + tip incasare 1 (Fara incasare) - orice incasare reala pe AVIZ +* (tip 2/3/4) intorcea poDate.nid_vanzare=9999999999 (sentinela), fara rand nou in VANZARI. +* +* CAUZA GASITA (verificata direct in sursa PL/SQL, PACK_FACTURARE PACKAGE BODY, MARIUSM_AUTO): +* - scrie_factura2 (linia ~4886) apeleaza contabilizeaza_articol() pentru fiecare linie, care la +* randul ei alege contul de debit dupa pack_facturare.ntip (linia ~6266): +* WHEN ntip <= 20 OR ntip IN (nTipFacturaHotel,nTipFacturaRestaurant,nTipNotaPlata, +* nTipVanzareRetail,48,49,51,52) THEN V_SCD := scd_articol -- 4111, cont client normal +* WHEN ntip IN (28,29) THEN V_SCD := '461' -- aviz catre clienti debitori +* ELSE V_SCD := '418' -- aviz, cont DIFERIT +* AVIZ (ntip=22) cade pe ramura ELSE -> cont 418, nu 4111. +* - scrie_incasari() posteaza incasarea pe contul standard de creanta client (4111-style), asteptat +* de pack_contafin.verifica_note_contabile(1) sa se stinga cu nota de vanzare a documentului. +* Cand documentul insusi a postat pe 418 (nu 4111), cele doua note nu se compenseaza -> notele nu +* se balanseaza -> scrie_factura2 (linia ~5064) ia ramura "IF verifica_note_contabile(1)>0": +* V_ID_VANZARE:=NULL, deschide V_CURSOR_VERIFICARE in loc sa finalizeze. In VFP +* (ofacturare.vc2:14404/20126), asta declanseaza "Do Form verificare" (real, modal) - inlocuit +* aici cu acelasi stub_verificare deja folosit ("gnButon=1" in Init). Chiar cu stub-ul confirmand, +* poDate.nid_vanzare a ramas la valoarea implicita din clasa (ofacturare_comun.prg:186, +* nid_vanzare=9999999999) - document NESCRIS. +* - FACTURA normala (ntip<=20, deci Tip=1) intra pe ramura ntip<=20 -> cont 4111, acelasi cont pe +* care il asteapta scrie_incasari() -> notele se balanseaza -> scrie_factura2 finalizeaza direct, +* fara sa mai treaca prin verificare. +* +* FIX DE TEST (nu de productie): sursa articolelor ramane cursor_preturi cu tnTip=22 (singura care +* intoarce randuri reale in acest mediu, RAJA id_part=463 - probe_emitere_reala.prg), dar poDate.Tip +* se suprascrie pe 1 (FACTURA) DUPA ce crsfactura e deja populat (do_adauga_tot/do_calculeaza_totaluri) +* si INAINTE de do_scrie_articole()/do_termin() - exact acelasi tipar deja folosit in productie pentru +* bonul fiscal de magazin ("hacuiesc Tip = 43 ... apoi pun tipul la loc", ofacturare.vc2:14247-14259): +* acolo poDate.Tip controleaza ce se scrie in VANZARI_DETALII_TEMP.TIP (deci pack_facturare.ntip), +* independent de sursa preturilor. poDate.nIdTipDoc NU se suprascrie (ramane 5=FACTURA, valoarea +* implicita din clasa, deja dovedita ca aloca numere reale in test_s3b_paritate_emitere.prg) - deci +* seria/numerotarea documentului e cea de FACTURA, consistenta cu Tip=1. +* +* Verificat, nu presupus: pentru fiecare document se citeste randul din VANZARI dupa scriere (nu doar +* raspunsul VFP) si se compara MAX(ID_VANZARE)/COUNT(*) inainte/dupa fiecare rulare. +* +* SECVENTIAL: intai toate 4 tipurile de incasare pe formularul VECHI (frm_alte_date, prin driverul pe +* Timer, mecanism identic cu test_s3b_emitere_reala.prg), apoi (intr-un bloc separat, cu Release() +* complet inainte) o incercare pe formularul NOU (frm_facturare_articole2) - cunoscut ca hangs la +* CREATEOBJECT pe coloana Gestiune a grilei (docs\raport_s3b_emitere_reala.md sectiunea 3); daca se +* manifesta din nou, ramane documentat aici, nu ocolit tacit. +* +* CONSUMA DATE REALE: fiecare document scris ramane in VANZARI (client 463, RAJA); tipurile 2/3/4 +* aloca si numere reale de chitanta/bon fiscal/pos (seriile 16/3/26). Niciun rollback, nicio stergere. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_emitere_paritate_2.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_emitere_paritate_2.log +* +* 26.08.2026: blocaj "Do Form verificare" pe formularul REAL (bucla messagebox REZULTATE VERIFICARI + +* CATCH 103). Cauza: test_init_env_auto_roafacturare.prg:81 "SET PATH TO &lcPath ADDITIVE" are lcPath +* terminat in backslash, care inghite cuvantul ADDITIVE (ultimul element devine "COMUNROA\ ADDITIVE") +* si INLOCUIESTE path-ul, stergand stub_verificare de pe prima pozitie - asa ca verificare.scx se +* rezolva la COMUN\FERESTRE (real). Fix test: re-asertare "SET PATH TO stub;" + SET('PATH') dupa +* test_init_env + in driver eliberare DIRECTA (Release) a _FRMBASE in loc de do_termin, cu garda +* glVerifTratatAD (plasa de siguranta anti-bucla). + +SET SAFETY OFF +SET TALK OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog, gnPass, gnFail +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_emitere_paritate_2.log" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLog) +gnPass = 0 +gnFail = 0 + +ON ERROR DO S3bErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + LOCAL lcAppPathLocal, lcSql + lcAppPathLocal = "D:\ROA\ROAFACTURARE\" + + *-- stub_verificare PRIMUL (SET PATH plain, nu ADDITIVE) - vezi test_s3b_emitere_reala.prg + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + + 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 S3bLog WITH 'EROARE: conectare Oracle esuata' + DO S3bFinal + ENDIF + DO S3bLog WITH 'test_init_env_auto_roafacturare OK, gnHandle=' + TRANSFORM(gnHandle) + + *-- goLog scrie fiecare SQL trimis prin oExecute/oExecuta, dar numai daca fisierul exista deja + PUBLIC gcSqlTrace + gcSqlTrace = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\sql_trace_2.log" + STRTOFILE("", gcSqlTrace) + IF TYPE('goLog') = 'O' + goLog.cLogFile = gcSqlTrace + ENDIF + IF TYPE('poLog') = 'O' + poLog.cLogFile = gcSqlTrace + ENDIF + + *-- fara asta, un lacat Oracle blocheaza rularea la infinit, invizibil in log + SQLSETPROP(gnHandle, "QueryTimeOut", 45) + IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle + SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45) + ENDIF + + SET PATH TO (lcAppPathLocal + "COMUN\utile\gridextras") ADDITIVE + SET CLASSLIB TO gridextras.vcx ADDITIVE + SET CLASSLIB TO _cb_base.vcx ADDITIVE + DO S3bLog WITH 'SET CLASSLIB suplimentar OK' + + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE + DO S3bLog WITH 'mock_amessagebox OK' + + *-- CdocGasesteIdVanzare: dovada de scriere pe jonctiunea serie_act + nract + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE + + IF !actualizeaza_optiuni_program() + DO S3bLog WITH 'EROARE: actualizeaza_optiuni_program()' + DO S3bFinal + ENDIF + gnScadereStoc = 0 + gnModTotFact = 0 + gnFactSeturi = 0 + gnListareAvizBonFiscal = 0 + gnid_part_casa = 0 + gnIdUtil = 8 + *-- 167: singura sucursala cu plaje pentru chitanta/bon fiscal/pos in acest mediu (16/3/26) + gnIdSucursala = 167 + lcSql = [begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;] + goExecutor.oExecuta(lcSql) + DO S3bLog WITH 'actualizeaza_optiuni_program OK, gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + + *-- test_init_env:81 "SET PATH TO &lcPath ADDITIVE" (lcPath cu backslash final) inghite cuvantul + *-- ADDITIVE si INLOCUIESTE path-ul, stergand stub_verificare - re-asertare: stub PRIMUL + restul + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare;" + SET('PATH') + DO S3bLog WITH 'stub_verificare re-asertat PRIMUL in SET PATH' + + PUBLIC gcMockUltimMesaj, gnMockUltimTip + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + + *----- driver: conduce frm_alte_date (singurul modal ramas, doar pe calea veche) ----- + PUBLIC goDriverAD, glDlgTratatAD, gnTipIncasareCerut, gnNrIncasareCapturat, gcClaseVazute, gnDrvDeadline, glVerifTratatAD + glDlgTratatAD = .F. + gnTipIncasareCerut = 1 + gnNrIncasareCapturat = 0 + gcClaseVazute = ';' + gnDrvDeadline = SECONDS() + 20 + glVerifTratatAD = .F. + goDriverAD = CREATEOBJECT('driverAlteDateAD') + _SCREEN.AddObject('tmrDrvAD', 'Timer') + _SCREEN.tmrDrvAD.Interval = 200 + BINDEVENT(_SCREEN.tmrDrvAD, 'Timer', goDriverAD, 'Executa') + _SCREEN.tmrDrvAD.Enabled = .T. + _SCREEN.Caption = 'S3b - emitere paritate 2 (FACTURA, Tip=1)' + DO S3bLog WITH 'driver+timer pregatiti' + + DO S3bLog WITH 'pre-proba plaje: tip3=' + TRANSFORM(RanduriSerii(3)) + ' tip16=' + TRANSFORM(RanduriSerii(16)) + ; + ' tip26=' + TRANSFORM(RanduriSerii(26)) + ' tip5(factura)=' + TRANSFORM(RanduriSerii(5)) + + DO S3bLog WITH CHR(13)+CHR(10) + '===== STARE VANZARI INAINTE =====' + DO LogStareVanzari + + CREATE CURSOR crsRezultate (tip_incasare N(1), forma C(10), id_vanzare N(10), cod N(10), ; + serie_act C(10), id_fact N(10), nr_incasare_asteptat N(10), nr_incasat N(10), ; + tip_incasat N(10), suma_incasat N(18,2), serie_incasat C(10), total_cu_tva N(18,2), ; + pret_det N(18,4)) + + LOCAL laNumeTip[4] + laNumeTip[1] = 'Fara incasare' + laNumeTip[2] = 'Chitanta' + laNumeTip[3] = 'Bon fiscal' + laNumeTip[4] = 'POS Card' + + LOCAL lnTip, lnIdVz + + *-- FORMA VECHE, toate patru tipurile + FOR lnTip = 1 TO 4 + DO S3bLog WITH CHR(13)+CHR(10) + '===== TIP ' + TRANSFORM(lnTip) + ' (' + laNumeTip[lnTip] + ') - FORMA VECHE =====' + lnIdVz = CreeazaDocumentIncasare(lnTip, .F.) + DO InregistreazaRezultat WITH lnTip, 'vechi', lnIdVz + ENDFOR + + *-- FORMA NOUA, toate patru tipurile - separat, ca un hang/crash pe una sa nu piarda dovada + *-- celorlalte (log-ul e scris incremental, STRTOFILE cu append, la fiecare pas). TRY/CATCH per + *-- tip, ca o eroare neasteptata (necunoscuta inca pe calea noua) sa nu opreasca tot scriptul + *-- inainte de comparatie si de starea finala VANZARI. + FOR lnTip = 1 TO 4 + DO S3bLog WITH CHR(13)+CHR(10) + '===== TIP ' + TRANSFORM(lnTip) + ' (' + laNumeTip[lnTip] + ') - FORMA NOUA =====' + TRY + lnIdVz = CreeazaDocumentIncasare(lnTip, .T.) + DO InregistreazaRezultat WITH lnTip, 'nou', lnIdVz + CATCH TO loExcNou + DO S3bLog WITH ' CATCH forma noua tip=' + TRANSFORM(lnTip) + ' ErrorNo=' + TRANSFORM(loExcNou.ErrorNo) + ; + ' Message=' + loExcNou.Message + ' Proc=' + loExcNou.Procedure + ' Line=' + TRANSFORM(loExcNou.LineNo) + IF TYPE('goFrmS3b') = 'O' AND !ISNULL(goFrmS3b) + TRY + goFrmS3b.Release() + CATCH + ENDTRY + ENDIF + goFrmS3b = NULL + DO InregistreazaRezultat WITH lnTip, 'nou', 0 + ENDTRY + ENDFOR + + DO S3bLog WITH CHR(13)+CHR(10) + '===== COMPARATIE VECHI / NOU, PE TIP =====' + DO ComparaRezultate + + DO S3bLog WITH CHR(13)+CHR(10) + '===== STARE VANZARI DUPA =====' + DO LogStareVanzari + + _SCREEN.tmrDrvAD.Enabled = .F. + DO S3bFinal + +CATCH TO loExc + DO S3bLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO S3bFinal +ENDTRY + +QUIT + +*================================================================================== +PROCEDURE S3bLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13)+CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE S3bErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO S3bLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE S3bFinal + DO S3bLog WITH CHR(13)+CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + DO S3bLog WITH 'END ' + TTOC(DATETIME()) + QUIT +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO S3bLog WITH 'PASS: ' + tcMsg + ELSE + gnFail = gnFail + 1 + DO S3bLog WITH 'FAIL: ' + tcMsg + ENDIF +ENDPROC + +*-- cate randuri de plaja intoarce verifica_cursor_serii pentru un tip de document, fara sa aloce +FUNCTION RanduriSerii + LPARAMETERS tnIdTipDoc + LOCAL lnOk, lnRanduri, lcSql + LOCAL ARRAY laErr[1] + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lnRanduri = -1 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobapl") + IF lnOk > 0 + lnRanduri = RECCOUNT("crsprobapl") + USE IN (SELECT("crsprobapl")) + ELSE + AERROR(laErr) + DO S3bLog WITH 'pre-proba plaje tip ' + TRANSFORM(tnIdTipDoc) + ' ESEC: ' + TRANSFORM(laErr[2]) + ENDIF + RETURN lnRanduri +ENDFUNC + +PROCEDURE LogStareVanzari + LOCAL lnQ + lnQ = goExecutor.oExecute([select max(id_vanzare) as maxid, count(*) as cnt from vanzari], 'crsMaxVz') + IF lnQ > 0 + DO S3bLog WITH ' MAX(ID_VANZARE)=' + TRANSFORM(crsMaxVz.maxid) + ' COUNT(*)=' + TRANSFORM(crsMaxVz.cnt) + USE IN crsMaxVz + ELSE + DO S3bLog WITH ' EROARE citire stare VANZARI: ' + goExecutor.oPrelucrareEroare() + ENDIF + lnQ = goExecutor.oExecute([select tip_incasat, max(nr_incasat) as maxnr, count(*) as nr ] + ; + [from vanzari where tip_incasat is not null group by tip_incasat order by tip_incasat], 'crsMaxInc') + IF lnQ > 0 + SELECT crsMaxInc + SCAN + DO S3bLog WITH ' tip_incasat=' + TRANSFORM(tip_incasat) + ' max(nr_incasat)=' + TRANSFORM(maxnr) + ' nr_documente=' + TRANSFORM(nr) + ENDSCAN + USE IN crsMaxInc + ELSE + DO S3bLog WITH ' EROARE citire stare incasat: ' + goExecutor.oPrelucrareEroare() + ENDIF +ENDPROC + +*-- citeste randul VANZARI scris pentru id_vanzare si-l adauga in crsRezultate +PROCEDURE InregistreazaRezultat + LPARAMETERS tnTip, tcForma, tnIdVz + IF tnIdVz <= 0 + DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': documentul NU s-a scris (id_vanzare=0), fara rand in VANZARI' + INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare) VALUES (tnTip, tcForma, 0) + RETURN + ENDIF + LOCAL lnQ + lnQ = goExecutor.oExecute([select id_vanzare, tip, cod, serie_act, nvl(id_fact,0) as id_fact, ] + ; + [nvl(nr_incasat,0) as nr_incasat, nvl(tip_incasat,0) as tip_incasat, nvl(suma_incasat,0) as suma_incasat, ] + ; + [nvl(serie_incasat,'') as serie_incasat, total_cu_tva, ] + ; + [(select max(nvl(d.pret,0)) from vanzari_detalii d where d.id_vanzare = v.id_vanzare ] + ; + [and nvl(d.sters,0) = 0) as pret_det from vanzari v where v.id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVz1') + IF lnQ <= 0 OR RECCOUNT('crsVz1') <> 1 + DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': EROARE citire VANZARI id_vanzare=' + TRANSFORM(tnIdVz) + INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare) VALUES (tnTip, tcForma, tnIdVz) + RETURN + ENDIF + SELECT crsVz1 + INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare, cod, serie_act, id_fact, ; + nr_incasare_asteptat, nr_incasat, tip_incasat, suma_incasat, serie_incasat, total_cu_tva, pret_det) ; + VALUES (tnTip, tcForma, tnIdVz, crsVz1.cod, NVL(crsVz1.serie_act,''), crsVz1.id_fact, ; + gnNrIncasareCapturat, crsVz1.nr_incasat, crsVz1.tip_incasat, crsVz1.suma_incasat, NVL(crsVz1.serie_incasat,''), crsVz1.total_cu_tva, ; + NVL(crsVz1.pret_det,0)) + DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': id_vanzare=' + TRANSFORM(tnIdVz) + ' vanzari.tip=' + TRANSFORM(crsVz1.tip) + ; + ' cod=' + TRANSFORM(crsVz1.cod) + ' serie_act=' + TRANSFORM(crsVz1.serie_act) + ' id_fact=' + TRANSFORM(crsVz1.id_fact) + ; + ' nr_incasat=' + TRANSFORM(crsVz1.nr_incasat) + ' (asteptat ' + TRANSFORM(gnNrIncasareCapturat) + ') tip_incasat=' + TRANSFORM(crsVz1.tip_incasat) + ; + ' suma_incasat=' + TRANSFORM(crsVz1.suma_incasat) + ' serie_incasat=[' + TRANSFORM(crsVz1.serie_incasat) + ']' + ; + ' total_cu_tva=' + TRANSFORM(crsVz1.total_cu_tva) + ' pret_det=' + TRANSFORM(NVL(crsVz1.pret_det,0)) + USE IN crsVz1 + + DO Assert WITH crsRezultate.nr_incasat = gnNrIncasareCapturat, ; + '[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] VANZARI.NR_INCASAT persistat (' + TRANSFORM(crsRezultate.nr_incasat) + ; + ') == poDate.nr_incasare capturat inainte de scriere (' + TRANSFORM(gnNrIncasareCapturat) + ')' + DO Assert WITH crsRezultate.pret_det > 0, ; + '[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] VANZARI_DETALII.PRET nenul (' + ; + TRANSFORM(crsRezultate.pret_det) + ') - linia are pret, nu doar cantitate' + DO Assert WITH crsRezultate.total_cu_tva > 0, ; + '[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] VANZARI.TOTAL_CU_TVA nenul (' + ; + TRANSFORM(crsRezultate.total_cu_tva) + ') - documentul are valoare, nu doar rand' +ENDPROC + +PROCEDURE ComparaRezultate + LOCAL lnTip, lnRVechi, lnRNou + FOR lnTip = 1 TO 4 + SELECT crsRezultate + LOCATE FOR tip_incasare = lnTip AND ALLTRIM(forma) == 'vechi' + IF !FOUND() + DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] rand vechi gasit in crsRezultate' + LOOP + ENDIF + lnRVechi = RECNO() + LOCATE FOR tip_incasare = lnTip AND ALLTRIM(forma) == 'nou' + IF !FOUND() + DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] rand nou gasit in crsRezultate' + LOOP + ENDIF + lnRNou = RECNO() + + LOCAL lnIdVechi, lnIdNou, lnTipIncVechi, lnTipIncNou, lnSumaVechi, lnSumaNou, lcSerieVechi, lcSerieNou + GO lnRVechi IN crsRezultate + lnIdVechi = crsRezultate.id_vanzare + lnTipIncVechi = crsRezultate.tip_incasat + lnSumaVechi = crsRezultate.suma_incasat + lcSerieVechi = crsRezultate.serie_incasat + GO lnRNou IN crsRezultate + lnIdNou = crsRezultate.id_vanzare + lnTipIncNou = crsRezultate.tip_incasat + lnSumaNou = crsRezultate.suma_incasat + lcSerieNou = crsRezultate.serie_incasat + + IF lnIdVechi <= 0 OR lnIdNou <= 0 + DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] ambele documente s-au scris (vechi id_vanzare=' + ; + TRANSFORM(lnIdVechi) + ' nou id_vanzare=' + TRANSFORM(lnIdNou) + ')' + LOOP + ENDIF + + DO Assert WITH lnTipIncVechi = lnTipIncNou, '[tip=' + TRANSFORM(lnTip) + '] VANZARI.TIP_INCASAT identic (vechi=' + ; + TRANSFORM(lnTipIncVechi) + ' nou=' + TRANSFORM(lnTipIncNou) + ')' + DO Assert WITH ABS(lnSumaVechi - lnSumaNou) < 0.005, '[tip=' + TRANSFORM(lnTip) + '] VANZARI.SUMA_INCASAT identica (vechi=' + ; + TRANSFORM(lnSumaVechi) + ' nou=' + TRANSFORM(lnSumaNou) + ')' + DO Assert WITH ALLTRIM(lcSerieVechi) == ALLTRIM(lcSerieNou), '[tip=' + TRANSFORM(lnTip) + '] VANZARI.SERIE_INCASAT identica (vechi=[' + ; + ALLTRIM(lcSerieVechi) + '] nou=[' + ALLTRIM(lcSerieNou) + '])' + ENDFOR +ENDPROC + +*================================================================================== +* CreeazaDocumentIncasare: emite un document REAL prin fluxul de productie, clasificat FACTURA +* (poDate.Tip=1 de la Init, NU suprascris ulterior - varianta anterioara, cu suprascriere tarzie, +* a rupt txtDataScadenta pe calea veche si opt_incasat pe calea noua, vezi antetul fisierului si +* docs\raport_s3b_emitere_reala_2.md). Sursa articolelor ramane insa cursor_preturi cu pnTipPreturi=22 +* (AVIZ din lista de preturi - singura combinatie cu date reale in acest mediu, +* probe_emitere_reala.prg): parametrul de tip trimis la cursor_preturi e o variabila separata, +* NU poDate.tip, ca structura/continutul cursorului nu depinde de valoarea trimisa (doar eligibilitatea +* articolelor pentru acel tip de lista) - poDate.tip ramane 1 (FACTURA) neschimbat pe tot fluxul. +* Intoarce poDate.nid_vanzare (>0 succes) sau 0 (esec, detaliat in log). +FUNCTION CreeazaDocumentIncasare + LPARAMETERS tnTipIncasare, tlFormNou + + PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTipPreturi + LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat, tnTip, tnIdClient, tnIdDelegat + LOCAL lcSerieAlocata, lnNractAlocat + lnIdVanzareRezultat = 0 + lcSerieAlocata = '' + lnNractAlocat = 0 + gnNrIncasareCapturat = 0 + + *-- poDate.Tip = 1 (FACTURA) de la Init - ntip<=20, contul de client normal (4111), consistent pe + *-- tot fluxul (vezi antetul fisierului). Sursa preturilor (pnTipPreturi=22) ramane separata. + tnTip = 1 + pnTipPreturi = 22 + tnIdClient = 463 + tnIdDelegat = 256 + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + + lnIdSet = 25000 + pnTipPreturi - 1 + gnScadereStoc * 10 + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + + gnIdUtil = 8 + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + + poDate.id_client = tnIdClient + poDate.id_delegat = tnIdDelegat + poDate.zi_curs = {^2026-08-10} + + IF poDate.rezultat_serii = 3 + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + ENDIF + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + gnIdUtil = -3 + lcSerieAlocata = ALLTRIM(TRANSFORM(NVL(poDate.serie_act, []))) + lnNractAlocat = poDate.nract + DO S3bLog WITH ' poDate.nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' poDate.nract=' + TRANSFORM(poDate.nract) + ; + ' serie_act=[' + TRANSFORM(NVL(poDate.serie_act,[])) + ']' + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?pnTipPreturi,?poDate.id_valuta,] + ; + [?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + + lcCursor = [crsarticole] + lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor) + IF lnSucces < 0 + DO S3bLog WITH ' EROARE cursor articole: ' + goExecutor.oPrelucrareEroare() + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO S3bCurataJtva + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + RETURN 0 + ENDIF + + IF RECCOUNT(lcCursor) = 0 + DO S3bLog WITH ' Nu exista articole (Reccount=0) - abandon document' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO S3bCurataJtva + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + RETURN 0 + ENDIF + DO S3bLog WITH ' crsarticole Reccount=' + TRANSFORM(RECCOUNT(lcCursor)) + + *-- articolul sursa (SERVICII PER BUC, lista de proba) are pretul 0 in acest mediu - cu + *-- poDate.totalctva=0, validarea reala (ofacturare.vc2 "Suma incasata nu poate fi mai mare + *-- decat valoarea facturii") respinge orice incasare nenula, iar fara nicio incasare + *-- lcListaIncasare iese gol (nu 'NULL') -> SQL Oracle malformat. Fortam un pret real de test, + *-- ca actualizeaza_tipincasare (codul real de productie) sa preumple poDate.incasat/incasatCARD + *-- = poDate.totalctva pe cont propriu, exact ca la un document real cu suma de incasat. + *-- Lista de preturi a articolului e in EURO (tip_valuta=1), iar do_scrie_articole + *-- trimite pe ramura aceea vpretftva, derivat din pret_val - fortand doar pret, + *-- documentul iesea cu VANZARI_DETALII.PRET=0. Se forteaza perechea, coerent cu cursul. + SELECT (lcCursor) + REPLACE ALL cantitate WITH 1, ; + pret_val WITH IIF(tip_valuta = 1, 100, 0), ; + pret WITH IIF(tip_valuta = 1, ROUND(100 * IIF(NVL(curs, 0) = 0, 1, curs) / IIF(NVL(multiplicator, 0) = 0, 1, multiplicator), gnPPretV), 100) + =TABLEUPDATE(.T., .T., lcCursor) + GO TOP + DO S3bLog WITH ' crsarticole dupa REPLACE: pret=' + TRANSFORM(pret) + ' cantitate=' + TRANSFORM(cantitate) + ; + ' pret_val=' + TRANSFORM(pret_val) + ' tip_valuta=' + TRANSFORM(tip_valuta) + ' curs=' + TRANSFORM(NVL(curs,0)) + ; + ' proc_tvav=' + TRANSFORM(proc_tvav) + ' preturi_cu_tva=' + TRANSFORM(preturi_cu_tva) + ' modificabil=' + TRANSFORM(modificabil) + + creeaza_facturacrs([crsfactura]) + + *-- Construim crsfactura DIRECT din crsarticole, cu prelucreaza_facturacrs (ofacturare_comun.prg:1803) + *-- - procedura reala care calculeaza pretctva/valctva/valftva/valtva/valdiminuatctva etc. Ocolim + *-- complet do_adauga_tot()/do_adauga_articol(), care citesc Thisform.grd_articole - grila NU se + *-- materializeaza sub vfp9.exe -A -T (capcana cunoscuta), deci randul adaugat prin ea iese gol + *-- (cantitate=0/pret=NULL) indiferent ce e in crsarticole - verificat cu log dedicat intr-o + *-- rulare anterioara. do_calculeaza_totaluri() (ambele clase, verificat in sursa) citeste STRICT + *-- din crsfactura (Sum(valdiminuatctva) etc.), fara nicio dependenta de grid - deci populand + *-- crsfactura corect pe alta cale, restul fluxului (do_calculeaza_totaluri, do_termin, + *-- do_scrie_articole -> SELECT crsfactura SCAN) functioneaza neschimbat. + LOCAL lnCotaTva, lnIdJtvaColoana, lnSelAnterior + SELECT (lcCursor) + lnCotaTva = ROUND((proc_tvav - 1) * 100, 0) + lnIdJtvaColoana = 0 + IF USED('jtva_coloane') + lnSelAnterior = SELECT() + SELECT jtva_coloane + LOCATE FOR cota_tva = lnCotaTva + IF FOUND() + lnIdJtvaColoana = id_jtva_coloana + ENDIF + SELECT (lnSelAnterior) + ENDIF + DO S3bLog WITH ' lookup jtva_coloane: cota_tva=' + TRANSFORM(lnCotaTva) + ' -> id_jtva_coloana=' + TRANSFORM(lnIdJtvaColoana) + + SELECT id_articol, id_pol, 1 AS id_vanzare_det, CAST('' AS M) AS explicatie, denumire, lot, serie, codmat, ; + m.lnIdJtvaColoana AS id_jtva_coloana, CAST(NULL AS N(20)) AS id_jtva_coloana_ex, CAST(NULL AS N(6)) AS taxcode, ; + codmat AS codmatf, codbare, 0 AS pret_achizitie, cantitate, proc_tvav, um, ; + preturi_cu_tva AS pret_cu_tva, pret, discount_unitar, pret_val, discount_unitar_val, ; + CAST(NULL AS N(20)) AS id_vanzare_set, CAST(NULL AS N(20)) AS id_gestiune, CAST(NULL AS N(20)) AS id_ctr, ; + CAST('' AS C(100)) AS numar_contract, id_valuta, tip_valuta, curs, multiplicator, nume_val ; + FROM (lcCursor) INTO CURSOR crssursaprelucrare READWRITE + + DO prelucreaza_facturacrs WITH 'crssursaprelucrare', 'crsfactura', 0, 0, 0 + SELECT (lcCursor) + LOCAL lnIdPolCrs + lnIdPolCrs = NVL(id_pol, 0) + SELECT crsfactura + REPLACE ALL id_pol WITH lnIdPolCrs + USE IN crssursaprelucrare + DO S3bLog WITH ' crsfactura dupa prelucreaza_facturacrs: Reccount=' + TRANSFORM(RECCOUNT('crsfactura')) + IF RECCOUNT('crsfactura') > 0 + SELECT crsfactura + GO TOP + DO S3bLog WITH ' crsfactura linia 1: pret_achizitie=' + TRANSFORM(pret_achizitie) + ' cantitate=' + TRANSFORM(cantitate) + ; + ' pretctva=' + TRANSFORM(pretctva) + ' valctva=' + TRANSFORM(valctva) + ' valdiminuatctva=' + TRANSFORM(valdiminuatctva) + ; + ' proc_tvav=' + TRANSFORM(proc_Tvav) + ' cu_tva=' + TRANSFORM(cu_tva) + ' id_pol=' + TRANSFORM(NVL(id_pol,-1)) + ENDIF + + IF poDate.in_valuta = 1 + SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM (lcCursor) WITH (Buffering = .T.) WHERE tip_valuta = 1 ORDER BY nume_val INTO CURSOR crscursuri + SELECT crscursuri + poDate.Curs = Curs + poDate.multiplicator = multiplicator + ELSE + citeste_cursuri_zi(poDate.zi_curs) + IF RECCOUNT('crscursuri') = 0 + USE IN crscursuri + ENDIF + ENDIF + + IF TYPE(lcCursor + '.nume_lista_preturi') <> 'U' + CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100)) + SELECT crspolitici + INSERT INTO crspolitici(id_pol, nume_lista_preturi) VALUES (-9999, '') + INSERT INTO crspolitici(id_pol, nume_lista_preturi) ; + SELECT DISTINCT id_pol, nume_lista_preturi FROM (lcCursor) ORDER BY nume_lista_preturi + ENDIF + + *-- formularul, modeless (apel direct de metode) - vechi sau unificat, dupa tlFormNou + PUBLIC goFrmS3b + IF tlFormNou + goFrmS3b = CREATEOBJECT('frm_facturare_articole2') + ELSE + goFrmS3b = CREATEOBJECT('frm_facturare_articole') + ENDIF + DO S3bLog WITH ' CREATEOBJECT OK, VARTYPE=' + VARTYPE(goFrmS3b) + goFrmS3b.WindowType = 0 + goFrmS3b.Show() + DOEVENTS FORCE + DO S3bLog WITH ' formular afisat modeless (' + IIF(tlFormNou, 'NOU frm_facturare_articole2', 'VECHI frm_facturare_articole') + ')' + + *-- crsfactura e deja populat direct (prelucreaza_facturacrs, mai sus) - NU mai chemam + *-- goFrmS3b.do_adauga_tot()/do_adauga_articol(), care citesc Thisform.grd_articole (nematerializat + *-- headless pe formularul vechi, si inexistent ca proprietate pe formularul nou - vezi antetul). + goFrmS3b.do_calculeaza_totaluri() + DOEVENTS FORCE + *-- poDate.totalctva se seteaza abia in inainte_de_do_termin; totalul calculat sta in ntotalron + DO S3bLog WITH ' dupa do_calculeaza_totaluri: ntotalron=' + TRANSFORM(goFrmS3b.ntotalron) + ; + ' nbazaron=' + TRANSFORM(goFrmS3b.nbazaron) + ' ntvaron=' + TRANSFORM(goFrmS3b.ntvaron) + ; + ' (poDate.totalctva inca ' + TRANSFORM(poDate.totalctva) + ')' + + *-- poDate.Tip a fost 1 (FACTURA) inca de la Init - vezi antetul functiei. Doar diagnostic aici: + *-- confirma ca .datascad s-a completat singur (tnTip=1<21 la Init, ofacturare_comun.prg:246). + DO S3bLog WITH ' poDate.Tip=' + TRANSFORM(poDate.Tip) + ' poDate.datascad=' + TRANSFORM(NVL(poDate.datascad,{})) + ' inainte de do_termin()' + + LOCAL lnScris + IF tlFormNou + *-- opt_incasat e inline pe formular - fara al doilea modal + *-- actualizeaza_tipincasare pune incasat=poDate.totalctva; totalul se umple abia in inainte_de_do_termin, deci il pre-seteaza aici + poDate.totalctva = goFrmS3b.ntotalron + goFrmS3b.seteaza_mod_incasare(tnTipIncasare) + gnNrIncasareCapturat = poDate.nr_incasare + DO S3bLog WITH ' opt_incasat.Value=' + TRANSFORM(tnTipIncasare) + ' -> poDate.nr_incasare=' + TRANSFORM(gnNrIncasareCapturat) + ; + ' incasat=' + TRANSFORM(poDate.incasat) + ' incasatCARD=' + TRANSFORM(poDate.incasatCARD) + lnScris = goFrmS3b.do_termin() + ELSE + *-- calea veche: al doilea modal (frm_alte_date) e condus de goDriverAD/tmrDrvAD. Deadline de + *-- gardian, verificat in Executa: daca modalul nu se rezolva in 20s (mesaj necunoscut, + *-- ActiveControl invalid etc.), Executa il forteaza sa se elibereze in loc sa agate rularea + *-- pe ecranul lui Marius (asa cum s-a intamplat o data, PID 9312, vezi handoff). + glDlgTratatAD = .F. + glVerifTratatAD = .F. + gnTipIncasareCerut = tnTipIncasare + gnDrvDeadline = SECONDS() + 20 + lnScris = goFrmS3b.do_termin() + LOCAL lnWait + lnWait = 0 + *-- INKEY(0.1) proceseaza evenimente SI asteapta real ~100ms, spre deosebire de un + *-- DOEVENTS FORCE gol (care revine aproape instant) - altfel 250 de iteratii s-ar termina + *-- in sub-o-secunda, mult inainte ca gardianul din Executa (20s) sa apuce sa actioneze. + DO WHILE !glDlgTratatAD AND lnWait < 250 + =INKEY(0.1) + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + IF !glDlgTratatAD + DO S3bLog WITH ' ATENTIE: glDlgTratatAD tot .F. dupa asteptare - posibil modal ramas deschis' + ENDIF + ENDIF + DO S3bLog WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0)) + + *-- do_termin() intoarce mereu .T. (_frm_base.vc2:363, DoDefault fara RETURN) si nid_vanzare + *-- ramane santinela 9999999999 la esec: singura dovada e randul din VANZARI, pe serie_act + nract. + lnIdVanzareRezultat = CdocGasesteIdVanzare(lcSerieAlocata, lnNractAlocat) + IF lnIdVanzareRezultat < 0 + lnIdVanzareRezultat = 0 + ENDIF + DO S3bLog WITH ' verificare in VANZARI pe ' + lcSerieAlocata + ' ' + TRANSFORM(lnNractAlocat) + ; + ' -> id_vanzare=' + TRANSFORM(lnIdVanzareRezultat) + + IF TYPE('goFrmS3b') = 'O' AND !ISNULL(goFrmS3b) + goFrmS3b.Release() + ENDIF + goFrmS3b = NULL + + IF USED('crspolitici') + USE IN crspolitici + ENDIF + IF USED('crscursuri') + USE IN crscursuri + ENDIF + IF USED('crsfactura') + USE IN crsfactura + ENDIF + IF USED('crsarticole') + USE IN crsarticole + ENDIF + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF USED('jtva_coloane_temp') + USE IN jtva_coloane_temp + ENDIF + + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + RETURN lnIdVanzareRezultat +ENDFUNC + +PROCEDURE S3bCurataJtva + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF USED('jtva_coloane_temp') + USE IN jtva_coloane_temp + ENDIF +ENDPROC + +*================================================================================== +*-- driverAlteDateAD: cauta FRM_ALTE_DATE prin _SCREEN.Forms si ii seteaza opt_incasat.Value la +* gnTipIncasareCerut INAINTE de a-i chema .do_termin() - identic cu test_s3b_emitere_reala.prg. +DEFINE CLASS driverAlteDateAD AS Custom + PROCEDURE Executa + LOCAL lnI, loForm, llGasit, loMsgForm, loCautaAlfaForm, loFormVerif + *-- gardian: daca modalul nu s-a rezolvat in gnDrvDeadline secunde, il eliberam fortat in loc + *-- sa lasam do_termin() agatat pe ecran (asa cum s-a intamplat o data, PID 9312). + IF !glDlgTratatAD AND SECONDS() > gnDrvDeadline + DO S3bLog WITH ' [diag timer] GARDIAN: deadline depasit, eliberez fortat formele deschise' + *-- eliberare pe Forms(1) repetat (nu FOR pe index crescator), ca sterile modificarile + *-- de FormCount la fiecare Release() sa nu sara peste elemente + LOCAL lnGardCicluri + lnGardCicluri = 0 + DO WHILE _SCREEN.FormCount > 0 AND lnGardCicluri < 20 + TRY + DO S3bLog WITH ' [diag timer] GARDIAN: eliberez ' + UPPER(_SCREEN.Forms(1).Class) + _SCREEN.Forms(1).Release() + CATCH TO loExcGard + DO S3bLog WITH ' [diag timer] GARDIAN: CATCH la Release ' + TRANSFORM(loExcGard.ErrorNo) + ' ' + loExcGard.Message + EXIT + ENDTRY + lnGardCicluri = lnGardCicluri + 1 + ENDDO + glDlgTratatAD = .T. + RETURN + ENDIF + llGasit = .F. + loMsgForm = NULL + loCautaAlfaForm = NULL + loFormVerif = NULL + FOR lnI = 1 TO _SCREEN.FormCount + LOCAL lcClasa + lcClasa = UPPER(_SCREEN.Forms(lnI).Class) + IF lcClasa == 'FRM_ALTE_DATE' + loForm = _SCREEN.Forms(lnI) + llGasit = .T. + ENDIF + IF 'MESSAGEBOX_FORM' $ lcClasa + loMsgForm = _SCREEN.Forms(lnI) + ENDIF + IF lcClasa == 'CAUTA_ALFA_FORM' + loCautaAlfaForm = _SCREEN.Forms(lnI) + ENDIF + IF '_FRMBASE' $ lcClasa + loFormVerif = _SCREEN.Forms(lnI) + ENDIF + IF !(lcClasa $ gcClaseVazute) + gcClaseVazute = gcClaseVazute + lcClasa + ';' + DO S3bLog WITH ' [diag timer] forma noua vazuta: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' + ENDIF + ENDFOR + *-- confirmare reala neacoperita de mock_amessagebox (forma modala messagebox_form) - + *-- apasa automat cmdYes/cmdOk, ca in productie la raspuns implicit "Da". Textul se logheaza + *-- de fiecare data (nu doar la primul din clasa) - mesajele difera de la un popup la altul. + IF !ISNULL(loMsgForm) + TRY + IF PEMSTATUS(loMsgForm, 'edtMensaje', 5) + DO S3bLog WITH ' [diag timer] messagebox_form text=[' + TRANSFORM(loMsgForm.edtMensaje.Value) + ; + '] caption=[' + TRANSFORM(loMsgForm.Caption) + ']' + ENDIF + CATCH TO loExcTxt + DO S3bLog WITH ' [diag timer] messagebox_form: CATCH la citire text ' + TRANSFORM(loExcTxt.ErrorNo) + ' ' + loExcTxt.Message + ENDTRY + TRY + DO CASE + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) + DO S3bLog WITH ' [diag timer] messagebox_form: apas cmgBotones.cmdYes' + loMsgForm.cmgBotones.cmdYes.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) + DO S3bLog WITH ' [diag timer] messagebox_form: apas cmgBotones.cmdOk' + loMsgForm.cmgBotones.cmdOk.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdCancel', 5) + DO S3bLog WITH ' [diag timer] messagebox_form: buton necunoscut (nici Yes, nici Ok) - apas cmgBotones.cmdCancel ca sa nu ramana blocat' + loMsgForm.cmgBotones.cmdCancel.Click() + OTHERWISE + DO S3bLog WITH ' [diag timer] messagebox_form: NICIUN buton recunoscut (Yes/Ok/Cancel) - raman blocat pana la gardian (' + ; + TRANSFORM(gnDrvDeadline - SECONDS()) + 's ramase)' + ENDCASE + CATCH TO loExcMsg + DO S3bLog WITH ' [diag timer] messagebox_form: CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message + ENDTRY + ENDIF + *-- cautare partener analitic (POS Card): se inchide fara selectie prin do_termin, inainte de + *-- garda glDlgTratatAD ca sa fie tratat si dupa ce FRM_ALTE_DATE a fost deja rezolvat + IF !ISNULL(loCautaAlfaForm) + TRY + DO S3bLog WITH ' [diag timer] forma cauta_alfa: Caption=[' + TRANSFORM(loCautaAlfaForm.Caption) + '] - apas do_termin()' + loCautaAlfaForm.do_termin() + CATCH TO loExcCautaAlfa + DO S3bLog WITH ' [diag timer] forma cauta_alfa: CATCH ' + TRANSFORM(loExcCautaAlfa.ErrorNo) + ' ' + loExcCautaAlfa.Message + TRY + IF TYPE('loCautaAlfaForm') = 'O' AND !ISNULL(loCautaAlfaForm) + loCautaAlfaForm.Release() + ENDIF + CATCH + ENDTRY + ENDTRY + ENDIF + *-- formularul real verificare (SCX _frmbase12, raportat _FRMBASE) - modal din scrie_factura2, + *-- inainte de garda glDlgTratatAD; plasa de siguranta: eliberare DIRECTA (Release) - do_termin() + *-- re-ruleaza verificarea si arunca bucla pe messagebox "REZULTATE VERIFICARI" + CATCH 103 + IF !ISNULL(loFormVerif) AND !glVerifTratatAD + gnButon = 1 + glVerifTratatAD = .T. + TRY + DO S3bLog WITH ' [diag timer] forma _FRMBASE (verificare): eliberare directa (Release), gnButon=1' + loFormVerif.Release() + CATCH TO loExcVerif + DO S3bLog WITH ' [diag timer] forma _FRMBASE: CATCH Release ' + TRANSFORM(loExcVerif.ErrorNo) + ' ' + loExcVerif.Message + ENDTRY + ENDIF + IF glDlgTratatAD OR !llGasit + RETURN + ENDIF + *-- loForm.ActiveControl arunca eroarea 1924 "ACTIVECONTROL is not an object" cand formularul + *-- nu are (inca) niciun control cu focus - varianta anterioara o citea fara sa o foloseasca + *-- si asta a cauzat exact blocajul raportat (PID 9312). Nu o mai citim deloc. + TRY + loForm.opt_incasat.Value = gnTipIncasareCerut + gnNrIncasareCapturat = poDate.nr_incasare + DO S3bLog WITH ' driverAlteDateAD: opt_incasat.Value=' + TRANSFORM(gnTipIncasareCerut) + ; + ' -> poDate.nr_incasare=' + TRANSFORM(gnNrIncasareCapturat) + ' incasat=' + TRANSFORM(poDate.incasat) + ; + ' incasatCARD=' + TRANSFORM(poDate.incasatCARD) + loForm.do_termin() + glDlgTratatAD = .T. + CATCH TO loExcDrv + DO S3bLog WITH ' driverAlteDateAD: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ; + ' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo) + *-- daca formularul a ramas deschis dupa CATCH, il eliberam - altfel do_termin() de mai + *-- sus (cel apelat pe goFrmS3b, care asteapta modalul) ramane agatat la nesfarsit + TRY + IF TYPE('loForm') = 'O' AND !ISNULL(loForm) + loForm.Release() + ENDIF + CATCH + ENDTRY + glDlgTratatAD = .T. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_unificat/test_s3b_emitere_paritate_2.ps1 b/utile/Teste/facturare_unificat/test_s3b_emitere_paritate_2.ps1 new file mode 100644 index 0000000..2358287 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3b_emitere_paritate_2.ps1 @@ -0,0 +1,28 @@ +$ErrorActionPreference = 'Stop' +$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat' +$prg = Join-Path $dir 'test_s3b_emitere_paritate_2.prg' +$log = Join-Path $dir 'out\test_s3b_emitere_paritate_2.log' +$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' + +$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s3b_emitere_paritate_2*' } +if ($viu) { + "Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua." + exit 1 +} + +Set-Location $dir +Remove-Item *.FXP, *.fxp -ErrorAction SilentlyContinue +Remove-Item $log -ErrorAction SilentlyContinue + +$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru +"lansat PID " + $p.Id +$null = $p.WaitForExit(240000) +if (-not $p.HasExited) { + "INCA RULEAZA dupa 240s - omor instanta (filtrat pe CommandLine)" + Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s3b_emitere_paritate_2*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force } +} +if (Test-Path $log) { + Get-Content $log | Select-String -Pattern '^(PASS|FAIL|ERROR|TOTAL|START|END|=====| MAX| tip_incasat| vechi | nou |CATCH)' +} else { + "Log inexistent: $log" +} diff --git a/utile/Teste/facturare_unificat/test_s3b_emitere_reala.prg b/utile/Teste/facturare_unificat/test_s3b_emitere_reala.prg new file mode 100644 index 0000000..b857be2 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3b_emitere_reala.prg @@ -0,0 +1,698 @@ +* test_s3b_emitere_reala.prg +* Criteriul 1 de "gata" al S3b, PROBA REALA (nu structurala): emite documente REALE in Oracle +* (MARIUSM_AUTO@ROA_CENTRAL, aprobat explicit de Marius) prin fluxul de emitere efectiv, pe +* fiecare din cele patru tipuri de incasare (1=Fara incasare, 2=Chitanta, 3=Bon fiscal, 4=POS/Card), +* o data pe formularul vechi (frm_facturare_articole) si o data pe cel unificat +* (frm_facturare_articole2), si compara randurile persistate in VANZARI dupa commit. +* +* Sursa documentului e cursor_preturi (lista de preturi, client RAJA id_part=463) cu tnTip=22 - +* singura combinatie confirmata prin proba read-only (probe_emitere_reala.prg) ca intoarce articole +* in acest mediu; tnTip=5 (FACTURA direct) da Reccount=0. Numerotarea/serie a documentului ramane +* cea naturala pentru tnTip=22 (AVIZ, nIdTipDoc=6, plaja globala) - neatinsa, nu conteaza pentru +* criteriul de paritate a INCASARII, care e independent de seria documentului. +* +* Mecanica bazata pe COMUN\utile\Teste\editare_factura\creeaza_documente_s8.prg (mediu Oracle real +* + clase de productie, dovedit ca emite documente reale pentru tnTip=22): dialogul modal de antet +* e inlocuit cu setare directa poDate (ca acolo), iar "Do Form verificare" (ofacturare.vc2:14404 / +* :20126) e ocolit cu acelasi stub versionat COMUN\utile\Teste\achizitie_import\stub_verificare\ +* (SET PATH cu el primul). +* +* Diferenta fata de creeaza_documente_s8.prg: al doilea modal (frm_alte_date, doar pe calea veche) +* NU e doar "confirmat" - un driver pe Timer ii seteaza opt_incasat.Value la tipul cerut INAINTE +* sa-i cheme do_termin(), exact tehnica validata structural in test_s3b_paritate_emitere.prg (setarea +* de .Value declanseaza opt_incasat.ProgrammaticChange -> actualizeaza_tipincasare(), cod real). +* Pe calea noua nu exista al doilea modal (opt_incasat e inline pe formular): se seteaza direct pe +* goFrm inainte de goFrm.do_termin(). +* +* De ce NU se compara nr_incasare/NR_INCASAT intre vechi si nou (asa cum a facut suita structurala): +* acolo numerele erau dezalocate dupa fiecare tip, deci acelasi numar fizic se realoca in faza 2. +* Aici documentele raman scrise (nu se dezaloca nimic dupa un commit reusit), deci vechi si nou aloca +* NUMERE DIFERITE, consecutive, din aceeasi plaja - egalitatea lor ar fi o eroare, nu o dovada. +* Paritatea reala verificata e (a) consistenta interna - VANZARI.NR_INCASAT persistat == poDate.nr_incasare +* capturat chiar inainte de scriere, pe fiecare document in parte, si (b) egalitatea intre vechi/nou a +* CODULUI de tip (VANZARI.TIP_INCASAT) si a SUMEI (VANZARI.SUMA_INCASAT) - marimi care nu depind de +* alocarea secventiala si trebuie sa fie identice daca cele doua cai proceseaza acelasi lcListaIncasare. +* +* CONSUMA DATE REALE: fiecare pereche (tip, forma) scrie un document nou in VANZARI (client 463), +* iar tipurile 2/3/4 aloca si un numar real de chitanta/bon fiscal/pos (serii 16/3/26). Niciun +* rollback, nicio stergere - documentele raman in schema, de inspectat de Marius. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_emitere_reala.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_emitere_reala.log + +SET SAFETY OFF +SET TALK OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog, gnPass, gnFail +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_emitere_reala.log" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13)+CHR(10), gcLog) +gnPass = 0 +gnFail = 0 + +ON ERROR DO S3bErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + LOCAL lcAppPathLocal, lcSql + lcAppPathLocal = "D:\ROA\ROAFACTURARE\" + + *-- stub_verificare PRIMUL (SET PATH plain, nu ADDITIVE): test_init_env_auto_roafacturare.prg + *-- face el insusi SET PATH TO ... ADDITIVE mai jos, care ADAUGA dupa (nu inaintea) intrarilor + *-- deja existente - asta pastreaza stub_verificare cu prioritate fata de COMUN\FERESTRE, ca + *-- "Do Form verificare" (ofacturare.vc2:14404 / :20126) sa rezolve la stub, nu la formularul real + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + + *-- mediul REAL, identic cu cel folosit de test_s3b_paritate_emitere.prg (deja dovedit ca + *-- instantiaza fara agatare frm_facturare_articole2 - orice reconstructie manuala a acestui + *-- mediu s-a dovedit incompleta si a agatat headless in interiorul Init-ului formularului nou, + *-- la constructia coloanei Gestiune din grd_factura (vezi raport) + 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 S3bLog WITH 'EROARE: conectare Oracle esuata' + DO S3bFinal + ENDIF + DO S3bLog WITH 'test_init_env_auto_roafacturare OK, gnHandle=' + TRANSFORM(gnHandle) + + *-- fara asta, un lacat Oracle blocheaza rularea la infinit, invizibil in log + SQLSETPROP(gnHandle, "QueryTimeOut", 45) + + *-- clase suplimentare, necesare pentru grd_factura (coloane cu combo pe cursor SQL) + SET PATH TO (lcAppPathLocal + "COMUN\utile\gridextras") ADDITIVE + SET CLASSLIB TO gridextras.vcx ADDITIVE + SET CLASSLIB TO _cb_base.vcx ADDITIVE + DO S3bLog WITH 'SET CLASSLIB suplimentar OK' + + *-- mock amessagebox: la nume duplicat castiga fisierul de proceduri deschis cel mai recent + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE + DO S3bLog WITH 'mock_amessagebox OK' + + *-- CdocGasesteIdVanzare: dovada de scriere pe jonctiunea serie_act + nract + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE + + *-- initializare REALA a optiunilor de program (tehnica din test_s3b_paritate_emitere.prg) - + *-- creeaza dinamic globalele gnXxx/glXxx/gcXxx din tabela OPTIUNI; suprascrise imediat dupa + *-- cu valorile care bypaseaza dialogurile per-linie in mediul headless + IF !actualizeaza_optiuni_program() + DO S3bLog WITH 'EROARE: actualizeaza_optiuni_program()' + DO S3bFinal + ENDIF + gnScadereStoc = 0 + gnModTotFact = 0 + gnFactSeturi = 0 + gnListareAvizBonFiscal = 0 + gnid_part_casa = 0 + *-- 167: singura sucursala cu plaje pentru chitanta/bon fiscal/pos in acest mediu (16/3/26); + *-- verificat READ-ONLY (probe_emitere_reala.prg) ca nu schimba Reccount(cursor_preturi) + gnIdSucursala = 167 + lcSql = [begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;] + goExecutor.oExecuta(lcSql) + DO S3bLog WITH 'actualizeaza_optiuni_program OK, gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + + PUBLIC gcMockUltimMesaj, gnMockUltimTip + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + + *----- driver: conduce frm_alte_date (singurul modal ramas, doar pe calea veche) ----- + PUBLIC goDriverAD, glDlgTratatAD, gnTipIncasareCerut, gnNrIncasareCapturat, gcClaseVazute + glDlgTratatAD = .F. + gnTipIncasareCerut = 1 + gnNrIncasareCapturat = 0 + gcClaseVazute = ';' + goDriverAD = CREATEOBJECT('driverAlteDateAD') + _SCREEN.AddObject('tmrDrvAD', 'Timer') + _SCREEN.tmrDrvAD.Interval = 200 + BINDEVENT(_SCREEN.tmrDrvAD, 'Timer', goDriverAD, 'Executa') + _SCREEN.tmrDrvAD.Enabled = .T. + *-- _SCREEN ramane invizibil (default -A -T), ca in test_s3b_paritate_emitere.prg - un GETFILE() + *-- nativ (dialog "Open") aparut la o SET SCREEN VISIBLE = .T. a agatat rularea (vezi raport) + _SCREEN.Caption = 'S3b - emitere reala (paritate incasare vechi/nou)' + DO S3bLog WITH 'driver+timer pregatiti' + + *-- pre-proba plajelor 3/16/26 - plasa de siguranta, evita blocaj invizibil daca lipsesc + DO S3bLog WITH 'pre-proba plaje: tip3=' + TRANSFORM(RanduriSerii(3)) + ' tip16=' + TRANSFORM(RanduriSerii(16)) + ; + ' tip26=' + TRANSFORM(RanduriSerii(26)) + + *-- stare INAINTE: ultimul NR_INCASAT emis pe fiecare tip de incasare, in TOATA schema + DO S3bLog WITH CHR(13)+CHR(10) + '===== STARE INAINTE (MAX(NR_INCASAT) pe tip_incasat, toata schema) =====' + DO LogStareMaxIncasat + + CREATE CURSOR crsRezultate (tip_incasare N(1), forma C(10), id_vanzare N(10), cod N(10), ; + serie_act C(10), id_fact N(10), nr_incasare_asteptat N(10), nr_incasat N(10), ; + tip_incasat N(10), suma_incasat N(18,2), serie_incasat C(10), total_cu_tva N(18,2)) + + LOCAL laNumeTip[4] + laNumeTip[1] = 'Fara incasare' + laNumeTip[2] = 'Chitanta' + laNumeTip[3] = 'Bon fiscal' + laNumeTip[4] = 'POS Card' + + *-- FORMA NOUA: BLOCATA in aceasta sesiune (vezi docs\raport_s3b_emitere_reala.md) - + *-- frm_facturare_articole2 agata la CREATEOBJECT (Init -> grd_factura.cGestiune.cCboGestiune + *-- -> _cb_base.vc2 combosql.Init:589 -> RefreshData(0):826 -> SelectData():832 -> un dialog + *-- nativ "Open" real, needeterminat cauzal, indiferent de mediu/tip/vizibilitate _SCREEN). + *-- Ramane .F. neconditionat aici; DACA se rezolva blocajul, se schimba in .T. pentru ambele. + PUBLIC glIncercaFormaNoua + glIncercaFormaNoua = .F. + + LOCAL lnTip, lnIdVz + FOR lnTip = 1 TO 4 + DO S3bLog WITH CHR(13)+CHR(10) + '===== TIP ' + TRANSFORM(lnTip) + ' (' + laNumeTip[lnTip] + ') - FORMA VECHE (tnTip=22) =====' + lnIdVz = CreeazaDocumentIncasare(lnTip, .F.) + DO InregistreazaRezultat WITH lnTip, 'vechi', lnIdVz + + IF glIncercaFormaNoua + DO S3bLog WITH CHR(13)+CHR(10) + '===== TIP ' + TRANSFORM(lnTip) + ' (' + laNumeTip[lnTip] + ') - FORMA NOUA (tnTip=3) =====' + lnIdVz = CreeazaDocumentIncasare(lnTip, .T.) + DO InregistreazaRezultat WITH lnTip, 'nou', lnIdVz + ELSE + DO S3bLog WITH ' forma noua SARITA (blocata, vezi raport)' + ENDIF + ENDFOR + + DO S3bLog WITH CHR(13)+CHR(10) + '===== COMPARATIE VECHI / NOU, PE TIP =====' + DO ComparaRezultate + + DO S3bLog WITH CHR(13)+CHR(10) + '===== STARE DUPA (MAX(NR_INCASAT) pe tip_incasat, toata schema) =====' + DO LogStareMaxIncasat + + _SCREEN.tmrDrvAD.Enabled = .F. + DO S3bFinal + +CATCH TO loExc + DO S3bLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO S3bFinal +ENDTRY + +QUIT + +*================================================================================== +PROCEDURE S3bLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13)+CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE S3bErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO S3bLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE S3bFinal + DO S3bLog WITH CHR(13)+CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + DO S3bLog WITH 'END ' + TTOC(DATETIME()) + QUIT +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO S3bLog WITH 'PASS: ' + tcMsg + ELSE + gnFail = gnFail + 1 + DO S3bLog WITH 'FAIL: ' + tcMsg + ENDIF +ENDPROC + +*-- cate randuri de plaja intoarce verifica_cursor_serii pentru un tip de document, fara sa aloce +FUNCTION RanduriSerii + LPARAMETERS tnIdTipDoc + LOCAL lnOk, lnRanduri, lcSql + LOCAL ARRAY laErr[1] + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lnRanduri = -1 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobapl") + IF lnOk > 0 + lnRanduri = RECCOUNT("crsprobapl") + USE IN (SELECT("crsprobapl")) + ELSE + AERROR(laErr) + DO S3bLog WITH 'pre-proba plaje tip ' + TRANSFORM(tnIdTipDoc) + ' ESEC: ' + TRANSFORM(laErr[2]) + ENDIF + RETURN lnRanduri +ENDFUNC + +PROCEDURE LogStareMaxIncasat + LOCAL lnQ + lnQ = goExecutor.oExecute([select tip_incasat, max(nr_incasat) as maxnr, count(*) as nr ] + ; + [from vanzari where tip_incasat is not null group by tip_incasat order by tip_incasat], 'crsMaxInc') + IF lnQ > 0 + SELECT crsMaxInc + SCAN + DO S3bLog WITH ' tip_incasat=' + TRANSFORM(tip_incasat) + ' max(nr_incasat)=' + TRANSFORM(maxnr) + ' nr_documente=' + TRANSFORM(nr) + ENDSCAN + USE IN crsMaxInc + ELSE + DO S3bLog WITH ' EROARE citire stare incasat: ' + goExecutor.oPrelucrareEroare() + ENDIF +ENDPROC + +*-- citeste randul VANZARI scris pentru id_vanzare si-l adauga in crsRezultate +PROCEDURE InregistreazaRezultat + LPARAMETERS tnTip, tcForma, tnIdVz + DO Assert WITH tnIdVz > 0, '[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] documentul exista in VANZARI (jonctiune serie_act+nract), e=' + TRANSFORM(tnIdVz) + IF tnIdVz <= 0 + DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': documentul NU s-a scris (id_vanzare=0), fara rand in VANZARI' + INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare) VALUES (tnTip, tcForma, 0) + RETURN + ENDIF + LOCAL lnQ + lnQ = goExecutor.oExecute([select id_vanzare, cod, serie_act, nvl(id_fact,0) as id_fact, ] + ; + [nvl(nr_incasat,0) as nr_incasat, nvl(tip_incasat,0) as tip_incasat, nvl(suma_incasat,0) as suma_incasat, ] + ; + [nvl(serie_incasat,'') as serie_incasat, total_cu_tva from vanzari where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVz1') + IF lnQ <= 0 OR RECCOUNT('crsVz1') <> 1 + DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': EROARE citire VANZARI id_vanzare=' + TRANSFORM(tnIdVz) + INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare) VALUES (tnTip, tcForma, tnIdVz) + RETURN + ENDIF + SELECT crsVz1 + INSERT INTO crsRezultate (tip_incasare, forma, id_vanzare, cod, serie_act, id_fact, ; + nr_incasare_asteptat, nr_incasat, tip_incasat, suma_incasat, serie_incasat, total_cu_tva) ; + VALUES (tnTip, tcForma, tnIdVz, crsVz1.cod, NVL(crsVz1.serie_act,''), crsVz1.id_fact, ; + gnNrIncasareCapturat, crsVz1.nr_incasat, crsVz1.tip_incasat, crsVz1.suma_incasat, NVL(crsVz1.serie_incasat,''), crsVz1.total_cu_tva) + DO S3bLog WITH ' ' + tcForma + ' tip=' + TRANSFORM(tnTip) + ': id_vanzare=' + TRANSFORM(tnIdVz) + ' cod=' + TRANSFORM(crsVz1.cod) + ; + ' serie_act=' + TRANSFORM(crsVz1.serie_act) + ' id_fact=' + TRANSFORM(crsVz1.id_fact) + ; + ' nr_incasat=' + TRANSFORM(crsVz1.nr_incasat) + ' (asteptat ' + TRANSFORM(gnNrIncasareCapturat) + ') tip_incasat=' + TRANSFORM(crsVz1.tip_incasat) + ; + ' suma_incasat=' + TRANSFORM(crsVz1.suma_incasat) + ' serie_incasat=[' + TRANSFORM(crsVz1.serie_incasat) + ']' + ; + ' total_cu_tva=' + TRANSFORM(crsVz1.total_cu_tva) + USE IN crsVz1 + + DO Assert WITH crsRezultate.nr_incasat = gnNrIncasareCapturat, ; + '[' + tcForma + ' tip=' + TRANSFORM(tnTip) + '] VANZARI.NR_INCASAT persistat (' + TRANSFORM(crsRezultate.nr_incasat) + ; + ') == poDate.nr_incasare capturat inainte de scriere (' + TRANSFORM(gnNrIncasareCapturat) + ')' +ENDPROC + +PROCEDURE ComparaRezultate + LOCAL lnTip, lnRVechi, lnRNou + IF !glIncercaFormaNoua + DO S3bLog WITH ' forma noua sarita in aceasta rulare - fara comparatie vechi/nou, doar valorile persistate pe forma veche' + RETURN + ENDIF + FOR lnTip = 1 TO 4 + SELECT crsRezultate + LOCATE FOR tip_incasare = lnTip AND forma == 'vechi' + IF !FOUND() + DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] rand vechi gasit in crsRezultate' + LOOP + ENDIF + lnRVechi = RECNO() + LOCATE FOR tip_incasare = lnTip AND forma == 'nou' + IF !FOUND() + DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] rand nou gasit in crsRezultate' + LOOP + ENDIF + lnRNou = RECNO() + + LOCAL lnIdVechi, lnIdNou, lnTipIncVechi, lnTipIncNou, lnSumaVechi, lnSumaNou, lcSerieVechi, lcSerieNou + GO lnRVechi IN crsRezultate + lnIdVechi = crsRezultate.id_vanzare + lnTipIncVechi = crsRezultate.tip_incasat + lnSumaVechi = crsRezultate.suma_incasat + lcSerieVechi = crsRezultate.serie_incasat + GO lnRNou IN crsRezultate + lnIdNou = crsRezultate.id_vanzare + lnTipIncNou = crsRezultate.tip_incasat + lnSumaNou = crsRezultate.suma_incasat + lcSerieNou = crsRezultate.serie_incasat + + IF lnIdVechi <= 0 OR lnIdNou <= 0 + DO Assert WITH .F., '[tip=' + TRANSFORM(lnTip) + '] ambele documente s-au scris (vechi id_vanzare=' + ; + TRANSFORM(lnIdVechi) + ' nou id_vanzare=' + TRANSFORM(lnIdNou) + ')' + LOOP + ENDIF + + DO Assert WITH lnTipIncVechi = lnTipIncNou, '[tip=' + TRANSFORM(lnTip) + '] VANZARI.TIP_INCASAT identic (vechi=' + ; + TRANSFORM(lnTipIncVechi) + ' nou=' + TRANSFORM(lnTipIncNou) + ')' + DO Assert WITH ABS(lnSumaVechi - lnSumaNou) < 0.005, '[tip=' + TRANSFORM(lnTip) + '] VANZARI.SUMA_INCASAT identica (vechi=' + ; + TRANSFORM(lnSumaVechi) + ' nou=' + TRANSFORM(lnSumaNou) + ')' + DO Assert WITH ALLTRIM(lcSerieVechi) == ALLTRIM(lcSerieNou), '[tip=' + TRANSFORM(lnTip) + '] VANZARI.SERIE_INCASAT identica (vechi=[' + ; + ALLTRIM(lcSerieVechi) + '] nou=[' + ALLTRIM(lcSerieNou) + '])' + ENDFOR +ENDPROC + +*================================================================================== +* CreeazaDocumentIncasare: emite un document REAL prin fluxul de productie (tnTip=22, cursor_preturi, +* client RAJA id_part=463), aplicand tipul de incasare cerut pe formularul indicat. Intoarce +* poDate.nid_vanzare (>0 succes) sau 0 (esec, detaliat in log). gnNrIncasareCapturat e umplut cu +* poDate.nr_incasare chiar inainte de do_termin() - marimea persistata se verifica fata de asta. +FUNCTION CreeazaDocumentIncasare + LPARAMETERS tnTipIncasare, tlFormNou + + PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest + LOCAL lnIdSet, lcSqlCursor, lcCursor, lnSucces, lnIdVanzareRezultat, tnTip, tnIdClient, tnIdDelegat + LOCAL lcSerieAlocata, lnNractAlocat + lnIdVanzareRezultat = 0 + lcSerieAlocata = '' + lnNractAlocat = 0 + gnNrIncasareCapturat = 0 + *-- FORMA VECHE: tnTip=22 (AVIZ din lista de preturi) - calea PROVENITA, curata, fara efecte + *-- secundare (nu intra pe ramura "comanda" din do_scrie_factura). opt_incasat traieste pe + *-- frm_alte_date (clasa separata), deci nu are restrictia Between(poDate.tip,1,4). + *-- FORMA NOUA: are nevoie de tnTip Between(1,4) ca opt_incasat sa existe inline pe formular + *-- (ofacturare.vc2:21066) - singurele din acel interval cu date reale in cursor_preturi sunt + *-- 3/4 (probe_emitere_reala.prg), dar tnTip=3 declanseaza un MESSAGEBOX_FORM real necunoscut + *-- mock-ului ("Doriti sa se inchida comanda?") si formularul nou insusi agata la CREATEOBJECT + *-- pe coloana Gestiune a grd_factura (vezi raport) - BLOCAT, nerezolvat in aceasta sesiune. + tnTip = IIF(tlFormNou, 3, 22) + tnIdClient = 463 + tnIdDelegat = 256 + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + + lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10 + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + + IF !tlFormNou + poDate.nIdTipDoc = 6 && AVIZ - plaja globala, dovedit (id_vanzare 1061/1062/1063) + ENDIF + + gnIdUtil = 8 + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + + poDate.id_client = tnIdClient + poDate.id_delegat = tnIdDelegat + poDate.zi_curs = {^2026-08-10} + + IF poDate.rezultat_serii = 3 + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + ENDIF + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + gnIdUtil = -3 + lcSerieAlocata = ALLTRIM(TRANSFORM(NVL(poDate.serie_act, []))) + lnNractAlocat = poDate.nract + DO S3bLog WITH ' poDate.nract=' + TRANSFORM(poDate.nract) + ' serie_act=[' + TRANSFORM(NVL(poDate.serie_act,[])) + ']' + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + lcSqlCursor = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + [?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + + lcCursor = [crsarticole] + lnSucces = goExecutor.oExecute(lcSqlCursor, lcCursor) + IF lnSucces < 0 + DO S3bLog WITH ' EROARE cursor articole: ' + goExecutor.oPrelucrareEroare() + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO S3bCurataJtva + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + RETURN 0 + ENDIF + + IF RECCOUNT(lcCursor) = 0 + DO S3bLog WITH ' Nu exista articole (Reccount=0) - abandon document' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO S3bCurataJtva + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + RETURN 0 + ENDIF + DO S3bLog WITH ' crsarticole Reccount=' + TRANSFORM(RECCOUNT(lcCursor)) + + *-- Lista de preturi a articolului e in EURO (tip_valuta=1), iar do_scrie_articole + *-- trimite pe ramura aceea vpretftva, derivat din pret_val - fortand doar pret, + *-- documentul iesea cu VANZARI_DETALII.PRET=0. Se forteaza perechea, coerent cu cursul. + SELECT (lcCursor) + REPLACE ALL cantitate WITH 1, ; + pret_val WITH IIF(tip_valuta = 1, 100, 0), ; + pret WITH IIF(tip_valuta = 1, ROUND(100 * IIF(NVL(curs, 0) = 0, 1, curs) / IIF(NVL(multiplicator, 0) = 0, 1, multiplicator), gnPPretV), 100) + =TABLEUPDATE(.T., .T., lcCursor) + GO TOP + + creeaza_facturacrs([crsfactura]) + + IF poDate.in_valuta = 1 + SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM (lcCursor) WITH (Buffering = .T.) WHERE tip_valuta = 1 ORDER BY nume_val INTO CURSOR crscursuri + SELECT crscursuri + poDate.Curs = Curs + poDate.multiplicator = multiplicator + ELSE + citeste_cursuri_zi(poDate.zi_curs) + IF RECCOUNT('crscursuri') = 0 + USE IN crscursuri + ENDIF + ENDIF + + IF TYPE(lcCursor + '.nume_lista_preturi') <> 'U' + CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100)) + SELECT crspolitici + INSERT INTO crspolitici(id_pol, nume_lista_preturi) VALUES (-9999, '') + INSERT INTO crspolitici(id_pol, nume_lista_preturi) ; + SELECT DISTINCT id_pol, nume_lista_preturi FROM (lcCursor) ORDER BY nume_lista_preturi + ENDIF + + *-- formularul, modeless (apel direct de metode) - vechi sau unificat, dupa tlFormNou + PUBLIC goFrmS3b + IF tlFormNou + goFrmS3b = CREATEOBJECT('frm_facturare_articole2') + ELSE + goFrmS3b = CREATEOBJECT('frm_facturare_articole') + ENDIF + DO S3bLog WITH ' CREATEOBJECT OK, VARTYPE=' + VARTYPE(goFrmS3b) + goFrmS3b.WindowType = 0 + DO S3bLog WITH ' WindowType=0 OK' + goFrmS3b.Show() + DO S3bLog WITH ' Show() OK' + DOEVENTS FORCE + DO S3bLog WITH ' formular afisat modeless (' + IIF(tlFormNou, 'NOU frm_facturare_articole2', 'VECHI frm_facturare_articole') + ')' + + goFrmS3b.do_adauga_tot() + DOEVENTS FORCE + DO S3bLog WITH ' do_adauga_tot() -> Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + + goFrmS3b.do_calculeaza_totaluri() + DOEVENTS FORCE + + *-- CONT_VENIT asteptat, derivat exact ca in do_scrie_articole (ofacturare.vc2:14279), citit + *-- direct din randul crsfactura pe care do_scrie_articole il va scana + LOCAL lcExpContVenit, lnExpIdPol, lnExpIdArticol, lcExpCont, loExecutorReal + SELECT crsfactura + GO TOP + lnExpIdPol = crsfactura.id_pol + lnExpIdArticol = crsfactura.id_articol + lcExpCont = crsfactura.Cont + lcExpContVenit = IIF(EMPTY(NVL(lnExpIdPol, 0)), deriva_cont_venit_fara_pol(lnExpIdArticol, lcExpCont), '') + + *-- spion pe goExecutor (tehnica SpyS13, probe_s13_toomanycolumns.prg): captureaza SQL-ul real + *-- trimis de do_scrie_articole, fara sa-i schimbe comportamentul (DODEFAULT pe PCOUNT) + loExecutorReal = goExecutor + goExecutor = CREATEOBJECT('SpyContVenit') + goExecutor.nHandle = gnHandle + + LOCAL lnScris + IF tlFormNou + *-- opt_incasat e inline pe formular - fara al doilea modal + goFrmS3b.seteaza_mod_incasare(tnTipIncasare) + gnNrIncasareCapturat = poDate.nr_incasare + DO S3bLog WITH ' opt_incasat.Value=' + TRANSFORM(tnTipIncasare) + ' -> poDate.nr_incasare=' + TRANSFORM(gnNrIncasareCapturat) + ; + ' incasat=' + TRANSFORM(poDate.incasat) + ' incasatCARD=' + TRANSFORM(poDate.incasatCARD) + lnScris = goFrmS3b.do_termin() + ELSE + *-- calea veche: al doilea modal (frm_alte_date) e condus de goDriverAD/tmrDrvAD + glDlgTratatAD = .F. + gnTipIncasareCerut = tnTipIncasare + lnScris = goFrmS3b.do_termin() + LOCAL lnWait + lnWait = 0 + DO WHILE !glDlgTratatAD AND lnWait < 10 + DOEVENTS FORCE + lnWait = lnWait + 1 + ENDDO + ENDIF + DO S3bLog WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare,0)) + + *-- restaureaza goExecutor real si verifica CONT_VENIT trimis de do_scrie_articole + LOCAL lcActualContVenit, lcEticheta + lcEticheta = '[' + IIF(tlFormNou,'nou','vechi') + ' tip=' + TRANSFORM(tnTipIncasare) + ']' + DO Assert WITH goExecutor.cLastArtCall # '', ; + lcEticheta + ' do_scrie_articole a trimis adauga_articol_factura (spion pe goExecutor)' + IF goExecutor.cLastArtCall # '' + lcActualContVenit = ExtrageContVenit(goExecutor.cLastArtCall) + DO Assert WITH lcActualContVenit == lcExpContVenit, ; + lcEticheta + ' CONT_VENIT trimis de do_scrie_articole = [' + lcExpContVenit + '], obtinut [' + lcActualContVenit + ']' + ENDIF + goExecutor = loExecutorReal + + *-- do_termin() intoarce mereu .T. (_frm_base.vc2:363, DoDefault fara RETURN) si nid_vanzare + *-- ramane santinela la esec: singura dovada e randul din VANZARI, pe serie_act + nract. + lnIdVanzareRezultat = CdocGasesteIdVanzare(lcSerieAlocata, lnNractAlocat) + IF lnIdVanzareRezultat < 0 + lnIdVanzareRezultat = 0 + ENDIF + DO S3bLog WITH ' verificare in VANZARI pe ' + lcSerieAlocata + ' ' + TRANSFORM(lnNractAlocat) + ; + ' -> id_vanzare=' + TRANSFORM(lnIdVanzareRezultat) + + IF TYPE('goFrmS3b') = 'O' AND !ISNULL(goFrmS3b) + goFrmS3b.Release() + ENDIF + goFrmS3b = NULL + + IF USED('crspolitici') + USE IN crspolitici + ENDIF + IF USED('crscursuri') + USE IN crscursuri + ENDIF + IF USED('crsfactura') + USE IN crsfactura + ENDIF + IF USED('crsarticole') + USE IN crsarticole + ENDIF + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF USED('jtva_coloane_temp') + USE IN jtva_coloane_temp + ENDIF + + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + RETURN lnIdVanzareRezultat +ENDFUNC + +PROCEDURE S3bCurataJtva + IF USED('jtva_coloane') + USE IN jtva_coloane + ENDIF + IF USED('jtva_coloane_temp') + USE IN jtva_coloane_temp + ENDIF +ENDPROC + +*-- extrage parametrul 29 (CONT_VENIT) dintr-un apel capturat pack_facturare.adauga_articol_factura(...); +*-- pozitia 28 e mereu literalul NULL, deci pos29 e tot ce urmeaza dupa ultima virgula dinaintea "); end;" +FUNCTION ExtrageContVenit + LPARAMETERS tcSql + LOCAL lnEnd, lcParams, lnComma, lcPos29 + lnEnd = AT('); end;', tcSql) + IF lnEnd = 0 + RETURN '' + ENDIF + lcParams = LEFT(tcSql, lnEnd - 1) + lnComma = RAT(',', lcParams) + IF lnComma = 0 + RETURN '' + ENDIF + lcPos29 = SUBSTR(lcParams, lnComma + 1) + IF UPPER(lcPos29) == 'NULL' + RETURN '' + ENDIF + RETURN STRTRAN(lcPos29, "'", '') +ENDFUNC + +*================================================================================== +*-- SpyContVenit: subclasa a lui oexecutor (tehnica SpyS13 din probe_s13_toomanycolumns.prg) - +*-- logheaza in cLastArtCall statementul adauga_articol_factura, apoi executa normal prin +*-- DODEFAULT pe PCOUNT (fara sa schimbe comportamentul real) +DEFINE CLASS SpyContVenit AS oexecutor + cLastArtCall = '' + + PROCEDURE oExecute(tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect) + LOCAL lnPc, lcS, lnRet + lnPc = PCOUNT() + lcS = IIF(VARTYPE(m.tcSql) = 'C', m.tcSql, '') + IF 'adauga_articol_factura(' $ lcS + THIS.cLastArtCall = lcS + ENDIF + TRY + DO CASE + CASE lnPc <= 1 + lnRet = DODEFAULT(m.tcSql) + CASE lnPc = 2 + lnRet = DODEFAULT(m.tcSql, m.tcCursor) + CASE lnPc = 3 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress) + CASE lnPc = 4 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress) + CASE lnPc = 5 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle) + CASE lnPc = 6 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError) + CASE lnPc = 7 + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError) + OTHERWISE + lnRet = DODEFAULT(m.tcSql, m.tcCursor, m.tlProgress, m.tcTitluProgress, m.tnHandle, m.tlShowError, m.tlQuitOnError, m.tlReconnect) + ENDCASE + CATCH TO loExSpy + lnRet = -1 + THIS.cEroare = 'SpyContVenit: ' + TRANSFORM(loExSpy.Message) + ENDTRY + RETURN lnRet + ENDPROC +ENDDEFINE + +*================================================================================== +*-- driverAlteDateAD: cauta FRM_ALTE_DATE prin _SCREEN.Forms si ii seteaza opt_incasat.Value la +* gnTipIncasareCerut INAINTE de a-i chema .do_termin() - acelasi mecanism ca driverAlteDate8 din +* creeaza_documente_s8.prg, cu un singur adaos (selectia tipului de incasare). +DEFINE CLASS driverAlteDateAD AS Custom + PROCEDURE Executa + LOCAL lnI, loForm, llGasit, loMsgForm + llGasit = .F. + loMsgForm = NULL + FOR lnI = 1 TO _SCREEN.FormCount + LOCAL lcClasa + lcClasa = UPPER(_SCREEN.Forms(lnI).Class) + IF lcClasa == 'FRM_ALTE_DATE' + loForm = _SCREEN.Forms(lnI) + llGasit = .T. + ENDIF + IF 'MESSAGEBOX_FORM' $ lcClasa + loMsgForm = _SCREEN.Forms(lnI) + ENDIF + IF !(lcClasa $ gcClaseVazute) + gcClaseVazute = gcClaseVazute + lcClasa + ';' + DO S3bLog WITH ' [diag timer] forma noua vazuta: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' + ENDIF + ENDFOR + *-- confirmare reala neacoperita de mock_amessagebox (forma modala messagebox_form) - + *-- apasa automat cmdYes/cmdOk, ca in productie la raspuns implicit "Da" + IF !ISNULL(loMsgForm) + TRY + DO CASE + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) + DO S3bLog WITH ' [diag timer] messagebox_form: apas cmgBotones.cmdYes' + loMsgForm.cmgBotones.cmdYes.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) + DO S3bLog WITH ' [diag timer] messagebox_form: apas cmgBotones.cmdOk' + loMsgForm.cmgBotones.cmdOk.Click() + ENDCASE + CATCH TO loExcMsg + DO S3bLog WITH ' [diag timer] messagebox_form: CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message + ENDTRY + ENDIF + IF glDlgTratatAD OR !llGasit + RETURN + ENDIF + LOCAL loAC + loAC = loForm.ActiveControl + TRY + loForm.opt_incasat.Value = gnTipIncasareCerut + gnNrIncasareCapturat = poDate.nr_incasare + DO S3bLog WITH ' driverAlteDateAD: opt_incasat.Value=' + TRANSFORM(gnTipIncasareCerut) + ; + ' -> poDate.nr_incasare=' + TRANSFORM(gnNrIncasareCapturat) + ' incasat=' + TRANSFORM(poDate.incasat) + ; + ' incasatCARD=' + TRANSFORM(poDate.incasatCARD) + loForm.do_termin() + glDlgTratatAD = .T. + CATCH TO loExcDrv + DO S3bLog WITH ' driverAlteDateAD: CATCH ErrorNo=' + TRANSFORM(loExcDrv.ErrorNo) + ' Message=' + loExcDrv.Message + ; + ' Procedure=' + loExcDrv.Procedure + ' LineNo=' + TRANSFORM(loExcDrv.LineNo) + glDlgTratatAD = .T. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_unificat/test_s3b_emitere_reala.ps1 b/utile/Teste/facturare_unificat/test_s3b_emitere_reala.ps1 new file mode 100644 index 0000000..f93bd23 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3b_emitere_reala.ps1 @@ -0,0 +1,28 @@ +$ErrorActionPreference = 'Stop' +$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat' +$prg = Join-Path $dir 'test_s3b_emitere_reala.prg' +$log = Join-Path $dir 'out\test_s3b_emitere_reala.log' +$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' + +$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s3b_emitere_reala*' } +if ($viu) { + "Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua." + exit 1 +} + +Set-Location $dir +Remove-Item *.FXP, *.fxp -ErrorAction SilentlyContinue +Remove-Item $log -ErrorAction SilentlyContinue + +$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru +"lansat PID " + $p.Id +$null = $p.WaitForExit(300000) +if (-not $p.HasExited) { + "INCA RULEAZA dupa 300s - omor instanta (filtrat pe CommandLine)" + Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s3b_emitere_reala*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force } +} +if (Test-Path $log) { + Get-Content $log | Select-String -Pattern '^(PASS|FAIL|ERROR|TOTAL|START|END|=====| MAX| tip_incasat| vechi | nou |CATCH)' +} else { + "Log inexistent: $log" +} diff --git a/utile/Teste/facturare_unificat/test_s3b_incasare_nealocare.prg b/utile/Teste/facturare_unificat/test_s3b_incasare_nealocare.prg new file mode 100644 index 0000000..b35e9ec --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3b_incasare_nealocare.prg @@ -0,0 +1,323 @@ +* test_s3b_incasare_nealocare.prg +* Headless: un ciclu complet de bifare/debifare a casetelor "Alte date" si "Incasare" nu lasa +* alocat niciun numar de bon fiscal (3) / chitanta (16) / POS-Card (26), in ambele scenarii de +* start. Sub comutarea pe casete, bifarea "Incasare" ALOCA o chitanta si debifarea o dezaloca +* (ramura "fara incasare" din actualizeaza_tipincasare); invariantul e pe ciclul intreg, nu pe +* apelul individual. Scenariile de start: +* A - document nou (poDate.incasat = 0 la construire) +* B - document copiat cu incasare presetata (poDate.incasat <> 0 la construire, +* asta ALOCA deja chitanta la Init - comportament asteptat, nu un fail) +* Specificatie: docs\nota_s3b_testare.md sectiunea 1. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_incasare_nealocare.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_incasare_nealocare.log + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_incasare_nealocare.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) +gnFail = 0 +gnPass = 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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnScadereStoc = 0 +* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel - +* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist" +IF !USED('saft_tip_facturi') + update_saft_tip_facturi() +ENDIF + +DO Scenariu_A +DO Scenariu_B + +DO Final + +PROCEDURE Scenariu_A + * Document nou: poDate.incasat ramane 0 la construire - grupul de incasare nu aloca nimic + * la Init, iar togglingul repetat al celor doua acordeoane nu trebuie sa schimbe nimic. + PRIVATE poDate, poGeneratorNumere, loForm, i, lcInitial, lcCurent + DO AfLog WITH "=== Scenariul A: document nou (poDate.incasat = 0 la construire) ===" + poDate = CREATEOBJECT("oDateFactura", 25000, 1) + poDate.nIdTipDoc = 5 + poDate.totalctva = 1000 + DO AfLog WITH "A: poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + " poDate.incasat=" + TRANSFORM(poDate.incasat) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poGeneratorNumere.ResetNumere() + DO ProbaSerii WITH poDate.nIdTipDoc + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + DO Assert WITH poDate.incasat = 0, "A: poDate.incasat ramane 0 inainte de instantiere" + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "A: Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + DO Assert WITH ObjExists(loForm, 'opt_incasat'), "A: opt_incasat prezent (poDate.tip intre 1 si 4)" + + lcInitial = StareToate() + DO AfLog WITH "A: stare initiala dupa Createobject: " + lcInitial + DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), "A: nimic alocat la construire" + + FOR i = 1 TO 5 + loForm.chk_incasare.Value = 1 + loForm.do_comuta_incasare() + loForm.chk_incasare.Value = 0 + loForm.do_comuta_incasare() + ENDFOR + lcCurent = StareToate() + DO AfLog WITH "A: stare dupa 5x ciclu incasare (bifat+debifat): " + lcCurent + DO Assert WITH lcCurent == lcInitial, "A: neschimbat dupa 5x ciclu incasare (bifat+debifat)" + + FOR i = 1 TO 5 + loForm.chk_alte_date.Value = 1 + loForm.do_comuta_alte_date() + loForm.chk_alte_date.Value = 0 + loForm.do_comuta_alte_date() + ENDFOR + lcCurent = StareToate() + DO AfLog WITH "A: stare dupa 5x ciclu alte date (bifat+debifat): " + lcCurent + DO Assert WITH lcCurent == lcInitial, "A: neschimbat dupa 5x ciclu alte date (bifat+debifat)" + + FOR i = 1 TO 5 + loForm.chk_incasare.Value = 1 + loForm.do_comuta_incasare() + loForm.chk_alte_date.Value = 1 + loForm.do_comuta_alte_date() + loForm.chk_incasare.Value = 0 + loForm.do_comuta_incasare() + loForm.chk_alte_date.Value = 0 + loForm.do_comuta_alte_date() + ENDFOR + lcCurent = StareToate() + DO AfLog WITH "A: stare dupa 5x ciclu pe ambele casete: " + lcCurent + DO Assert WITH lcCurent == lcInitial, "A: neschimbat dupa 5x ciclu pe ambele casete" + + loForm.Release() + RELEASE loForm +ENDPROC + +PROCEDURE Scenariu_B + * Document copiat: poDate.incasat <> 0 la construire - Init aloca deja chitanta (16), + * asta e comportamentul ASTEPTAT (nu un fail). Assertul e ca togglingul repetat NU + * mai schimba nimic fata de starea de dupa construire, si ca la final curatenia + * (opt_incasat.Value = 1) dezaloca explicit tot ce a fost alocat. + PRIVATE poDate, poGeneratorNumere, loForm, i, lcDupaConstruire, lcCurent + DO AfLog WITH "=== Scenariul B: document copiat (poDate.incasat <> 0 la construire) ===" + poDate = CREATEOBJECT("oDateFactura", 25000, 1) + poDate.nIdTipDoc = 5 + poDate.totalctva = 1000 + poDate.incasat = 100 + DO AfLog WITH "B: poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + " poDate.incasat inainte de Createobject=" + TRANSFORM(poDate.incasat) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poGeneratorNumere.ResetNumere() + DO ProbaSerii WITH poDate.nIdTipDoc + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + DO AfLog WITH "B: stare numere inainte de Createobject: " + StareToate() + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "B: Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + DO AfLog WITH "B: poDate.incasat dupa Init=" + TRANSFORM(poDate.incasat) + " (asteptat = poDate.totalctva)" + DO Assert WITH loForm.ct_incasare.opt_incasat.Value = 1, "B: opt_incasat.Value=1 (chitanta) la construire (poDate.incasat era <> 0)" + DO Assert WITH loForm.chk_incasare.Value = 1, "B: caseta Incasare bifata de seteaza_mod_incasare(2) la construire" + DO Assert WITH loForm.nmod_incasare() = 2, "B: nmod_incasare()=2 (chitanta) la construire" + lcDupaConstruire = StareToate() + DO AfLog WITH "B: stare numere dupa construire: " + lcDupaConstruire + DO Assert WITH EsteAlocat(16) AND !EsteAlocat(3) AND !EsteAlocat(26), "B: doar chitanta (16) alocata la construire, nu si bonul/POS-ul" + + FOR i = 1 TO 5 + loForm.chk_incasare.Value = 0 + loForm.do_comuta_incasare() + loForm.chk_incasare.Value = 1 + loForm.do_comuta_incasare() + ENDFOR + lcCurent = StareToate() + DO AfLog WITH "B: stare dupa 5x ciclu incasare (debifat+bifat): " + lcCurent + DO Assert WITH lcCurent == lcDupaConstruire, "B: neschimbat dupa 5x ciclu incasare (debifat+bifat)" + + FOR i = 1 TO 5 + loForm.chk_alte_date.Value = 1 + loForm.do_comuta_alte_date() + loForm.chk_alte_date.Value = 0 + loForm.do_comuta_alte_date() + ENDFOR + lcCurent = StareToate() + DO AfLog WITH "B: stare dupa 5x ciclu alte date (bifat+debifat): " + lcCurent + DO Assert WITH lcCurent == lcDupaConstruire, "B: neschimbat dupa 5x ciclu alte date (bifat+debifat)" + + FOR i = 1 TO 5 + loForm.chk_incasare.Value = 0 + loForm.do_comuta_incasare() + loForm.chk_alte_date.Value = 1 + loForm.do_comuta_alte_date() + loForm.chk_incasare.Value = 1 + loForm.do_comuta_incasare() + loForm.chk_alte_date.Value = 0 + loForm.do_comuta_alte_date() + ENDFOR + lcCurent = StareToate() + DO AfLog WITH "B: stare dupa 5x ciclu pe ambele casete: " + lcCurent + DO Assert WITH lcCurent == lcDupaConstruire, "B: neschimbat dupa 5x ciclu pe ambele casete" + + * Curatenie obligatorie inainte de Release - altfel ramane un numar real alocat in MARIUSM_AUTO. + * "Fara incasare" e acum caseta debifata: opt_incasat.Value=1 inseamna chitanta, nu golire. + loForm.chk_incasare.Value = 0 + loForm.do_comuta_incasare() + DO Assert WITH loForm.nmod_incasare() = 1, "B: nmod_incasare()=1 dupa debifarea casetei" + lcCurent = StareToate() + DO AfLog WITH "B: stare numere dupa curatenie (chk_incasare=0): " + lcCurent + DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), "B: toate trei numerele dezalocate dupa curatenie" + + loForm.Release() + RELEASE loForm +ENDPROC + +FUNCTION EsteAlocat + * .T. daca tipul tnTip are un numar alocat, in oricare din cele doua reprezentari + * (array paPlaje(tip,1) fara buffer, sau cursorul paPlaje(tip,8) cu buffer) + LPARAMETERS tnTip + LOCAL lcCursor + IF poGeneratorNumere.paPlaje(tnTip, 6) + lcCursor = poGeneratorNumere.paPlaje(tnTip, 8) + IF EMPTY(NVL(lcCursor, [])) OR !USED(lcCursor) + RETURN .F. + ENDIF + RETURN RECCOUNT(lcCursor) > 0 + ELSE + RETURN poGeneratorNumere.paPlaje(tnTip, 1) <> 0 + ENDIF +ENDFUNC + +FUNCTION StareNumar + * reprezentare textuala a starii unui tip, pentru comparatie exacta inainte/dupa + LPARAMETERS tnTip + LOCAL lcCursor, lnCount + IF poGeneratorNumere.paPlaje(tnTip, 6) + lcCursor = poGeneratorNumere.paPlaje(tnTip, 8) + IF EMPTY(NVL(lcCursor, [])) OR !USED(lcCursor) + lnCount = 0 + ELSE + lnCount = RECCOUNT(lcCursor) + ENDIF + RETURN "buffer:" + TRANSFORM(lnCount) + ELSE + RETURN "array:" + TRANSFORM(poGeneratorNumere.paPlaje(tnTip, 1)) + ENDIF +ENDFUNC + +FUNCTION StareToate + RETURN "3=" + StareNumar(3) + "|16=" + StareNumar(16) + "|26=" + StareNumar(26) +ENDFUNC + +PROCEDURE ProbaSerii + * apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor + * ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului + LPARAMETERS tnIdTipDoc + LOCAL lnOk, laErr[1], i, lcSql + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + FOR i = 1 TO 3 + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii") + IF lnOk > 0 + DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii")) + USE IN (SELECT("crsprobaserii")) + EXIT + ELSE + AERROR(laErr) + DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5]) + ENDIF + ENDFOR +ENDPROC + +FUNCTION ObjExists + * prezenta reala in colectia Objects: dupa RemoveObject, PEMSTATUS(...,5) si TYPE() raman .T./'O' + * Cautarea e RECURSIVA: dupa S7 controalele de sub grila stau in containerele ct_*, nu la + * nivel de formular, iar o cautare plata ar raporta tacut "lipseste". + LPARAMETERS toContainer, tcName + LOCAL i, loO + FOR i = 1 TO toContainer.Objects.Count + loO = toContainer.Objects(i) + IF UPPER(loO.Name) == UPPER(tcName) + RETURN .T. + ENDIF + IF TYPE('loO.Objects.Count') = 'N' + IF ObjExists(loO, tcName) + RETURN .T. + ENDIF + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO AfLog WITH "PASS: " + tcMsg + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL: " + tcMsg + ENDIF +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3b_incasare_paritate_campuri.prg b/utile/Teste/facturare_unificat/test_s3b_incasare_paritate_campuri.prg new file mode 100644 index 0000000..55ad7b8 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3b_incasare_paritate_campuri.prg @@ -0,0 +1,312 @@ +* test_s3b_incasare_paritate_campuri.prg +* Headless: pentru fiecare din cele patru tipuri de incasare (1=Fara incasare, 2=Chitanta, +* 3=Bon fiscal, 4=POS Card), formularul nou (frm_facturare_articole2) aduce poDate in aceeasi +* stare ca dialogul vechi (frm_alte_date) - fara sa treaca prin do_scrie_factura/Termina, deci +* fara sa scrie nimic in Oracle si fara sa emita niciun document. +* Specificatie: docs\nota_s3b_testare.md sectiunea 2b. Nu acopera lcListaIncasare/do_scrie_factura +* insusi (ar cere emitere reala sau un mock detaliat pe goExecutor - vezi sectiunea 2a/2b, ultimul +* paragraf) - asta ramane proba manuala a lui Marius, cerut si de raport_s3b_incasare.md sectiunea 10. +* +* ATENTIE la citirea rezultatelor: din cele cinci campuri cerute de specificatie (poDate.incasat, +* incasatCARD, incasatTichete, id_casa, ntip_incasare), doar poDate.incasat si poDate.id_casa sunt +* scrise efectiv de actualizeaza_tipincasare()/Init - verificat pe cod (ofacturare.vc2, ferestre_ +* cere_date.vc2). incasatCARD, incasatTichete si ntip_incasare sunt scrise abia in Termina / +* inainte_de_do_termin (calea care emite, exclusa explicit din acest test - sectiunea 2a). Pentru +* aceste trei campuri parizatea verificata aici e reala, dar putin adanca: confirma doar ca NICIUNA +* din cele doua cai nu le atinge la simplul toggle al opt_incasat (raman la valoarea implicita 0 pe +* ambele cai), nu ca Termina le populeaza identic pe ambele cai. +* +* SECVENTIAL, nu simultan: frm_alte_date e creata, testata pe toate cele patru tipuri si eliberata +* COMPLET inainte sa existe frm_facturare_articole2 - niciodata doua forme vii in acelasi timp. +* Motiv: ambele forme au propriul cboTipFactura cu RowSource IDENTIC ("...into cursor cTipFacturaX", +* ofacturare.vc2:16157 si ferestre_cere_date.vc2:2388), reevaluat la fiecare apel al lui +* actualizeaza_tipincasare() (Thisform.cboTipFactura.Refresh(), prima linie a metodei pe ambele +* forme); cu ambele vii simultan in aceeasi sesiune de date (fara DataSession propriu), doua +* comboboxuri concureaza pe acelasi nume de cursor - suspectat ca varianta paralela (rulata de patru +* ori, toate agatate in acelasi punct) bloca aici, la nivel de tabel, fara sa arunce o exceptie +* catchabila prin ON ERROR. Nota cerea "acelasi poDate", nu simultaneitate - pastrata aici prin +* pastrarea aceluiasi obiect poDate intre cele doua faze, cu cele cinci campuri resetate explicit +* la starea de start intre faze (ca a doua forma sa porneasca de la aceeasi stare ca prima). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_incasare_paritate_campuri.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_incasare_paritate_campuri.log + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_incasare_paritate_campuri.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) +gnFail = 0 +gnPass = 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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnScadereStoc = 0 +gnIdUtil = 8 +* aliniaza sucursala cu singura plaja POS/card existenta, evita blocajul Oracle pe cursor OUT +gnIdSucursala = 167 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE - +* necesar pentru frm_facturare_articole2 (frm_alte_date nu are grid, dar SET-urile sunt ADDITIVE) +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +DO ProbaParitate + +DO Final + +PROCEDURE ProbaParitate + * VARIANTA SECVENTIALA (23.08.2026): nota cerea "acelasi poDate", nu "ambele forme vii in + * acelasi timp" - simultaneitatea era detaliu de implementare, nu cerinta (confirmat de + * team-lead). Motivul schimbarii: frm_alte_date SI frm_facturare_articole2 au fiecare propriul + * cboTipFactura, cu RowSource IDENTIC ("select tip_saftname, cod from saft_tip_facturi into + * cursor cTipFacturaX" - ofacturare.vc2:16157, ferestre_cere_date.vc2:2388), refacut la fiecare + * apel al lui actualizeaza_tipincasare() (Thisform.cboTipFactura.Refresh(), prima linie a + * metodei pe ambele forme). Cu ambele forme vii simultan, in aceeasi sesiune de date (fara + * DataSession propriu pe niciuna), doua comboboxuri concureaza pe acelasi nume de cursor tinta - + * suspiciunea unei asteptari de lacat la nivel de tabel, care nu trece prin ON ERROR (nu e o + * exceptie aruncata). Aici: loVechi e creata, testata COMPLET si eliberata inainte sa existe + * loNou - niciodata doua forme vii simultan. + * + * poDate ramane ACELASI obiect intre cele doua faze (nu se recreeaza) - dar cele cinci campuri + * se retin la start si se restaureaza explicit intre faze, ca a doua forma sa porneasca de la + * aceeasi stare ca prima, nu de la ce a lasat prima in urma. + PRIVATE poDate, poGeneratorNumere, loVechi, loNou, i + LOCAL laTip[4], laNume[4], laRezVechi[4,5] + laTip[1] = 1 + laTip[2] = 2 + laTip[3] = 3 + laTip[4] = 4 + laNume[1] = "Fara incasare" + laNume[2] = "Chitanta" + laNume[3] = "Bon fiscal" + laNume[4] = "POS Card" + + poDate = CREATEOBJECT("oDateFactura", 25000, 1) + poDate.nIdTipDoc = 5 + poDate.totalctva = 1000 + DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + " poDate.incasat=" + TRANSFORM(poDate.incasat) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poGeneratorNumere.ResetNumere() + DO ProbaSerii WITH poDate.nIdTipDoc + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + + * starea de start a celor cinci campuri, INAINTE de orice forma - se restaureaza intre faze + LOCAL lnStartIncasat, lnStartCard, lnStartTichete, lnStartCasa, lnStartTipInc + lnStartIncasat = poDate.incasat + lnStartCard = poDate.incasatCARD + lnStartTichete = poDate.incasatTichete + lnStartCasa = poDate.id_casa + lnStartTipInc = poDate.ntip_incasare + DO AfLog WITH "stare start poDate: incasat=" + TRANSFORM(lnStartIncasat) + " incasatCARD=" + TRANSFORM(lnStartCard) + ; + " incasatTichete=" + TRANSFORM(lnStartTichete) + " id_casa=" + TRANSFORM(lnStartCasa) + " ntip_incasare=" + TRANSFORM(lnStartTipInc) + + LOCAL lnTip, lcNumeTip + + * ---------- FAZA 1: doar frm_alte_date (calea veche), complet, apoi Release() ---------- + DO AsiguraSaftTipFacturi + DO AfLog WITH "inainte de Createobject frm_alte_date: USED('saft_tip_facturi')=" + TRANSFORM(USED('saft_tip_facturi')) + ; + " USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX')) + loVechi = CREATEOBJECT('frm_alte_date') + DO Assert WITH VARTYPE(loVechi) = 'O', "Createobject frm_alte_date (calea veche)" + IF VARTYPE(loVechi) <> 'O' + RETURN + ENDIF + loVechi.Visible = .F. + DO AfLog WITH "dupa Createobject frm_alte_date: USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX')) + + FOR i = 1 TO 4 + lnTip = laTip[i] + lcNumeTip = laNume[i] + DO AfLog WITH "vechi [" + lcNumeTip + "]: inainte de opt_incasat.Value=, USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX')) + loVechi.opt_incasat.Value = lnTip + DO AfLog WITH "vechi [" + lcNumeTip + "]: dupa opt_incasat.Value=, USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX')) + laRezVechi[i,1] = poDate.incasat + laRezVechi[i,2] = poDate.incasatCARD + laRezVechi[i,3] = poDate.incasatTichete + laRezVechi[i,4] = poDate.id_casa + laRezVechi[i,5] = poDate.ntip_incasare + DO AfLog WITH "vechi [" + lcNumeTip + "]: incasat=" + TRANSFORM(laRezVechi[i,1]) + " incasatCARD=" + TRANSFORM(laRezVechi[i,2]) + ; + " incasatTichete=" + TRANSFORM(laRezVechi[i,3]) + " id_casa=" + TRANSFORM(laRezVechi[i,4]) + " ntip_incasare=" + TRANSFORM(laRezVechi[i,5]) + DO AfLog WITH "vechi [" + lcNumeTip + "]: stare numere=" + StareToate() + loVechi.opt_incasat.Value = 1 + DO AfLog WITH "vechi [" + lcNumeTip + "]: dezalocat, stare numere=" + StareToate() + ENDFOR + + loVechi.Release() + RELEASE loVechi + DO AfLog WITH "dupa Release loVechi: USED('saft_tip_facturi')=" + TRANSFORM(USED('saft_tip_facturi')) + ; + " USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX')) + + * readuce poDate la starea de start, ca a doua forma sa porneasca identic cu prima + poDate.incasat = lnStartIncasat + poDate.incasatCARD = lnStartCard + poDate.incasatTichete = lnStartTichete + poDate.id_casa = lnStartCasa + poDate.ntip_incasare = lnStartTipInc + DO AfLog WITH "poDate resetat inainte de a doua forma: incasat=" + TRANSFORM(poDate.incasat) + " id_casa=" + TRANSFORM(poDate.id_casa) + + * ---------- FAZA 2: doar frm_facturare_articole2 (calea noua) ---------- + DO AsiguraSaftTipFacturi + DO AfLog WITH "inainte de Createobject frm_facturare_articole2: USED('saft_tip_facturi')=" + TRANSFORM(USED('saft_tip_facturi')) + ; + " USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX')) + loNou = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loNou) = 'O', "Createobject frm_facturare_articole2 (calea noua)" + IF VARTYPE(loNou) <> 'O' + RETURN + ENDIF + loNou.Visible = .F. + DO AfLog WITH "dupa Createobject frm_facturare_articole2: USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX')) + + FOR i = 1 TO 4 + lnTip = laTip[i] + lcNumeTip = laNume[i] + DO AfLog WITH "nou [" + lcNumeTip + "]: inainte de opt_incasat.Value=, USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX')) + loNou.seteaza_mod_incasare(lnTip) + DO Assert WITH loNou.nmod_incasare() = lnTip, "[" + lcNumeTip + "] nmod_incasare() reflecta seteaza_mod_incasare(" + TRANSFORM(lnTip) + ")" + DO AfLog WITH "nou [" + lcNumeTip + "]: dupa opt_incasat.Value=, USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX')) + DO AfLog WITH "nou [" + lcNumeTip + "]: incasat=" + TRANSFORM(poDate.incasat) + " incasatCARD=" + TRANSFORM(poDate.incasatCARD) + ; + " incasatTichete=" + TRANSFORM(poDate.incasatTichete) + " id_casa=" + TRANSFORM(poDate.id_casa) + " ntip_incasare=" + TRANSFORM(poDate.ntip_incasare) + DO Assert WITH poDate.incasat = laRezVechi[i,1], "[" + lcNumeTip + "] poDate.incasat identic (vechi=" + TRANSFORM(laRezVechi[i,1]) + " nou=" + TRANSFORM(poDate.incasat) + ")" + DO Assert WITH poDate.incasatCARD = laRezVechi[i,2], "[" + lcNumeTip + "] poDate.incasatCARD identic" + DO Assert WITH poDate.incasatTichete = laRezVechi[i,3], "[" + lcNumeTip + "] poDate.incasatTichete identic" + DO Assert WITH poDate.id_casa = laRezVechi[i,4], "[" + lcNumeTip + "] poDate.id_casa identic" + DO Assert WITH poDate.ntip_incasare = laRezVechi[i,5], "[" + lcNumeTip + "] poDate.ntip_incasare identic" + + loNou.seteaza_mod_incasare(1) + DO Assert WITH loNou.nmod_incasare() = 1, "[" + lcNumeTip + "] nmod_incasare() reflecta seteaza_mod_incasare(1) (dezalocare)" + DO AfLog WITH "nou [" + lcNumeTip + "]: dezalocat, stare numere=" + StareToate() + ENDFOR + + DO AfLog WITH "stare finala numere (asteptat nimic alocat): " + StareToate() + DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), "nimic ramas alocat la finalul rularii" + + loNou.Release() + RELEASE loNou + DO AfLog WITH "dupa Release loNou: USED('saft_tip_facturi')=" + TRANSFORM(USED('saft_tip_facturi')) + ; + " USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX')) +ENDPROC + +PROCEDURE AsiguraSaftTipFacturi + * cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel la + * instantiere (ofacturare.vc2:16157 - frm_facturare_articole2, ferestre_cere_date.vc2:2388 - + * frm_alte_date). Structura copiata din update_saft_tip_facturi (updateserver.prg:669-691), + * fara apel la server - cursor local, dummy, cu randul gol si indexul pe cod ca in original. + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF +ENDPROC + +FUNCTION EsteAlocat + LPARAMETERS tnTip + LOCAL lcCursor + IF poGeneratorNumere.paPlaje(tnTip, 6) + lcCursor = poGeneratorNumere.paPlaje(tnTip, 8) + IF EMPTY(NVL(lcCursor, [])) OR !USED(lcCursor) + RETURN .F. + ENDIF + RETURN RECCOUNT(lcCursor) > 0 + ELSE + RETURN poGeneratorNumere.paPlaje(tnTip, 1) <> 0 + ENDIF +ENDFUNC + +FUNCTION StareNumar + LPARAMETERS tnTip + LOCAL lcCursor, lnCount + IF poGeneratorNumere.paPlaje(tnTip, 6) + lcCursor = poGeneratorNumere.paPlaje(tnTip, 8) + IF EMPTY(NVL(lcCursor, [])) OR !USED(lcCursor) + lnCount = 0 + ELSE + lnCount = RECCOUNT(lcCursor) + ENDIF + RETURN "buffer:" + TRANSFORM(lnCount) + ELSE + RETURN "array:" + TRANSFORM(poGeneratorNumere.paPlaje(tnTip, 1)) + ENDIF +ENDFUNC + +FUNCTION StareToate + RETURN "3=" + StareNumar(3) + "|16=" + StareNumar(16) + "|26=" + StareNumar(26) +ENDFUNC + +PROCEDURE ProbaSerii + LPARAMETERS tnIdTipDoc + LOCAL lnOk, laErr[1], i, lcSql + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + FOR i = 1 TO 3 + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii") + IF lnOk > 0 + DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii")) + USE IN (SELECT("crsprobaserii")) + EXIT + ELSE + AERROR(laErr) + DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5]) + ENDIF + ENDFOR +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO AfLog WITH "PASS: " + tcMsg + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL: " + tcMsg + ENDIF +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3b_paritate_emitere.prg b/utile/Teste/facturare_unificat/test_s3b_paritate_emitere.prg new file mode 100644 index 0000000..06f1664 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3b_paritate_emitere.prg @@ -0,0 +1,590 @@ +* test_s3b_paritate_emitere.prg +* Headless: criteriul 1 de "gata" din docs\cercetare\s3b_alte_date_analitice.md sectiunea 10 - +* paritate de EMITERE intre calea veche (frm_alte_date, dialogul modal creat de +* frm_facturare_articole.inainte_de_do_termin, ofacturare.vc2:14923) si formularul unificat +* (frm_facturare_articole2, care are grupul de incasare inline), pe toate patru tipurile de +* incasare: 1=Fara incasare, 2=Chitanta, 3=Bon fiscal, 4=POS Card. +* +* Se compara doua marimi, cerute explicit de criteriu: +* (a) numarul alocat -> poDate.nr_incasare, scris de actualizeaza_tipincasare (ramurile 1/2: +* nr_incasare=0; ramura 3: do_aloca_nr_bon; ramura 4: do_aloca_nr_pos) si de ControlSource-ul +* clb_nrchit.text_simplu1 ("poDate.nr_incasare", ofacturare.vc2:16558 / +* ferestre_cere_date.vc2:2490); +* (b) lcListaIncasare - stringul asamblat in do_scrie_factura inainte de scrie_factura2 +* (ofacturare.vc2:14227-14253 pentru calea veche, 19967-19993 pentru cea noua). +* +* De ce lcListaIncasare se calculeaza cu o REPLICA, nu prin apelul codului real: +* lcListaIncasare e o variabila LOCAL in do_scrie_factura, iar do_scrie_factura EMITE documentul +* (scrie in Oracle). Testul nu are voie sa emita. In loc de asta: +* - blocul de asamblare din cele doua do_scrie_factura e comparat CA TEXT, in test, si trebuie sa +* fie identic (assert dedicat); +* - replica din acest fisier (intre marcajele REPLICA-LISTA) e comparata CA TEXT cu blocul din +* sursa, dupa normalizare (fara comentarii && , fara spatii de indentare, fara linii goale) - +* assert dedicat. Daca sursa se schimba si replica nu, testul cade. +* La fel pentru pasul de emitere dinaintea lui do_scrie_factura: poDate.ntip_incasare se calculeaza +* din opt_incasat.Value cu aceeasi expresie pe ambele cai (ferestre_cere_date.vc2:3067 in +* frm_alte_date.inainte_de_do_termin, ofacturare.vc2:20673 in +* frm_facturare_articole2.inainte_de_do_termin) - cele doua linii sunt comparate ca text. +* Comutarea POS (incasatCARD = incasat; incasat = 0) e ferestre_cere_date.vc2:3100-3104 respectiv +* ofacturare.vc2:20680-20683 - aceleasi doua atribuiri, sub garzi echivalente (plReturn / gnButon). +* +* SECVENTIAL, nu simultan: frm_alte_date e creata, parcursa pe toate patru tipurile si eliberata +* COMPLET inainte sa existe frm_facturare_articole2. Ambele forme au propriul cboTipFactura cu +* RowSource identic ("... into cursor cTipFacturaX", ofacturare.vc2:16157 si +* ferestre_cere_date.vc2:2388), reevaluat la fiecare actualizeaza_tipincasare - doua forme vii +* simultan se bat pe acelasi nume de cursor. Acelasi poDate pentru ambele faze, cu starea +* restaurata explicit intre faze. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_paritate_emitere.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_paritate_emitere.log + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gcSursaNou, gcSursaVechi, gcAcestFisier, glPOSDisponibil +glPOSDisponibil = .F. +gcAcestFisier = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_paritate_emitere.prg" +gcSursaNou = "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2" +gcSursaVechi = "D:\ROA\ROAFACTURARE\COMUN\clase\ferestre_cere_date.vc2" +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3b_paritate_emitere.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) +gnFail = 0 +gnPass = 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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnScadereStoc = 0 +gnIdUtil = 8 +* singura plaja pentru tipul 26 e legata de sucursala 167; mediul lasa gnIdSucursala pe 110 (sau +* null), iar filtrul NVL(id_sucursala,-99) IN (v_id_sucursala,-99) din pack_serii_numere nu o prinde +gnIdSucursala = 167 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + " gnPc=" + TRANSFORM(gnPc) + ; + " gnIdUtil=" + TRANSFORM(gnIdUtil) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala) + +* fara asta, un lacat pe plajele de serii blocheaza rularea la infinit, invizibil in log +SQLSETPROP(gnHandle, "QueryTimeOut", 45) +IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle + SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45) +ENDIF +DO AfLog WITH "QueryTimeOut gnHandle=" + TRANSFORM(SQLGETPROP(gnHandle, "QueryTimeOut")) + ; + " goExecutor.nHandle=" + TRANSFORM(goExecutor.nHandle) + +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +DO ProbaTextSursa +DO ProbaParitateEmitere + +DO Final + +*===================================================================================== +* Partea 1 - aserturile pe TEXTUL sursei: cele doua cai asambleaza identic, si replica +* din acest fisier e identica cu sursa. +*===================================================================================== +PROCEDURE ProbaTextSursa + LOCAL lcAncora, lnCate, i + LOCAL ARRAY laSursa[1], laPoz[1] + + IF !FILE(gcSursaNou) + DO Assert WITH .F., "sursa " + gcSursaNou + " exista" + RETURN + ENDIF + lnCate = ALINES(laSursa, FILETOSTR(gcSursaNou), 0) + DO AfLog WITH "ofacturare.vc2: " + TRANSFORM(lnCate) + " linii" + + * blocul de asamblare incepe cu acest If si tine pana la Endif-ul de dupa lcListaIncasare = [NULL] + lcAncora = "IF INLIST(PODATE.NTIP_INCASARE, 11, 2, 3)" + DIMENSION laPoz[2] + laPoz[1] = 0 + laPoz[2] = 0 + LOCAL lnGasit + lnGasit = 0 + FOR i = 1 TO lnCate + IF UPPER(NormalizeazaLinie(laSursa[i])) == lcAncora + lnGasit = lnGasit + 1 + IF lnGasit <= 2 + laPoz[lnGasit] = i + ENDIF + ENDIF + ENDFOR + DO AfLog WITH "ancora blocului de asamblare gasita de " + TRANSFORM(lnGasit) + " ori, la liniile " + ; + TRANSFORM(laPoz[1]) + " si " + TRANSFORM(laPoz[2]) + DO Assert WITH lnGasit = 2, "blocul lcListaIncasare apare exact de doua ori in ofacturare.vc2 (calea veche + calea noua)" + IF lnGasit <> 2 + RETURN + ENDIF + + LOCAL lcA, lcB, lcRep + lcA = ExtrageBloc(gcSursaNou, laPoz[1], 30) + lcB = ExtrageBloc(gcSursaNou, laPoz[2], 30) + DO AfLog WITH "bloc vechi (ofacturare.vc2:" + TRANSFORM(laPoz[1]) + ") normalizat, " + TRANSFORM(LEN(lcA)) + " octeti" + DO AfLog WITH "bloc nou (ofacturare.vc2:" + TRANSFORM(laPoz[2]) + ") normalizat, " + TRANSFORM(LEN(lcB)) + " octeti" + DO Assert WITH lcA == lcB, "asamblarea lcListaIncasare e identica in do_scrie_factura al celor doua cai" + IF !(lcA == lcB) + DO AfLog WITH "vechi=[" + lcA + "]" + DO AfLog WITH "nou =[" + lcB + "]" + ENDIF + + * replica din acest fisier, intre marcaje, trebuie sa fie aceeasi bucata de cod + lcRep = ExtrageIntreMarcaje(gcAcestFisier, "*--REPLICA-LISTA-START--*", "*--REPLICA-LISTA-END--*") + DO AfLog WITH "replica din test normalizata, " + TRANSFORM(LEN(lcRep)) + " octeti" + DO Assert WITH lcRep == lcB, "replica ListaIncasare() din test e identica cu blocul din sursa" + IF !(lcRep == lcB) + DO AfLog WITH "replica=[" + lcRep + "]" + DO AfLog WITH "sursa =[" + lcB + "]" + ENDIF + + * linia care calculeaza ntip_incasare din opt_incasat.Value, pe ambele cai + LOCAL lcNtipNou, lcNtipVechi, lcNtipVechiNorm + lcNtipNou = CautaLinie(gcSursaNou, "PODATE.NTIP_INCASARE = IIF(") + lcNtipVechi = CautaLinie(gcSursaVechi, "PODATE.NTIP_INCASARE = IIF(") + * calea noua citeste modul de incasare prin nmod_incasare(), nu direct opt_incasat.Value (container ct_incasare) + lcNtipVechiNorm = STRTRAN(lcNtipVechi, "THISFORM.OPT_INCASAT.VALUE", "THISFORM.NMOD_INCASARE()") + DO AfLog WITH "ntip nou =[" + lcNtipNou + "]" + DO AfLog WITH "ntip vechi =[" + lcNtipVechi + "] normalizat=[" + lcNtipVechiNorm + "]" + DO Assert WITH !EMPTY(lcNtipNou) AND lcNtipNou == lcNtipVechiNorm, ; + "expresia poDate.ntip_incasare = Iif(opt_incasat.Value...) e identica pe ambele cai" +ENDPROC + +*===================================================================================== +* Partea 2 - proba de runtime, pe cele doua forme, secvential +*===================================================================================== +PROCEDURE ProbaParitateEmitere + PRIVATE poDate, poGeneratorNumere, loVechi, loNou, i + LOCAL laTip[4], laNume[4], laVechi[4,4], laNou[4,4] + laTip[1] = 1 + laTip[2] = 2 + laTip[3] = 3 + laTip[4] = 4 + laNume[1] = "Fara incasare" + laNume[2] = "Chitanta" + laNume[3] = "Bon fiscal" + laNume[4] = "POS Card" + + poDate = CREATEOBJECT("oDateFactura", 25000, 1) + poDate.nIdTipDoc = 5 + poDate.totalctva = 1000 + DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + ; + " poDate.incasat=" + TRANSFORM(poDate.incasat) + " poDate.nract=" + TRANSFORM(poDate.nract) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poGeneratorNumere.ResetNumere() + DO ProbaSerii WITH poDate.nIdTipDoc + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + + * tipul 26 (POS/card) nu are plaje in acest mediu la fiecare rulare; fara pre-proba, + * do_aloca_nr_pos blocheaza rularea in interiorul apelului Oracle, fara nimic in log + LOCAL lnRandPOS + lnRandPOS = RanduriSerii(26) + glPOSDisponibil = (lnRandPOS > 0) + DO AfLog WITH "pre-proba plaje: tip 3 randuri=" + TRANSFORM(RanduriSerii(3)) + ; + " tip 16 randuri=" + TRANSFORM(RanduriSerii(16)) + " tip 26 randuri=" + TRANSFORM(lnRandPOS) + ; + " -> POS " + IIF(glPOSDisponibil, "probabil", "NEPROBABIL in acest mediu") + + LOCAL lnStartIncasat, lnStartCard, lnStartTichete, lnStartCasa, lnStartTipInc, lnStartNrInc, lnStartPos + lnStartIncasat = poDate.incasat + lnStartCard = poDate.incasatCARD + lnStartTichete = poDate.incasatTichete + lnStartCasa = poDate.id_casa + lnStartTipInc = poDate.ntip_incasare + lnStartNrInc = poDate.nr_incasare + lnStartPos = poDate.nIncasatPos + DO AfLog WITH "stare start poDate: incasat=" + TRANSFORM(lnStartIncasat) + " incasatCARD=" + TRANSFORM(lnStartCard) + ; + " incasatTichete=" + TRANSFORM(lnStartTichete) + " id_casa=" + TRANSFORM(lnStartCasa) + ; + " ntip_incasare=" + TRANSFORM(lnStartTipInc) + " nr_incasare=" + TRANSFORM(lnStartNrInc) + ; + " nIncasatPos=" + TRANSFORM(lnStartPos) + + LOCAL lnTip, lcNumeTip + + * ---------- FAZA 1: calea veche - frm_alte_date ---------- + DO AsiguraSaftTipFacturi + loVechi = CREATEOBJECT('frm_alte_date') + DO Assert WITH VARTYPE(loVechi) = 'O', "Createobject frm_alte_date (calea veche)" + IF VARTYPE(loVechi) <> 'O' + RETURN + ENDIF + loVechi.Visible = .F. + loVechi.nnrbon = poDate.nract + + FOR i = 1 TO 4 + lnTip = laTip[i] + lcNumeTip = laNume[i] + IF lnTip = 4 AND !glPOSDisponibil + DO AfLog WITH "vechi [" + lcNumeTip + "]: SARIT - nu exista plaje de serii pentru tipul 26 in acest mediu" + LOOP + ENDIF + loVechi.opt_incasat.Value = lnTip + DO AfLog WITH "vechi [" + lcNumeTip + "]: dupa opt_incasat.Value=" + TRANSFORM(lnTip) + ; + " nr_incasare=" + TRANSFORM(poDate.nr_incasare) + " incasat=" + TRANSFORM(poDate.incasat) + ; + " incasatCARD=" + TRANSFORM(poDate.incasatCARD) + " id_casa=" + TRANSFORM(poDate.id_casa) + ; + " nIncasatPos=" + TRANSFORM(poDate.nIncasatPos) + " nnrbon=" + TRANSFORM(loVechi.nnrbon) + ; + " numere=" + StareToate() + laVechi[i,1] = poDate.nr_incasare + DO AplicaTermin WITH loVechi.opt_incasat.Value + laVechi[i,2] = poDate.ntip_incasare + laVechi[i,3] = ListaIncasare() + laVechi[i,4] = "incasat=" + TRANSFORM(poDate.incasat) + "|card=" + TRANSFORM(poDate.incasatCARD) + ; + "|tichete=" + TRANSFORM(poDate.incasatTichete) + "|casa=" + TRANSFORM(poDate.id_casa) + DO AfLog WITH "vechi [" + lcNumeTip + "]: dupa emitere ntip_incasare=" + TRANSFORM(laVechi[i,2]) + ; + " nr_incasare=" + TRANSFORM(laVechi[i,1]) + " campuri=" + laVechi[i,4] + DO AfLog WITH "vechi [" + lcNumeTip + "]: lcListaIncasare=[" + laVechi[i,3] + "]" + + * dezaloca si readu campurile la starea de start, ca tipul urmator sa porneasca identic + loVechi.opt_incasat.Value = 1 + poDate.incasatCARD = lnStartCard + poDate.incasatTichete = lnStartTichete + DO AfLog WITH "vechi [" + lcNumeTip + "]: dezalocat, numere=" + StareToate() + DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), ; + "vechi [" + lcNumeTip + "] nimic alocat dupa comutarea inapoi pe Fara incasare (" + StareToate() + ")" + ENDFOR + + loVechi.Release() + RELEASE loVechi + DO AfLog WITH "dupa Release loVechi: USED('saft_tip_facturi')=" + TRANSFORM(USED('saft_tip_facturi')) + ; + " USED('cTipFacturaX')=" + TRANSFORM(USED('cTipFacturaX')) + + poDate.incasat = lnStartIncasat + poDate.incasatCARD = lnStartCard + poDate.incasatTichete = lnStartTichete + poDate.id_casa = lnStartCasa + poDate.ntip_incasare = lnStartTipInc + poDate.nr_incasare = lnStartNrInc + poDate.nIncasatPos = lnStartPos + DO AfLog WITH "poDate resetat inainte de faza 2: incasat=" + TRANSFORM(poDate.incasat) + ; + " nr_incasare=" + TRANSFORM(poDate.nr_incasare) + " numere=" + StareToate() + + * ---------- FAZA 2: calea noua - frm_facturare_articole2 ---------- + DO AsiguraSaftTipFacturi + loNou = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loNou) = 'O', "Createobject frm_facturare_articole2 (calea noua)" + IF VARTYPE(loNou) <> 'O' + RETURN + ENDIF + loNou.Visible = .F. + loNou.nnrbon = poDate.nract + + FOR i = 1 TO 4 + lnTip = laTip[i] + lcNumeTip = laNume[i] + IF lnTip = 4 AND !glPOSDisponibil + DO AfLog WITH "nou [" + lcNumeTip + "]: SARIT - nu exista plaje de serii pentru tipul 26 in acest mediu" + LOOP + ENDIF + loNou.seteaza_mod_incasare(lnTip) + DO Assert WITH loNou.nmod_incasare() = lnTip, "[" + lcNumeTip + "] nmod_incasare() reflecta seteaza_mod_incasare(" + TRANSFORM(lnTip) + ")" + DO AfLog WITH "nou [" + lcNumeTip + "]: dupa opt_incasat.Value=" + TRANSFORM(lnTip) + ; + " nr_incasare=" + TRANSFORM(poDate.nr_incasare) + " incasat=" + TRANSFORM(poDate.incasat) + ; + " incasatCARD=" + TRANSFORM(poDate.incasatCARD) + " id_casa=" + TRANSFORM(poDate.id_casa) + ; + " nIncasatPos=" + TRANSFORM(poDate.nIncasatPos) + " nnrbon=" + TRANSFORM(loNou.nnrbon) + ; + " numere=" + StareToate() + laNou[i,1] = poDate.nr_incasare + DO AplicaTermin WITH loNou.nmod_incasare() + laNou[i,2] = poDate.ntip_incasare + laNou[i,3] = ListaIncasare() + laNou[i,4] = "incasat=" + TRANSFORM(poDate.incasat) + "|card=" + TRANSFORM(poDate.incasatCARD) + ; + "|tichete=" + TRANSFORM(poDate.incasatTichete) + "|casa=" + TRANSFORM(poDate.id_casa) + DO AfLog WITH "nou [" + lcNumeTip + "]: dupa emitere ntip_incasare=" + TRANSFORM(laNou[i,2]) + ; + " nr_incasare=" + TRANSFORM(laNou[i,1]) + " campuri=" + laNou[i,4] + DO AfLog WITH "nou [" + lcNumeTip + "]: lcListaIncasare=[" + laNou[i,3] + "]" + + DO Assert WITH laNou[i,1] = laVechi[i,1], "[" + lcNumeTip + "] poDate.nr_incasare identic (vechi=" + ; + TRANSFORM(laVechi[i,1]) + " nou=" + TRANSFORM(laNou[i,1]) + ")" + DO Assert WITH laNou[i,3] == laVechi[i,3], "[" + lcNumeTip + "] lcListaIncasare identic (vechi=[" + ; + laVechi[i,3] + "] nou=[" + laNou[i,3] + "])" + DO Assert WITH laNou[i,2] = laVechi[i,2], "[" + lcNumeTip + "] poDate.ntip_incasare identic (vechi=" + ; + TRANSFORM(laVechi[i,2]) + " nou=" + TRANSFORM(laNou[i,2]) + ")" + DO Assert WITH laNou[i,4] == laVechi[i,4], "[" + lcNumeTip + "] campurile care intra in lcListaIncasare identice (vechi=" + ; + laVechi[i,4] + " nou=" + laNou[i,4] + ")" + + loNou.seteaza_mod_incasare(1) + DO Assert WITH loNou.nmod_incasare() = 1, "[" + lcNumeTip + "] nmod_incasare() reflecta seteaza_mod_incasare(1) (dezalocare)" + loNou.actualizeaza_tipincasare() + poDate.incasatCARD = lnStartCard + poDate.incasatTichete = lnStartTichete + DO AfLog WITH "nou [" + lcNumeTip + "]: dezalocat, numere=" + StareToate() + DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), ; + "nou [" + lcNumeTip + "] nimic alocat dupa comutarea inapoi pe Fara incasare (" + StareToate() + ")" + ENDFOR + + DO AfLog WITH "stare finala numere (asteptat nimic alocat): " + StareToate() + DO Assert WITH !EsteAlocat(3) AND !EsteAlocat(16) AND !EsteAlocat(26), "nimic ramas alocat la finalul rularii" + + loNou.Release() + RELEASE loNou +ENDPROC + +* Pasul de emitere dinaintea lui do_scrie_factura, comun celor doua cai: +* ferestre_cere_date.vc2:3067 + 3100-3104 (frm_alte_date.inainte_de_do_termin) +* ofacturare.vc2:20673 + 20680-20683 (frm_facturare_articole2.inainte_de_do_termin) +PROCEDURE AplicaTermin + LPARAMETERS tnValoareOpt + poDate.ntip_incasare = Iif(tnValoareOpt=2, 11, IIF(tnValoareOpt = 3, 2, IIF(tnValoareOpt = 4, 3, 0))) + IF poDate.nIncasatPos = 1 + poDate.incasatCARD = poDate.incasat + poDate.incasat = 0 + ENDIF +ENDPROC + +* Replica blocului din do_scrie_factura. Corpul dintre marcaje e comparat ca text cu sursa +* (ProbaTextSursa) - nu edita aici fara sa verifici sursa. +FUNCTION ListaIncasare + LOCAL lcListaIncasare + lcListaIncasare = '' + *--REPLICA-LISTA-START--* + If Inlist(poDate.ntip_incasare, 11, 2, 3) + Do Case + Case poDate.ntip_incasare = 11 + If poDate.incasat <> 0 + lcListaIncasare = lcListaIncasare + ['11|] + Alltrim(Str(poDate.incasat,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;'] + Endif + Case poDate.ntip_incasare = 3 + If poDate.incasatCARD <> 0 + lcListaIncasare = lcListaIncasare + ['3|] + Alltrim(Str(poDate.incasatCARD,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;'] + Endif + Otherwise + If poDate.incasat <> 0 + lcListaIncasare = lcListaIncasare + ['2|] + Alltrim(Str(poDate.incasat,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;'] + Endif + + If poDate.incasatCARD <> 0 + lcListaIncasare = lcListaIncasare + ['3|] + Alltrim(Str(poDate.incasatCARD,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;'] + Endif + + If poDate.incasatTichete <> 0 + lcListaIncasare = lcListaIncasare + ['5|] + Alltrim(Str(poDate.incasatTichete,18,gnPc)) + [|] + Alltrim(Str(poDate.id_casa)) + [;'] + Endif + Endcase + If Empty(m.lcListaIncasare) + lcListaIncasare = [NULL] + Endif + + Else + lcListaIncasare = [NULL] + Endif + *--REPLICA-LISTA-END--* + RETURN lcListaIncasare +ENDFUNC + +*===================================================================================== +* Ajutoare de text +*===================================================================================== +* taie comentariul && , spatiile de la capete si tab-urile de indentare +FUNCTION NormalizeazaLinie + LPARAMETERS tcLinie + LOCAL lcL, lnP + * marcajul de comentariu se construieste din CHR(38): scris literal, compilatorul VFP il ia + * drept inceput de comentariu si taie restul liniei, chiar si intre ghilimele + lcL = CHRTRAN(tcLinie, CHR(9), " ") + lnP = AT(CHR(38) + CHR(38), lcL) + IF lnP > 0 + lcL = LEFT(lcL, lnP - 1) + ENDIF + RETURN ALLTRIM(lcL) +ENDFUNC + +* concateneaza tnCate linii din fisier incepand de la tnStart, normalizate si fara linii goale +FUNCTION ExtrageBloc + LPARAMETERS tcFisier, tnStart, tnCate + LOCAL lcRez, i, lcL, lnCate + LOCAL ARRAY laF[1] + lcRez = "" + lnCate = ALINES(laF, FILETOSTR(tcFisier), 0) + FOR i = tnStart TO MIN(tnStart + tnCate - 1, lnCate) + lcL = UPPER(NormalizeazaLinie(laF[i])) + IF !EMPTY(lcL) + lcRez = lcRez + lcL + CHR(10) + ENDIF + ENDFOR + RETURN lcRez +ENDFUNC + +* extrage din fisier liniile dintre cele doua marcaje, normalizate, fara linii goale +FUNCTION ExtrageIntreMarcaje + LPARAMETERS tcFisier, tcStart, tcStop + LOCAL lcRez, i, lnCate, llIn, lcL + LOCAL ARRAY laF[1] + lcRez = "" + llIn = .F. + lnCate = ALINES(laF, FILETOSTR(tcFisier), 0) + FOR i = 1 TO lnCate + lcL = ALLTRIM(CHRTRAN(laF[i], CHR(9), " ")) + IF lcL == tcStop + EXIT + ENDIF + IF llIn + lcL = UPPER(NormalizeazaLinie(laF[i])) + IF !EMPTY(lcL) + lcRez = lcRez + lcL + CHR(10) + ENDIF + ENDIF + IF lcL == tcStart + llIn = .T. + ENDIF + ENDFOR + RETURN lcRez +ENDFUNC + +* prima linie normalizata (majuscule) care contine tcFragment +FUNCTION CautaLinie + LPARAMETERS tcFisier, tcFragment + LOCAL i, lnCate, lcL + LOCAL ARRAY laF[1] + lnCate = ALINES(laF, FILETOSTR(tcFisier), 0) + FOR i = 1 TO lnCate + lcL = UPPER(NormalizeazaLinie(laF[i])) + IF tcFragment $ lcL + RETURN lcL + ENDIF + ENDFOR + RETURN "" +ENDFUNC + +*===================================================================================== +* Ajutoare de mediu, preluate din test_s3b_incasare_paritate_campuri.prg +*===================================================================================== +PROCEDURE AsiguraSaftTipFacturi + * cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel la + * instantiere (ofacturare.vc2:16157, ferestre_cere_date.vc2:2388). Structura copiata din + * update_saft_tip_facturi (updateserver.prg:669-691), fara apel la server. + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF +ENDPROC + +FUNCTION EsteAlocat + LPARAMETERS tnTip + LOCAL lcCursor + IF poGeneratorNumere.paPlaje(tnTip, 6) + lcCursor = poGeneratorNumere.paPlaje(tnTip, 8) + IF EMPTY(NVL(lcCursor, [])) OR !USED(lcCursor) + RETURN .F. + ENDIF + RETURN RECCOUNT(lcCursor) > 0 + ELSE + RETURN poGeneratorNumere.paPlaje(tnTip, 1) <> 0 + ENDIF +ENDFUNC + +FUNCTION StareNumar + LPARAMETERS tnTip + LOCAL lcCursor, lnCount + IF poGeneratorNumere.paPlaje(tnTip, 6) + lcCursor = poGeneratorNumere.paPlaje(tnTip, 8) + IF EMPTY(NVL(lcCursor, [])) OR !USED(lcCursor) + lnCount = 0 + ELSE + lnCount = RECCOUNT(lcCursor) + ENDIF + RETURN "buffer:" + TRANSFORM(lnCount) + ELSE + RETURN "array:" + TRANSFORM(poGeneratorNumere.paPlaje(tnTip, 1)) + ENDIF +ENDFUNC + +FUNCTION StareToate + RETURN "3=" + StareNumar(3) + "|16=" + StareNumar(16) + "|26=" + StareNumar(26) +ENDFUNC + +PROCEDURE ProbaSerii + LPARAMETERS tnIdTipDoc + LOCAL lnOk, laErr[1], i, lcSql + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + FOR i = 1 TO 3 + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii") + IF lnOk > 0 + DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii")) + USE IN (SELECT("crsprobaserii")) + EXIT + ELSE + AERROR(laErr) + DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5]) + ENDIF + ENDFOR +ENDPROC + +* cate randuri de plaja intoarce verifica_cursor_serii pentru un tip de document, fara sa aloce +FUNCTION RanduriSerii + LPARAMETERS tnIdTipDoc + LOCAL lnOk, lnRanduri, lcSql + LOCAL ARRAY laErr[1] + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lnRanduri = -1 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobapl") + IF lnOk > 0 + lnRanduri = RECCOUNT("crsprobapl") + USE IN (SELECT("crsprobapl")) + ELSE + AERROR(laErr) + DO AfLog WITH "pre-proba plaje tip " + TRANSFORM(tnIdTipDoc) + " ESEC: " + TRANSFORM(laErr[2]) + ENDIF + RETURN lnRanduri +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO AfLog WITH "PASS: " + tcMsg + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL: " + tcMsg + ENDIF +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnFail = gnFail + 1 + * plafon de scriere: o eroare intr-o bucla peste liniile unui .vc2 a produs un log de 3 MB + IF gnFail <= 200 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg + ENDIF + IF gnFail = 201 + DO AfLog WITH "ERROR: peste 200 de erori, restul nu se mai scriu in log" + ENDIF +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3b_paritate_emitere.ps1 b/utile/Teste/facturare_unificat/test_s3b_paritate_emitere.ps1 new file mode 100644 index 0000000..18f26bc --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3b_paritate_emitere.ps1 @@ -0,0 +1,28 @@ +$ErrorActionPreference = 'Stop' +$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat' +$prg = Join-Path $dir 'test_s3b_paritate_emitere.prg' +$log = Join-Path $dir 'out\test_s3b_paritate_emitere.log' +$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' + +$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s3b_paritate_emitere*' } +if ($viu) { + "Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua." + exit 1 +} + +Set-Location $dir +Remove-Item *.FXP, *.fxp -ErrorAction SilentlyContinue +Remove-Item $log -ErrorAction SilentlyContinue + +$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru +"lansat PID " + $p.Id +$null = $p.WaitForExit(300000) +if (-not $p.HasExited) { + "INCA RULEAZA dupa 300s - omor instanta" + Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s3b_paritate_emitere*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force } +} +if (Test-Path $log) { + Get-Content $log | Select-String -Pattern '^(PASS|FAIL|ERROR|TOTAL|pre-proba plaje:)' +} else { + "Log inexistent: $log" +} diff --git a/utile/Teste/facturare_unificat/test_s3b_referinta_ui.prg b/utile/Teste/facturare_unificat/test_s3b_referinta_ui.prg new file mode 100644 index 0000000..6830af3 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3b_referinta_ui.prg @@ -0,0 +1,293 @@ +* test_s3b_referinta_ui.prg +* UI VIZIBIL: capturi de REFERINTA pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) ASA CUM E +* AZI, inainte de orice modificare vizuala. Formular maximizat, apoi do_comuta_alte_date() / +* do_comuta_incasare() pentru cele 4 stari cerute (ambele plaite / alte date deschis / incasare +* deschis / ambele deschise). Pe langa PNG-uri (via harness), dupa fiecare stare extrage geometria +* REALA la runtime (Thisform.Objects: Name/Class/Left/Top/Width/Height/Visible) intr-un .tsv si +* calculeaza suprapuneri / iesiri din zona utila / controale lipite. NU modifica nimic - doar +* citeste stare si captureaza. +* +* Mediu: copiat din test_s3b_incasare_nealocare.prg (validat azi, 14 pass / 0 fail) - poDate cu +* nIdTipDoc=5 (FACTURA, tip 1, opt_incasat prezent), poGeneratorNumere REAL (nu mock), fara nicio +* alocare de numar (poDate.incasat ramane 0 la construire, opt_incasat.Value nu se atinge). +* +* Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_referinta_ui.ps1 (timeout >= 300s) +* Log: facturare_unificat\test_s3b_referinta_ui_log.txt ; capturi in screenshots_referinta\ ; +* geometrie in out\geom_referinta_.tsv + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcUILog, gcSyncDir, gnFail, gnPass +gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3b_referinta_ui_log.txt" +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_referinta\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) +gnFail = 0 +gnPass = 0 +PUBLIC gcRaport +gcRaport = "" +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out") + MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out" +ENDIF + +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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnScadereStoc = 0 +* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel - +* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist" +IF !USED('saft_tip_facturi') + update_saft_tip_facturi() +ENDIF + +PRIVATE poDate, poGeneratorNumere, loForm, lcTsv, lcRaportFile +lcRaportFile = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_referinta_raport.txt" + +* document nou: poDate.incasat ramane 0 la construire - identic Scenariul A din test_s3b_incasare_nealocare.prg +poDate = CREATEOBJECT("oDateFactura", 25000, 1) +poDate.nIdTipDoc = 5 +poDate.totalctva = 1000 +DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + " poDate.incasat=" + TRANSFORM(poDate.incasat) +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") +poGeneratorNumere.ResetNumere() +DO ProbaSerii WITH poDate.nIdTipDoc +poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + +loForm = CREATEOBJECT('frm_facturare_articole2') +DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" +IF VARTYPE(loForm) <> 'O' + DO Final +ENDIF +DO Assert WITH ObjExists(loForm, 'opt_incasat'), "opt_incasat prezent (poDate.tip intre 1 si 4, deci grupul de incasare exista)" + +loForm.WindowType = 0 +loForm.Show() +loForm.WindowState = 2 +DOEVENTS FORCE + +* pas0: stare initiala dupa Createobject - ambele acordeoane plaite (lalte_date_deschis=.F., lincasare_deschis=.F. by design) +DO AfLog WITH "PAS0 stare initiala: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_referinta_stare_initiala.tsv" +DO DumpSiAnalizeaza WITH loForm, "stare initiala (ambele plaite)", lcTsv +DO HarnessStep WITH 0, 'stare_initiala', 6 + +* pas1: Alte date deschis - caseta se seteaza INAINTE de comutare (metoda citeste caseta) +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +DO AfLog WITH "PAS1 alte date deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_referinta_alte_date.tsv" +DO DumpSiAnalizeaza WITH loForm, "Alte date deschis", lcTsv +DO HarnessStep WITH 1, 'alte_date_deschis', 6 + +* pas2: Alte date inchis la loc, Incasare deschis +* bifarea casetei aloca o chitanta reala in MARIUSM_AUTO - vezi curatenia de dinainte de Release +loForm.chk_alte_date.Value = 0 +loForm.do_comuta_alte_date() +loForm.chk_incasare.Value = 1 +loForm.do_comuta_incasare() +DOEVENTS FORCE +DO AfLog WITH "PAS2 incasare deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_referinta_incasare.tsv" +DO DumpSiAnalizeaza WITH loForm, "Incasare deschis", lcTsv +DO HarnessStep WITH 2, 'incasare_deschis', 6 + +* pas3: Alte date deschis din nou - ambele deschise simultan +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +DO AfLog WITH "PAS3 ambele deschise: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_referinta_ambele.tsv" +DO DumpSiAnalizeaza WITH loForm, "Ambele deschise", lcTsv +DO HarnessStep WITH 3, 'ambele_deschise', 6 + +STRTOFILE(gcRaport, lcRaportFile) +DO AfLog WITH "Raport geometrie scris in " + lcRaportFile + +* curatenie obligatorie: bifarea casetei la pasul 2 a alocat o chitanta reala in MARIUSM_AUTO, +* iar debifarea ruleaza ramura "fara incasare", care dezaloca 16/3/26 +loForm.chk_incasare.Value = 0 +loForm.do_comuta_incasare() +DO Assert WITH loForm.nmod_incasare() = 1, "dupa curatenie: nmod_incasare()=1 (fara incasare)" +loForm.Release() +RELEASE loForm + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE DumpSiAnalizeaza + * Parcurge Thisform.Objects (top-level, fara recursie in containere) - dupa S7 NU mai vede cele + * 30 de controale mutate in ct_document/ct_contabilitate/ct_livrare/ct_incasare; harta completa + * cere enumerare recursiva (vezi test_s5_benzi2_ui.prg). Scrie .tsv cu + * Name/Class/Left/Top/Width/Height/Visible pentru fiecare obiect cu geometrie, apoi + * calculeaza suprapuneri (2D), iesire din zona utila a formularului si perechi lipite + * (<4px) pe orizontala/verticala, doar intre controale Visible=.T. Adauga sectiunea la gcRaport. + LPARAMETERS toForm, tcEticheta, tcTsvPath + LOCAL i, j, loO, lcOut, lnN, lnCount, llVis + LOCAL ARRAY laN[400], laC[400], laL[400], laT[400], laW[400], laH[400], laV[400] + lnN = 0 + lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(13) + CHR(10) + lnCount = toForm.Objects.Count + FOR i = 1 TO lnCount + loO = toForm.Objects(i) + IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' AND lnN < 400 + llVis = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) + lnN = lnN + 1 + laN[lnN] = loO.Name + laC[lnN] = loO.Class + laL[lnN] = loO.Left + laT[lnN] = loO.Top + laW[lnN] = loO.Width + laH[lnN] = loO.Height + laV[lnN] = llVis + lcOut = lcOut + loO.Name + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + TRANSFORM(llVis) + CHR(13) + CHR(10) + ENDIF + ENDFOR + STRTOFILE(lcOut, tcTsvPath) + DO AfLog WITH "GEOMETRIE [" + tcEticheta + "]: " + TRANSFORM(lnN) + " controale cu geometrie din " + TRANSFORM(lnCount) + " obiecte totale -> " + tcTsvPath + + LOCAL lnAL, lnAT, lnAR, lnAB, lnBL, lnBT, lnBR, lnBB, lnOvX, lnOvY, lnGap + LOCAL lcSectiune + lcSectiune = "=== " + tcEticheta + " (forma " + TRANSFORM(toForm.Width) + "x" + TRANSFORM(toForm.Height) + ") ===" + CHR(13) + CHR(10) + FOR i = 1 TO lnN + IF !laV[i] + LOOP + ENDIF + lnAL = laL[i] + lnAT = laT[i] + lnAR = laL[i] + laW[i] + lnAB = laT[i] + laH[i] + IF lnAL < 0 OR lnAT < 0 OR lnAR > toForm.Width OR lnAB > toForm.Height + lcSectiune = lcSectiune + "IESIT: " + laN[i] + " (" + laC[i] + ") Left=" + TRANSFORM(lnAL) + " Top=" + TRANSFORM(lnAT) + " Right=" + TRANSFORM(lnAR) + " Bottom=" + TRANSFORM(lnAB) + CHR(13) + CHR(10) + ENDIF + FOR j = i + 1 TO lnN + IF !laV[j] + LOOP + ENDIF + lnBL = laL[j] + lnBT = laT[j] + lnBR = laL[j] + laW[j] + lnBB = laT[j] + laH[j] + lnOvX = MIN(lnAR, lnBR) - MAX(lnAL, lnBL) + lnOvY = MIN(lnAB, lnBB) - MAX(lnAT, lnBT) + IF lnOvX > 0 AND lnOvY > 0 + lcSectiune = lcSectiune + "SUPRAPUNERE: " + laN[i] + " (" + laC[i] + ") x " + laN[j] + " (" + laC[j] + ") " + TRANSFORM(lnOvX) + "x" + TRANSFORM(lnOvY) + "px" + CHR(13) + CHR(10) + ELSE + IF lnOvY > 0 AND lnOvX <= 0 AND -lnOvX < 4 + lnGap = -lnOvX + lcSectiune = lcSectiune + "LIPIT-ORIZ: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10) + ENDIF + IF lnOvX > 0 AND lnOvY <= 0 AND -lnOvY < 4 + lnGap = -lnOvY + lcSectiune = lcSectiune + "LIPIT-VERT: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10) + ENDIF + ENDIF + ENDFOR + ENDFOR + gcRaport = gcRaport + lcSectiune + CHR(13) + CHR(10) +ENDPROC + +PROCEDURE ProbaSerii + * apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor + * ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului + LPARAMETERS tnIdTipDoc + LOCAL lnOk, laErr[1], i, lcSql + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + FOR i = 1 TO 3 + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii") + IF lnOk > 0 + DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii")) + USE IN (SELECT("crsprobaserii")) + EXIT + ELSE + AERROR(laErr) + DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5]) + ENDIF + ENDFOR +ENDPROC + +FUNCTION ObjExists + * Cautare RECURSIVA: dupa S7 controalele de sub grila nu mai sunt in Thisform.Objects, ci in + * containerele lor - o cautare plata ar raporta tacut "lipseste". + LPARAMETERS toContainer, tcName + LOCAL i, loO + FOR i = 1 TO toContainer.Objects.Count + loO = toContainer.Objects(i) + IF UPPER(loO.Name) == UPPER(tcName) + RETURN .T. + ENDIF + IF TYPE('loO.Objects.Count') = 'N' + IF ObjExists(loO, tcName) + RETURN .T. + ENDIF + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO AfLog WITH "PASS: " + tcMsg + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL: " + tcMsg + ENDIF +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + DO HarnessDone WITH 'done' + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3b_referinta_ui.ps1 b/utile/Teste/facturare_unificat/test_s3b_referinta_ui.ps1 new file mode 100644 index 0000000..0769f38 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3b_referinta_ui.ps1 @@ -0,0 +1,11 @@ +# test_s3b_referinta_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru +# test_s3b_referinta_ui.prg. Capturi de REFERINTA pe frm_facturare_articole2 (ofacturare.vc2), +# ASA CUM E AZI - nu modifica nimic vizual, doar deschide/inchide acordeoanele Alte date / Incasare. +# Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_referinta_ui.ps1 (timeout >= 300s) +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_s3b_referinta_ui.prg') ` + -Steps @('stare_initiala','alte_date_deschis','incasare_deschis','ambele_deschise') ` + -SyncDir (Join-Path $Teste 'uisync_referinta') ` + -ShotsDir (Join-Path $Teste 'screenshots_referinta') diff --git a/utile/Teste/facturare_unificat/test_s3c_1_paritate_sursa.prg b/utile/Teste/facturare_unificat/test_s3c_1_paritate_sursa.prg new file mode 100644 index 0000000..9dd7489 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3c_1_paritate_sursa.prg @@ -0,0 +1,302 @@ +* test_s3c_1_paritate_sursa.prg +* Headless: paritatea lui oDateFactura.Init cu/ fara parametrul optional de sursa (comanda/contract). +* Dovedeste ca apelul vechi (fara sursa) citeste din goComanda/goContract ca inainte (fallback), iar +* apelul nou (cu toSursa obiect) citeste din parametru chiar si cand globala e populata diferit. +* Nu instantiaza niciun formular: doar oDateFactura + functiile .prg, cu goExecutor inlocuit de +* oExecutorMockS3c (intercepteaza DOAR cursorele crsCtrTemp/crsComTemp din cele doua ramuri de sursa). +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3c_1_paritate_sursa.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3c_1_paritate_sursa.log + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr +PUBLIC goComanda, goContract +PUBLIC gnMockIdCtr, gnMockIdSectie, goExecutorReal +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3c_1_paritate_sursa.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) +gnFail = 0 +gnPass = 0 +gcCaz = "" +gcErr = "" +gnMockIdCtr = 0 +gnMockIdSectie = 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 +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + +goExecutorReal = goExecutor +goExecutor = CREATEOBJECT("oExecutorMockS3c") +goExecutor.oReal = goExecutorReal + +DO CazTipParam +DO CazComandaFallback +DO CazComandaParam +DO CazContractFallback +DO CazContractParam +DO CazContractTip52Fallback +DO CazTip1FaraSursa +DO CazTip1GlobalMurdar + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE CazTipParam + gcCaz = "[S3C0_TIP_PARAM] " + DO AfLog WITH "PAS: " + gcCaz + DO Assert WITH ProbaTipParam(1) == 'L', "Type(param nepasat) = 'L' (nu 'U')" + DO Assert WITH ProbaTipParam(1) <> 'U', "Type(param nepasat) NU e 'U'" + DO Assert WITH ProbaTipParam(1, 2, CREATEOBJECT('Custom')) == 'O', "Type(param obiect pasat) = 'O'" +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE CazComandaFallback + gcCaz = "[COMANDA_FALLBACK] " + DO AfLog WITH "PAS: " + gcCaz + goComanda = CreSursaComanda(101, "COMANDA GLOBAL", "CF-G", 1001, "NR-G", 11) + LOCAL lo + lo = CREATEOBJECT("oDateFactura", 25012, 3) + DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 3, fara sursa)" + DO Assert WITH lo.id_client = 101, "id_client din goComanda" + DO Assert WITH ALLTRIM(lo.nume_client) == "COMANDA GLOBAL", "nume_client din goComanda" + DO Assert WITH ALLTRIM(lo.cod_fiscal) == "CF-G", "cod_fiscal din goComanda" + DO Assert WITH lo.listaid = 1001, "listaid din goComanda" + DO Assert WITH ALLTRIM(lo.descriere) == "NR-G", "descriere din goComanda" + DO Assert WITH lo.id_sectie = 11, "id_sectie din goComanda" + DO Assert WITH ALLTRIM(lo.sectie) == "SECTIE 11", "sectie derivata din goComanda.id_sectie" +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE CazComandaParam + gcCaz = "[COMANDA_PARAM] " + DO AfLog WITH "PAS: " + gcCaz + goComanda = CreSursaComanda(101, "COMANDA GLOBAL", "CF-G", 1001, "NR-G", 11) + LOCAL loSursa, lo + loSursa = CreSursaComanda(201, "COMANDA PARAM", "CF-P", 2001, "NR-P", 22) + lo = CREATEOBJECT("oDateFactura", 25012, 3, loSursa) + DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 3, cu sursa)" + DO Assert WITH lo.id_client = 201, "id_client din toSursa (nu globala)" + DO Assert WITH ALLTRIM(lo.nume_client) == "COMANDA PARAM", "nume_client din toSursa" + DO Assert WITH ALLTRIM(lo.cod_fiscal) == "CF-P", "cod_fiscal din toSursa" + DO Assert WITH lo.listaid = 2001, "listaid din toSursa" + DO Assert WITH ALLTRIM(lo.descriere) == "NR-P", "descriere din toSursa" + DO Assert WITH lo.id_sectie = 22, "id_sectie din toSursa" + DO Assert WITH ALLTRIM(lo.sectie) == "SECTIE 22", "sectie derivata din toSursa.id_sectie" +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE CazContractFallback + gcCaz = "[CONTRACT_FALLBACK] " + DO AfLog WITH "PAS: " + gcCaz + goContract = CreSursaContract(301, "CONTRACT GLOBAL", "CF-CG", 3001, "CTR-G", 33, "SEC-G", 331, "RESP-G", 1, "RON") + LOCAL lo + lo = CREATEOBJECT("oDateFactura", 25011, 2) + DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 2, fara sursa)" + DO Assert WITH lo.id_client = 301, "id_client din goContract" + DO Assert WITH ALLTRIM(lo.nume_client) == "CONTRACT GLOBAL", "nume_client din goContract" + DO Assert WITH ALLTRIM(lo.cod_fiscal) == "CF-CG", "cod_fiscal din goContract" + DO Assert WITH lo.listaid = 3001, "listaid din goContract" + DO Assert WITH ALLTRIM(lo.descriere) == "CTR-G", "descriere din goContract" + DO Assert WITH lo.id_sectie = 33, "id_sectie din goContract" + DO Assert WITH ALLTRIM(lo.sectie) == "SEC-G", "sectie din goContract" + DO Assert WITH lo.id_responsabil = 331, "id_responsabil din goContract" + DO Assert WITH ALLTRIM(lo.responsabil) == "RESP-G", "responsabil din goContract" + DO Assert WITH lo.id_valuta = 1, "id_valuta din goContract" + DO Assert WITH ALLTRIM(lo.nume_valuta) == "RON", "nume_valuta din goContract" + DO Assert WITH gnMockIdCtr = 3001, "SQL fact_vcontracte foloseste goContract.id_ctr" +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE CazContractParam + gcCaz = "[CONTRACT_PARAM] " + DO AfLog WITH "PAS: " + gcCaz + goContract = CreSursaContract(301, "CONTRACT GLOBAL", "CF-CG", 3001, "CTR-G", 33, "SEC-G", 331, "RESP-G", 1, "RON") + LOCAL loSursa, lo + loSursa = CreSursaContract(401, "CONTRACT PARAM", "CF-CP", 4001, "CTR-P", 44, "SEC-P", 441, "RESP-P", 2, "EUR") + lo = CREATEOBJECT("oDateFactura", 25011, 2, loSursa) + DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 2, cu sursa)" + DO Assert WITH lo.id_client = 401, "id_client din toSursa (nu globala)" + DO Assert WITH ALLTRIM(lo.nume_client) == "CONTRACT PARAM", "nume_client din toSursa" + DO Assert WITH ALLTRIM(lo.cod_fiscal) == "CF-CP", "cod_fiscal din toSursa" + DO Assert WITH lo.listaid = 4001, "listaid din toSursa" + DO Assert WITH ALLTRIM(lo.descriere) == "CTR-P", "descriere din toSursa" + DO Assert WITH lo.id_sectie = 44, "id_sectie din toSursa" + DO Assert WITH ALLTRIM(lo.sectie) == "SEC-P", "sectie din toSursa" + DO Assert WITH lo.id_responsabil = 441, "id_responsabil din toSursa" + DO Assert WITH ALLTRIM(lo.responsabil) == "RESP-P", "responsabil din toSursa" + DO Assert WITH lo.id_valuta = 2, "id_valuta din toSursa" + DO Assert WITH ALLTRIM(lo.nume_valuta) == "EUR", "nume_valuta din toSursa" + DO Assert WITH gnMockIdCtr = 4001, "SQL fact_vcontracte foloseste toSursa.id_ctr" +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE CazContractTip52Fallback + gcCaz = "[CONTRACT_TIP52_FALLBACK] " + DO AfLog WITH "PAS: " + gcCaz + goContract = CreSursaContract(301, "CONTRACT GLOBAL", "CF-CG", 3001, "CTR-G", 33, "SEC-G", 331, "RESP-G", 1, "RON") + LOCAL lo + lo = CREATEOBJECT("oDateFactura", 25061, 52) + DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 52, fara sursa)" + DO Assert WITH lo.id_client = 301, "id_client din goContract (INLIST acopera tip 52)" + DO Assert WITH lo.listaid = 3001, "listaid din goContract (tip 52)" +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE CazTip1FaraSursa + gcCaz = "[TIP1_FARA_SURSA] " + DO AfLog WITH "PAS: " + gcCaz + RELEASE goComanda, goContract + gcErr = "" + LOCAL lo + lo = CREATEOBJECT("oDateFactura", 25010, 1) + DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 1) fara eroare" + DO Assert WITH EMPTY(gcErr), "nicio eroare pe tip 1 - " + gcErr + DO Assert WITH ISNULL(lo.id_client), "id_client ramane Null (nicio precompletare)" + DO Assert WITH EMPTY(lo.nume_client), "nume_client ramane gol (nicio precompletare)" +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE CazTip1GlobalMurdar + gcCaz = "[TIP1_GLOBAL_MURDAR] " + DO AfLog WITH "PAS: " + gcCaz + goComanda = CreSursaComanda(101, "COMANDA GLOBAL", "CF-G", 1001, "NR-G", 11) + gcErr = "" + LOCAL lo + lo = CREATEOBJECT("oDateFactura", 25010, 1) + DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 1) cu globala murdara" + DO Assert WITH EMPTY(gcErr), "nicio eroare pe tip 1 cu globala murdara - " + gcErr + DO Assert WITH ISNULL(lo.id_client), "id_client ramane Null (garda tnTip=3 nu se declanseaza)" +ENDPROC + +*---------------------------------------------------------------------------------------- +FUNCTION ProbaTipParam + LPARAMETERS tnA, tnB, toC + RETURN TYPE('toC') +ENDFUNC + +*---------------------------------------------------------------------------------------- +FUNCTION CreSursaComanda + LPARAMETERS tnIdPart, tcNume, tcCodFiscal, tnIdComanda, tcNrComanda, tnIdSectie + CREATE CURSOR _cs (id_part N(10), nume C(50), cod_fiscal C(20), id_comanda N(10), nr_comanda C(20), id_sectie N(10)) + INSERT INTO _cs VALUES (tnIdPart, tcNume, tcCodFiscal, tnIdComanda, tcNrComanda, tnIdSectie) + LOCAL loS + SCATTER NAME loS MEMO + USE IN _cs + RETURN loS +ENDFUNC + +*---------------------------------------------------------------------------------------- +FUNCTION CreSursaContract + LPARAMETERS tnIdPart, tcDenumire, tcCodFiscal, tnIdCtr, tcContract, tnIdSectie, tcSectie, tnIdResp, tcResp, tnIdVal, tcVal + CREATE CURSOR _cc (id_part N(10), denumire C(50), cod_fiscal C(20), id_ctr N(10), contract C(30), id_sectie N(10), ; + sectie C(30), id_responsabil N(10), responsabil C(30), id_valuta N(10), nume_val C(10)) + INSERT INTO _cc VALUES (tnIdPart, tcDenumire, tcCodFiscal, tnIdCtr, tcContract, tnIdSectie, tcSectie, tnIdResp, tcResp, tnIdVal, tcVal) + LOCAL loS + SCATTER NAME loS MEMO + USE IN _cc + RETURN loS +ENDFUNC + +*---------------------------------------------------------------------------------------- +DEFINE CLASS oExecutorMockS3c AS oexecutor + oReal = NULL + + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect + LOCAL lcCur, lcSql, lnPos + lcCur = UPPER(ALLTRIM(TRANSFORM(tcCursor))) + lcSql = TRANSFORM(tcSql) + IF lcCur == 'CRSCTRTEMP' + lnPos = AT('id_ctr =', lcSql) + IF lnPos > 0 + gnMockIdCtr = VAL(SUBSTR(lcSql, lnPos + LEN('id_ctr ='))) + ENDIF + DO CreeazaCtrTemp + RETURN 1 + ENDIF + IF lcCur == 'CRSCOMTEMP' + lnPos = AT('id_sectie =', lcSql) + IF lnPos > 0 + gnMockIdSectie = VAL(SUBSTR(lcSql, lnPos + LEN('id_sectie ='))) + ENDIF + DO CreeazaComTemp WITH gnMockIdSectie + RETURN 1 + ENDIF + RETURN This.oReal.oExecute(tcSql, tcCursor) + ENDPROC + + FUNCTION oPrelucrareEroare + RETURN "MOCK eroare Oracle" + ENDFUNC +ENDDEFINE + +*---------------------------------------------------------------------------------------- +PROCEDURE CreeazaCtrTemp + IF USED('crsCtrTemp') + USE IN crsCtrTemp + ENDIF + CREATE CURSOR crsCtrTemp (scadenta_incasare N(6), afisare_scadenta N(1), opt_facturare N(1)) + RETURN +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE CreeazaComTemp + LPARAMETERS tnIdSectie + IF USED('crsComTemp') + USE IN crsComTemp + ENDIF + CREATE CURSOR crsComTemp (sectie C(100)) + INSERT INTO crsComTemp VALUES ("SECTIE " + ALLTRIM(STR(tnIdSectie))) + RETURN +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Final + IF TYPE('goExecutorReal') = 'O' + goExecutor = goExecutorReal + ENDIF + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s3c_4_do_factura_locomanda.prg b/utile/Teste/facturare_unificat/test_s3c_4_do_factura_locomanda.prg new file mode 100644 index 0000000..4d131c2 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s3c_4_do_factura_locomanda.prg @@ -0,0 +1,215 @@ +* test_s3c_4_do_factura_locomanda.prg +* Headless: izoleaza mecanismul din do_factura dupa S3c-4 (ocomenzi.vc2:1580-1596) - SCATTER NAME +* loComanda MEMO pe crsComenzi, trimis explicit la oDateFactura.Init prin toSursa, fara sa mai +* depinda de goComanda. Nu poate rula do_factura insusi (clic pe grid real), reproduce fidel doar +* pasul SCATTER + apelul Init cu parametrul, cf. propunerii docs\propunere_s3c_4_apelanti_reali.md +* sectiunea 6. +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s3c_4_do_factura_locomanda.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3c_4_do_factura_locomanda.log + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr +PUBLIC goComanda, loComanda +PUBLIC gnMockIdSectie, goExecutorReal +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s3c_4_do_factura_locomanda.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) +gnFail = 0 +gnPass = 0 +gcCaz = "" +gcErr = "" +gnMockIdSectie = 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 +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + +goExecutorReal = goExecutor +goExecutor = CREATEOBJECT("oExecutorMockS3c4") +goExecutor.oReal = goExecutorReal + +DO CazScatterLoComandaVsGlobalaMurdara +DO CazParitateCandCoincid +DO CazLoComandaNuEAliasGlobalei + +DO Final + +*---------------------------------------------------------------------------------------- +* Pasii 1-5 din propunere: crsComenzi minimal, SCATTER NAME loComanda MEMO (linia din diff), +* goComanda populat diferit (simuland navigare anterioara in grid) - Init trebuie sa citeasca +* din parametrul loComanda, nu din globala murdara. +PROCEDURE CazScatterLoComandaVsGlobalaMurdara + gcCaz = "[LOCOMANDA_VS_GLOBALA_MURDARA] " + DO AfLog WITH "PAS: " + gcCaz + + DO CreeazaCrsComenzi + + SELECT crsComenzi + GO 1 + SCATTER NAME loComanda MEMO + + goComanda = CreSursaComanda(999, "GLOBAL MURDAR", "CF-MURDAR", 9999, "NR-MURDAR", 88) + + LOCAL lo + lo = CREATEOBJECT("oDateFactura", 30001, 3, loComanda) + DO Assert WITH VARTYPE(lo) = 'O', "Createobject oDateFactura(tip 3, cu loComanda)" + DO Assert WITH lo.id_client = loComanda.id_part, "id_client din loComanda (501), nu din goComanda (999)" + DO Assert WITH ALLTRIM(lo.nume_client) == ALLTRIM(loComanda.nume), "nume_client din loComanda" + DO Assert WITH ALLTRIM(lo.cod_fiscal) == ALLTRIM(NVL(loComanda.cod_fiscal, '')), "cod_fiscal din loComanda" + DO Assert WITH lo.listaid = loComanda.id_comanda, "listaid din loComanda" + DO Assert WITH ALLTRIM(lo.descriere) == ALLTRIM(loComanda.nr_comanda), "descriere din loComanda" + DO Assert WITH lo.id_sectie = loComanda.id_sectie, "id_sectie din loComanda" + + DO Assert WITH lo.id_client <> goComanda.id_part, "id_client NU e cel din globala murdara (999)" + DO Assert WITH ALLTRIM(lo.nume_client) <> ALLTRIM(goComanda.nume), "nume_client NU e cel din globala murdara" +ENDPROC + +*---------------------------------------------------------------------------------------- +* Pasul 6 din propunere: cand goComanda si loComanda coincid pe valori, calea de fallback +* (fara toSursa) si calea cu parametru dau acelasi rezultat. +PROCEDURE CazParitateCandCoincid + gcCaz = "[PARITATE_CAND_COINCID] " + DO AfLog WITH "PAS: " + gcCaz + + LOCAL loParam + loParam = CreSursaComanda(501, "COMANDA ROW1", "CF-1", 5001, "NR-1", 71) + goComanda = CreSursaComanda(501, "COMANDA ROW1", "CF-1", 5001, "NR-1", 71) + + LOCAL loConParam, loFallback + loConParam = CREATEOBJECT("oDateFactura", 30002, 3, loParam) + loFallback = CREATEOBJECT("oDateFactura", 30003, 3) + + DO Assert WITH loConParam.id_client = loFallback.id_client, "id_client identic: param vs fallback" + DO Assert WITH ALLTRIM(loConParam.nume_client) == ALLTRIM(loFallback.nume_client), "nume_client identic: param vs fallback" + DO Assert WITH ALLTRIM(loConParam.cod_fiscal) == ALLTRIM(loFallback.cod_fiscal), "cod_fiscal identic: param vs fallback" + DO Assert WITH loConParam.listaid = loFallback.listaid, "listaid identic: param vs fallback" + DO Assert WITH ALLTRIM(loConParam.descriere) == ALLTRIM(loFallback.descriere), "descriere identic: param vs fallback" + DO Assert WITH loConParam.id_sectie = loFallback.id_sectie, "id_sectie identic: param vs fallback" +ENDPROC + +*---------------------------------------------------------------------------------------- +* Asertiunea 7 (obligatorie): loComanda nu e alias al lui goComanda. GO 2 pe crsComenzi si +* re-SCATTER pe loComanda schimba doar loComanda; goComanda (nescris in acest pas) ramane +* neschimbat fata de ce a fost setat inainte. +PROCEDURE CazLoComandaNuEAliasGlobalei + gcCaz = "[LOCOMANDA_NU_E_ALIAS] " + DO AfLog WITH "PAS: " + gcCaz + + goComanda = CreSursaComanda(501, "COMANDA ROW1", "CF-1", 5001, "NR-1", 71) + + SELECT crsComenzi + GO 2 + SCATTER NAME loComanda MEMO + + DO Assert WITH loComanda.id_part = 502, "loComanda reflecta randul 2 dupa re-SCATTER" + DO Assert WITH goComanda.id_part = 501, "goComanda ramane neschimbat (randul 1) - variabile distincte" + DO Assert WITH loComanda.id_part <> goComanda.id_part, "loComanda nu e alias al goComanda" +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE CreeazaCrsComenzi + IF USED('crsComenzi') + USE IN crsComenzi + ENDIF + CREATE CURSOR crsComenzi (id_part N(10), nume C(50), cod_fiscal C(20), id_comanda N(10), nr_comanda C(20), id_sectie N(10)) + INSERT INTO crsComenzi VALUES (501, "COMANDA ROW1", "CF-1", 5001, "NR-1", 71) + INSERT INTO crsComenzi VALUES (502, "COMANDA ROW2", "CF-2", 5002, "NR-2", 72) +ENDPROC + +*---------------------------------------------------------------------------------------- +FUNCTION CreSursaComanda + LPARAMETERS tnIdPart, tcNume, tcCodFiscal, tnIdComanda, tcNrComanda, tnIdSectie + CREATE CURSOR _cs4 (id_part N(10), nume C(50), cod_fiscal C(20), id_comanda N(10), nr_comanda C(20), id_sectie N(10)) + INSERT INTO _cs4 VALUES (tnIdPart, tcNume, tcCodFiscal, tnIdComanda, tcNrComanda, tnIdSectie) + LOCAL loS + SCATTER NAME loS MEMO + USE IN _cs4 + RETURN loS +ENDFUNC + +*---------------------------------------------------------------------------------------- +DEFINE CLASS oExecutorMockS3c4 AS oexecutor + oReal = NULL + + PROCEDURE oExecute + LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect + LOCAL lcCur, lcSql, lnPos + lcCur = UPPER(ALLTRIM(TRANSFORM(tcCursor))) + lcSql = TRANSFORM(tcSql) + IF lcCur == 'CRSCOMTEMP' + lnPos = AT('id_sectie =', lcSql) + IF lnPos > 0 + gnMockIdSectie = VAL(SUBSTR(lcSql, lnPos + LEN('id_sectie ='))) + ENDIF + DO CreeazaComTemp WITH gnMockIdSectie + RETURN 1 + ENDIF + RETURN This.oReal.oExecute(tcSql, tcCursor) + ENDPROC + + FUNCTION oPrelucrareEroare + RETURN "MOCK eroare Oracle" + ENDFUNC +ENDDEFINE + +*---------------------------------------------------------------------------------------- +PROCEDURE CreeazaComTemp + LPARAMETERS tnIdSectie + IF USED('crsComTemp') + USE IN crsComTemp + ENDIF + CREATE CURSOR crsComTemp (sectie C(100)) + INSERT INTO crsComTemp VALUES ("SECTIE " + ALLTRIM(STR(tnIdSectie))) + RETURN +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Final + IF TYPE('goExecutorReal') = 'O' + goExecutor = goExecutorReal + ENDIF + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4_3_incarca_filtrat.prg b/utile/Teste/facturare_unificat/test_s4_3_incarca_filtrat.prg new file mode 100644 index 0000000..9270b8e --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4_3_incarca_filtrat.prg @@ -0,0 +1,251 @@ +* test_s4_3_incarca_filtrat.prg +* Headless: do_incarca_articole pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) NU mai cheama +* incarca_cursor_articole pe tipurile de lista de preturi (1, 22, 5, 29, 7, 10, 45). Verifica ramificarea +* introdusa de S4-3: pe aceste tipuri crsfactura ramane gol si accesibil (gridul devine editabil in linie), +* lArticoleIncarcate devine .T. si butonul de incarcare se ascunde, FARA niciun apel Oracle pe crsarticole +* (probat prin gcMockSql ramas gol - oExecutorMock captureaza DOAR apelurile pe cursorul crsarticole, iar +* incarca_cursor_articole trece intotdeauna prin oExecute cu 'crsarticole'). +* +* Asimetrie documentata: 23 NU intra in lista de cautare in linie (ramane pe incarcare in masa, ca azi); +* 23/41 se adauga intr-un pas urmator, impreuna cu decuplarea Rolului B. +* +* Cazuri (toate cu listaid = "1", ca sa treaca valideaza_antet pe tipurile care il cer): +* A1. tip 1 (lista de preturi lei) -> Return .T., gcMockSql gol, crsfactura gol+deschis, lArticoleIncarcate=.T., buton .F. +* A2. tip 5 (lista de preturi valuta) -> identic A1 (in_valuta=1 setat de oDateFactura.Init) +* A3. tip 45 (ROARESTAURANT) -> identic A1 +* B. tip 1, antet invalid (dataireg gol) -> Return .F., gcMockSql gol, lArticoleIncarcate=.F., buton .T. +* +* Oracle NU se atinge pe calea articolelor/generatorului: goExecutor -> oExecutorMock (mock_cursor_articole.prg), +* poGeneratorNumere -> oGeneratorMock (mock_generator_numere.prg). amessagebox/facturi_duplicate -> +* mock_validare_antet.prg. oAntetFacturare.valideaza_antet ruleaza REAL. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4_3_incarca_filtrat.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3_incarca_filtrat.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs +PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3_incarca_filtrat.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockNumar = 0 +gcMockSql = "" +gnMockSucces = 1 +gnMockEroare = 0 +gcMockMod = "PLIN" +gcMockCurs = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_articole.prg", ; + &lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg" +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +update_jtva_coloane([JV], [jtva_coloane_temp]) + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") +poDate = NULL + +goExecutorReal = goExecutor +goExecutor = CREATEOBJECT("oExecutorMock") +goExecutor.oReal = goExecutorReal + +DO Caz WITH "A1_TIP1", 1, .F. +DO Caz WITH "A2_TIP5", 5, .F. +DO Caz WITH "A3_TIP45", 45, .F. +DO Caz WITH "B_TIP1_INVALID", 1, .T. + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz + LPARAMETERS tcCaz, tnTip, tlAntetInvalid + LOCAL loForm, llRezultat + gcCaz = "[" + tcCaz + "] " + DO AfLog WITH "PAS: " + gcCaz + + DO Reseteaza WITH tnTip, tlAntetInvalid + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + DO Assert WITH PEMSTATUS(loForm, 'lArticoleIncarcate', 5), "lArticoleIncarcate materializata" + DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate = .F. la Createobject" + DO Assert WITH ObjExists(loForm, 'but_incarca_articole'), "but_incarca_articole prezent" + DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole vizibil la Createobject" + DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura deschis dar gol inainte de do_incarca_articole" + + llRezultat = loForm.do_incarca_articole() + + DO CASE + CASE tlAntetInvalid + DO Assert WITH !llRezultat, "Return .F. pe antet invalid" + DO Assert WITH EMPTY(gcMockSql), "niciun apel pe crsarticole pe antet invalid - gcMockSql gol" + DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura tot gol dupa antet invalid" + DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate tot .F. dupa antet invalid" + DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole tot vizibil dupa antet invalid" + OTHERWISE + DO Assert WITH llRezultat, "Return .T. pe antet valid" + DO Assert WITH EMPTY(gcMockSql), "incarca_cursor_articole NU a fost apelat - gcMockSql gol pe tip " + TRANSFORM(tnTip) + DO Assert WITH USED('crsfactura'), "crsfactura deschis dupa succes" + DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura gol (editabil in linie) dupa succes" + DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. dupa succes" + DO Assert WITH !loForm.but_incarca_articole.Visible, "but_incarca_articole invizibil dupa succes" + DO Assert WITH UPPER(loForm.grd_factura.RecordSource) == 'CRSFACTURA', "grd_factura.RecordSource = crsfactura" + ENDCASE + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip, tlAntetInvalid + LOCAL lnIdSet + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + SELECT 0 + + * cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcMockSql = "" + gcMockCurs = "" + gcErr = "" + gnMockNumar = 100 + gnMockRaspuns = 6 + gcMockDuplicat = "" + gcMockMod = "PLIN" + gnMockSucces = 1 + gnMockEroare = 0 + + lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10 + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 77 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_valuta = 1 + poDate.listaid = "1" + + IF tlAntetInvalid + poDate.dataireg = {} + ENDIF + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +FUNCTION ObjExists + LPARAMETERS toForm, tcName + LOCAL i + FOR i = 1 TO toForm.Objects.Count + IF UPPER(toForm.Objects(i).Name) == UPPER(tcName) + RETURN .T. + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + IF TYPE('goExecutorReal') = 'O' + goExecutor = goExecutorReal + ENDIF + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4_3_neregresie_masa.prg b/utile/Teste/facturare_unificat/test_s4_3_neregresie_masa.prg new file mode 100644 index 0000000..16ea1e6 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4_3_neregresie_masa.prg @@ -0,0 +1,233 @@ +* test_s4_3_neregresie_masa.prg +* Headless: do_incarca_articole pe frm_facturare_articole2 PASTREAZA apelul incarca_cursor_articole pe +* tipurile care nu sunt lista de preturi (comanda 3, avize 4, contract 2) - comportament identic cu S3-4b. +* Verifica ramificarea introdusa de S4-3: pe aceste tipuri se executa incarcarea in masa (probat prin +* gcMockSql care contine {call pack_facturare.cursor_comanda/cursor_avize/cursor_contract}), crsfactura se +* populeaza din cursorul mockuit, lArticoleIncarcate devine .T. si butonul se ascunde. +* +* Cazuri (toate cu listaid = "1", ca sa treaca valideaza_antet - aceste tipuri cer comanda/avizul/contractul): +* C1. tip 3 (comanda) -> Return .T., 'cursor_comanda' $ gcMockSql, crsfactura populat, lArticoleIncarcate=.T., buton .F. +* C2. tip 4 (avize) -> Return .T., 'cursor_avize' $ gcMockSql, la fel. +* C3. tip 2 (contract) -> Return .T., 'cursor_contract' $ gcMockSql, la fel (mock PLIN2: crsarticole1 pentru +* Insert Into crscontracte din incarca_cursor_articole). +* +* Oracle NU se atinge pe calea articolelor/generatorului: goExecutor -> oExecutorMock (mock_cursor_articole.prg), +* poGeneratorNumere -> oGeneratorMock (mock_generator_numere.prg). amessagebox/facturi_duplicate -> +* mock_validare_antet.prg. oAntetFacturare.valideaza_antet ruleaza REAL. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4_3_neregresie_masa.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3_neregresie_masa.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs +PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3_neregresie_masa.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockNumar = 0 +gcMockSql = "" +gnMockSucces = 1 +gnMockEroare = 0 +gcMockMod = "PLIN" +gcMockCurs = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_articole.prg", ; + &lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg" +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +update_jtva_coloane([JV], [jtva_coloane_temp]) + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") +poDate = NULL + +goExecutorReal = goExecutor +goExecutor = CREATEOBJECT("oExecutorMock") +goExecutor.oReal = goExecutorReal + +DO Caz WITH "C1_TIP3", 3, "PLIN", "cursor_comanda" +DO Caz WITH "C2_TIP4", 4, "PLIN", "cursor_avize" +DO Caz WITH "C3_TIP2", 2, "PLIN2", "cursor_contract" + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz + LPARAMETERS tcCaz, tnTip, tcMockMod, tcCursorSql + LOCAL loForm, llRezultat + gcCaz = "[" + tcCaz + "] " + DO AfLog WITH "PAS: " + gcCaz + + DO Reseteaza WITH tnTip, tcMockMod + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + DO Assert WITH PEMSTATUS(loForm, 'lArticoleIncarcate', 5), "lArticoleIncarcate materializata" + DO Assert WITH !loForm.lArticoleIncarcate, "lArticoleIncarcate = .F. la Createobject" + DO Assert WITH ObjExists(loForm, 'but_incarca_articole'), "but_incarca_articole prezent" + DO Assert WITH loForm.but_incarca_articole.Visible, "but_incarca_articole vizibil la Createobject" + DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') = 0, "crsfactura deschis dar gol inainte de do_incarca_articole" + + llRezultat = loForm.do_incarca_articole() + + DO Assert WITH llRezultat, "Return .T. pe antet valid" + DO Assert WITH !EMPTY(gcMockSql), "incarca_cursor_articole a fost apelat - gcMockSql nevid" + DO Assert WITH tcCursorSql $ gcMockSql, "apel pe " + tcCursorSql + " in gcMockSql: " + STRTRAN(ALLTRIM(gcMockSql), CHR(13) + CHR(10), " | ") + DO Assert WITH USED('crsarticole') AND RECCOUNT('crsarticole') > 0, "crsarticole populat dupa succes (sursa incarcarii in masa)" + DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. dupa succes" + DO Assert WITH !loForm.but_incarca_articole.Visible, "but_incarca_articole invizibil dupa succes" + DO Assert WITH UPPER(loForm.grd_factura.RecordSource) == 'CRSFACTURA', "grd_factura.RecordSource = crsfactura" + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip, tcMockMod + LOCAL lnIdSet + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + SELECT 0 + + * cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcMockSql = "" + gcMockCurs = "" + gcErr = "" + gnMockNumar = 100 + gnMockRaspuns = 6 + gcMockDuplicat = "" + gcMockMod = tcMockMod + gnMockSucces = 1 + gnMockEroare = 0 + + lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10 + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 77 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_valuta = 1 + poDate.listaid = "1" + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +FUNCTION ObjExists + LPARAMETERS toForm, tcName + LOCAL i + FOR i = 1 TO toForm.Objects.Count + IF UPPER(toForm.Objects(i).Name) == UPPER(tcName) + RETURN .T. + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + IF TYPE('goExecutorReal') = 'O' + goExecutor = goExecutorReal + ENDIF + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4_3b_combosql_filtrat.prg b/utile/Teste/facturare_unificat/test_s4_3b_combosql_filtrat.prg new file mode 100644 index 0000000..5bf0345 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4_3b_combosql_filtrat.prg @@ -0,0 +1,353 @@ +* test_s4_3b_combosql_filtrat.prg +* Headless: S4-3 bucata 2 - combosql (grd_factura.cCodMat.cboCodmat / cDenumire.cCboDenumire) alimentat din +* {call pack_facturare.cursor_preturi(...)} FILTRAT (V_FILTRU_COD/V_FILTRU_DEN), in loc de view-ul static +* vnom_articole; iar linia aleasa ajunge in crsfactura cu pret/TVA/id_jtva_coloana completate prin +* do_adauga_articol_cautat. +* +* Combosql e subclasat ca combosql_cautare (COMUN\clase\ofacturare.vcx); mock-ul intercepteaza +* DOAR cursoarele brute crsCodmatRaw/crsDenumireRaw (oExecutorMockPret din mock_cursor_preturi.prg) si +* jurnalizeaza SQL-ul in gcMockSql. Capcana grid-coloane-nu-se-materializeaza-headless: nu se randeaza +* gridul, se citesc direct cursoarele (scrsCodmat/scrsDenumire/crsfactura) si se apeleaza metodele programatic. +* +* Cazuri: +* A. transport + mapare cboCodmat: RefreshData(1) pe "CM" -> SQL {call ...cursor_preturi...} cu ?pcFiltruCod/ +* ?pcFiltruDen, FARA vnom_articole; scrsCodmat are codmat pe coloana 1 si campurile pret/proc_tvav/id_pol/ +* gestionabil/preturi_cu_tva prezente. +* B. transport + mapare cCboDenumire: idem, filtrul merge pe denumire, coloana 1 = denumire. +* C. INIT: dupa CREATEOBJECT al formularului, gcMockSql e GOL (niciun {call cursor_preturi} la deschidere). +* D. flux rand: linia aleasa (scatter din crsCodmat) intra in crsfactura prin do_adauga_articol_cautat cu +* codmat/denumire/id_articol/pretftva/proc_tvav/id_jtva_coloana completate. +* +* Oracle NU se atinge pe calea cautarii (mock pe cursor_preturi); restul (oAntetFacturare, cCboGestiune -> +* VNOM_GESTIUNI) merge la executorul real. poGeneratorNumere -> oGeneratorMock. amessagebox -> mock_validare_antet. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4_3b_combosql_filtrat.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3b_combosql_filtrat.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs +PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal +PUBLIC gnPc, gnPVal, gnPPretV, gnScadereStoc, gnMemProcDisc +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3b_combosql_filtrat.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockNumar = 0 +gcMockSql = "" +gnMockSucces = 1 +gnMockEroare = 0 +gcMockMod = "PLIN" +gcMockCurs = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +gnPc = 2 +gnPVal = 2 +gnPPretV = 4 +gnScadereStoc = 1 +gnMemProcDisc = 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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_preturi.prg", ; + &lcProc +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +gnPc = 2 +gnPVal = 2 +gnPPretV = 4 +gnScadereStoc = 1 +gnMemProcDisc = 0 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +update_jtva_coloane([JV], [jtva_coloane_temp]) + +* jtva_coloane: cursorul folosit de derivarea id_jtva_coloana din proc_tvav (do_adauga_articol_cautat) +IF USED('jtva_coloane') + USE IN jtva_coloane +ENDIF +CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2)) +INSERT INTO jtva_coloane VALUES (190, 'TVA 19%', 19) +INSERT INTO jtva_coloane VALUES (210, 'TVA 21%', 21) +INSERT INTO jtva_coloane VALUES (110, 'TVA 11%', 11) +GO TOP IN jtva_coloane + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") +poDate = NULL + +goExecutorReal = goExecutor +goExecutor = CREATEOBJECT("oExecutorMockPret") +goExecutor.oReal = goExecutorReal + +DO Caz_Init +DO Caz_Transport_Cod +DO Caz_Transport_Den +DO Caz_Flux_Rand + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz_Init + gcCaz = "[INIT] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 1, .F. + LOCAL loForm + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + DO Assert WITH UPPER(loForm.grd_factura.cCodMat.cboCodmat.Class) == 'COMBOSQL_CAUTARE', "cboCodmat e combosql_cautare" + DO Assert WITH UPPER(loForm.grd_factura.cDenumire.cCboDenumire.Class) == 'COMBOSQL_CAUTARE', "cCboDenumire e combosql_cautare" + DO Assert WITH EMPTY(gcMockSql), "INIT: niciun {call cursor_preturi} la deschiderea formularului - gcMockSql gol" + DO Assert WITH USED('scrsCodmat'), "INIT: scrsCodmat creat (structura mapata, gol)" + DO Assert WITH UPPER(Field(1, 'scrsCodmat')) == 'CODMAT', "INIT: scrsCodmat coloana 1 = codmat" + DO Assert WITH USED('scrsDenumire'), "INIT: scrsDenumire creat" + DO Assert WITH UPPER(Field(1, 'scrsDenumire')) == 'DENUMIRE', "INIT: scrsDenumire coloana 1 = denumire" + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz_Transport_Cod + gcCaz = "[TRANSPORT_COD] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 1, .F. + LOCAL loForm, loCombo + loForm = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + loCombo = loForm.grd_factura.cCodMat.cboCodmat + loCombo.cSearchString = "CM" + DO Assert WITH loCombo.RefreshData(1), "RefreshData(1) intoarce .T." + DO Assert WITH !EMPTY(gcMockSql), "apelul de cautare a trecut prin goExecutor (gcMockSql nevid)" + DO Assert WITH '{CALL' $ UPPER(gcMockSql), "SQL-ul capturat e un {call ...}" + DO Assert WITH 'CURSOR_PRETURI' $ UPPER(gcMockSql), "SQL-ul capturat cheama cursor_preturi" + DO Assert WITH '?PCFILTRUCOD' $ UPPER(gcMockSql), "SQL-ul contine ?pcFiltruCod" + DO Assert WITH '?PCFILTRUDEN' $ UPPER(gcMockSql), "SQL-ul contine ?pcFiltruDen" + DO Assert WITH !('VNOM_ARTICOLE' $ UPPER(gcMockSql)), "SQL-ul NU mai contine vnom_articole" + DO Assert WITH loCombo.cfiltrucod == "CM%", "cfiltrucod = CM% (incepe cu)" + DO Assert WITH EMPTY(loCombo.cfiltruden), "cfiltruden gol pe cautarea dupa cod" + DO Assert WITH USED('scrsCodmat'), "scrsCodmat deschis dupa cautare" + DO Assert WITH UPPER(Field(1, 'scrsCodmat')) == 'CODMAT', "scrsCodmat coloana 1 = codmat" + DO Assert WITH TYPE('scrsCodmat.pret') <> 'U' AND TYPE('scrsCodmat.proc_tvav') <> 'U', "scrsCodmat are pret/proc_tvav" + DO Assert WITH TYPE('scrsCodmat.id_pol') <> 'U' AND TYPE('scrsCodmat.gestionabil') <> 'U', "scrsCodmat are id_pol/gestionabil" + DO Assert WITH TYPE('scrsCodmat.preturi_cu_tva') <> 'U', "scrsCodmat are preturi_cu_tva" + DO Assert WITH RECCOUNT('scrsCodmat') = 2, "scrsCodmat are cele 2 randuri din mock" + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz_Transport_Den + gcCaz = "[TRANSPORT_DEN] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 1, .F. + LOCAL loForm, loCombo + loForm = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + loCombo = loForm.grd_factura.cDenumire.cCboDenumire + loCombo.cSearchString = "ART" + DO Assert WITH loCombo.RefreshData(1), "RefreshData(1) intoarce .T. (denumire)" + DO Assert WITH '?PCFILTRUDEN' $ UPPER(gcMockSql), "SQL-ul contine ?pcFiltruDen (denumire)" + DO Assert WITH loCombo.cfiltruden == "ART%", "cfiltruden = ART% (incepe cu)" + DO Assert WITH EMPTY(loCombo.cfiltrucod), "cfiltrucod gol pe cautarea dupa denumire" + DO Assert WITH USED('scrsDenumire'), "scrsDenumire deschis dupa cautare" + DO Assert WITH UPPER(Field(1, 'scrsDenumire')) == 'DENUMIRE', "scrsDenumire coloana 1 = denumire" + DO Assert WITH TYPE('scrsDenumire.pret') <> 'U' AND TYPE('scrsDenumire.id_articol') <> 'U', "scrsDenumire are pret/id_articol" + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz_Flux_Rand + gcCaz = "[FLUX_RAND] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 1, .F. + LOCAL loForm, loCombo, loArticol + loForm = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + loCombo = loForm.grd_factura.cCodMat.cboCodmat + loCombo.cSearchString = "CM" + loCombo.RefreshData(1) + DO Assert WITH USED('scrsCodmat') AND RECCOUNT('scrsCodmat') = 2, "scrsCodmat populat (2 randuri) inainte de flux" + + * mimic RowSource-ul combobox-ului: crsCodmat = select * from scrsCodmat + SELECT * FROM scrsCodmat INTO CURSOR crsCodmat READWRITE + GO TOP IN crsCodmat + SCATTER NAME loArticol MEMO + + SELECT crsfactura + APPEND BLANK + DO Assert WITH RECCOUNT('crsfactura') = 1, "crsfactura are o linie goala (But_nou1) inainte de adaugare" + loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate) + + DO Assert WITH RECCOUNT('crsfactura') = 1, "do_adauga_articol_cautat NU a adaugat o a doua linie (scrie in linia curenta)" + DO Assert WITH ALLTRIM(crsfactura.codmat) == "CM1", "crsfactura.codmat = CM1" + DO Assert WITH ALLTRIM(crsfactura.denumire) == "Articol A", "crsfactura.denumire = Articol A" + DO Assert WITH crsfactura.id_articol = 11, "crsfactura.id_articol = 11" + DO Assert WITH crsfactura.proc_tvav = 1.19, "crsfactura.proc_tvav = 1.19" + DO Assert WITH crsfactura.pretftva = 100, "crsfactura.pretftva = 100 (derivat din pret + proc_tvav)" + DO Assert WITH crsfactura.id_jtva_coloana = 190, "crsfactura.id_jtva_coloana = 190 (derivat din proc_tvav prin jtva_coloane)" + DO Assert WITH crsfactura.id_c = 0, "crsfactura.id_c = 0 (linie libera)" + DO Assert WITH ALLTRIM(crsfactura.um) == "BUC", "crsfactura.um = BUC" + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip, tlAntetInvalid + LOCAL lnIdSet + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + DO Inchide WITH 'scrsCodmat' + DO Inchide WITH 'crsCodmat' + DO Inchide WITH 'scrsDenumire' + DO Inchide WITH 'crsDenumire' + DO Inchide WITH 'crsCodmatRaw' + DO Inchide WITH 'crsDenumireRaw' + DO Inchide WITH 'scrsGestiuni' + DO Inchide WITH 'crsGestiuni' + SELECT 0 + + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcMockSql = "" + gcMockCurs = "" + gcErr = "" + gnMockNumar = 100 + gnMockRaspuns = 6 + gcMockDuplicat = "" + gcMockMod = "PLIN" + gnMockSucces = 1 + gnMockEroare = 0 + + lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10 + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 77 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_valuta = 1 + poDate.listaid = "1" + + IF tlAntetInvalid + poDate.dataireg = {} + ENDIF + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +FUNCTION ObjExists + LPARAMETERS toForm, tcName + LOCAL i + FOR i = 1 TO toForm.Objects.Count + IF UPPER(toForm.Objects(i).Name) == UPPER(tcName) + RETURN .T. + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + IF TYPE('goExecutorReal') = 'O' + goExecutor = goExecutorReal + ENDIF + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4_3c_combosql_tip41.prg b/utile/Teste/facturare_unificat/test_s4_3c_combosql_tip41.prg new file mode 100644 index 0000000..49b242d --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4_3c_combosql_tip41.prg @@ -0,0 +1,290 @@ +* test_s4_3c_combosql_tip41.prg +* Headless: decizia 8 (plan #13) - tip 41 (aviz retur transfer subunitati din lista) intra in +* llCautareInLinie si combosql_cautare.cursor_preturi_call comuta pe {call pack_facturare.cursor_gestiune(...)} +* (gestiunea EXACTA de transfer, poDate.id_pol/poDate.id_client), nu mai pe cursor_preturi +* (grupul de gestiuni, poDate.id_gestiune_init). Clona lui test_s4_3b_combosql_filtrat.prg, tip 41 +* in loc de 1, plus proba de neregresie a mass-load-ului (do_incarca_articole nu mai cheama +* incarca_cursor_articole pentru 41, la fel ca celelalte tipuri deja din Inlist). +* +* Mock identic cu test_s4_3b: oExecutorMockPret (mock_cursor_preturi.prg) intercepteaza DOAR +* crsCodmatRaw/crsDenumireRaw dupa numele cursorului, nu dupa continutul SQL - functioneaza +* neschimbat si pentru cursor_gestiune. +* +* Cazuri: +* A. Caz_Transport_Cod: RefreshData(1) pe "CM" -> SQL {call ...cursor_gestiune...} cu ?poDate.id_pol/ +* ?poDate.id_client (NU ?poDate.id_gestiune_init), FARA cursor_preturi in text; restul identic +* cu comportamentul de azi pentru celelalte tipuri (cfiltrucod, coloane scrsCodmat). +* B. Caz_NeregresieMasa41: do_incarca_articole() pe tip 41 NU cheama incarca_cursor_articole +* (crsarticole ramane neincarcat) - la fel ca test_s4_3_neregresie_masa.prg pentru celelalte +* tipuri deja in Inlist. +* +* Oracle NU se atinge pe calea cautarii (mock pe cursor_preturi/cursor_gestiune - acelasi mock, dupa +* numele cursorului brut). poGeneratorNumere -> oGeneratorMock. amessagebox/facturi_duplicate -> +* mock_validare_antet. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4_3c_combosql_tip41.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3c_combosql_tip41.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs +PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal +PUBLIC gnPc, gnPVal, gnPPretV, gnScadereStoc, gnMemProcDisc +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_3c_combosql_tip41.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockNumar = 0 +gcMockSql = "" +gnMockSucces = 1 +gnMockEroare = 0 +gcMockMod = "PLIN" +gcMockCurs = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +gnPc = 2 +gnPVal = 2 +gnPPretV = 4 +gnScadereStoc = 1 +gnMemProcDisc = 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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_preturi.prg", ; + &lcProc +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +gnPc = 2 +gnPVal = 2 +gnPPretV = 4 +gnScadereStoc = 1 +gnMemProcDisc = 0 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +update_jtva_coloane([JV], [jtva_coloane_temp]) + +* jtva_coloane: cursorul folosit de derivarea id_jtva_coloana din proc_tvav (do_adauga_articol_cautat) +IF USED('jtva_coloane') + USE IN jtva_coloane +ENDIF +CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2)) +INSERT INTO jtva_coloane VALUES (190, 'TVA 19%', 19) +INSERT INTO jtva_coloane VALUES (210, 'TVA 21%', 21) +INSERT INTO jtva_coloane VALUES (110, 'TVA 11%', 11) +GO TOP IN jtva_coloane + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") +poDate = NULL + +goExecutorReal = goExecutor +goExecutor = CREATEOBJECT("oExecutorMockPret") +goExecutor.oReal = goExecutorReal + +DO Caz_Transport_Cod +DO Caz_NeregresieMasa41 + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz_Transport_Cod + gcCaz = "[TRANSPORT_COD_TIP41] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 41, .F. + LOCAL loForm, loCombo + loForm = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + loCombo = loForm.grd_factura.cCodMat.cboCodmat + loCombo.cSearchString = "CM" + DO Assert WITH loCombo.RefreshData(1), "RefreshData(1) intoarce .T." + DO Assert WITH !EMPTY(gcMockSql), "apelul de cautare a trecut prin goExecutor (gcMockSql nevid)" + DO Assert WITH '{CALL' $ UPPER(gcMockSql), "SQL-ul capturat e un {call ...}" + DO Assert WITH 'CURSOR_GESTIUNE' $ UPPER(gcMockSql), "SQL-ul capturat cheama cursor_gestiune (nu cursor_preturi)" + DO Assert WITH !('CURSOR_PRETURI' $ UPPER(gcMockSql)), "SQL-ul NU mai cade pe cursor_preturi pentru tip 41" + DO Assert WITH '?PODATE.ID_POL' $ UPPER(gcMockSql), "SQL-ul contine ?poDate.id_pol" + DO Assert WITH '?PODATE.ID_CLIENT' $ UPPER(gcMockSql), "SQL-ul contine ?poDate.id_client (gestiunea exacta)" + DO Assert WITH !('ID_GESTIUNE_INIT' $ UPPER(gcMockSql)), "SQL-ul NU mai contine id_gestiune_init (grupul de gestiuni)" + DO Assert WITH '?PCFILTRUCOD' $ UPPER(gcMockSql), "SQL-ul contine ?pcFiltruCod" + DO Assert WITH '?PCFILTRUDEN' $ UPPER(gcMockSql), "SQL-ul contine ?pcFiltruDen" + DO Assert WITH loCombo.cfiltrucod == "CM%", "cfiltrucod = CM% (incepe cu)" + DO Assert WITH USED('scrsCodmat'), "scrsCodmat deschis dupa cautare" + DO Assert WITH UPPER(Field(1, 'scrsCodmat')) == 'CODMAT', "scrsCodmat coloana 1 = codmat" + DO Assert WITH TYPE('scrsCodmat.pret') <> 'U' AND TYPE('scrsCodmat.proc_tvav') <> 'U', "scrsCodmat are pret/proc_tvav" + DO Assert WITH TYPE('scrsCodmat.id_pol') <> 'U' AND TYPE('scrsCodmat.gestionabil') <> 'U', "scrsCodmat are id_pol/gestionabil" + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz_NeregresieMasa41 + gcCaz = "[NEREGRESIE_MASA_TIP41] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 41, .F. + LOCAL loForm, llRezultat + loForm = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + llRezultat = loForm.do_incarca_articole() + DO Assert WITH llRezultat, "do_incarca_articole() Return .T. pe antet valid, gcErr=[" + gcErr + "] gcMockApeluri=[" + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), " | ") + "]" + DO Assert WITH !USED('crsarticole'), "crsarticole NU e deschis (mass-load nu s-a executat pentru tip 41)" + DO Assert WITH loForm.lArticoleIncarcate, "lArticoleIncarcate = .T. (a intrat pe ramura llCautareInLinie)" + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip, tlAntetInvalid + LOCAL lnIdSet + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + DO Inchide WITH 'scrsCodmat' + DO Inchide WITH 'crsCodmat' + DO Inchide WITH 'scrsDenumire' + DO Inchide WITH 'crsDenumire' + DO Inchide WITH 'crsCodmatRaw' + DO Inchide WITH 'crsDenumireRaw' + DO Inchide WITH 'scrsGestiuni' + DO Inchide WITH 'crsGestiuni' + SELECT 0 + + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcMockSql = "" + gcMockCurs = "" + gcErr = "" + gnMockNumar = 100 + gnMockRaspuns = 6 + gcMockDuplicat = "" + gcMockMod = "PLIN" + gnMockSucces = 1 + gnMockEroare = 0 + + lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10 + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 77 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_valuta = 1 + poDate.listaid = "1" + + IF tnTip = 41 + poDate.nIdTipDoc = poDate.nIdTipDocAvizExpeditie + poDate.id_pol = 31 + ENDIF + + IF tlAntetInvalid + poDate.dataireg = {} + ENDIF + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +FUNCTION ObjExists + LPARAMETERS toForm, tcName + LOCAL i + FOR i = 1 TO toForm.Objects.Count + IF UPPER(toForm.Objects(i).Name) == UPPER(tcName) + RETURN .T. + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + IF TYPE('goExecutorReal') = 'O' + goExecutor = goExecutorReal + ENDIF + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4_4_rol_a_paritate.prg b/utile/Teste/facturare_unificat/test_s4_4_rol_a_paritate.prg new file mode 100644 index 0000000..7d8ffda --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4_4_rol_a_paritate.prg @@ -0,0 +1,254 @@ +* test_s4_4_rol_a_paritate.prg +* Headless: paritate S4-4 (Rol A, do_scrie_factura, COMUN\clase\ofacturare.vc2:20048-20137). +* NU cheama do_scrie_factura si nu scrie nicio factura - compara direct, pe date REALE din +* MARIUSM_AUTO, cele doua cai de calcul al "cantitatii ramase": +* VECHI: acelasi apel Oracle (cursor_comanda / cursor_avize) folosit de incarca_cursor_articole +* ca sa populeze crsarticole inainte de S4-4, urmat de Select crsarticole / Calculate Sum(cantitate) +* (cod care nu mai e eliminat: do_scrie_factura il combina acum cu semnalul Oracle prin Min). +* NOU: apelul Oracle introdus de S4-4 (pack_facturare.cantitate_ramasa_comanda / exista_ramas_avize_lista), +* citit prin SELECT ... FROM dual, la fel cum face acum do_scrie_factura. +* Daca cele doua cai dau aceeasi valoare pe fiecare caz, inlocuirea nu schimba verdictul de care +* depinde dialogul de confirmare (inchidere comanda / aviz de retur). +* +* ID-uri comanda: preluate din docs\raport_s4_2.md sectiunea 4.1 (deja verificate acolo cu SELECT +* direct). ID-uri aviz: din docs\raport_s4_4_oracle_varianta_c.md sectiunea 6 (avize cu corespondenta +* TIP=1 inca prezenta in VANZARI_CORESP) + o combinatie sintetica cu doua avize (mecanism de lista, +* nu caz real - vezi DATORII in raportul final). +* +* TestSecventaNoua (adaugata in review): PROCEDURE Test* de mai sus compara valori, dar nu executa +* niciodata CODUL SCRIS in ofacturare.vc2 (o cerea rescrie propriul apel intr-un cursor cu alt nume, +* 'crstestramas') - de-asta prima rulare a trecut 12/12 cu bug-ul "Use In (crsramasavize)" (paranteze +* = evaluare ca VARIABILA in VFP, nu alias) inca in cod, netestat. TestSecventaNoua reproduce LITERAL +* secventa noua din ambele ramuri (lcSql/goExecutor.oExecute/citire/Use In, ofacturare.vc2:20051-20058 +* si :20088-20095), cu aceleasi nume de cursor ca in clasa, si aserteaza explicit ca alias-ul se +* inchide (Used() = .F.) dupa Use In. Nu se cheama do_scrie_factura/do_termin() prin +* CREATEOBJECT('frm_facturare_articole2') urmat de emitere reala: docs\raport_s3b_emitere_reala.md +* documenteaza un blocaj cunoscut la acest CREATEOBJECT cand formularul unificat isi populeaza +* grila cu date reale (coloana Gestiune, combo pe cursor SQL) - risc de agatare pe o masina +* partajata, neasumat pentru un test de acoperire a doua linii. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4_4_rol_a_paritate.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_4_rol_a_paritate.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_4_rol_a_paritate.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +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 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + +PRIVATE poDate, pnTotalDiscountAvize +poDate = NULL +pnTotalDiscountAvize = 0 + +DO TestRamuraComanda +DO TestRamuraAviz +DO TestSecventaNoua + +DO Final + +*---------------------------------------------------------------------------------------- +* Ramura comanda (Case Inlist(poDate.Tip,3,21,25,28,42,47)) - cantitate_ramasa_comanda +PROCEDURE TestRamuraComanda + LOCAL laIds[1], nCnt, i, lnId, lnOldSum, lnNewVal, lcSql + nCnt = ALINES(laIds, "657,1163,2154,1191,1503,1572,2229,2268", 1, ",") + FOR i = 1 TO nCnt + lnId = VAL(laIds[i]) + gcCaz = "[comanda id_comanda=" + TRANSFORM(lnId) + "] " + DO AfLog WITH "PAS: " + gcCaz + + DO Inchide WITH 'crsarticole' + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 30000 + lnId, 3) + poDate.zi_curs = DATE(gnAn, gnLuna, 1) + poDate.listaid = ALLTRIM(STR(lnId)) + + lcSql = [{call pack_facturare.cursor_comanda(?poDate.zi_curs,?poDate.tip,?poDate.listaid,?gnIdUtil)}] + IF goExecutor.oExecute(lcSql, 'crsarticole') < 0 + DO Assert WITH .F., "cursor_comanda apel esuat: " + goExecutor.oPrelucrareEroare() + LOOP + ENDIF + + lnOldSum = 0 + IF USED('crsarticole') AND RECCOUNT('crsarticole') > 0 + SELECT crsarticole + CALCULATE SUM(cantitate) TO lnOldSum + ENDIF + + lcSql = [SELECT pack_facturare.cantitate_ramasa_comanda(] + ALLTRIM(STR(lnId)) + [) AS ramas FROM dual] + IF goExecutor.oExecute(lcSql, 'crstestramas') < 0 + DO Assert WITH .F., "cantitate_ramasa_comanda apel esuat: " + goExecutor.oPrelucrareEroare() + DO Inchide WITH 'crsarticole' + LOOP + ENDIF + lnNewVal = crstestramas.ramas + DO Inchide WITH 'crstestramas' + + DO Assert WITH ROUND(NVL(lnOldSum, 0), 2) == ROUND(NVL(lnNewVal, 0), 2), ; + "vechi(Calculate Sum)=" + TRANSFORM(lnOldSum) + " nou(cantitate_ramasa_comanda)=" + TRANSFORM(lnNewVal) + + DO Inchide WITH 'crsarticole' + ENDFOR +ENDPROC + +*---------------------------------------------------------------------------------------- +* Ramura aviz (Case poDate.Tip = 4) - exista_ramas_avize_lista +PROCEDURE TestRamuraAviz + LOCAL laListe[1], nCnt, i, lcLista, lnOldSum, lnNewVal, lcSql + nCnt = ALINES(laListe, "1052|973|140|1052,973", 1, "|") + FOR i = 1 TO nCnt + lcLista = laListe[i] + gcCaz = "[aviz listaid=" + lcLista + "] " + DO AfLog WITH "PAS: " + gcCaz + + DO Inchide WITH 'crsarticole' + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 40000 + i, 4) + poDate.zi_curs = DATE(gnAn, gnLuna, 1) + poDate.listaid = lcLista + pnTotalDiscountAvize = 0 + + lcSql = [{call pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}] + IF goExecutor.oExecute(lcSql, 'crsarticole') < 0 + DO Assert WITH .F., "cursor_avize apel esuat: " + goExecutor.oPrelucrareEroare() + LOOP + ENDIF + + lnOldSum = 0 + IF USED('crsarticole') AND RECCOUNT('crsarticole') > 0 + SELECT crsarticole + CALCULATE SUM(cantitate) TO lnOldSum + ENDIF + + lcSql = [SELECT pack_facturare.exista_ramas_avize_lista('] + lcLista + [') AS ramas FROM dual] + IF goExecutor.oExecute(lcSql, 'crstestramas') < 0 + DO Assert WITH .F., "exista_ramas_avize_lista apel esuat: " + goExecutor.oPrelucrareEroare() + DO Inchide WITH 'crsarticole' + LOOP + ENDIF + lnNewVal = crstestramas.ramas + DO Inchide WITH 'crstestramas' + + DO Assert WITH ROUND(NVL(lnOldSum, 0), 2) == ROUND(NVL(lnNewVal, 0), 2), ; + "vechi(Calculate Sum)=" + TRANSFORM(lnOldSum) + " nou(exista_ramas_avize_lista)=" + TRANSFORM(lnNewVal) + + DO Inchide WITH 'crsarticole' + ENDFOR +ENDPROC + +*---------------------------------------------------------------------------------------- +* Reproduce LITERAL secventa noua din ofacturare.vc2 (aceleasi nume de cursor: crsramasavize, +* crsramascomanda), ca sa execute efectiv codul scris - nu doar o comparatie de valori pe alt +* cursor. Aserteaza explicit ca alias-ul se inchide dupa Use In (Used() = .F.) - exact ce ar fi +* prins bug-ul "Use In (crsramasavize)" (paranteze = evaluare ca variabila in VFP, eroare la +* rulare, alias ramas deschis). +PROCEDURE TestSecventaNoua + LOCAL lcSql, lnCantitateRamasa + + gcCaz = "[secventa noua - aviz, listaid=1052] " + DO AfLog WITH "PAS: " + gcCaz + DO Inchide WITH 'crsramasavize' + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 50001, 4) + poDate.listaid = "1052" + + *-- reproducere literala, ofacturare.vc2:20051-20058 + lcSql = [SELECT pack_facturare.exista_ramas_avize_lista('] + Alltrim(poDate.listaid) + [') AS ramas FROM dual] + IF goExecutor.oExecute(lcSql,'crsramasavize') < 0 + DO Assert WITH .F., "aviz: apelul nou a esuat: " + goExecutor.oPrelucrareEroare() + ELSE + DO Assert WITH USED('crsramasavize'), "aviz: cursorul crsramasavize a fost deschis de oExecute" + lnCantitateRamasa = crsramasavize.ramas + Use In (Select('crsramasavize')) + DO Assert WITH !USED('crsramasavize'), "aviz: Use In (Select(...)) a inchis alias-ul (Used()=.F.)" + DO Assert WITH VARTYPE(lnCantitateRamasa) == 'N', "aviz: lnCantitateRamasa citit ca numeric (" + TRANSFORM(lnCantitateRamasa) + ")" + ENDIF + + gcCaz = "[secventa noua - comanda, listaid=1163] " + DO AfLog WITH "PAS: " + gcCaz + DO Inchide WITH 'crsramascomanda' + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 50002, 3) + poDate.listaid = "1163" + + *-- reproducere literala, ofacturare.vc2:20088-20095 + lcSql = [SELECT pack_facturare.cantitate_ramasa_comanda(] + Alltrim(Str(Val(poDate.listaid))) + [) AS ramas FROM dual] + IF goExecutor.oExecute(lcSql,'crsramascomanda') < 0 + DO Assert WITH .F., "comanda: apelul nou a esuat: " + goExecutor.oPrelucrareEroare() + ELSE + DO Assert WITH USED('crsramascomanda'), "comanda: cursorul crsramascomanda a fost deschis de oExecute" + lnCantitateRamasa = crsramascomanda.ramas + Use In (Select('crsramascomanda')) + DO Assert WITH !USED('crsramascomanda'), "comanda: Use In (Select(...)) a inchis alias-ul (Used()=.F.)" + DO Assert WITH VARTYPE(lnCantitateRamasa) == 'N', "comanda: lnCantitateRamasa citit ca numeric (" + TRANSFORM(lnCantitateRamasa) + ")" + ENDIF + + *-- Cazul care probeaza castigul formei Use In (Select(...)) fata de forma bara: alias + *-- INEXISTENT (cursorul n-a fost creat, de exemplu pe o cale unde oExecute ar fi esuat). + *-- Select('alias') intoarce 0 daca alias-ul nu e deschis, iar Use In (0) e no-op - deci + *-- linia nu arunca eroare. Forma bara (Use In crsramasavize) ar arunca "Alias not found". + gcCaz = "[secventa noua - alias inexistent] " + DO AfLog WITH "PAS: " + gcCaz + DO Inchide WITH 'crsramasavize' + DO Assert WITH !USED('crsramasavize'), "alias inexistent: crsramasavize confirmat inchis inainte de proba" + LOCAL lnErrInainte + lnErrInainte = gnErr + Use In (Select('crsramasavize')) + DO Assert WITH gnErr == lnErrInainte, "alias inexistent: Use In (Select(...)) pe alias inchis NU arunca eroare (gnErr neschimbat)" +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4_5_do_sterge_garda.prg b/utile/Teste/facturare_unificat/test_s4_5_do_sterge_garda.prg new file mode 100644 index 0000000..d592d4f --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4_5_do_sterge_garda.prg @@ -0,0 +1,303 @@ +* test_s4_5_do_sterge_garda.prg +* Headless: EXECUTA garda noua Used(lcCursor) din do_sterge (COMUN\clase\ofacturare.vc2:20413-20447), +* singura parte din S4-5 ramasa in acest tur - vezi docs\raport_s4_5_implementare.md pentru motivul +* pentru care extinderea llCautareInLinie la 23 si plafonul Rol B in do_adauga_articol_cautat au fost +* REVENITE (blocaj real gasit prin aceasta suita, nu prin citire de cod). +* +* 1. Garda noua: stergerea unei linii adaugate prin do_adauga_articol_cautat (deci crsarticole +* NEIncarcat - cazul tipurilor din llCautareInLinie, ex. tip 1) nu mai arunca eroare de alias +* la Select(lcCursor). Fara fix, aceasta suita ar fi cazut cu "ERROR ... Alias ... not found". +* 2. Neregresie Rol A: pe un tip comanda (crsarticole incarcat), do_sterge restaureaza cantitatea +* exact ca inainte de fix - fix-ul adauga doar garda, nu schimba continutul Do Case-ului. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4_5_do_sterge_garda.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_5_do_sterge_garda.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat, gnMockNumar +PUBLIC gnPc, gnPVal, gnPPretV, gnScadereStoc, gnMemProcDisc +gnMockNumar = 0 +gnPc = 2 +gnPVal = 2 +gnPPretV = 4 +gnScadereStoc = 1 +gnMemProcDisc = 0 +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4_5_do_sterge_garda.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +gnIdSucursala = 167 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +update_jtva_coloane([JV], [jtva_coloane_temp]) + +* jtva_coloane: cursorul folosit de derivarea id_jtva_coloana din proc_tvav (do_adauga_articol_cautat) +IF USED('jtva_coloane') + USE IN jtva_coloane +ENDIF +CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2)) +INSERT INTO jtva_coloane VALUES (190, 'TVA 19%', 19) +INSERT INTO jtva_coloane VALUES (210, 'TVA 21%', 21) +INSERT INTO jtva_coloane VALUES (110, 'TVA 11%', 11) +GO TOP IN jtva_coloane + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poDate = NULL +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") + +DO TestStergereLinieCautata WITH 315554536 +DO TestStergereNeregresieRolA + +DO Final + +*---------------------------------------------------------------------------------------- +* do_sterge: linie adaugata prin do_adauga_articol_cautat pe un tip din llCautareInLinie +* (crsarticole NU e incarcat) - inainte de fix ar fi cazut cu eroare de alias la Select(lcCursor). +PROCEDURE TestStergereLinieCautata + LPARAMETERS tnIdArticol + LOCAL loForm, loArticol + + gcCaz = "[do_sterge pe linie cautata, crsarticole neincarcat] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 1 + DO Inchide WITH 'crsarticole' + DO Assert WITH !USED('crsarticole'), "precondition: crsarticole NU e deschis" + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + SELECT crsfactura + APPEND BLANK + loArticol = ConstruiesteArticol(tnIdArticol, 1) + loForm.do_adauga_articol_cautat(loArticol, 1) + DO Assert WITH RECCOUNT('crsfactura') = 1, "randul a fost adaugat inainte de stergere" + + gcErr = "" + gnErr = 0 + gnMockRaspuns = 6 && confirma stergerea + loForm.do_sterge() + + DO Assert WITH gnErr = 0, "do_sterge nu arunca nicio eroare cand crsarticole nu e deschis (gnErr=" + TRANSFORM(gnErr) + ")" + DO Assert WITH !("ALIAS" $ UPPER(gcErr)) AND !("CRSARTICOLE" $ UPPER(gcErr)), "fara eroare de alias/crsarticole in gcErr" + DO Assert WITH RECCOUNT('crsfactura') = 0, "randul a fost sters din crsfactura" + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* Neregresie Rol A: tip comanda (3), crsarticole incarcat - do_sterge trebuie sa refaca +* cantitatea in crsarticole exact ca inainte de fix (fix-ul adauga doar garda Used(), nu schimba +* continutul Do Case-ului pentru tipurile unde crsarticole e Used()). +PROCEDURE TestStergereNeregresieRolA + LOCAL loForm + + gcCaz = "[do_sterge neregresie Rol A, tip=3, crsarticole incarcat] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 3 + + SELECT 0 + CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ; + gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ; + preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ; + Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; + codmat C(50), codbare C(50), nume_val C(20)) + INSERT INTO crsarticole VALUES (1, 401, "ARTICOL COMANDA", 7, 0, 0, 100, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM401", "", "RON") + GO TOP IN crsarticole + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 1, id_articol WITH 401, denumire WITH "ARTICOL COMANDA", ; + cantitate WITH 3, opt_facturare WITH 0 + GO TOP + + gcErr = "" + gnErr = 0 + gnMockRaspuns = 6 + loForm.do_sterge() + + DO Assert WITH gnErr = 0, "do_sterge fara eroare pe tip comanda cu crsarticole incarcat" + DO Assert WITH RECCOUNT('crsfactura') = 0, "randul a fost sters din crsfactura" + IF USED('crsarticole') + SELECT crsarticole + LOCATE FOR id_c = 1 + DO Assert WITH FOUND() AND cantitate = 10, "crsarticole id_c=1: cantitate restaurata (7+3=10), Rol A neregresat" + ENDIF + + DO Inchide WITH 'crsarticole' + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* Construieste un obiect cu exact campurile cursorului combosql_cautare (creeaza_cursor_gol), +* ca sa reproduca fidel Scatter Name loArticol MEMO din LostFocus. +FUNCTION ConstruiesteArticol + LPARAMETERS tnIdArticol, tnCantitate + LOCAL loArticol + loArticol = CREATEOBJECT("Empty") + ADDPROPERTY(loArticol, "codmat", "CMTEST") + ADDPROPERTY(loArticol, "denumire", "ARTICOL TEST S4-5") + ADDPROPERTY(loArticol, "um", "BUC") + ADDPROPERTY(loArticol, "pret", 100) + ADDPROPERTY(loArticol, "proc_tvav", 1.19) + ADDPROPERTY(loArticol, "nume_val", "RON") + ADDPROPERTY(loArticol, "codbare", "") + ADDPROPERTY(loArticol, "id_articol", tnIdArticol) + ADDPROPERTY(loArticol, "id_pol", 1) + ADDPROPERTY(loArticol, "gestionabil", 1) + ADDPROPERTY(loArticol, "preturi_cu_tva", 0) + ADDPROPERTY(loArticol, "tip_valuta", 0) + ADDPROPERTY(loArticol, "curs", 1) + ADDPROPERTY(loArticol, "multiplicator", 1) + ADDPROPERTY(loArticol, "id_valuta", 1) + ADDPROPERTY(loArticol, "discount_unitar", 0) + ADDPROPERTY(loArticol, "discount_unitar_val", 0) + ADDPROPERTY(loArticol, "cantitate", tnCantitate) + ADDPROPERTY(loArticol, "nume_lista_preturi", "TEST") + ADDPROPERTY(loArticol, "pret_val", 0) + ADDPROPERTY(loArticol, "id_gestiune", -1000) + ADDPROPERTY(loArticol, "cont", "XXXX") + ADDPROPERTY(loArticol, "id_ctr", 0) + ADDPROPERTY(loArticol, "opt_facturare", 0) + RETURN loArticol +ENDFUNC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip + LOCAL lnIdSet + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + DO Inchide WITH 'saft_tip_facturi' + SELECT 0 + + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcErr = "" + gnErr = 0 + gnMockRaspuns = 6 + gcMockDuplicat = "" + + lnIdSet = 27000 + tnTip + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 78 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_valuta = 1 + poDate.in_valuta = 0 + poDate.listaid = "1" + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4c_discount_grid.prg b/utile/Teste/facturare_unificat/test_s4c_discount_grid.prg new file mode 100644 index 0000000..0658195 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4c_discount_grid.prg @@ -0,0 +1,405 @@ +* test_s4c_discount_grid.prg +* Headless: S4c - discountul pe linie de articol editabil in grid, frm_facturare_articole2 (v2). +* Acopera direct campurile scrise de recalc_discount_linie (COMUN\programe\oproceduri_facturare.prg: +* 2398-2446) + calculeaza_totaluri (COMUN\programe\oproceduri_facturare.prg:2259-2394), campul real +* procdisc din creeaza_facturacrs (COMUN\programe\ofacturare_comun.prg:1794), Column14.ReadOnly = .T. +* (COMUN\clase\ofacturare.vc2:17438) si neregresia pe campul memo explicatie la ciclul +* SCATTER/GATHER NAME ... MEMO. +* +* Sase asertiuni: +* T1. recalc_discount_linie(loArt, 100, 2) [discount RON pe pret ftva=1000, cantitate=2, +* proc_tvav=1.19, tip_valuta=0] + calculeaza_totaluri: valdiminuatftva, valdiminuatctva, +* vvaldiminuatftva, vvaldiminuatctva, valdiscountftva, vvaldiscountftva egale cu valorile +* calculate manual dupa aceeasi formula (Do Case tnTip=2, ramura cu_tva=0). +* T2. recalc_discount_linie(loArt, 10, 3) [discount in valuta pe vpretftva=100, Curs=5, +* cantitate=3] + calculeaza_totaluri: aceleasi 6 campuri, ramura tnTip=3/tip_valuta=1. +* T3. procdisc = Round(discountftva/pretftva*100, 2) dupa T1 si T2. +* T4. Garda pretftva=0: recalc_discount_linie nu arunca eroare (gnErr=0) si procdisc=0. +* T5. Column14.ReadOnly = .T. pe grid-ul instantiat (frm_facturare_articole2.grd_factura.Column14). +* T6. explicatie (M) neschimbata dupa un ciclu SCATTER NAME ... MEMO / recalc / GATHER NAME ... MEMO. +* +* Sablon urmat: test_s4e_registru.prg (harness identic, acelasi env auto). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4c_discount_grid.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4c_discount_grid.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO (schema/instanta CONTAFIN_ORACLE); gnIdUtil = 8 inainte de +* creeaza_cursor_serii; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat, gnMockNumar +PUBLIC gnPc, gnPVal, gnPPretV, gnScadereStoc, gnMemProcDisc +gnMockNumar = 0 +gnPc = 2 +gnPVal = 2 +gnPPretV = 4 +gnScadereStoc = 1 +gnMemProcDisc = 0 +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4c_discount_grid.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +gnIdSucursala = 167 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +IF USED('jtva_coloane') + USE IN jtva_coloane +ENDIF +CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2)) +INSERT INTO jtva_coloane VALUES (190, 'TVA 19%', 19) +INSERT INTO jtva_coloane VALUES (210, 'TVA 21%', 21) +INSERT INTO jtva_coloane VALUES (110, 'TVA 11%', 11) +GO TOP IN jtva_coloane + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poDate = NULL +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") + +DO TestT1 +DO TestT2 +DO TestT3 +DO TestT4 +DO TestT5 +DO TestT6 + +DO Final + +*---------------------------------------------------------------------------------------- +* T1: recalc_discount_linie(loArt, 100, 2) - discount in RON pe o linie RON (tip_valuta=0), +* pretftva=1000, cantitate=2, proc_tvav=1.19. Verifica cele 6 campuri agregate dupa calculeaza_totaluri. +PROCEDURE TestT1 + LOCAL loArt, lnValdiminuatftva, lnValdiminuatctva, lnVvaldiminuatftva, lnVvaldiminuatctva, ; + lnValdiscountftva, lnVvaldiscountftva + + gcCaz = "[T1: recalc_discount_linie tip=2 (RON)] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 3 + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 401, denumire WITH "ARTICOL RON", ; + cantitate WITH 2, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1, ; + pretftva WITH 1000, pretctva WITH 1190, vpretftva WITH 1000, vpretctva WITH 1190, ; + proc_Tvav WITH 1.19, discountftva WITH 0, discountctva WITH 0, vdiscountftva WITH 0, ; + vdiscountctva WITH 0 + + SELECT crsfactura + SCATTER NAME loArt MEMO + loArt = recalc_discount_linie(loArt, 100, 2) + loArt = calculeaza_totaluri(loArt) + GATHER NAME loArt MEMO + DO Assert WITH gnErr = 0, "recalc_discount_linie + calculeaza_totaluri fara eroare (T1)" + + SELECT crsfactura + lnValdiminuatftva = valdiminuatftva + lnValdiminuatctva = valdiminuatctva + lnVvaldiminuatftva = vvaldiminuatftva + lnVvaldiminuatctva = vvaldiminuatctva + lnValdiscountftva = valdiscountftva + lnVvaldiscountftva = vvaldiscountftva + + DO Assert WITH discountftva = 100, "discountftva = 100 (obtinut: " + TRANSFORM(discountftva) + ")" + DO Assert WITH discountctva = 119, "discountctva = 119 = 100 + 100*0.19 (obtinut: " + TRANSFORM(discountctva) + ")" + DO Assert WITH lnValdiscountftva = 200, "valdiscountftva = 200 = 100*2 (obtinut: " + TRANSFORM(lnValdiscountftva) + ")" + DO Assert WITH lnVvaldiscountftva = 0, "vvaldiscountftva = 0 (vdiscountftva neatins de editarea RON, obtinut: " + TRANSFORM(lnVvaldiscountftva) + ")" + DO Assert WITH lnValdiminuatftva = 1800, "valdiminuatftva = 1800 = (1000-100)*2 (obtinut: " + TRANSFORM(lnValdiminuatftva) + ")" + DO Assert WITH lnValdiminuatctva = 2142, "valdiminuatctva = 2142 = 1800 + 1800*0.19 (obtinut: " + TRANSFORM(lnValdiminuatctva) + ")" + DO Assert WITH lnVvaldiminuatftva = 2000, "vvaldiminuatftva = 2000 = (1000-0)*2 (obtinut: " + TRANSFORM(lnVvaldiminuatftva) + ")" + DO Assert WITH lnVvaldiminuatctva = 2380, "vvaldiminuatctva = 2380 = 2000 + 2000*0.19 (obtinut: " + TRANSFORM(lnVvaldiminuatctva) + ")" +ENDPROC + +*---------------------------------------------------------------------------------------- +* T2: recalc_discount_linie(loArt, 10, 3) - discount in valuta pe o linie in valuta (tip_valuta=1), +* vpretftva=100, Curs=5, multiplicator=1, pretftva=500, cantitate=3, proc_tvav=1.19. +PROCEDURE TestT2 + LOCAL loArt, lnValdiminuatftva, lnValdiminuatctva, lnVvaldiminuatftva, lnVvaldiminuatctva, ; + lnValdiscountftva, lnVvaldiscountftva + + gcCaz = "[T2: recalc_discount_linie tip=3 (valuta)] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 3 + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 402, denumire WITH "ARTICOL VALUTA", ; + cantitate WITH 3, cu_tva WITH 0, tip_valuta WITH 1, Curs WITH 5, multiplicator WITH 1, ; + pretftva WITH 500, pretctva WITH 595, vpretftva WITH 100, vpretctva WITH 119, ; + proc_Tvav WITH 1.19, discountftva WITH 0, discountctva WITH 0, vdiscountftva WITH 0, ; + vdiscountctva WITH 0 + + SELECT crsfactura + SCATTER NAME loArt MEMO + loArt = recalc_discount_linie(loArt, 10, 3) + loArt = calculeaza_totaluri(loArt) + GATHER NAME loArt MEMO + DO Assert WITH gnErr = 0, "recalc_discount_linie + calculeaza_totaluri fara eroare (T2)" + + SELECT crsfactura + lnValdiminuatftva = valdiminuatftva + lnValdiminuatctva = valdiminuatctva + lnVvaldiminuatftva = vvaldiminuatftva + lnVvaldiminuatctva = vvaldiminuatctva + lnValdiscountftva = valdiscountftva + lnVvaldiscountftva = vvaldiscountftva + + DO Assert WITH vdiscountftva = 10, "vdiscountftva = 10 (obtinut: " + TRANSFORM(vdiscountftva) + ")" + DO Assert WITH discountftva = 50, "discountftva = 50 = 10*5/1 (obtinut: " + TRANSFORM(discountftva) + ")" + DO Assert WITH vdiscountctva = 11.90, "vdiscountctva = 11.90 = 10 + 10*0.19 (obtinut: " + TRANSFORM(vdiscountctva) + ")" + DO Assert WITH lnValdiscountftva = 150, "valdiscountftva = 150 = 50*3 (obtinut: " + TRANSFORM(lnValdiscountftva) + ")" + DO Assert WITH lnVvaldiscountftva = 30, "vvaldiscountftva = 30 = 10*3 (obtinut: " + TRANSFORM(lnVvaldiscountftva) + ")" + DO Assert WITH lnValdiminuatftva = 1350, "valdiminuatftva = 1350 = (500-50)*3 (obtinut: " + TRANSFORM(lnValdiminuatftva) + ")" + DO Assert WITH lnValdiminuatctva = 1606.50, "valdiminuatctva = 1606.50 = 1350 + 1350*0.19 (obtinut: " + TRANSFORM(lnValdiminuatctva) + ")" + DO Assert WITH lnVvaldiminuatftva = 270, "vvaldiminuatftva = 270 = (100-10)*3 (obtinut: " + TRANSFORM(lnVvaldiminuatftva) + ")" + DO Assert WITH lnVvaldiminuatctva = 321.30, "vvaldiminuatctva = 321.30 = 270 + 270*0.19 (obtinut: " + TRANSFORM(lnVvaldiminuatctva) + ")" +ENDPROC + +*---------------------------------------------------------------------------------------- +* T3: procdisc = Round(discountftva/pretftva*100, 2), verificat pe cele doua randuri ramase +* din T1/T2 (crsfactura nu e resetat intre T1..T3 in mod explicit - se reia cu Reseteaza local). +PROCEDURE TestT3 + LOCAL loArt + + gcCaz = "[T3: procdisc calculat] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 3 + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 401, denumire WITH "ARTICOL RON", ; + cantitate WITH 2, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1, ; + pretftva WITH 1000, pretctva WITH 1190, vpretftva WITH 1000, vpretctva WITH 1190, ; + proc_Tvav WITH 1.19, discountftva WITH 0, discountctva WITH 0, vdiscountftva WITH 0, ; + vdiscountctva WITH 0 + SCATTER NAME loArt MEMO + loArt = recalc_discount_linie(loArt, 100, 2) + loArt = calculeaza_totaluri(loArt) + GATHER NAME loArt MEMO + DO Assert WITH procdisc = 10.00, "procdisc = 10.00 = Round(100/1000*100,2) (obtinut: " + TRANSFORM(procdisc) + ")" + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 402, denumire WITH "ARTICOL VALUTA", ; + cantitate WITH 3, cu_tva WITH 0, tip_valuta WITH 1, Curs WITH 5, multiplicator WITH 1, ; + pretftva WITH 500, pretctva WITH 595, vpretftva WITH 100, vpretctva WITH 119, ; + proc_Tvav WITH 1.19, discountftva WITH 0, discountctva WITH 0, vdiscountftva WITH 0, ; + vdiscountctva WITH 0 + SCATTER NAME loArt MEMO + loArt = recalc_discount_linie(loArt, 10, 3) + loArt = calculeaza_totaluri(loArt) + GATHER NAME loArt MEMO + DO Assert WITH procdisc = 10.00, "procdisc = 10.00 = Round(50/500*100,2) (obtinut: " + TRANSFORM(procdisc) + ")" +ENDPROC + +*---------------------------------------------------------------------------------------- +* T4: garda pretftva=0 - recalc_discount_linie nu arunca eroare (impartire la zero evitata), +* procdisc ramane 0. +PROCEDURE TestT4 + LOCAL loArt + + gcCaz = "[T4: garda pretftva=0] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 3 + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 403, denumire WITH "ARTICOL PRET 0", ; + cantitate WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1, ; + pretftva WITH 0, pretctva WITH 0, vpretftva WITH 0, vpretctva WITH 0, ; + proc_Tvav WITH 1.19, discountftva WITH 0, discountctva WITH 0, vdiscountftva WITH 0, ; + vdiscountctva WITH 0 + + gnErr = 0 + gcErr = "" + SCATTER NAME loArt MEMO + loArt = recalc_discount_linie(loArt, 50, 2) + loArt = calculeaza_totaluri(loArt) + GATHER NAME loArt MEMO + DO Assert WITH gnErr = 0, "fara eroare cu pretftva=0 (gcErr: " + gcErr + ")" + + SELECT crsfactura + DO Assert WITH procdisc = 0, "procdisc = 0 cu pretftva=0, fara impartire la zero (obtinut: " + TRANSFORM(procdisc) + ")" + DO Assert WITH discountftva = 50, "discountftva tot s-a scris (=50) desi pretftva=0 (obtinut: " + TRANSFORM(discountftva) + ")" +ENDPROC + +*---------------------------------------------------------------------------------------- +* T5: Column14 (cProcentDiscount) e needitabila pe grid-ul instantiat. +PROCEDURE TestT5 + LOCAL loForm + + gcCaz = "[T5: frm_facturare_articole2 se instantiaza] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 3 + + *-- Column14.ReadOnly = .T. e verificat static (diff pe text + reconversie binar->text + *-- byte-identica), NU aici: coloanele de grid nu se materializeaza sub -A -T + *-- (Column14 nu exista ca membru desi ColumnCount=14 - grid neinitializat vizual, + *-- memorie de proiect grid-coloane-nu-se-materializeaza-headless), asa ca un + *-- Thisform.grd_factura.Column14.ReadOnly headless arunca "Unknown member". + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) = 'O' + loForm.Release() + ENDIF + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* T6: neregresie - campul memo explicatie ramane neschimbat dupa un ciclu +* SCATTER NAME ... MEMO / recalc_discount_linie / calculeaza_totaluri / GATHER NAME ... MEMO. +PROCEDURE TestT6 + LOCAL loArt, lcExplicatieInainte, lcExplicatieDupa + + gcCaz = "[T6: neregresie explicatie M la SCATTER/GATHER MEMO] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 3 + + lcExplicatieInainte = "Explicatie test S4c, text lung cu linie noua." + CHR(13) + CHR(10) + "a doua linie, semne: !?.,;:-_()" + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 401, denumire WITH "ARTICOL EXPLICATIE", ; + cantitate WITH 1, cu_tva WITH 0, tip_valuta WITH 0, Curs WITH 1, multiplicator WITH 1, ; + pretftva WITH 1000, pretctva WITH 1190, vpretftva WITH 1000, vpretctva WITH 1190, ; + proc_Tvav WITH 1.19, discountftva WITH 0, discountctva WITH 0, vdiscountftva WITH 0, ; + vdiscountctva WITH 0 + REPLACE explicatie WITH m.lcExplicatieInainte + + SELECT crsfactura + SCATTER NAME loArt MEMO + loArt = recalc_discount_linie(loArt, 100, 2) + loArt = calculeaza_totaluri(loArt) + GATHER NAME loArt MEMO + + SELECT crsfactura + lcExplicatieDupa = explicatie + DO Assert WITH lcExplicatieDupa == m.lcExplicatieInainte, ; + "explicatie (M) neschimbata dupa SCATTER/GATHER MEMO (lungime inainte=" + ; + TRANSFORM(LEN(m.lcExplicatieInainte)) + " dupa=" + TRANSFORM(LEN(m.lcExplicatieDupa)) + ")" +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip + LOCAL lnIdSet + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + DO Inchide WITH 'saft_tip_facturi' + SELECT 0 + + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcErr = "" + gnErr = 0 + gnMockRaspuns = 6 + gcMockDuplicat = "" + + lnIdSet = 29000 + tnTip + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 79 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_valuta = 1 + poDate.in_valuta = 0 + poDate.listaid = "1" + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4d_zi_curs.prg b/utile/Teste/facturare_unificat/test_s4d_zi_curs.prg new file mode 100644 index 0000000..702bbc1 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4d_zi_curs.prg @@ -0,0 +1,365 @@ +* test_s4d_zi_curs.prg +* Headless: S4d - data cursului valutar, reactiva (frm_facturare_articole2, v2). +* Acopera direct: metoda noua do_actualizeaza_vizibilitate_curs (COMUN\clase\ofacturare.vc2) +* si proprietatea noua loRezultat.lForteazaCursVizibil pusa de incarca_cursor_articole +* (COMUN\programe\ofacturare.prg:444-637) la eroarea Oracle -20005. +* +* Cazuri: +* T1. incarca_cursor_articole, mock Oracle -20005 (FARA/-1/20005) -> loRezultat.lForteazaCursVizibil = .T. +* T2. incarca_cursor_articole, mock succes (PLIN/1/0) -> loRezultat.lForteazaCursVizibil = .F. +* T3. incarca_cursor_articole, mock alta eroare (FARA/-1/1400) -> loRezultat.lForteazaCursVizibil = .F. +* T4. do_actualizeaza_vizibilitate_curs, poDate.in_valuta = 1 -> Visible = .T. +* T5. do_actualizeaza_vizibilitate_curs, in_valuta=0, 0 linii tip_valuta=1 -> Visible = .F. +* T6. do_actualizeaza_vizibilitate_curs, in_valuta=0, 1 linie tip_valuta=1 -> Visible = .T. (apare reactiv) +* T7. dupa stergerea liniei din T6 -> Visible = .F. (dispare reactiv) +* T8. do_actualizeaza_vizibilitate_curs(.T.), in_valuta=0, 0 linii tip_valuta=1 -> Visible = .T. (fortare -20005) +* T9. formular pe retur (tip 8): clb_zi_curs eliminat la Init; do_actualizeaza_vizibilitate_curs() +* nu arunca eroare (garda do_exista_obiect). +* T10. do_incarca_articole (tip=4, mock Oracle -20005): Return .F., si daca clb_zi_curs.Visible e +* citibil headless, verifica ca a devenit .T. (fortat de lForteazaCursVizibil). Citirea insasi +* e proba - daca nu e citibila, cazul se raporteaza informativ, nu esec. +* +* Oracle NU se atinge pe calea articolelor: goExecutor -> oExecutorMock (mock_cursor_articole.prg, +* deja folosit de test_s3_4_cursor_articole.prg si test_s4_3_incarca_filtrat.prg pentru exact acelasi +* scenariu -20005). poGeneratorNumere -> oGeneratorMock. amessagebox/facturi_duplicate -> +* mock_validare_antet.prg (T10, valideaza_antet ruleaza REAL). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4d_zi_curs.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4d_zi_curs.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs +PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4d_zi_curs.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockNumar = 0 +gcMockSql = "" +gnMockSucces = 1 +gnMockEroare = 0 +gcMockMod = "PLIN" +gcMockCurs = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_articole.prg", ; + &lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg" +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +update_jtva_coloane([JV], [jtva_coloane_temp]) + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") +poDate = NULL + +goExecutorReal = goExecutor +goExecutor = CREATEOBJECT("oExecutorMock") +goExecutor.oReal = goExecutorReal + +DO TestFlagEroare WITH "T1", 1, "FARA", -1, 20005, .T. +DO TestFlagEroare WITH "T2", 1, "PLIN", 1, 0, .F. +DO TestFlagEroare WITH "T3", 1, "FARA", -1, 1400, .F. + +DO TestVizibilitate +DO TestRetur +DO TestIncarcaArticoleEroare + +DO Final + +*---------------------------------------------------------------------------------------- +* T1-T3: proprietatea noua loRezultat.lForteazaCursVizibil pe incarca_cursor_articole. +PROCEDURE TestFlagEroare + LPARAMETERS tcCaz, tnTip, tcMod, tnSucces, tnEroare, tlAsteptat + LOCAL loRez + + gcCaz = "[" + tcCaz + " mod=" + tcMod + " succes=" + TRANSFORM(tnSucces) + " eroare=" + TRANSFORM(tnEroare) + "] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH tnTip, tcMod, tnSucces, tnEroare, 0 + + loRez = incarca_cursor_articole(tnTip, .F., poGeneratorNumere) + DO Assert WITH VARTYPE(loRez) = 'O', "incarca_cursor_articole a intors obiect" + IF VARTYPE(loRez) <> 'O' + RETURN + ENDIF + DO Assert WITH PEMSTATUS(loRez, 'lForteazaCursVizibil', 5), "lForteazaCursVizibil materializata pe loRezultat" + DO Assert WITH loRez.lForteazaCursVizibil = tlAsteptat, "lForteazaCursVizibil = " + TRANSFORM(tlAsteptat) + " (obtinut: " + TRANSFORM(loRez.lForteazaCursVizibil) + ")" + DO Assert WITH loRez.nSucces = tnSucces, "nSucces = " + TRANSFORM(tnSucces) + " (obtinut: " + TRANSFORM(loRez.nSucces) + ")" +ENDPROC + +*---------------------------------------------------------------------------------------- +* T4-T8: matricea de vizibilitate a do_actualizeaza_vizibilitate_curs pe formularul instantiat. +PROCEDURE TestVizibilitate + LOCAL loForm, llVal, lnErrAntes, llCitibil + + gcCaz = "[T4-T8 vizibilitate] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 1, "PLIN", 1, 0, 0 + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + DO Assert WITH loForm.do_exista_obiect('clb_zi_curs'), "clb_zi_curs prezent (tip normal, nu retur)" + + * T4: in_valuta = 1 -> vizibil neconditionat + poDate.in_valuta = 1 + loForm.do_actualizeaza_vizibilitate_curs() + DO Assert WITH gnErr = 0, "T4 fara eroare (gcErr: " + gcErr + ")" + lnErrAntes = gnErr + llVal = .F. + llVal = loForm.clb_zi_curs.Visible + llCitibil = (gnErr = lnErrAntes) + IF llCitibil + DO Assert WITH llVal, "T4: clb_zi_curs.Visible = .T. cu in_valuta=1" + ELSE + DO AfLog WITH "INFO T4: clb_zi_curs.Visible nu s-a putut citi headless (eroare la citire)" + ENDIF + + * T5: in_valuta = 0, 0 linii tip_valuta=1 -> ascuns + poDate.in_valuta = 0 + loForm.do_actualizeaza_vizibilitate_curs() + DO Assert WITH gnErr = 0, "T5 fara eroare (gcErr: " + gcErr + ")" + IF llCitibil + llVal = loForm.clb_zi_curs.Visible + DO Assert WITH !llVal, "T5: clb_zi_curs.Visible = .F. cu in_valuta=0 si 0 linii valuta" + ENDIF + + * T6: adauga o linie tip_valuta=1 -> apare reactiv + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 501, denumire WITH "ARTICOL VALUTA T6", ; + cantitate WITH 1, cu_tva WITH 0, tip_valuta WITH 1, Curs WITH 5, multiplicator WITH 1, ; + pretftva WITH 100, pretctva WITH 119, vpretftva WITH 20, vpretctva WITH 23.80, ; + proc_Tvav WITH 1.19 + loForm.do_actualizeaza_vizibilitate_curs() + DO Assert WITH gnErr = 0, "T6 fara eroare (gcErr: " + gcErr + ")" + IF llCitibil + llVal = loForm.clb_zi_curs.Visible + DO Assert WITH llVal, "T6: clb_zi_curs.Visible = .T. dupa adaugarea unei linii tip_valuta=1" + ENDIF + + * T7: sterge linia -> dispare reactiv + SELECT crsfactura + LOCATE FOR id_articol = 501 + IF FOUND() + DELETE + ENDIF + loForm.do_actualizeaza_vizibilitate_curs() + DO Assert WITH gnErr = 0, "T7 fara eroare (gcErr: " + gcErr + ")" + IF llCitibil + llVal = loForm.clb_zi_curs.Visible + DO Assert WITH !llVal, "T7: clb_zi_curs.Visible = .F. dupa stergerea liniei tip_valuta=1" + ENDIF + + * T8: fortare (semnal -20005) cu in_valuta=0 si 0 linii valuta -> vizibil oricum + loForm.do_actualizeaza_vizibilitate_curs(.T.) + DO Assert WITH gnErr = 0, "T8 fara eroare (gcErr: " + gcErr + ")" + IF llCitibil + llVal = loForm.clb_zi_curs.Visible + DO Assert WITH llVal, "T8: clb_zi_curs.Visible = .T. cu tlForteazaVizibil=.T., indiferent de continutul grilei" + ENDIF + + IF !llCitibil + DO AfLog WITH "DATORIE: clb_zi_curs.Visible nu s-a putut verifica headless in T4-T8 (proba doar structurala: gnErr=0 pe fiecare apel)" + ENDIF + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* T9: pe retur (tip 8), clb_zi_curs e eliminat la Init; metoda noua nu trebuie sa arunce eroare. +PROCEDURE TestRetur + LOCAL loForm + + gcCaz = "[T9 retur tip=8] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 8, "PLIN", 1, 0, 0 + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip retur)" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + DO Assert WITH !loForm.do_exista_obiect('clb_zi_curs'), "clb_zi_curs eliminat la Init pe retur (tip 8)" + + loForm.do_actualizeaza_vizibilitate_curs() + DO Assert WITH gnErr = 0, "do_actualizeaza_vizibilitate_curs() pe retur nu arunca eroare (gcErr: " + gcErr + ")" + loForm.do_actualizeaza_vizibilitate_curs(.T.) + DO Assert WITH gnErr = 0, "do_actualizeaza_vizibilitate_curs(.T.) pe retur nu arunca eroare (gcErr: " + gcErr + ")" + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* T10: do_incarca_articole pe un tip care CHEAMA incarca_cursor_articole (nu e in llCautareInLinie), +* cu mock Oracle -20005. Verifica Return .F. si, daca citibil, revenirea vizibila a campului. +PROCEDURE TestIncarcaArticoleEroare + LOCAL loForm, llRezultat, llVal, lnErrAntes, llCitibil + + gcCaz = "[T10 do_incarca_articole tip=4, mock -20005] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 4, "FARA", -1, 20005, 0 + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2 (tip=4)" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + llRezultat = loForm.do_incarca_articole() + DO Assert WITH !llRezultat, "do_incarca_articole() Return .F. pe eroare Oracle -20005" + DO Assert WITH !EMPTY(gcMockSql), "incarca_cursor_articole a fost apelat (gcMockSql nevid) pe tip=4" + + IF loForm.do_exista_obiect('clb_zi_curs') + lnErrAntes = gnErr + llVal = .F. + llVal = loForm.clb_zi_curs.Visible + llCitibil = (gnErr = lnErrAntes) + IF llCitibil + DO Assert WITH llVal, "T10: clb_zi_curs.Visible = .T. dupa -20005 in do_incarca_articole (fortat de lForteazaCursVizibil)" + ELSE + DO AfLog WITH "DATORIE: clb_zi_curs.Visible nu s-a putut verifica headless in T10" + ENDIF + ELSE + DO AfLog WITH "INFO T10: clb_zi_curs nu exista pe formularul instantiat (tip=4 neasteptat sa-l elimine)" + ENDIF + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip, tcMod, tnSucces, tnEroare, tnInValuta + LOCAL lnIdSet + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + SELECT 0 + + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcMockSql = "" + gcMockCurs = "" + gcErr = "" + gnMockNumar = 100 + gnMockRaspuns = 6 + gcMockDuplicat = "" + gcMockMod = tcMod + gnMockSucces = tnSucces + gnMockEroare = tnEroare + + lnIdSet = 29000 + tnTip + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 79 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_valuta = 1 + poDate.in_valuta = tnInValuta + poDate.listaid = "1" + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + IF TYPE('goExecutorReal') = 'O' + goExecutor = goExecutorReal + ENDIF + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4e_0_adauga_articol.prg b/utile/Teste/facturare_unificat/test_s4e_0_adauga_articol.prg new file mode 100644 index 0000000..707a1b0 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4e_0_adauga_articol.prg @@ -0,0 +1,294 @@ +* test_s4e_0_adauga_articol.prg +* Headless: do_adauga_articol pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) NU mai arunca +* "1925 Unknown member GRD_ARTICOLE/GRD_CONTRACTE/TXTCODMAT" la prima executie pe formularul unificat +* (S4e-0: loGrid = Thisform.grd_factura in loc de grd_contracte/grd_articole la intrare, plus blocul de +* SetFocus neconditionat de la coada metodei colapsat pe grd_factura in loc de txtCodmat/txtArticole/ +* grd_articole/grd_contracte - toate patru inexistente pe formularul unificat). +* +* crsarticole e construit direct (nu prin Oracle) - do_urmator/do_adauga_tot citesc doar cursorul, +* pozitionat explicit de test inainte de apel, deci nu depind de gridul nematerializat headless +* (capcana grid-coloane-nu-se-materializeaza-headless: aici nu se citeste nimic DIN grid, doar se cere +* SetFocus pe el la coada). +* +* CAZ_A (do_urmator, ramura de refuz): gestionabil=1, cantitate=-1, tip=3 -> do_verifica_articol +* refuza (stoc insuficient), gnButon ramane <>1 -> se ajunge pe a DOUA aparitie a blocului de SetFocus +* colapsat (:18789-18800 dinainte de fix), fara nicio adaugare in crsfactura. Verifica ca simpla +* INTRARE in metoda (Local lcCursor, loGrid = grd_factura) si iesirea pe ramura de refuz nu mai +* arunca amprenta veche. +* CAZ_B (do_adauga_tot, ramura de succes): gestionabil=0, tip=3, tlImplicit=.T. (dat de do_adauga_tot +* insusi) -> do_verifica_articol accepta, Do Case intra pe "gestionabil=0" cu tlImplicit=.T. -> NU +* deschide niciun formular modal (poArticol=calculeaza_totaluri(poArticol); gnButon=1) -> ajunge pe +* PRIMA aparitie a blocului de SetFocus (:18776-18787 dinainte de fix) dupa ce randul a fost deja +* scris in crsfactura. Verifica randul ajuns in crsfactura (id_articol/cantitate/denumire) si +* scaderea cantitatii in crsarticole (Replace ... For id_c, ramura Inlist(tip,3,4,21,25,28,42,47)). +* +* Deliberat NU se cheama Thisform.Show(): pe masina de dezvoltare ecranul e partajat, iar afisarea unui +* formular (chiar modeless) ar muta focus-ul real Windows la SetFocus() - interzis explicit. Fara Show, +* Thisform.grd_factura.SetFocus() (ultima instructiune din metoda, dupa ce randul a fost deja scris) +* poate arunca o eroare headless-only (fereastra nu exista) - se accepta si se ignora daca apare, CU +* CONDITIA sa nu fie amprenta veche (GRD_ARTICOLE/GRD_CONTRACTE/TXTCODMAT/TXTARTICOLE): ON ERROR +* jurnalizeaza si executia continua (SetFocus e ultima linie a metodei, deci nu afecteaza randul deja +* scris in crsfactura). +* +* amessagebox e mocat (mock_validare_antet.prg) ca sa nu apara dialogul real pe ramura de refuz. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4e_0_adauga_articol.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_0_adauga_articol.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +SET TABLEPROMPT OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat, gnMockNumar +gnMockNumar = 0 +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_0_adauga_articol.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +update_jtva_coloane([JV], [jtva_coloane_temp]) + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poDate = NULL +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") + +DO CazUrmatorRefuz +DO CazAdaugaTotSucces + +DO Final + +*---------------------------------------------------------------------------------------- +* CAZ_A: do_urmator pe articol negestionabil... nu, gestionabil=1 cu cantitate<=0 -> refuz stoc +PROCEDURE CazUrmatorRefuz + LOCAL loForm + gcCaz = "[CAZ_A do_urmator_refuz] " + DO AfLog WITH "PAS: " + gcCaz + + DO Reseteaza WITH 3 + + SELECT 0 + CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ; + gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ; + preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ; + Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; + codmat C(50), codbare C(50), nume_val C(20)) + INSERT INTO crsarticole VALUES (1, 201, "ARTICOL REFUZ", -1, 1, 0, 100, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM201", "", "RON") + GO TOP IN crsarticole + SELECT crsarticole + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + gcErr = "" + gnErr = 0 + gcMockApeluri = "" + loForm.do_urmator() + + DO Assert WITH !("GRD_ARTICOLE" $ UPPER(gcErr)), "fara amprenta GRD_ARTICOLE in gcErr" + DO Assert WITH !("GRD_CONTRACTE" $ UPPER(gcErr)), "fara amprenta GRD_CONTRACTE in gcErr" + DO Assert WITH !("TXTCODMAT" $ UPPER(gcErr)), "fara amprenta TXTCODMAT in gcErr" + DO Assert WITH !("TXTARTICOLE" $ UPPER(gcErr)), "fara amprenta TXTARTICOLE in gcErr" + DO Assert WITH RECCOUNT('crsfactura') = 0, "refuz de stoc: crsfactura ramane gol" + DO Assert WITH "amessagebox(" $ gcMockApeluri, "mesajul de refuz a fost afisat (mocat)" + + DO Inchide WITH 'crsarticole' + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* CAZ_B: do_adauga_tot pe doua articole negestionabile (tlImplicit=.T. dat de do_adauga_tot insusi, +* deci fara formular modal) -> ambele trebuie sa ajunga in crsfactura +PROCEDURE CazAdaugaTotSucces + LOCAL loForm + gcCaz = "[CAZ_B do_adauga_tot_succes] " + DO AfLog WITH "PAS: " + gcCaz + + DO Reseteaza WITH 3 + + SELECT 0 + CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ; + gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ; + preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ; + Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; + codmat C(50), codbare C(50), nume_val C(20)) + INSERT INTO crsarticole VALUES (1, 301, "ARTICOL UNU", 5, 0, 0, 100, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM301", "", "RON") + INSERT INTO crsarticole VALUES (2, 302, "ARTICOL DOI", 3, 0, 0, 200, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM302", "", "RON") + GO TOP IN crsarticole + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + gcErr = "" + gnErr = 0 + gcMockApeluri = "" + loForm.do_adauga_tot() + + DO Assert WITH !("GRD_ARTICOLE" $ UPPER(gcErr)), "fara amprenta GRD_ARTICOLE in gcErr" + DO Assert WITH !("GRD_CONTRACTE" $ UPPER(gcErr)), "fara amprenta GRD_CONTRACTE in gcErr" + DO Assert WITH !("TXTCODMAT" $ UPPER(gcErr)), "fara amprenta TXTCODMAT in gcErr" + DO Assert WITH !("TXTARTICOLE" $ UPPER(gcErr)), "fara amprenta TXTARTICOLE in gcErr" + DO Assert WITH RECCOUNT('crsfactura') = 2, "ambele randuri au ajuns in crsfactura (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")" + + IF RECCOUNT('crsfactura') >= 1 + SELECT crsfactura + GO TOP + DO Assert WITH id_articol = 301 AND cantitate = 5 AND ALLTRIM(denumire) == "ARTICOL UNU", "randul 1: id_articol/cantitate/denumire corecte" + ENDIF + IF RECCOUNT('crsfactura') >= 2 + SELECT crsfactura + GO 2 + DO Assert WITH id_articol = 302 AND cantitate = 3 AND ALLTRIM(denumire) == "ARTICOL DOI", "randul 2: id_articol/cantitate/denumire corecte" + ENDIF + + DO Assert WITH USED('crsarticole') AND RECCOUNT('crsarticole') = 2, "crsarticole ramane deschis dupa adaugare" + IF USED('crsarticole') + SELECT crsarticole + LOCATE FOR id_c = 1 + DO Assert WITH FOUND() AND cantitate = 0, "crsarticole id_c=1: cantitate scazuta la 0 (5-5)" + LOCATE FOR id_c = 2 + DO Assert WITH FOUND() AND cantitate = 0, "crsarticole id_c=2: cantitate scazuta la 0 (3-3)" + ENDIF + + DO Inchide WITH 'crsarticole' + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip + LOCAL lnIdSet + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + DO Inchide WITH 'saft_tip_facturi' + SELECT 0 + + * cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcErr = "" + gnErr = 0 + gnMockRaspuns = 6 + gcMockDuplicat = "" + + lnIdSet = 26000 + tnTip + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 78 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_valuta = 1 + poDate.in_valuta = 0 + poDate.listaid = "1" + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4e_2_verifica_articol.prg b/utile/Teste/facturare_unificat/test_s4e_2_verifica_articol.prg new file mode 100644 index 0000000..e5690ac --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4e_2_verifica_articol.prg @@ -0,0 +1,238 @@ +* test_s4e_2_verifica_articol.prg +* Headless: do_verifica_articol pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) primeste +* articolul ca parametru explicit (toArticol), decizia 44 - in loc sa citeasca Private-ul poArticol +* populat de apelant. Testul construieste poArticol ad-hoc (CREATEOBJECT('Empty') + AddProperty), +* FARA sa declare Private poArticol in scopul apelant, si verifica ca metoda produce acelasi verdict +* ca inainte de schimbare pe un tabel de cazuri care acopera dimensiunile din nota_executie_s4e.md §8: +* gestionabil (0/1), cantitate (<=0 / >0), opt_facturare (0/3), poDate.tip (3/8/2). +* +* Conditia din cod (neschimbata ca logica, doar poArticol -> toArticol): +* (cantitate>=0 SI tip IN(8,9)) -> refuz (stoc) +* SAU (cantitate<=0 SI NOT(tip=2 SI opt_facturare=3) SI tip NOT IN(8,9) +* SI gestionabil=1 SI gnScadereStoc=1 SI NOT llFacturareFaraStoc) -> refuz (stoc) +* altfel -> accept +* +* Cazuri (tlContract = .F., gnScadereStoc = 1, gnRF_FACTURARE_FARA_STOC nesetat): +* C1. RETUR_POZITIV tip=8 cant=5 gest=1 opt=0 -> refuz (cantitate pozitiva pe retur) +* C2. STOC_INSUFICIENT tip=3 cant=-1 gest=1 opt=0 -> refuz (cazul normal de "nu e pe stoc") +* C3. NEGESTIONABIL tip=3 cant=-1 gest=0 opt=0 -> accept (articol negestionabil, fara plafon) +* C4. CANTITATE_POZITIVA tip=3 cant=5 gest=1 opt=0 -> accept (cantitate pozitiva pe tip normal) +* C5. CONTRACT_OPT3 tip=2 cant=-1 gest=1 opt=3 -> accept (exceptia pret fixat prin contract) +* C6. CONTRACT_OPT0 tip=2 cant=-1 gest=1 opt=0 -> refuz (fara exceptia opt_facturare=3) +* C7. RETUR_NEPOZITIV tip=8 cant=-1 gest=1 opt=0 -> accept (retur cu cantitate nepozitiva) +* +* amessagebox e mocat (mock_validare_antet.prg, ADITIV inainte in SET PROCEDURE) ca sa nu apara +* dialogul real "Acest articol nu este pe stoc!" - apelul se verifica prin gcMockApeluri, nu vizual. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4e_2_verifica_articol.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_2_verifica_articol.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs +PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_2_verifica_articol.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockNumar = 0 +gcMockSql = "" +gnMockSucces = 1 +gnMockEroare = 0 +gcMockMod = "PLIN" +gcMockCurs = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_cursor_articole.prg", ; + &lcProc, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg" +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +update_jtva_coloane([JV], [jtva_coloane_temp]) + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") +poDate = NULL + +goExecutorReal = goExecutor +goExecutor = CREATEOBJECT("oExecutorMock") +goExecutor.oReal = goExecutorReal + +DO Caz WITH "C1_RETUR_POZITIV", 8, 1, 0, 5, .T. +DO Caz WITH "C2_STOC_INSUFICIENT", 3, 1, 0, -1, .T. +DO Caz WITH "C3_NEGESTIONABIL", 3, 0, 0, -1, .F. +DO Caz WITH "C4_CANTITATE_POZITIVA", 3, 1, 0, 5, .F. +DO Caz WITH "C5_CONTRACT_OPT3", 2, 1, 3, -1, .F. +DO Caz WITH "C6_CONTRACT_OPT0", 2, 1, 0, -1, .T. +DO Caz WITH "C7_RETUR_NEPOZITIV", 8, 1, 0, -1, .F. + +DO Final + +*---------------------------------------------------------------------------------------- +* tnTip, tnGestionabil, tnOptFacturare, tnCantitate, tlAsteptatRefuz (.T. = trebuie refuzat) +PROCEDURE Caz + LPARAMETERS tcCaz, tnTip, tnGestionabil, tnOptFacturare, tnCantitate, tlAsteptatRefuz + LOCAL loForm, llRezultat, loArticol + gcCaz = "[" + tcCaz + "] " + DO AfLog WITH "PAS: " + gcCaz + + DO Reseteaza WITH tnTip + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + loArticol = CREATEOBJECT('Empty') + AddProperty(loArticol, 'gestionabil', tnGestionabil) + AddProperty(loArticol, 'opt_facturare', tnOptFacturare) + AddProperty(loArticol, 'id_articol', 1) + AddProperty(loArticol, 'denumire', 'ARTICOL TEST') + AddProperty(loArticol, 'nume_lista_preturi', 'LISTA TEST') + + gcMockApeluri = "" + llRezultat = loForm.do_verifica_articol(loArticol, .F., tnCantitate) + + IF tlAsteptatRefuz + DO Assert WITH !llRezultat, "Return .F. (refuz) asteptat" + DO Assert WITH "amessagebox(" $ gcMockApeluri, "mesaj de stoc afisat (mocat)" + ELSE + DO Assert WITH llRezultat, "Return .T. (accept) asteptat" + DO Assert WITH !("amessagebox(" $ gcMockApeluri), "niciun mesaj de stoc afisat" + ENDIF + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip + LOCAL lnIdSet + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + SELECT 0 + + * cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcMockSql = "" + gcMockCurs = "" + gcErr = "" + gnMockNumar = 100 + gnMockRaspuns = 6 + gcMockDuplicat = "" + gcMockMod = "PLIN" + gnMockSucces = 1 + gnMockEroare = 0 + + lnIdSet = 25000 + tnTip + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 77 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_valuta = 1 + poDate.listaid = "1" + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + IF TYPE('goExecutorReal') = 'O' + goExecutor = goExecutorReal + ENDIF + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4e_3_linie_libera.prg b/utile/Teste/facturare_unificat/test_s4e_3_linie_libera.prg new file mode 100644 index 0000000..5beb565 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4e_3_linie_libera.prg @@ -0,0 +1,306 @@ +* test_s4e_3_linie_libera.prg +* Headless: S4e-3 - validarea de cantitate/stoc pentru linia libera adaugata prin combosql (cautare in +* lista de preturi/registru), pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2), +* do_adauga_articol_cautat (introdusa la S4-3b, azi extinsa cu apelul do_verifica_articol). +* +* Executa metoda REALA (nu recalculeaza in paralel): APPEND BLANK pe crsfactura (simuleaza But_nou1), +* apoi do_adauga_articol_cautat(loArticol, loArticol.cantitate) - identic cu apelul din LostFocus +* (grd_factura.cCodMat.cboCodmat / cDenumire.cCboDenumire, ofacturare.vc2:21514/:21541). +* +* poArticol e construit dintr-un cursor local cu structura identica cu cursorul brut al cautarii +* (mock_cursor_preturi.prg / cursor_preturi din pack_facturare, 24 coloane) - FARA Oracle si FARA +* combosql_cautare.RefreshData; Oracle nu are ce sa valideze aici (validarea e locala, pe randul deja +* adus). Formularul tot are nevoie de parintele combosql (SET CLASSLIB _cb_base.vcx ADDITIVE) ca sa +* se poata face CREATEOBJECT fara eroare de clasa - combosql_cautare insasi traieste azi direct in +* ofacturare.vc2 (mutata acolo la 30.08.2026, commit e2ee622), nu mai exista ofacturare_cautare.prg. +* +* Gatare disjuncta verificata explicit: tipurile S4e-3 (3,4,21,25,28,42,47) primesc validarea noua; +* tipul 1 (lista de preturi, perimetrul plafonului Rol B - S4-5, poveste separata) NU o primeste - +* cazul ROL_B_DISJUNCT arata ca acelasi articol cu cantitate 0 intra necontestat pe tip 1, exact ca +* inaintea acestei sarcini, si ca do_initializeaza_articol ii zeroeste cantitatea (:19646-19648) - +* spre deosebire de tipurile S4e-3, unde cantitatea ramane cea reala (nu 0) dupa acceptare. +* +* Cazuri: +* STOC_ZERO_T3 tip=3 gest=1 cant=0 -> refuz, linia NU intra (crsfactura revine la 0 randuri) +* STOC_NEGATIV_T3 tip=3 gest=1 cant=-5 -> refuz (aceeasi conditie, cantitate<=0) +* STOC_SUFICIENT_T3 tip=3 gest=1 cant=10 -> accept, intra cu pret/TVA/id_jtva_coloana si +* cantitate REALA (10, nu 0) +* NEGESTIONABIL_T3 tip=3 gest=0 cant=0 -> accept (fara plafon pe articol negestionabil) +* STOC_ZERO_T4 tip=4 gest=1 cant=0 -> refuz (factura din avize) +* STOC_SUFICIENT_T21 tip=21 gest=1 cant=5 -> accept (aviz catre clienti din comanda) +* ROL_B_DISJUNCT_T1 tip=1 gest=1 cant=0 -> accept FARA nicio validare (gatare disjuncta; +* cantitate ajunge 0 in crsfactura - zeroita de +* do_initializeaza_articol, comportament neschimbat) +* +* amessagebox e mocat (mock_validare_antet.prg) ca sa nu apara dialogul real; textul capturat se +* verifica sa fie cel neschimbat "Acest articol nu este pe stoc!" (decizia Marius, nu se schimba). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4e_3_linie_libera.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_3_linie_libera.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 inainte de creeaza_cursor_serii; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockNumar, gcMockSql, gnMockSucces, gnMockEroare, gcMockMod, gcMockCurs +PUBLIC gnMockRaspuns, gcMockDuplicat, goExecutorReal +PUBLIC gnPc, gnPVal, gnPPretV, gnScadereStoc, gnMemProcDisc +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_3_linie_libera.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockNumar = 0 +gcMockSql = "" +gnMockSucces = 1 +gnMockEroare = 0 +gcMockMod = "PLIN" +gcMockCurs = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +gnPc = 2 +gnPVal = 2 +gnPPretV = 4 +gnScadereStoc = 1 +gnMemProcDisc = 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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", ; + &lcProc +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +gnPc = 2 +gnPVal = 2 +gnPPretV = 4 +gnScadereStoc = 1 +gnMemProcDisc = 0 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE +* combosql_cautare traieste azi in ofacturare.vc2 insusi (mutata acolo la 30.08.2026, commit +* e2ee622) - nu mai exista ofacturare_cautare.prg separat, deci nu mai e nimic de inregistrat +* suplimentar aici; SET CLASSLIB _cb_base.vcx de mai sus ramane necesar (parintele combosql). + +* jtva_coloane: cursorul folosit de derivarea id_jtva_coloana din proc_tvav (do_adauga_articol_cautat) +IF USED('jtva_coloane') + USE IN jtva_coloane +ENDIF +CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2)) +INSERT INTO jtva_coloane VALUES (190, 'TVA 19%', 19) +INSERT INTO jtva_coloane VALUES (210, 'TVA 21%', 21) +INSERT INTO jtva_coloane VALUES (110, 'TVA 11%', 11) +GO TOP IN jtva_coloane + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") +poDate = NULL + +DO Caz WITH "STOC_ZERO_T3", 3, 1, 0, .T., 101, "CM101" +DO Caz WITH "STOC_NEGATIV_T3", 3, 1, -5, .T., 102, "CM102" +DO Caz WITH "STOC_SUFICIENT_T3", 3, 1, 10, .F., 103, "CM103" +DO Caz WITH "NEGESTIONABIL_T3", 3, 0, 0, .F., 104, "CM104" +DO Caz WITH "STOC_ZERO_T4", 4, 1, 0, .T., 105, "CM105" +DO Caz WITH "STOC_SUFICIENT_T21",21, 1, 5, .F., 106, "CM106" +DO Caz WITH "ROL_B_DISJUNCT_T1", 1, 1, 0, .F., 107, "CM107" + +DO Final + +*---------------------------------------------------------------------------------------- +* tcCaz, tnTip, tnGestionabil, tnCantitate, tlAsteptatRefuz, tnIdArticol, tcCodmat +PROCEDURE Caz + LPARAMETERS tcCaz, tnTip, tnGestionabil, tnCantitate, tlAsteptatRefuz, tnIdArticol, tcCodmat + LOCAL loForm, llRezultat, loArticol + gcCaz = "[" + tcCaz + "] " + DO AfLog WITH "PAS: " + gcCaz + + DO Reseteaza WITH tnTip + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + loArticol = CreeazaArticolCautat(tnIdArticol, tcCodmat, tnGestionabil, tnCantitate) + + SELECT crsfactura + APPEND BLANK + DO Assert WITH RECCOUNT('crsfactura') = 1, "crsfactura are o linie goala (But_nou1) inainte de adaugare" + + gcMockApeluri = "" + llRezultat = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate) + + IF tlAsteptatRefuz + DO Assert WITH !llRezultat, "Return .F. (refuz) asteptat" + DO Assert WITH RECCOUNT('crsfactura') = 0, "linia NU intra in crsfactura dupa refuz" + DO Assert WITH "amessagebox(" $ gcMockApeluri, "mesaj de stoc afisat (mocat)" + DO Assert WITH "nu este pe stoc" $ LOWER(gcMockApeluri), "textul mesajului ramane cel de azi, neschimbat" + ELSE + DO Assert WITH llRezultat, "Return .T. (accept) asteptat" + DO Assert WITH RECCOUNT('crsfactura') = 1, "do_adauga_articol_cautat NU a adaugat o a doua linie" + DO Assert WITH !("amessagebox(" $ gcMockApeluri), "niciun mesaj de stoc la acceptare" + DO Assert WITH crsfactura.id_articol = tnIdArticol, "crsfactura.id_articol corect" + DO Assert WITH ALLTRIM(crsfactura.codmat) == tcCodmat, "crsfactura.codmat corect" + DO Assert WITH crsfactura.proc_tvav = 1.19, "crsfactura.proc_tvav = 1.19 (pastrat din randul cautat)" + DO Assert WITH crsfactura.pretftva = 50, "crsfactura.pretftva = 50 (valoare reala, nu 0 - capcana FACT-013)" + DO Assert WITH crsfactura.id_jtva_coloana = 190, "crsfactura.id_jtva_coloana = 190 (derivat din proc_tvav=1.19)" + IF tnTip = 1 + DO Assert WITH crsfactura.cantitate = 0, "ROL_B_DISJUNCT: cantitate ZEROITA de do_initializeaza_articol (tip 1 e in grupul :19646) - neschimbat de S4e-3" + ELSE + DO Assert WITH crsfactura.cantitate = tnCantitate, "cantitate REALA pastrata (tip S4e-3 nu e in grupul zeroit de do_initializeaza_articol)" + ENDIF + ENDIF + + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* construieste poArticol exact ca randul scaterat dintr-un cursor brut de cursor_preturi +* (structura identica cu mock_cursor_preturi.prg / cursor_preturi din pack_facturare) +FUNCTION CreeazaArticolCautat + LPARAMETERS tnIdArticol, tcCodmat, tnGestionabil, tnCantitate + LOCAL loArticol + IF USED('crstestarticols4e3') + USE IN crstestarticols4e3 + ENDIF + CREATE CURSOR crstestarticols4e3 (id_c N(20), id_articol N(20), lot C(20) NULL, serie C(20) NULL, ; + id_pol N(20), id_valuta N(10), nume_lista_preturi C(100), discount_unitar N(20,4), ; + discount_unitar_val N(20,4), codmat C(100), codbare C(50), denumire C(100), um C(10), ; + gestionabil N(1), cantitate N(20,4), proc_tvav N(20,4), preturi_cu_tva N(1), ; + curs N(20,4), multiplicator N(10), pret N(20,4), pret_val N(20,4), tip_valuta N(1), ; + nume_val C(20), modificabil N(1)) + INSERT INTO crstestarticols4e3 VALUES (0, tnIdArticol, NULL, NULL, 31, 1, "LISTA TEST", 0, 0, ; + tcCodmat, "CB" + TRANSFORM(tnIdArticol), "Articol test " + TRANSFORM(tnIdArticol), "BUC", ; + tnGestionabil, tnCantitate, 1.19, 0, 1, 1, 50, 50, 1, "RON", 1) + GO TOP IN crstestarticols4e3 + SCATTER NAME loArticol MEMO + USE IN crstestarticols4e3 + RETURN loArticol +ENDFUNC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip + LOCAL lnIdSet + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + DO Inchide WITH 'scrsCodmat' + DO Inchide WITH 'crsCodmat' + DO Inchide WITH 'scrsDenumire' + DO Inchide WITH 'crsDenumire' + SELECT 0 + + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcMockSql = "" + gcMockCurs = "" + gcErr = "" + gnMockNumar = 100 + gnMockRaspuns = 6 + gcMockDuplicat = "" + gcMockMod = "PLIN" + gnMockSucces = 1 + gnMockEroare = 0 + + lnIdSet = 26000 + tnTip + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 77 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_valuta = 1 + poDate.in_valuta = 0 + poDate.listaid = "1" + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + IF TYPE('goExecutorReal') = 'O' + goExecutor = goExecutorReal + ENDIF + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4e_avize.prg b/utile/Teste/facturare_unificat/test_s4e_avize.prg new file mode 100644 index 0000000..9b04670 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4e_avize.prg @@ -0,0 +1,502 @@ +* test_s4e_avize.prg +* Headless: S4e-5 - extinderea si proba pe avize (tip 4 si 21,25,28,42,47), nota_executie_s4e.md +* sectiunea "S4e-5 - extinderea si proba pe avize (tip 4 si 21,25,28,42,47)" (~:479). FARA COD NOU - +* repeta probele S4e-4 (test_s4e_registru.prg) pe tip 4 ("factura din avize") si tip 21 (aviz din +* comanda), plus o proba suplimentara ceruta explicit de nota: dovada ca o linie LIBERA in crsfactura +* NU polueaza pnParametruAditional trimis catre Oracle prin scrie_factura_avize. +* +* CONSTATARE DE PROIECTARE (verificata pe cod, nu pe descrierea nota): pentru frm_facturare_articole2 +* (clasa vizata de S4e - do_scrie_factura la COMUN\clase\ofacturare.vc2:19983-20322), ramura +* Case poDate.Tip = 4 (:20059-20074) NU foloseste un Calculate Sum(cantitate) local peste crsarticole +* / crsfactura, cum descrie nota - foloseste o functie Oracle server-side, pack_facturare. +* exista_ramas_avize_lista(poDate.listaid), care citeste dupa listaid, nu dupa continutul cursoarelor +* locale. La fel, ramura Case Inlist(poDate.Tip,3,21,25,28,42,47) (:20096-20107) foloseste +* pack_facturare.cantitate_ramasa_comanda(Val(poDate.listaid)). ("Calculate Sum(cantitate)" local +* exista doar in copia VECHE, frm_facturare_articole.do_scrie_factura, :14454/:14485 - alta clasa, +* nu cea vizata de S4e.) Asertiunile B/C de mai jos dovedesc pe rulare, nu doar pe citirea codului, +* ca rezultatul (SQL/suma/pnParametruAditional/dialog) e identic cu si fara linie libera. +* +* Patru grupe de asertiuni: +* A_Tip4 / A_Tip21 (echivalent A2 din test_s4e_registru.prg): do_sterge pe o linie LIBERA lasa +* Sum(crsarticole.cantitate) neschimbat; pe o linie de AVIZ/COMANDA creste cantitatea la id_c +* respectiv cu exact cantitatea stearsa. Ramura Do Case atinsa (ofacturare.vc2:20436): +* "Case (gnScadereStoc=1 And poDate.tip=23) Or Inlist(poDate.tip,3,4,21,25,28,42,47)" - aceeasi +* ca la tip 3 (S4e-4), doar poDate.tip difera. +* BC_Tip4 / BC_Tip21: asertiune DIRECTA - SQL-ul construit, lnCantitateRamasa, pnFacturaRetur (doar +* tip4) si pnParametruAditional sunt IDENTICE intre o rulare cu crsfactura continand doar linii de +* aviz/comanda si o rulare cu ACEEASI stare + o linie LIBERA suplimentara (cantitate mare, 999, ca +* sa iasa in evidenta orice contaminare). Executa SimulaRamuraTip4/SimulaRamuraComanda - o oglinda +* LITERALA a codului de productie citat mai sus (nu apeleaza Thisform.do_scrie_factura, care ar +* scrie in Oracle prin do_scrie_articole - risc si scop in afara perimetrului "fara cod nou"). +* Captureaza si TEXTUL dialogului + tipul lui (raspunsul implicit e codificat in tnDialogBoxType, +* 4+32) prin mock_amessebox.prg (gcMockUltimMesaj/gnMockUltimTip) - PROBA PRIN MOCK, NU DIALOGUL +* REAL. Proba manuala pe dialogul real ("Gata cand" oficial al nota) ramane DATORIE DESCHISA - +* vezi raport. +* +* Sablon: test_s4e_registru.prg (S4e-4) + mock_amessagebox din test_s3b_emitere_reala.prg (PUBLIC +* gcMockUltimMesaj/gnMockUltimTip). CAPCANA descoperita aici: mock_validare_antet.prg defineste SI +* EL amessagebox, iar la nume duplicat de PROCEDURE intre fisiere SET PROCEDURE castiga PRIMUL +* fisier din lista (verificat empiric - vezi comentariul de la incarcarea SET PROCEDURE mai jos), +* nu ultimul cum spune antetul mock_amessagebox.prg - deci mock_amessagebox.prg trebuie incarcat +* PRIMUL. Dupa fiecare Calculate/Sum se face GO TOP IN crsarticole (Calculate muta Recno() la EOF +* pe cursorul afectat). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4e_avize.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_avize.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 inainte de creeaza_cursor_serii; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat, gnMockNumar +PUBLIC gnPc, gnPVal, gnPPretV, gnScadereStoc, gnMemProcDisc +PUBLIC gcMockUltimMesaj, gnMockUltimTip +PUBLIC gcUltimSql, gnUltimRamas, gnUltimFacturaRetur, gnUltimParamAditional +gnMockNumar = 0 +gnPc = 2 +gnPVal = 2 +gnPPretV = 4 +gnScadereStoc = 1 +gnMemProcDisc = 0 +gcMockUltimMesaj = '' +gnMockUltimTip = 0 +gcUltimSql = '' +gnUltimRamas = 0 +gnUltimFacturaRetur = 0 +gnUltimParamAditional = 0 +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_avize.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +* CAPCANA descoperita la scrierea acestui test: mock_validare_antet.prg si mock_amessagebox.prg +* definesc AMANDOUA FUNCTION amessagebox, si comentariile lor de antet se CONTRAZIC despre cine +* castiga la nume duplicat ("primul in lista" vs. "ultima incarcata"). Verificat EMPIRIC aici: +* la nume duplicat de PROCEDURE/FUNCTION intre fisiere SET PROCEDURE, castiga PRIMUL fisier din +* lista curenta a lui SET("PROCEDURE") - exact ce spune antetul mock_validare_antet.prg, NU ce +* spune antetul mock_amessagebox.prg. De-aici, mock_amessagebox.prg trebuie pus PRIMUL ca sa +* castige (necesar pt. captura gcMockUltimMesaj/gnMockUltimTip din TestBC_*); mock_validare_antet.prg +* ramane incarcat dupa el, doar pt. facturi_duplicate (nefolosit de acest test, dar pastrat pt. +* orice alt apel indirect din do_sterge). +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +gnIdSucursala = 167 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +IF USED('jtva_coloane') + USE IN jtva_coloane +ENDIF +CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2)) +INSERT INTO jtva_coloane VALUES (190, 'TVA 19%', 19) +INSERT INTO jtva_coloane VALUES (210, 'TVA 21%', 21) +INSERT INTO jtva_coloane VALUES (110, 'TVA 11%', 11) +GO TOP IN jtva_coloane + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poDate = NULL +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") + +DO TestA_Tip4 +DO TestA_Tip21 +DO TestBC_Tip4 +DO TestBC_Tip21 + +DO Final + +*---------------------------------------------------------------------------------------- +* A_Tip4: echivalentul A2 din test_s4e_registru.prg, pe poDate.tip=4. crsarticole cu 3 randuri +* (id_c 1..3); crsfactura cu o linie de aviz (id_c=2) si una libera (id_c=0). Ramura Do Case atinsa +* in do_sterge (ofacturare.vc2:20436): Inlist(poDate.tip,3,4,21,25,28,42,47) - include 4 explicit. +PROCEDURE TestA_Tip4 + DO TestARegistru WITH 4 +ENDPROC + +*---------------------------------------------------------------------------------------- +* A_Tip21: identic cu A_Tip4, pe poDate.tip=21 (aviz din comanda). Aceeasi ramura Do Case +* (Inlist include si 21). +PROCEDURE TestA_Tip21 + DO TestARegistru WITH 21 +ENDPROC + +*---------------------------------------------------------------------------------------- +* Corpul comun A2-echivalent, parametrizat pe tip (3 la S4e-4, 4/21 aici). +PROCEDURE TestARegistru + LPARAMETERS tnTip + LOCAL loForm, lnSumInainte, lnSumDupa, lnCantId2Inainte, lnCantId2Dupa + + gcCaz = "[A tip=" + TRANSFORM(tnTip) + ": do_sterge - linie libera vs linie de aviz/comanda] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH tnTip + + SELECT 0 + CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ; + gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ; + preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ; + Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; + codmat C(50), codbare C(50), nume_val C(20)) + INSERT INTO crsarticole VALUES (1, 401, "ARTICOL 1", 5, 1, 0, 100, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM401", "", "RON") + INSERT INTO crsarticole VALUES (2, 402, "ARTICOL 2", 7, 1, 0, 100, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM402", "", "RON") + INSERT INTO crsarticole VALUES (3, 403, "ARTICOL 3", 3, 1, 0, 100, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM403", "", "RON") + GO TOP IN crsarticole + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 2, id_articol WITH 402, denumire WITH "ARTICOL 2", ; + cantitate WITH 4, opt_facturare WITH 0 + APPEND BLANK + REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 999, denumire WITH "LINIE LIBERA", ; + cantitate WITH 2, opt_facturare WITH 0 + DO Assert WITH RECCOUNT('crsfactura') = 2, "crsfactura are 2 randuri (aviz/comanda + libera)" + + *-- pas 1: sterge linia LIBERA (id_c=0) - Sum(crsarticole.cantitate) ramane neschimbat + SELECT crsarticole + CALCULATE SUM(cantitate) TO lnSumInainte + GO TOP IN crsarticole + + SELECT crsfactura + LOCATE FOR id_c = 0 + DO Assert WITH FOUND(), "linia libera (id_c=0) gasita in crsfactura" + + gnErr = 0 + gcErr = "" + gnMockRaspuns = 6 + loForm.do_sterge() + DO Assert WITH gnErr = 0, "do_sterge (linie libera) fara eroare" + DO Assert WITH RECCOUNT('crsfactura') = 1, "linia libera a fost stearsa din crsfactura" + + SELECT crsarticole + CALCULATE SUM(cantitate) TO lnSumDupa + GO TOP IN crsarticole + DO Assert WITH lnSumDupa = lnSumInainte, "Sum(crsarticole.cantitate) neschimbat dupa stergerea liniei LIBERE (inainte=" + ; + TRANSFORM(lnSumInainte) + " dupa=" + TRANSFORM(lnSumDupa) + ")" + + *-- pas 2: sterge linia de aviz/comanda (id_c=2) - crsarticole.cantitate la id_c=2 creste cu exact 4 + SELECT crsarticole + LOCATE FOR id_c = 2 + lnCantId2Inainte = cantitate + GO TOP IN crsarticole + + SELECT crsfactura + LOCATE FOR id_c = 2 + DO Assert WITH FOUND(), "linia de aviz/comanda (id_c=2) gasita in crsfactura" + + gnErr = 0 + gcErr = "" + gnMockRaspuns = 6 + loForm.do_sterge() + DO Assert WITH gnErr = 0, "do_sterge (linie aviz/comanda) fara eroare" + DO Assert WITH RECCOUNT('crsfactura') = 0, "linia de aviz/comanda a fost stearsa din crsfactura" + + SELECT crsarticole + LOCATE FOR id_c = 2 + lnCantId2Dupa = cantitate + GO TOP IN crsarticole + DO Assert WITH lnCantId2Dupa = lnCantId2Inainte + 4, "crsarticole.cantitate la id_c=2 a crescut cu exact 4 (inainte=" + ; + TRANSFORM(lnCantId2Inainte) + " dupa=" + TRANSFORM(lnCantId2Dupa) + ")" + + DO Inchide WITH 'crsarticole' + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* BC_Tip4: asertiune directa - SQL/suma/pnFacturaRetur/pnParametruAditional/dialog (text+tip) +* identice intre "fara linie libera" si "cu linie libera" pe ramura tip 4. +PROCEDURE TestBC_Tip4 + LOCAL lcSql1, lnRamas1, lnFacturaRetur1, lnParam1, lcMesaj1, lnTip1 + LOCAL lcSql2, lnRamas2, lnFacturaRetur2, lnParam2, lcMesaj2, lnTip2 + + gcCaz = "[BC tip=4: SQL/suma/pnParametruAditional/dialog identice cu si fara linie libera] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 4 + poDate.listaid = "1" + + *-- baseline: crsfactura cu doar o linie de aviz (fara linie libera) + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 5, id_articol WITH 501, denumire WITH "AVIZ LINIE", ; + cantitate WITH 3, opt_facturare WITH 0 + + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + IF !DO_SimulaRamuraTip4() + DO AfLog WITH "FAIL: SimulaRamuraTip4 (baseline) nu a putut fi executata - vezi asertiunea SELECT de mai sus" + RETURN + ENDIF + lcSql1 = gcUltimSql + lnRamas1 = gnUltimRamas + lnFacturaRetur1 = gnUltimFacturaRetur + lnParam1 = gnUltimParamAditional + lcMesaj1 = gcMockUltimMesaj + lnTip1 = gnMockUltimTip + + *-- poluat: aceeasi stare + o linie LIBERA (id_c=0), cantitate mare (999) ca sa iasa in evidenta + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 999, denumire WITH "LINIE LIBERA", ; + cantitate WITH 999, opt_facturare WITH 0 + DO Assert WITH RECCOUNT('crsfactura') = 2, "crsfactura are acum si linia libera (tip 4)" + + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + IF !DO_SimulaRamuraTip4() + DO AfLog WITH "FAIL: SimulaRamuraTip4 (poluat) nu a putut fi executata - vezi asertiunea SELECT de mai sus" + RETURN + ENDIF + lcSql2 = gcUltimSql + lnRamas2 = gnUltimRamas + lnFacturaRetur2 = gnUltimFacturaRetur + lnParam2 = gnUltimParamAditional + lcMesaj2 = gcMockUltimMesaj + lnTip2 = gnMockUltimTip + + DO Assert WITH lcSql1 = lcSql2, "SQL-ul (exista_ramas_avize_lista) identic cu/fara linie libera" + DO Assert WITH lnRamas1 = lnRamas2, "lnCantitateRamasa identic (obtinut: " + TRANSFORM(lnRamas1) + " / " + TRANSFORM(lnRamas2) + ")" + DO Assert WITH lnFacturaRetur1 = lnFacturaRetur2, "pnFacturaRetur identic (obtinut: " + TRANSFORM(lnFacturaRetur1) + " / " + TRANSFORM(lnFacturaRetur2) + ")" + DO Assert WITH lnParam1 = lnParam2, "pnParametruAditional identic (obtinut: " + TRANSFORM(lnParam1) + " / " + TRANSFORM(lnParam2) + ")" + DO Assert WITH lcMesaj1 = lcMesaj2, "textul dialogului (mock) identic cu/fara linie libera (obtinut: [" + lcMesaj1 + "] / [" + lcMesaj2 + "])" + DO Assert WITH lnTip1 = lnTip2, "tipul dialogului / raspunsul implicit (mock) identic cu/fara linie libera (obtinut: " + TRANSFORM(lnTip1) + " / " + TRANSFORM(lnTip2) + ")" +ENDPROC + +*---------------------------------------------------------------------------------------- +* BC_Tip21: identic cu BC_Tip4, dar pe ramura Inlist(poDate.Tip,3,21,25,28,42,47) - foloseste +* cantitate_ramasa_comanda in loc de exista_ramas_avize_lista, si nu are pnFacturaRetur. +PROCEDURE TestBC_Tip21 + LOCAL lcSql1, lnRamas1, lnParam1, lcMesaj1, lnTip1 + LOCAL lcSql2, lnRamas2, lnParam2, lcMesaj2, lnTip2 + + gcCaz = "[BC tip=21: SQL/suma/pnParametruAditional/dialog identice cu si fara linie libera] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 21 + poDate.listaid = "1" + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 5, id_articol WITH 501, denumire WITH "COMANDA LINIE", ; + cantitate WITH 3, opt_facturare WITH 0 + + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + IF !DO_SimulaRamuraComanda() + DO AfLog WITH "FAIL: SimulaRamuraComanda (baseline) nu a putut fi executata - vezi asertiunea SELECT de mai sus" + RETURN + ENDIF + lcSql1 = gcUltimSql + lnRamas1 = gnUltimRamas + lnParam1 = gnUltimParamAditional + lcMesaj1 = gcMockUltimMesaj + lnTip1 = gnMockUltimTip + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 999, denumire WITH "LINIE LIBERA", ; + cantitate WITH 999, opt_facturare WITH 0 + DO Assert WITH RECCOUNT('crsfactura') = 2, "crsfactura are acum si linia libera (tip 21)" + + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + IF !DO_SimulaRamuraComanda() + DO AfLog WITH "FAIL: SimulaRamuraComanda (poluat) nu a putut fi executata - vezi asertiunea SELECT de mai sus" + RETURN + ENDIF + lcSql2 = gcUltimSql + lnRamas2 = gnUltimRamas + lnParam2 = gnUltimParamAditional + lcMesaj2 = gcMockUltimMesaj + lnTip2 = gnMockUltimTip + + DO Assert WITH lcSql1 = lcSql2, "SQL-ul (cantitate_ramasa_comanda) identic cu/fara linie libera" + DO Assert WITH lnRamas1 = lnRamas2, "lnCantitateRamasa identic (obtinut: " + TRANSFORM(lnRamas1) + " / " + TRANSFORM(lnRamas2) + ")" + DO Assert WITH lnParam1 = lnParam2, "pnParametruAditional identic (obtinut: " + TRANSFORM(lnParam1) + " / " + TRANSFORM(lnParam2) + ")" + DO Assert WITH lcMesaj1 = lcMesaj2, "textul dialogului (mock) identic cu/fara linie libera (obtinut: [" + lcMesaj1 + "] / [" + lcMesaj2 + "])" + DO Assert WITH lnTip1 = lnTip2, "tipul dialogului / raspunsul implicit (mock) identic cu/fara linie libera (obtinut: " + TRANSFORM(lnTip1) + " / " + TRANSFORM(lnTip2) + ")" +ENDPROC + +*---------------------------------------------------------------------------------------- +* Oglinda LITERALA a COMUN\clase\ofacturare.vc2:20059-20074 (frm_facturare_articole2.do_scrie_factura, +* Case poDate.Tip = 4). NU apeleaza metoda reala - aceea scrie in Oracle prin do_scrie_articole, +* in afara perimetrului "fara cod nou" al S4e-5. Rezultatul se pune in gcUltimSql/gnUltimRamas/ +* gnUltimFacturaRetur/gnUltimParamAditional. Returneaza .F. daca SELECT-ul Oracle a esuat (nu e +* asertiune de esec al S4e-5, ci semnal ca proba nu a putut rula pe acest mediu). +PROCEDURE DO_SimulaRamuraTip4 + LOCAL lcSql, lnCantitateRamasa, lnFacturaRetur, lnParamAditional, lnRet + + lcSql = [SELECT pack_facturare.exista_ramas_avize_lista('] + Alltrim(poDate.listaid) + [') AS ramas FROM dual] + lnRet = goExecutor.oExecute(lcSql,'crsramasavize') + DO Assert WITH lnRet >= 0, "SELECT exista_ramas_avize_lista a rulat fara eroare (ret=" + TRANSFORM(lnRet) + ")" + IF lnRet < 0 + RETURN .F. + ENDIF + lnCantitateRamasa = crsramasavize.ramas + USE IN (SELECT('crsramasavize')) + IF lnCantitateRamasa > 0 + lnFacturaRetur = 7 - amessagebox("Doriti sa se inregistreze si avizul de retur?",4+32,"Confirmare") + lnParamAditional = 1 + ELSE + lnFacturaRetur = 0 + lnParamAditional = 0 + ENDIF + gcUltimSql = lcSql + gnUltimRamas = lnCantitateRamasa + gnUltimFacturaRetur = lnFacturaRetur + gnUltimParamAditional = lnParamAditional + RETURN .T. +ENDPROC + +*---------------------------------------------------------------------------------------- +* Oglinda LITERALA a ofacturare.vc2:20096-20107 (Case Inlist(poDate.Tip,3,21,25,28,42,47)). +PROCEDURE DO_SimulaRamuraComanda + LOCAL lcSql, lnCantitateRamasa, lnParamAditional, lnRet + + lcSql = [SELECT pack_facturare.cantitate_ramasa_comanda(] + Alltrim(Str(Val(poDate.listaid))) + [) AS ramas FROM dual] + lnRet = goExecutor.oExecute(lcSql,'crsramascomanda') + DO Assert WITH lnRet >= 0, "SELECT cantitate_ramasa_comanda a rulat fara eroare (ret=" + TRANSFORM(lnRet) + ")" + IF lnRet < 0 + RETURN .F. + ENDIF + lnCantitateRamasa = crsramascomanda.ramas + USE IN (SELECT('crsramascomanda')) + lnParamAditional = 0 + IF lnCantitateRamasa <> 0 + lnParamAditional = 7 - amessagebox("Doriti sa se inchida comanda?",4+32,"Confirmare") + ENDIF + gcUltimSql = lcSql + gnUltimRamas = lnCantitateRamasa + gnUltimParamAditional = lnParamAditional + RETURN .T. +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip + LOCAL lnIdSet + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + DO Inchide WITH 'saft_tip_facturi' + SELECT 0 + + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcErr = "" + gnErr = 0 + gnMockRaspuns = 6 + gcMockDuplicat = "" + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + + lnIdSet = 28000 + tnTip + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 79 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_valuta = 1 + poDate.in_valuta = 0 + poDate.listaid = "1" + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4e_registru.prg b/utile/Teste/facturare_unificat/test_s4e_registru.prg new file mode 100644 index 0000000..72dbc3c --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4e_registru.prg @@ -0,0 +1,347 @@ +* test_s4e_registru.prg +* Headless: S4e-4 - proba de neregresie a registrului, FARA COD NOU (nota_executie_s4e.md, +* sectiunea "S4e-4 - proba de neregresie a registrului", ~:451). Dovedeste pe RULARE, nu pe +* definitie de camp, ca do_sterge (COMUN\clase\ofacturare.vc2:20391-20458) si structura produsa +* de creeaza_facturacrs (COMUN\programe\ofacturare_comun.prg:1782-1798) raman corecte. +* +* Trei asertiuni: +* A1. Dupa APPEND BLANK pe un cursor creat de creeaza_facturacrs: id_c=0 si opt_facturare=0 +* (campuri N() fara NULL, deci implicit 0 la APPEND BLANK - verificat pe rulare). +* A2. crsarticole cu 3 randuri de comanda (id_c 1..3); crsfactura cu o linie de comanda (id_c=2) +* si una libera (id_c=0). do_sterge pe linia LIBERA lasa Calculate Sum(cantitate) peste +* crsarticole NESCHIMBAT (REPLACE ... For id_c=0 nu gaseste niciun rand in crsarticole). +* do_sterge pe linia de COMANDA creste crsarticole.cantitate la id_c=2 cu exact cantitatea +* stearsa - ramura atinsa: "Case (gnScadereStoc=1 And poDate.tip=23) Or Inlist(poDate.tip, +* 3,4,21,25,28,42,47)" (ofacturare.vc2:20432). +* A3. Sum(crsarticole.cantitate) inainte si dupa adaugarea a doua linii libere in crsfactura: +* identic (liniile libere nu ating deloc crsarticole - cursoare separate). +* +* Sablon urmat: test_s4_5_do_sterge_garda.prg (garda Used(lcCursor) din do_sterge, deja verificata +* acolo - nu se reia aici). Dupa fiecare Calculate/Sum se face GO TOP IN crsarticole (Calculate muta +* Recno() la EOF pe cursorul afectat). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4e_registru.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_registru.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 inainte de creeaza_cursor_serii; gnScadereStoc = 1. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat, gnMockNumar +PUBLIC gnPc, gnPVal, gnPPretV, gnScadereStoc, gnMemProcDisc +gnMockNumar = 0 +gnPc = 2 +gnPVal = 2 +gnPPretV = 4 +gnScadereStoc = 1 +gnMemProcDisc = 0 +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4e_registru.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +gnIdSucursala = 167 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) + " gnIdSucursala=" + TRANSFORM(gnIdSucursala) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +IF USED('jtva_coloane') + USE IN jtva_coloane +ENDIF +CREATE CURSOR jtva_coloane (id_jtva_coloana N(14), denumire C(50), cota_tva N(6,2)) +INSERT INTO jtva_coloane VALUES (190, 'TVA 19%', 19) +INSERT INTO jtva_coloane VALUES (210, 'TVA 21%', 21) +INSERT INTO jtva_coloane VALUES (110, 'TVA 11%', 11) +GO TOP IN jtva_coloane + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poDate = NULL +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") + +DO TestA1 +DO TestA2 +DO TestA3 + +DO Final + +*---------------------------------------------------------------------------------------- +* A1: pe rulare, nu pe definitie de camp - APPEND BLANK pe crsfactura creat de creeaza_facturacrs +* trebuie sa produca id_c=0 si opt_facturare=0 (ambele N() fara NULL in ofacturare_comun.prg:1782-1798). +PROCEDURE TestA1 + LOCAL lnIdC, lnOptFact + + gcCaz = "[A1: APPEND BLANK pe crsfactura din creeaza_facturacrs] " + DO AfLog WITH "PAS: " + gcCaz + DO Inchide WITH 'crstest_a1' + + DO creeaza_facturacrs WITH 'crstest_a1' + DO Assert WITH USED('crstest_a1'), "cursorul a fost creat de creeaza_facturacrs" + + SELECT crstest_a1 + APPEND BLANK + lnIdC = id_c + lnOptFact = opt_facturare + DO Assert WITH lnIdC = 0, "id_c = 0 dupa APPEND BLANK (obtinut: " + TRANSFORM(lnIdC) + ")" + DO Assert WITH lnOptFact = 0, "opt_facturare = 0 dupa APPEND BLANK (obtinut: " + TRANSFORM(lnOptFact) + ")" + + DO Inchide WITH 'crstest_a1' +ENDPROC + +*---------------------------------------------------------------------------------------- +* A2: do_sterge pe tip=3 (comanda), crsarticole cu 3 randuri (id_c 1..3), crsfactura cu o linie +* de comanda (id_c=2) si una libera (id_c=0). +* - stergerea liniei LIBERE: Calculate Sum(cantitate) peste crsarticole ramane neschimbat. +* - stergerea liniei de COMANDA: crsarticole.cantitate la id_c=2 creste cu exact cantitatea stearsa. +PROCEDURE TestA2 + LOCAL loForm, lnSumInainte, lnSumDupa, lnCantId2Inainte, lnCantId2Dupa + + gcCaz = "[A2: do_sterge - linie libera vs linie de comanda] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 3 + + SELECT 0 + CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ; + gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ; + preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ; + Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; + codmat C(50), codbare C(50), nume_val C(20)) + INSERT INTO crsarticole VALUES (1, 401, "ARTICOL 1", 5, 1, 0, 100, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM401", "", "RON") + INSERT INTO crsarticole VALUES (2, 402, "ARTICOL 2", 7, 1, 0, 100, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM402", "", "RON") + INSERT INTO crsarticole VALUES (3, 403, "ARTICOL 3", 3, 1, 0, 100, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM403", "", "RON") + GO TOP IN crsarticole + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 2, id_articol WITH 402, denumire WITH "ARTICOL 2", ; + cantitate WITH 4, opt_facturare WITH 0 + APPEND BLANK + REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 999, denumire WITH "LINIE LIBERA", ; + cantitate WITH 2, opt_facturare WITH 0 + DO Assert WITH RECCOUNT('crsfactura') = 2, "crsfactura are 2 randuri (comanda + libera)" + + *-- pas 1: sterge linia LIBERA (id_c=0) - Sum(crsarticole.cantitate) ramane neschimbat + SELECT crsarticole + CALCULATE SUM(cantitate) TO lnSumInainte + GO TOP IN crsarticole + + SELECT crsfactura + LOCATE FOR id_c = 0 + DO Assert WITH FOUND(), "linia libera (id_c=0) gasita in crsfactura" + + gnErr = 0 + gcErr = "" + gnMockRaspuns = 6 + loForm.do_sterge() + DO Assert WITH gnErr = 0, "do_sterge (linie libera) fara eroare" + DO Assert WITH RECCOUNT('crsfactura') = 1, "linia libera a fost stearsa din crsfactura" + + SELECT crsarticole + CALCULATE SUM(cantitate) TO lnSumDupa + GO TOP IN crsarticole + DO Assert WITH lnSumDupa = lnSumInainte, "Sum(crsarticole.cantitate) neschimbat dupa stergerea liniei LIBERE (inainte=" + ; + TRANSFORM(lnSumInainte) + " dupa=" + TRANSFORM(lnSumDupa) + ")" + + *-- pas 2: sterge linia de COMANDA (id_c=2) - crsarticole.cantitate la id_c=2 creste cu exact cantitatea stearsa (4) + SELECT crsarticole + LOCATE FOR id_c = 2 + lnCantId2Inainte = cantitate + GO TOP IN crsarticole + + SELECT crsfactura + LOCATE FOR id_c = 2 + DO Assert WITH FOUND(), "linia de comanda (id_c=2) gasita in crsfactura" + + gnErr = 0 + gcErr = "" + gnMockRaspuns = 6 + loForm.do_sterge() + DO Assert WITH gnErr = 0, "do_sterge (linie comanda) fara eroare" + DO Assert WITH RECCOUNT('crsfactura') = 0, "linia de comanda a fost stearsa din crsfactura" + + SELECT crsarticole + LOCATE FOR id_c = 2 + lnCantId2Dupa = cantitate + GO TOP IN crsarticole + DO Assert WITH lnCantId2Dupa = lnCantId2Inainte + 4, "crsarticole.cantitate la id_c=2 a crescut cu exact 4 (inainte=" + ; + TRANSFORM(lnCantId2Inainte) + " dupa=" + TRANSFORM(lnCantId2Dupa) + ")" + + DO Inchide WITH 'crsarticole' + loForm.Release() + RELEASE loForm +ENDPROC + +*---------------------------------------------------------------------------------------- +* A3: adaugarea a doua linii libere (id_c=0) in crsfactura nu atinge deloc crsarticole - +* Sum(crsarticole.cantitate) identic inainte/dupa. +PROCEDURE TestA3 + LOCAL lnSumInainte, lnSumDupa + + gcCaz = "[A3: Sum(crsarticole) neschimbat de adaugarea liniilor libere] " + DO AfLog WITH "PAS: " + gcCaz + DO Reseteaza WITH 3 + + SELECT 0 + CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ; + gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ; + preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ; + Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; + codmat C(50), codbare C(50), nume_val C(20)) + INSERT INTO crsarticole VALUES (1, 401, "ARTICOL 1", 5, 1, 0, 100, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM401", "", "RON") + INSERT INTO crsarticole VALUES (2, 402, "ARTICOL 2", 7, 1, 0, 100, 0, 1.19, 0, "BUC", ; + 21, "371", 1, 0, 1, 1, 0, 0, "CM402", "", "RON") + GO TOP IN crsarticole + + SELECT crsarticole + CALCULATE SUM(cantitate) TO lnSumInainte + GO TOP IN crsarticole + + SELECT crsfactura + APPEND BLANK + REPLACE id_temp WITH 1, id_c WITH 0, id_articol WITH 991, denumire WITH "LIBERA 1", ; + cantitate WITH 6, opt_facturare WITH 0 + APPEND BLANK + REPLACE id_temp WITH 2, id_c WITH 0, id_articol WITH 992, denumire WITH "LIBERA 2", ; + cantitate WITH 9, opt_facturare WITH 0 + DO Assert WITH RECCOUNT('crsfactura') = 2, "cele doua linii libere au fost adaugate in crsfactura" + + SELECT crsarticole + CALCULATE SUM(cantitate) TO lnSumDupa + GO TOP IN crsarticole + DO Assert WITH lnSumDupa = lnSumInainte, "Sum(crsarticole.cantitate) identic inainte/dupa adaugarea a 2 linii libere (inainte=" + ; + TRANSFORM(lnSumInainte) + " dupa=" + TRANSFORM(lnSumDupa) + ")" + + DO Inchide WITH 'crsarticole' +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip + LOCAL lnIdSet + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + DO Inchide WITH 'saft_tip_facturi' + SELECT 0 + + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcErr = "" + gnErr = 0 + gnMockRaspuns = 6 + gcMockDuplicat = "" + + lnIdSet = 28000 + tnTip + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 79 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_valuta = 1 + poDate.in_valuta = 0 + poDate.listaid = "1" + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4f_cautare_retur.prg b/utile/Teste/facturare_unificat/test_s4f_cautare_retur.prg new file mode 100644 index 0000000..9f5ea5e --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4f_cautare_retur.prg @@ -0,0 +1,390 @@ +* test_s4f_cautare_retur.prg +* Headless: do_adauga_articol_cautat (frm_facturare_articole2, ofacturare.vc2:18929) pe un document +* de retur (poDate.tip = 8) trebuie sa delege la calea veche do_adauga_articol, care alege gestiunea +* reala - nu la Gather-ul direct din toArticol (care scria sentinela id_gestiune = -1000, S4f). +* +* crsarticole e construit direct (nu prin Oracle), cu UN singur rand deja "incarcat" pe document +* (ca dupa butonul Incarca articole / do_adauga_tot), gestionabil=0 ca sa ocoleasca do_alege_stoc +* (nu se testeaza alegerea de gestiune cu formular modal, doar rutarea - pattern validat deja de +* test_s4e_0_adauga_articol.prg CazAdaugaTotSucces). cantitate NEGATIVA (-2): pe tip 8/9, +* do_verifica_articol respinge orice cantitate >= 0 (ofacturare.vc2:20913). +* +* toArticol simuleaza obiectul scatter-uit din crsCodmat/crsDenumire (combo-ul de cautare in linie) +* dupa do_initializeaza_articol - doar proprietatile citite de do_initializeaza_articol INAINTE de +* ramura noua (um, preturi_cu_tva, discount_unitar(_val), proc_tvav, Pret, pret_val, cantitate, +* id_articol); campurile ramurii vechi (Gather in crsfactura) nu mai sunt atinse pe acest traseu. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4f_cautare_retur.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4f_cautare_retur.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnScadereStoc = 1. +* +* CazNegasitTip8/CazNegasitTip41 (garda S4f: articol nevandut pe documentul returnat) - articolul +* cautat NU e printre randurile din crsarticole. Pe tip 8/9 noua garda din do_adauga_articol_cautat +* (ofacturare.vc2:18945-18949) trebuie sa afiseze mesajul (mocat de mock_validare_antet.prg, incarcat +* PRIMUL - vezi SET PROCEDURE mai jos) si sa intoarca .F. fara sa scrie in crsfactura. Pe tip 41 +* garda nu se aplica (caz imposibil, cf. docs\verificare_s4f_caz_accesibil.md) - comportamentul ramane +* neschimbat: cade prin la Gather-ul vechi, scrie cu id_gestiune=-1000 (sentinela, nu regresie). + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +SET TABLEPROMPT OFF +PUBLIC gcLog, gnFail, gnPass, gnErr, gcCaz, gcErr +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat, gnMockNumar +gnMockNumar = 0 +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4f_cautare_retur.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) +gnFail = 0 +gnPass = 0 +gnErr = 0 +gcCaz = "" +gcErr = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +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 +LOCAL lcProc +lcProc = SET("PROCEDURE") +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg", ; + "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_generator_numere.prg", &lcProc +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +gnScadereStoc = 1 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +update_jtva_coloane([JV], [jtva_coloane_temp]) +update_saft_taxtable() + +PRIVATE poDate, poGeneratorNumere, plVizibil, pnTotalDiscountAvize +plVizibil = .F. +pnTotalDiscountAvize = 0 +poDate = NULL +poGeneratorNumere = CREATEOBJECT("oGeneratorMock") + +DO CazCautareRetur +DO CazNegasitTip8 +DO CazNegasitTip41 + +DO Final + +*---------------------------------------------------------------------------------------- +* CAZ: cautare in linie pe document retur (tip 8) - trebuie sa delege la do_adauga_articol, +* care scrie id_gestiune REAL (77, din crsarticole), nu sentinela -1000 din do_initializeaza_articol. +PROCEDURE CazCautareRetur + LOCAL loForm, loArticol + gcCaz = "[CAZ_S4f cautare_retur] " + DO AfLog WITH "PAS: " + gcCaz + + DO Reseteaza WITH 8 + + SELECT 0 + CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ; + gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ; + preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ; + Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; + codmat C(50), codbare C(50), nume_val C(20)) + * cantitate POZITIVA: do_adauga_articol cheama din nou do_initializeaza_articol pe poArticol + * (scatter din acest rand), care inverseaza semnul pentru tip 8/9 (:19898) - abia dupa aceea + * do_verifica_articol cere tnCantitate NEGATIV ca sa accepte pe retur (:20916) + INSERT INTO crsarticole VALUES (1, 555001, "ARTICOL RETUR TEST", 2, 0, 0, 100, 0, 1.19, 0, "BUC", ; + 77, "371", 1, 0, 1, 1, 0, 0, "CM555001", "", "RON") + GO TOP IN crsarticole + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + * obiectul cautat in combo (cCodMat/cDenumire), dupa Scatter din crsCodmat/crsDenumire + loArticol = CREATEOBJECT('Empty') + ADDPROPERTY(loArticol, 'id_articol', 555001) + ADDPROPERTY(loArticol, 'denumire', "ARTICOL RETUR TEST") + ADDPROPERTY(loArticol, 'codmat', "CM555001") + ADDPROPERTY(loArticol, 'um', "BUC") + ADDPROPERTY(loArticol, 'preturi_cu_tva', 0) + ADDPROPERTY(loArticol, 'discount_unitar', 0) + ADDPROPERTY(loArticol, 'discount_unitar_val', 0) + ADDPROPERTY(loArticol, 'proc_tvav', 1.19) + ADDPROPERTY(loArticol, 'Pret', 100) + ADDPROPERTY(loArticol, 'pret_val', 0) + ADDPROPERTY(loArticol, 'cantitate', 2) + + gcErr = "" + gnErr = 0 + gcMockApeluri = "" + DO AfLog WITH "DIAG poDate.tip=" + TRANSFORM(poDate.tip) + " crsarticole.id_articol(inainte)=" + TRANSFORM(crsarticole.id_articol) + " cantitate=" + TRANSFORM(crsarticole.cantitate) + loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate) + + DO AfLog WITH "DIAG dupa apel: gcErr=[" + gcErr + "] gcMockApeluri=[" + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13)+CHR(10), ' | ') + "]" + DO AfLog WITH "DIAG crsfactura reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + " crsarticole reccount=" + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), -1)) + IF USED('crsarticole') + DO AfLog WITH "DIAG crsarticole dupa: id_articol=" + TRANSFORM(crsarticole.id_articol) + " cantitate=" + TRANSFORM(crsarticole.cantitate) + ENDIF + + DO Assert WITH !("GRD_ARTICOLE" $ UPPER(gcErr)), "fara amprenta GRD_ARTICOLE in gcErr" + DO Assert WITH !("TXTCODMAT" $ UPPER(gcErr)), "fara amprenta TXTCODMAT in gcErr" + DO Assert WITH RECCOUNT('crsfactura') = 1, "randul a ajuns in crsfactura pe calea veche (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")" + + IF RECCOUNT('crsfactura') >= 1 + SELECT crsfactura + GO TOP + DO Assert WITH id_gestiune <> -1000, "id_gestiune NU ramane sentinela -1000, e=" + TRANSFORM(id_gestiune) + DO Assert WITH id_gestiune = 77, "id_gestiune vine din crsarticole (gestiunea reala), e=" + TRANSFORM(id_gestiune) + DO Assert WITH id_articol = 555001, "id_articol corect in crsfactura" + ENDIF + + DO Inchide WITH 'crsarticole' + loForm.Release() + RELEASE loForm, loArticol +ENDPROC + +*---------------------------------------------------------------------------------------- +* CAZ (a): tip 8, articolul cautat NU e in crsarticole (nevandut pe documentul returnat) - garda +* noua trebuie sa refuze: .F., fara rand nou in crsfactura, mesaj afisat (mocat). +PROCEDURE CazNegasitTip8 + LOCAL loForm, loArticol, llRet + gcCaz = "[CAZ_S4f negasit_tip8] " + DO AfLog WITH "PAS: " + gcCaz + + DO Reseteaza WITH 8 + + SELECT 0 + CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ; + gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ; + preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ; + Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; + codmat C(50), codbare C(50), nume_val C(20)) + * alt articol, deja incarcat pe document - id_articol diferit de cel cautat mai jos (555001) + INSERT INTO crsarticole VALUES (1, 999002, "ALT ARTICOL PE DOCUMENT", 2, 0, 0, 100, 0, 1.19, 0, "BUC", ; + 77, "371", 1, 0, 1, 1, 0, 0, "CM999002", "", "RON") + GO TOP IN crsarticole + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + loArticol = CREATEOBJECT('Empty') + ADDPROPERTY(loArticol, 'id_articol', 555001) + ADDPROPERTY(loArticol, 'denumire', "ARTICOL NEVANDUT") + ADDPROPERTY(loArticol, 'codmat', "CM555001") + ADDPROPERTY(loArticol, 'um', "BUC") + ADDPROPERTY(loArticol, 'preturi_cu_tva', 0) + ADDPROPERTY(loArticol, 'discount_unitar', 0) + ADDPROPERTY(loArticol, 'discount_unitar_val', 0) + ADDPROPERTY(loArticol, 'proc_tvav', 1.19) + ADDPROPERTY(loArticol, 'Pret', 100) + ADDPROPERTY(loArticol, 'pret_val', 0) + ADDPROPERTY(loArticol, 'cantitate', 2) + + gcErr = "" + gnErr = 0 + gcMockApeluri = "" + llRet = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate) + + DO AfLog WITH "DIAG llRet=" + TRANSFORM(llRet) + " gcMockApeluri=[" + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13)+CHR(10), ' | ') + "]" + DO AfLog WITH "DIAG crsfactura reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + + DO Assert WITH gnErr = 0, "fara eroare VFP la refuz (tip 8, articol negasit)" + DO Assert WITH llRet = .F., "do_adauga_articol_cautat intoarce .F. (tip 8, articol negasit)" + DO Assert WITH RECCOUNT('crsfactura') = 0, "crsfactura neschimbat (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")" + DO Assert WITH "amessagebox(" $ gcMockApeluri, "mesajul de refuz a fost afisat (mocat)" + DO Assert WITH "NU A FOST VANDUT" $ UPPER(gcMockApeluri), "textul mesajului explica motivul refuzului" + + DO Inchide WITH 'crsarticole' + loForm.Release() + RELEASE loForm, loArticol +ENDPROC + +*---------------------------------------------------------------------------------------- +* CAZ (c): tip 41, articolul cautat NU e in crsarticole - garda noua NU se aplica (scopata la 8/9). +* Comportamentul trebuie sa ramana neschimbat: cade prin la Gather-ul vechi, .T., id_gestiune=-1000. +PROCEDURE CazNegasitTip41 + LOCAL loForm, loArticol, llRet + gcCaz = "[CAZ_S4f negasit_tip41] " + DO AfLog WITH "PAS: " + gcCaz + + DO Reseteaza WITH 41 + + SELECT 0 + CREATE CURSOR crsarticole (id_c N(20), id_articol N(20), denumire C(100), cantitate N(20,4), ; + gestionabil N(1), opt_facturare N(3), Pret N(20,4), pret_val N(20,4), proc_tvav N(20,4), ; + preturi_cu_tva N(1), um C(10), id_gestiune N(20), cont C(10), id_valuta N(10), tip_valuta N(1), ; + Curs N(20,4), multiplicator N(10), discount_unitar N(20,4), discount_unitar_val N(20,4), ; + codmat C(50), codbare C(50), nume_val C(20)) + INSERT INTO crsarticole VALUES (1, 999002, "ALT ARTICOL PE DOCUMENT", 2, 0, 0, 100, 0, 1.19, 0, "BUC", ; + 77, "371", 1, 0, 1, 1, 0, 0, "CM999002", "", "RON") + GO TOP IN crsarticole + + loForm = CREATEOBJECT('frm_facturare_articole2') + DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" + IF VARTYPE(loForm) <> 'O' + RETURN + ENDIF + + loArticol = CREATEOBJECT('Empty') + ADDPROPERTY(loArticol, 'id_articol', 555001) + ADDPROPERTY(loArticol, 'denumire', "ARTICOL NEVANDUT") + ADDPROPERTY(loArticol, 'codmat', "CM555001") + ADDPROPERTY(loArticol, 'um', "BUC") + ADDPROPERTY(loArticol, 'preturi_cu_tva', 0) + ADDPROPERTY(loArticol, 'discount_unitar', 0) + ADDPROPERTY(loArticol, 'discount_unitar_val', 0) + ADDPROPERTY(loArticol, 'proc_tvav', 1.19) + ADDPROPERTY(loArticol, 'Pret', 100) + ADDPROPERTY(loArticol, 'pret_val', 0) + ADDPROPERTY(loArticol, 'cantitate', 2) + * tip 41 nu delega (nu are echivalent al do_adauga_articol) - cade in Gather-ul vechi, care mai + * citeste si aceste proprietati din obiectul cautat (neatinse de do_initializeaza_articol) + ADDPROPERTY(loArticol, 'Curs', 1) + ADDPROPERTY(loArticol, 'multiplicator', 1) + ADDPROPERTY(loArticol, 'codbare', "") + + * calea veche (Gather direct in crsfactura, fara Append Blank propriu) presupune ca grilul + * a pozitionat deja un rand gol pe crsfactura - ca la LostFocus pe ultima linie a grid-ului + SELECT crsfactura + APPEND BLANK + + gcErr = "" + gnErr = 0 + gcMockApeluri = "" + llRet = loForm.do_adauga_articol_cautat(loArticol, loArticol.cantitate) + + DO AfLog WITH "DIAG llRet=" + TRANSFORM(llRet) + " gcErr=[" + gcErr + "] gcMockApeluri=[" + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13)+CHR(10), ' | ') + "]" + DO AfLog WITH "DIAG crsfactura reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + + DO Assert WITH gnErr = 0, "fara eroare VFP (tip 41, articol negasit)" + DO Assert WITH llRet = .T., "do_adauga_articol_cautat intoarce .T. (tip 41, comportament neschimbat)" + DO Assert WITH RECCOUNT('crsfactura') = 1, "randul ajunge in crsfactura pe calea veche (Reccount=" + TRANSFORM(RECCOUNT('crsfactura')) + ")" + DO Assert WITH !("amessagebox(" $ gcMockApeluri), "nicio garda pe tip 41 (scopata la 8/9)" + IF RECCOUNT('crsfactura') >= 1 + SELECT crsfactura + GO TOP + DO Assert WITH id_gestiune = -1000, "id_gestiune ramane sentinela -1000 pe tip 41 (neschimbat, nu regresie)" + ENDIF + + DO Inchide WITH 'crsarticole' + loForm.Release() + RELEASE loForm, loArticol +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Reseteaza + LPARAMETERS tnTip + LOCAL lnIdSet + + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'CrsCotaTva' + DO Inchide WITH 'saft_tip_facturi' + DO Inchide WITH 'jtva_coloane' + SELECT 0 + + * cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + gcMockApeluri = "" + gcErr = "" + gnErr = 0 + gnMockRaspuns = 6 + gcMockDuplicat = "" + + lnIdSet = 26000 + tnTip + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + poDate.dataireg = DATE(gnAn, gnLuna, 1) + poDate.dataact = poDate.dataireg + poDate.zi_curs = poDate.dataireg + poDate.id_fdoc = 1 + poDate.fdoc = "FEL TEST" + poDate.nract = 78 + poDate.serie_act = "TST" + poDate.id_client = 1 + poDate.id_furnizor = 1 + poDate.nrfactachi = 1 + poDate.id_valuta = 1 + poDate.in_valuta = 0 + poDate.listaid = "1" + + * jtva_coloane real (do_initializeaza_articol face Select jtva_coloane pe fiecare articol) + DO Inchide WITH 'jtva_coloane' + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + gcMockApeluri = "" +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnErr = gnErr + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " err=" + TRANSFORM(gnErr) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s4g_cont_venit.prg b/utile/Teste/facturare_unificat/test_s4g_cont_venit.prg new file mode 100644 index 0000000..64bc571 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s4g_cont_venit.prg @@ -0,0 +1,180 @@ +* test_s4g_cont_venit.prg +* Headless: S4g (VFP) - cont de venit derivat pentru articolele fara politica de pret, al 29-lea +* argument (V_CONT_VENIT) pe apelul RPC catre pack_facturare.adauga_articol_factura, cablat in +* do_scrie_articole (COMUN\clase\ofacturare.vc2, frm_facturare_articole si frm_facturare_articole2). +* +* Proba in doua parti, FARA sa invoce do_scrie_articole/formularul complet (ar cere un document +* real scris in VANZARI_DETALII_TEMP - lasat ca datorie explicita in docs\raport_s4g_vfp.md): +* +* PARTEA A - deriva_cont_venit_fara_pol() (COMUN\programe\ofacturare_comun.prg), cele 3 nivele ale +* derivarii (s4g_adaugare_articole_modificare.md sectiunea 3.1), verificate cu date REALE citite +* chiar in test (SELECT direct, nimic scris in Oracle): +* A1: cont de gestiune CU corespondenta reala in vcoresp_cont_venchelt -> exact CONT_VENIT. +* A2: cont de gestiune fara corespondenta, articol cu nom_articole.cont care incepe cu 6/7 -> +* exact acel cont. +* A3: cont de gestiune fara corespondenta, articol fara cont 6xx/7xx -> fallback '704'. +* +* PARTEA B - formula de cablare adaugata in do_scrie_articole (identica cu diff-ul), evaluata pe +* un poArt minimal, cele doua ramuri cerute de story. Pozitional (nu named notation: driverul ODBC +* respinge P=>val in interiorul {call ...}, vezi docs\verificare_named_notation_odbc.md): +* B1: poArt.id_pol populat -> argumentul (poz. 29) e ,NULL explicit (Oracle primeste NULL, +* comportament neschimbat fata de azi). +* B2: poArt.id_pol gol -> argumentul (poz. 29) e ,''. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s4g_cont_venit.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4g_cont_venit.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +CLOSE DATABASES + +PUBLIC gcLog, gnPass, gnFail, gcCaz, gcErr +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s4g_cont_venit.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) +gnPass = 0 +gnFail = 0 +gcCaz = "" +gcErr = "" +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" + +LOCAL lnSucces, lnIdArtAny, lnIdArt67, lnIdArtFallback + +*---------------------------------------------------------------------------------------- +* orice articol valid, folosit ca ancora pentru A1 (nu conteaza nom_articole.cont acolo, +* corespondenta gaseste raspunsul inaintea CASE-ului de fallback) +gcCaz = "[setup-articol-oarecare] " +IF USED('crssetuparttv') + USE IN crssetuparttv +ENDIF +lnSucces = goExecutor.oExecute([select id_articol from nom_articole where id_articol > 0 and rownum = 1],[crssetuparttv]) +DO Assert WITH lnSucces >= 0 AND USED('crssetuparttv') AND RECCOUNT('crssetuparttv') = 1, "exista cel putin un articol in nom_articole" +lnIdArtAny = 0 +IF USED('crssetuparttv') AND RECCOUNT('crssetuparttv') = 1 + lnIdArtAny = crssetuparttv.id_articol +ENDIF +IF USED('crssetuparttv') + USE IN crssetuparttv +ENDIF + +*---------------------------------------------------------------------------------------- +* PARTEA A1 - corespondenta cont_venit gaseste raspunsul +gcCaz = "[A1-coresp_cont_venchelt] " +IF USED('crssurscvc') + USE IN crssurscvc +ENDIF +lnSucces = goExecutor.oExecute([select cont, cont_venit from vcoresp_cont_venchelt where cont_venit is not null and rownum = 1],[crssurscvc]) +DO Assert WITH lnSucces >= 0 AND USED('crssurscvc') AND RECCOUNT('crssurscvc') = 1, "exista cel putin o corespondenta cont_venit in schema" +IF USED('crssurscvc') AND RECCOUNT('crssurscvc') = 1 AND lnIdArtAny > 0 + LOCAL lcContGest, lcAsteptat, lcRezultat + lcContGest = ALLTRIM(crssurscvc.cont) + lcAsteptat = ALLTRIM(crssurscvc.cont_venit) + USE IN crssurscvc + lcRezultat = deriva_cont_venit_fara_pol(lnIdArtAny, lcContGest) + DO Assert WITH lcRezultat == lcAsteptat, "cont_venit din corespondenta: asteptat [" + lcAsteptat + "], obtinut [" + lcRezultat + "]" +ENDIF + +*---------------------------------------------------------------------------------------- +* PARTEA A2 - fara corespondenta, nom_articole.cont incepe cu 6/7 +gcCaz = "[A2-nom_articole 6-7] " +IF USED('crssursart') + USE IN crssursart +ENDIF +lnSucces = goExecutor.oExecute([select id_articol, cont from nom_articole where cont is not null and (substr(cont,1,1) = '6' or substr(cont,1,1) = '7') and rownum = 1],[crssursart]) +DO Assert WITH lnSucces >= 0, "select articol cu cont 6xx/7xx executat" +lnIdArt67 = 0 +IF USED('crssursart') AND RECCOUNT('crssursart') = 1 + LOCAL lcAsteptat2, lcRezultat2 + lnIdArt67 = crssursart.id_articol + lcAsteptat2 = ALLTRIM(crssursart.cont) + USE IN crssursart + lcRezultat2 = deriva_cont_venit_fara_pol(lnIdArt67, "ZZ_INEXISTENT") + DO Assert WITH lcRezultat2 == lcAsteptat2, "cont_venit din nom_articole (6/7): asteptat [" + lcAsteptat2 + "], obtinut [" + lcRezultat2 + "]" +ELSE + IF USED('crssursart') + USE IN crssursart + ENDIF + DO AfLog WITH "INFO: niciun articol cu cont 6xx/7xx in schema - A2 sarit (nu e regresie, doar lipsa de date)" +ENDIF + +*---------------------------------------------------------------------------------------- +* PARTEA A3 - fara corespondenta, fara cont 6/7 -> fallback 704 +gcCaz = "[A3-fallback-704] " +IF USED('crssursart3') + USE IN crssursart3 +ENDIF +lnSucces = goExecutor.oExecute([select id_articol from nom_articole where id_articol > 0 and (cont is null or substr(cont,1,1) not in ('6','7')) and rownum = 1],[crssursart3]) +DO Assert WITH lnSucces >= 0 AND USED('crssursart3') AND RECCOUNT('crssursart3') = 1, "exista cel putin un articol fara cont 6xx/7xx in schema" +lnIdArtFallback = 0 +IF USED('crssursart3') AND RECCOUNT('crssursart3') = 1 + LOCAL lcRezultat3 + lnIdArtFallback = crssursart3.id_articol + USE IN crssursart3 + lcRezultat3 = deriva_cont_venit_fara_pol(lnIdArtFallback, "ZZ_INEXISTENT") + DO Assert WITH lcRezultat3 == "704", "fallback 704: obtinut [" + lcRezultat3 + "]" +ENDIF + +*---------------------------------------------------------------------------------------- +* PARTEA B - formula de cablare, identica cu cea adaugata in do_scrie_articole +gcCaz = "[B1-cu-id_pol] " +LOCAL loArt1, lcArg1 +loArt1 = CREATEOBJECT('Empty') +ADDPROPERTY(loArt1, 'id_pol', 63) +ADDPROPERTY(loArt1, 'id_articol', IIF(lnIdArtFallback > 0, lnIdArtFallback, lnIdArtAny)) +ADDPROPERTY(loArt1, 'Cont', 'ZZ_INEXISTENT') +lcArg1 = Iif(Empty(Nvl(loArt1.id_pol,0)),[,'] + OracleSpecialCharacters(deriva_cont_venit_fara_pol(loArt1.id_articol,loArt1.Cont)) + ['],[,NULL]) +DO Assert WITH lcArg1 == ",NULL", "id_pol populat: argumentul RPC (poz. 29) e ,NULL explicit, obtinut [" + lcArg1 + "]" + +gcCaz = "[B2-fara-id_pol] " +LOCAL loArt2, lcArg2 +loArt2 = CREATEOBJECT('Empty') +ADDPROPERTY(loArt2, 'id_pol', .NULL.) +ADDPROPERTY(loArt2, 'id_articol', IIF(lnIdArtFallback > 0, lnIdArtFallback, lnIdArtAny)) +ADDPROPERTY(loArt2, 'Cont', 'ZZ_INEXISTENT') +lcArg2 = Iif(Empty(Nvl(loArt2.id_pol,0)),[,'] + OracleSpecialCharacters(deriva_cont_venit_fara_pol(loArt2.id_articol,loArt2.Cont)) + ['],[,NULL]) +DO Assert WITH LEFT(lcArg2,2) == ",'", "id_pol gol: argumentul RPC (poz. 29) incepe pozitional cu ,' [" + lcArg2 + "]" +DO Assert WITH RIGHT(lcArg2,1) == "'", "argumentul se inchide cu apostrof [" + lcArg2 + "]" +DO Assert WITH lcArg2 == ",'704'", "valoarea trimisa e fallback 704 (Cont test inexistent + articol A3): [" + lcArg2 + "]" + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE Assert + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + TRANSFORM(tcProg) + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s5_1_configuratie_tip_document.prg b/utile/Teste/facturare_unificat/test_s5_1_configuratie_tip_document.prg new file mode 100644 index 0000000..2213e95 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5_1_configuratie_tip_document.prg @@ -0,0 +1,178 @@ +* test_s5_1_configuratie_tip_document.prg +* Headless: S5-1 - cursorul de configurare per tip de document (COMUN\programe\ofacturare.prg, +* creeaza_configuratie_tip_document / configurare_tip_document), fara Oracle si fara formular - +* verifica MECANIC ca datele din cursor corespund literal inventarului verificat pe cod +* (docs\verificare_s5_tabel_sursa.md, sectiunea 1b, Do Case-ul din frm_facturare_articole.Init, +* ofacturare.vc2:15259-15395). +* +* Cazuri: +* A. Creare lenesa: cursorul NU exista inainte de primul apel al configurare_tip_document(), +* exista dupa. +* B. Multimea de tipuri din cursor == exact cele 21 din inventar + randurile speciale -1 +* (eProforma) / -2 (lCopiere), comparatie pe lista sortata. +* C. Pentru fiecare din cele 21 de tipuri: titlu, sufix_titlu, cap_cantitate, mesaj_stoc, +* ascunde_discount, sterge_serie, buton_tot, buton_retur, tip_doc - cate o asertiune per camp +* (titlu/sufix_titlu/cap_cantitate/mesaj_stoc comparate ALLTRIM, spatiul final din literalul +* sursa nu se poate observa - campul e C(50) cu padding la dreapta oricum). +* D. Prioritate: configurare_tip_document(3,.T.,.F.) intoarce randul de proforma (tip=-1); +* configurare_tip_document(3,.F.,.T.) intoarce randul de copiere (tip=-2); +* configurare_tip_document(3,.F.,.F.) intoarce randul propriu al tipului 3. +* E. Tip necunoscut (99) intoarce .Null. +* F. Select() al apelantului neschimbat dupa apel. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5_1_configuratie_tip_document.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5_1_configuratie_tip_document.log +* Fara Oracle, fara formular - doar SET PROCEDURE TO ofacturare.prg. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gcCaz, gcErr +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5_1_configuratie_tip_document.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) +gnFail = 0 +gnPass = 0 +gcCaz = "" +gcErr = "" +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare.prg" ADDITIVE + +IF USED('configuratie_tip_document') + USE IN configuratie_tip_document +ENDIF + +*---------------------------------------------------------------------------------------- +* A. creare lenesa +gcCaz = "[A-lenes] " +DO Assert WITH !USED('configuratie_tip_document'), "cursorul NU exista inainte de primul apel" + +PRIVATE loRes0 +loRes0 = configurare_tip_document(3, .F., .F.) +DO Assert WITH USED('configuratie_tip_document'), "cursorul exista dupa primul apel" + +*---------------------------------------------------------------------------------------- +* B. multimea de tipuri +gcCaz = "[B-multime] " +PRIVATE lcTipuri +lcTipuri = "" +SELECT DISTINCT tip FROM configuratie_tip_document ORDER BY tip INTO CURSOR crs_tipuri_test +SELECT crs_tipuri_test +SCAN + lcTipuri = lcTipuri + IIF(EMPTY(lcTipuri), "", ",") + TRANSFORM(tip) +ENDSCAN +USE IN crs_tipuri_test +DO Assert WITH lcTipuri == "-2,-1,1,2,3,4,5,6,7,8,9,10,21,22,23,24,25,26,28,29,41,42,47", "multimea de tipuri = " + lcTipuri + +*---------------------------------------------------------------------------------------- +* C. campurile fiecarui tip, cate o asertiune per camp +DO Verifica WITH 1, [], [], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .T., [factura] +DO Verifica WITH 5, [], [], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .T., [factura] +DO Verifica WITH 7, [], [], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .T., [factura] +DO Verifica WITH 10, [], [], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .T., [factura] +DO Verifica WITH 2, [FACTURA PE CTR.], [descriere], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .F., [factura] +DO Verifica WITH 6, [FACTURA PE CTR.], [descriere], [Cantitate in stoc], [Acest articol nu este pe stoc!], .F., .T., .F., .F., [factura] +DO Verifica WITH 3, [FACTURA LA COMANDA], [descriere], [Cantitate comandata], [A fost facturata intreaga cantitate comandata pentru acest articol!], .F., .T., .T., .F., [factura] +DO Verifica WITH 4, [FACTURA DIN AVIZE], [], [], [A fost facturata intreaga cantitate de pe aviz pentru acest articol!], .T., .F., .T., .F., [factura] +DO Verifica WITH 21, [AVIZ DE EXPEDITIE DIN COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz] +DO Verifica WITH 28, [AVIZ DE EXPEDITIE DIN COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz] +DO Verifica WITH 42, [AVIZ DE EXPEDITIE DIN COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz] +DO Verifica WITH 47, [AVIZ DE EXPEDITIE DIN COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz] +DO Verifica WITH 22, [AVIZ DE EXPEDITIE DIN LISTA DE PRETURI], [], [], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz] +DO Verifica WITH 29, [AVIZ DE EXPEDITIE DIN LISTA DE PRETURI], [], [], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz] +DO Verifica WITH 23, [TRANSFER ÎNTRE SUBUNITATI], [], [], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz] +DO Verifica WITH 41, [RETUR TRANSFER], [], [], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz] +DO Verifica WITH 25, [TRANSFER ÎNTRE SUBUNITATI PE BAZA DE COMANDA], [], [], [A fost avizata intreaga cantitate comandata pentru acest articol!], .T., .T., .T., .F., [aviz] +DO Verifica WITH 26, [AVIZ DE EXPEDITIE DIN CONTRACTUL], [descriere], [Cantitate in stoc], [Acest articol nu este pe stoc!], .T., .T., .F., .F., [aviz] +DO Verifica WITH 8, [], [], [Cant. max. de returnat], [Nu se mai poate face retur pentru acest articol!], .F., .F., .T., .F., [factura] +DO Verifica WITH 9, [], [], [Cant. max. de returnat], [Nu se mai poate face retur pentru acest articol!], .F., .F., .T., .F., [factura] +DO Verifica WITH 24, [RETUR AVIZ DE EXPEDITIE], [], [Cant. max. de returnat], [Nu se mai poate face retur pentru acest articol!], .F., .T., .T., .F., [factura] + +*---------------------------------------------------------------------------------------- +* D. prioritate +gcCaz = "[D-prioritate] " +PRIVATE loP, loC, loT +loP = configurare_tip_document(3, .T., .F.) +DO Assert WITH VARTYPE(loP) = 'O' AND ALLTRIM(loP.titlu) == "PROFORMA", "proforma are prioritate peste tip=3" + +loC = configurare_tip_document(3, .F., .T.) +DO Assert WITH VARTYPE(loC) = 'O' AND ALLTRIM(loC.titlu) == "COPIERE FACTURA/AVIZ", "copiere are prioritate peste tip=3 (cand nu e proforma)" +DO Assert WITH ALLTRIM(loC.mesaj_stoc) == "A fost facturata intreaga cantitate pentru acest articol!", "mesaj_stoc pe randul de copiere" + +loT = configurare_tip_document(3, .F., .F.) +DO Assert WITH VARTYPE(loT) = 'O' AND ALLTRIM(loT.titlu) == "FACTURA LA COMANDA", "fara proforma/copiere se intoarce randul propriu al tipului 3" + +*---------------------------------------------------------------------------------------- +* E. tip necunoscut +gcCaz = "[E-necunoscut] " +PRIVATE loU +loU = configurare_tip_document(99, .F., .F.) +DO Assert WITH ISNULL(loU), "tip necunoscut (99) intoarce .Null." + +*---------------------------------------------------------------------------------------- +* F. Select() neschimbat +gcCaz = "[F-select] " +IF USED('crsalias_test') + USE IN crsalias_test +ENDIF +CREATE CURSOR crsalias_test (x N(1)) +SELECT crsalias_test +PRIVATE lcAliasInainte, loResF +lcAliasInainte = ALIAS() +loResF = configurare_tip_document(4, .F., .F.) +DO Assert WITH ALIAS() == lcAliasInainte, "Select() al apelantului neschimbat dupa apel (era " + lcAliasInainte + ", e " + ALIAS() + ")" +USE IN crsalias_test + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE Verifica + LPARAMETERS tnTip, tcTitlu, tcSufix, tcCap, tcMesaj, tlAscunde, tlSterge, tlTot, tlRetur, tcTipDoc + LOCAL loRes + gcCaz = "[tip=" + TRANSFORM(tnTip) + "] " + loRes = configurare_tip_document(tnTip, .F., .F.) + DO Assert WITH VARTYPE(loRes) = 'O', "randul exista (nu e .Null.)" + IF VARTYPE(loRes) <> 'O' + RETURN + ENDIF + DO Assert WITH ALLTRIM(loRes.titlu) == tcTitlu, "titlu asteptat [" + tcTitlu + "] gasit [" + ALLTRIM(loRes.titlu) + "]" + DO Assert WITH ALLTRIM(loRes.sufix_titlu) == tcSufix, "sufix_titlu asteptat [" + tcSufix + "] gasit [" + ALLTRIM(loRes.sufix_titlu) + "]" + DO Assert WITH ALLTRIM(loRes.cap_cantitate) == tcCap, "cap_cantitate asteptat [" + tcCap + "] gasit [" + ALLTRIM(loRes.cap_cantitate) + "]" + DO Assert WITH ALLTRIM(loRes.mesaj_stoc) == tcMesaj, "mesaj_stoc asteptat [" + tcMesaj + "] gasit [" + ALLTRIM(loRes.mesaj_stoc) + "]" + DO Assert WITH loRes.ascunde_discount = tlAscunde, "ascunde_discount asteptat " + TRANSFORM(tlAscunde) + " gasit " + TRANSFORM(loRes.ascunde_discount) + DO Assert WITH loRes.sterge_serie = tlSterge, "sterge_serie asteptat " + TRANSFORM(tlSterge) + " gasit " + TRANSFORM(loRes.sterge_serie) + DO Assert WITH loRes.buton_tot = tlTot, "buton_tot asteptat " + TRANSFORM(tlTot) + " gasit " + TRANSFORM(loRes.buton_tot) + DO Assert WITH loRes.buton_retur = tlRetur, "buton_retur asteptat " + TRANSFORM(tlRetur) + " gasit " + TRANSFORM(loRes.buton_retur) + DO Assert WITH ALLTRIM(loRes.tip_doc) == tcTipDoc, "tip_doc asteptat [" + tcTipDoc + "] gasit [" + ALLTRIM(loRes.tip_doc) + "]" +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + gcErr = gcErr + TRANSFORM(tnErr) + " " + tcMsg + " (" + tcProg + ":" + TRANSFORM(tnLine) + ")" + CHR(13) + CHR(10) + gnFail = gnFail + 1 + DO AfLog WITH "ERR: " + gcCaz + TRANSFORM(tnErr) + " " + tcMsg + " (" + tcProg + ":" + TRANSFORM(tnLine) + ")" +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s5_3a_config_a_b_c.prg b/utile/Teste/facturare_unificat/test_s5_3a_config_a_b_c.prg new file mode 100644 index 0000000..d58be70 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5_3a_config_a_b_c.prg @@ -0,0 +1,228 @@ +* test_s5_3a_config_a_b_c.prg +* Headless: legarea configuratiei per tip de document (S5-3a) in frm_facturare_articole2.Init - +* diferentiatorii A (titlu, lb_titlu_alb_b121), B (cap coloana cantitate, grd_factura.cCantitate.header1) +* si C (mesaj de stoc, cmesaj_cantitate), pentru toate cele 21 de tipuri + eProforma + lCopiere. +* +* Literalii asteptati sunt luati din docs\verificare_s5_tabel_sursa.md sectiunea 1b (formularul +* VECHI, sursa de comportament), NU din cursorul din COMUN\programe\ofacturare.prg - ca sa prinda +* si o eventuala greseala de transcriere in cursor, nu doar o neconcordanta intre cursor si Init. +* Diacriticul "I cu sedila" (0xCE in cp1250) e scris cu CHR(206), nu ca literal in fisier, ca sa +* nu depinda de encoding-ul sursei .prg. +* +* B: capul de coloana e citit direct de pe obiectul static grd_factura.cCantitate.header1.Caption - +* nu trece prin ColumnCount/RecordSource (capcana cunoscuta de nematerializare a grid-urilor sub +* -A -T se aplica generarii automate de coloane, nu unui obiect static definit in clasa); testat +* explicit cu TYPE() inainte de citire, ca sa nu falsifice proba daca totusi nu e disponibil. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5_3a_config_a_b_c.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5_3a_config_a_b_c.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; seriile de facturi (tipdoc 5) sunt pe utilizator -> gnIdUtil = 8. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gcCaz +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5_3a_config_a_b_c.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) +gnFail = 0 +gnPass = 0 +gcCaz = "" +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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "ENV OK" +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa (..\utile\gridextras), rezolvabila doar din exe/IDE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + +PRIVATE poDate, poGeneratorNumere +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") +gnScadereStoc = 0 + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +* grd_factura.cGestiune e legat la crsFactura.gestiune, camp inexistent in creeaza_facturacrs (nume_gestiune) +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +PRIVATE lcDescriere +LOCAL lcDefTitlu, lcDefCap, lcDefMesaj, lcIntre +lcDefTitlu = "FACTURA" +lcDefCap = "Cantitate" +lcDefMesaj = "Acest articol nu este pe stoc!" +lcDescriere = "TEST DESCRIERE S5-3A" +lcIntre = CHR(206) + "NTRE" + +* tabel: tip, titlu asteptat, cap coloana asteptat, mesaj de stoc asteptat, nIdTipDoc (5=factura, 6=aviz) +DO Caz WITH 1, lcDefTitlu, "Cantitate in stoc", lcDefMesaj, 5 +DO Caz WITH 5, lcDefTitlu, "Cantitate in stoc", lcDefMesaj, 5 +DO Caz WITH 7, lcDefTitlu, "Cantitate in stoc", lcDefMesaj, 5 +DO Caz WITH 10, lcDefTitlu, "Cantitate in stoc", lcDefMesaj, 5 +DO Caz WITH 2, "FACTURA PE CTR. " + lcDescriere, "Cantitate in stoc", lcDefMesaj, 5 +DO Caz WITH 6, "FACTURA PE CTR. " + lcDescriere, "Cantitate in stoc", lcDefMesaj, 5 +DO Caz WITH 3, "FACTURA LA COMANDA " + lcDescriere, "Cantitate comandata", "A fost facturata intreaga cantitate comandata pentru acest articol!", 5 +DO Caz WITH 4, "FACTURA DIN AVIZE", lcDefCap, "A fost facturata intreaga cantitate de pe aviz pentru acest articol!", 5 +DO Caz WITH 21, "AVIZ DE EXPEDITIE DIN COMANDA", lcDefCap, "A fost avizata intreaga cantitate comandata pentru acest articol!", 6 +DO Caz WITH 28, "AVIZ DE EXPEDITIE DIN COMANDA", lcDefCap, "A fost avizata intreaga cantitate comandata pentru acest articol!", 6 +DO Caz WITH 42, "AVIZ DE EXPEDITIE DIN COMANDA", lcDefCap, "A fost avizata intreaga cantitate comandata pentru acest articol!", 6 +DO Caz WITH 47, "AVIZ DE EXPEDITIE DIN COMANDA", lcDefCap, "A fost avizata intreaga cantitate comandata pentru acest articol!", 6 +DO Caz WITH 22, "AVIZ DE EXPEDITIE DIN LISTA DE PRETURI", lcDefCap, lcDefMesaj, 6 +DO Caz WITH 29, "AVIZ DE EXPEDITIE DIN LISTA DE PRETURI", lcDefCap, lcDefMesaj, 6 +DO Caz WITH 23, "TRANSFER " + lcIntre + " SUBUNITATI", lcDefCap, lcDefMesaj, 6 +DO Caz WITH 41, "RETUR TRANSFER", lcDefCap, lcDefMesaj, 6 +DO Caz WITH 25, "TRANSFER " + lcIntre + " SUBUNITATI PE BAZA DE COMANDA", lcDefCap, "A fost avizata intreaga cantitate comandata pentru acest articol!", 6 +DO Caz WITH 26, "AVIZ DE EXPEDITIE DIN CONTRACTUL " + lcDescriere, "Cantitate in stoc", lcDefMesaj, 6 +DO Caz WITH 8, lcDefTitlu, "Cant. max. de returnat", "Nu se mai poate face retur pentru acest articol!", 5 +DO Caz WITH 9, lcDefTitlu, "Cant. max. de returnat", "Nu se mai poate face retur pentru acest articol!", 5 +DO Caz WITH 24, "RETUR AVIZ DE EXPEDITIE", "Cant. max. de returnat", "Nu se mai poate face retur pentru acest articol!", 5 + +* eProforma: prioritate peste orice tip - testat pe tipul 1, care altfel ar seta alt cap/mesaj/titlu +DO CazEProforma WITH 1, "PROFORMA", lcDefCap, lcDefMesaj, 5 + +* lCopiere: prioritate peste tip - testat pe tipul 2, care altfel ar seta alt titlu/cap/mesaj +DO CazCopiere WITH 2, "COPIERE FACTURA/AVIZ " + lcDescriere, "Cantitate maxima", "A fost facturata intreaga cantitate pentru acest articol!", 5 + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz + LPARAMETERS tnTip, tcTitluAst, tcCapAst, tcMesajAst, tnIdTipDoc + LOCAL loNou, lcCapReal + gcCaz = "[tip=" + TRANSFORM(tnTip) + "] " + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip, tnTip) + poDate.nIdTipDoc = tnIdTipDoc + poDate.descriere = lcDescriere + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(tnIdTipDoc) + + loNou = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loNou) <> 'O' + DO Assert WITH .F., "Createobject frm_facturare_articole2" + RETURN + ENDIF + + DO Verifica WITH loNou, tcTitluAst, tcCapAst, tcMesajAst + + loNou.Release() + RELEASE loNou + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(tnIdTipDoc) + ENDIF +ENDPROC + +PROCEDURE CazEProforma + LPARAMETERS tnTip, tcTitluAst, tcCapAst, tcMesajAst, tnIdTipDoc + LOCAL loNou + gcCaz = "[eProforma tip=" + TRANSFORM(tnTip) + "] " + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 25100 + tnTip, tnTip) + poDate.nIdTipDoc = tnIdTipDoc + poDate.descriere = lcDescriere + poDate.eProforma = 1 + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(tnIdTipDoc) + + loNou = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loNou) <> 'O' + DO Assert WITH .F., "Createobject frm_facturare_articole2 (eProforma)" + RETURN + ENDIF + + DO Verifica WITH loNou, tcTitluAst, tcCapAst, tcMesajAst + + loNou.Release() + RELEASE loNou + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(tnIdTipDoc) + ENDIF +ENDPROC + +PROCEDURE CazCopiere + LPARAMETERS tnTip, tcTitluAst, tcCapAst, tcMesajAst, tnIdTipDoc + LOCAL loNou, loSursa + gcCaz = "[lCopiere tip=" + TRANSFORM(tnTip) + "] " + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 25200 + tnTip, tnTip) + poDate.nIdTipDoc = tnIdTipDoc + poDate.descriere = lcDescriere + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(tnIdTipDoc) + + loSursa = CREATEOBJECT('Custom') + loNou = CREATEOBJECT('frm_facturare_articole2', loSursa) + IF VARTYPE(loNou) <> 'O' + DO Assert WITH .F., "Createobject frm_facturare_articole2 cu toFactura" + RETURN + ENDIF + + DO Assert WITH loNou.lCopiere, "lCopiere trebuie sa fie .T. cand toFactura e obiect" + DO Verifica WITH loNou, tcTitluAst, tcCapAst, tcMesajAst + + loNou.Release() + RELEASE loNou + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(tnIdTipDoc) + ENDIF +ENDPROC + +PROCEDURE Verifica + LPARAMETERS toNou, tcTitluAst, tcCapAst, tcMesajAst + LOCAL lcCapReal + DO Assert WITH toNou.Lb_titlu_alb_b121.Caption == tcTitluAst, "A titlu=[" + toNou.Lb_titlu_alb_b121.Caption + "] asteptat=[" + tcTitluAst + "]" + IF TYPE('toNou.grd_factura.cCantitate.header1.Caption') == 'C' + lcCapReal = toNou.grd_factura.cCantitate.header1.Caption + DO Assert WITH lcCapReal == tcCapAst, "B cap=[" + lcCapReal + "] asteptat=[" + tcCapAst + "]" + ELSE + DO AfLog WITH gcCaz + "NEVERIFICABIL headless: grd_factura.cCantitate.header1.Caption TYPE()=" + TYPE('toNou.grd_factura.cCantitate.header1.Caption') + ENDIF + DO Assert WITH toNou.cmesaj_cantitate == tcMesajAst, "C mesaj=[" + toNou.cmesaj_cantitate + "] asteptat=[" + tcMesajAst + "]" +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s5_3b_discount_serie.prg b/utile/Teste/facturare_unificat/test_s5_3b_discount_serie.prg new file mode 100644 index 0000000..e113001 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5_3b_discount_serie.prg @@ -0,0 +1,297 @@ +* test_s5_3b_discount_serie.prg +* Headless: S5-3b in frm_facturare_articole2.Init - D (ascunderea zonei de discount pe factura) +* si E (eliminarea coloanei cSerie din grd_factura), pentru toate cele 21 de tipuri + +* eProforma + lCopiere, plus reasezarea benzii de totaluri (aseaza_totaluri). +* +* Valorile asteptate pentru D si E sunt scrise HARDCODAT din v1 (nu citite din cursorul +* COMUN\programe\ofacturare.prg), ca sa prinda si o eventuala greseala de transcriere in cursor: +* D (ascunde_discount = .T., 11 tipuri): ofacturare.vc2 (v1) :15304,15323,15333,15342,15352,15361,15371 +* -> 4, {21,28,42,47}, {22,29}, 23, 41, 25, 26 +* E (sterge_serie = .T., 18 tipuri): confirmat pe v1 de orchestrator - +* 1, 2, 3, 5, 6, 7, 10, 21, 22, 23, 24, 25, 26, 28, 29, 41, 42, 47 +* Non-regresie: ck_discountevidentiat.Visible ramane .T. pe toate cazurile (paritate v1 - nu e +* in clb_discount pe v1, tine de discountul pe articole). +* +* ColumnCount asteptat: 14 - (1 daca sterge_serie) - (3, pentru ca poDate.in_valuta ramane la +* valoarea implicita 0 din oDateFactura -> ramura care sterge cVpretFtva/cVdiscountftva/ +* cVvaldiminuatftva, ofacturare.vc2:20887-20891). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5_3b_discount_serie.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5_3b_discount_serie.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; seriile de facturi (tipdoc 5) sunt pe utilizator -> gnIdUtil = 8. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gcCaz +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5_3b_discount_serie.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) +gnFail = 0 +gnPass = 0 +gcCaz = "" +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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "ENV OK" +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa (..\utile\gridextras), rezolvabila doar din exe/IDE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + +PRIVATE poDate, poGeneratorNumere +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") +gnScadereStoc = 0 + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +* grd_factura.cGestiune e legat la crsFactura.gestiune, camp inexistent in creeaza_facturacrs (nume_gestiune) +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +* tabel: tip, nIdTipDoc (5=factura,6=aviz), ascunde_discount asteptat, sterge_serie asteptat +DO Caz WITH 1, 5, .F., .T. +DO Caz WITH 5, 5, .F., .T. +DO Caz WITH 7, 5, .F., .T. +DO Caz WITH 10, 5, .F., .T. +DO Caz WITH 2, 5, .F., .T. +DO Caz WITH 6, 5, .F., .T. +DO Caz WITH 3, 5, .F., .T. +DO Caz WITH 4, 5, .T., .F. +DO Caz WITH 21, 6, .T., .T. +DO Caz WITH 28, 6, .T., .T. +DO Caz WITH 42, 6, .T., .T. +DO Caz WITH 47, 6, .T., .T. +DO Caz WITH 22, 6, .T., .T. +DO Caz WITH 29, 6, .T., .T. +DO Caz WITH 23, 6, .T., .T. +DO Caz WITH 41, 6, .T., .T. +DO Caz WITH 25, 6, .T., .T. +DO Caz WITH 26, 6, .T., .T. +DO Caz WITH 8, 5, .F., .F. +DO Caz WITH 9, 5, .F., .F. +DO Caz WITH 24, 5, .F., .T. + +* eProforma si lCopiere: pe v1 ambele campuri (ascunde_discount, sterge_serie) sunt .F. - vezi §8 din propunere +DO CazEProforma WITH 1, 5, .F., .F. +DO CazCopiere WITH 2, 5, .F., .F. + +DO Reasezare + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE Caz + LPARAMETERS tnTip, tnIdTipDoc, tlAscundeAst, tlStergeAst + LOCAL loNou + gcCaz = "[tip=" + TRANSFORM(tnTip) + "] " + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 26000 + tnTip, tnTip) + poDate.nIdTipDoc = tnIdTipDoc + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(tnIdTipDoc) + + loNou = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loNou) <> 'O' + DO Assert WITH .F., "Createobject frm_facturare_articole2" + RETURN + ENDIF + + DO Verifica WITH loNou, tnTip, tlAscundeAst, tlStergeAst + + loNou.Release() + RELEASE loNou + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(tnIdTipDoc) + ENDIF +ENDPROC + +PROCEDURE CazEProforma + LPARAMETERS tnTip, tnIdTipDoc, tlAscundeAst, tlStergeAst + LOCAL loNou + gcCaz = "[eProforma tip=" + TRANSFORM(tnTip) + "] " + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 26100 + tnTip, tnTip) + poDate.nIdTipDoc = tnIdTipDoc + poDate.eProforma = 1 + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(tnIdTipDoc) + + loNou = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loNou) <> 'O' + DO Assert WITH .F., "Createobject frm_facturare_articole2 (eProforma)" + RETURN + ENDIF + + DO Verifica WITH loNou, tnTip, tlAscundeAst, tlStergeAst + + loNou.Release() + RELEASE loNou + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(tnIdTipDoc) + ENDIF +ENDPROC + +PROCEDURE CazCopiere + LPARAMETERS tnTip, tnIdTipDoc, tlAscundeAst, tlStergeAst + LOCAL loNou, loSursa + gcCaz = "[lCopiere tip=" + TRANSFORM(tnTip) + "] " + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 26200 + tnTip, tnTip) + poDate.nIdTipDoc = tnIdTipDoc + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(tnIdTipDoc) + + loSursa = CREATEOBJECT('Custom') + loNou = CREATEOBJECT('frm_facturare_articole2', loSursa) + IF VARTYPE(loNou) <> 'O' + DO Assert WITH .F., "Createobject frm_facturare_articole2 cu toFactura" + RETURN + ENDIF + + DO Verifica WITH loNou, tnTip, tlAscundeAst, tlStergeAst + + loNou.Release() + RELEASE loNou + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(tnIdTipDoc) + ENDIF +ENDPROC + +PROCEDURE Verifica + LPARAMETERS toNou, tnTip, tlAscundeAst, tlStergeAst + LOCAL lnColAst, lnColBaza + + * D - vizibilitatea zonei de discount pe factura + DO Assert WITH toNou.lb_disc_factura.Visible == !tlAscundeAst, "D lb_disc_factura.Visible=" + TRANSFORM(toNou.lb_disc_factura.Visible) + " asteptat=" + TRANSFORM(!tlAscundeAst) + DO Assert WITH toNou.tx_disc_factura_nat.Visible == !tlAscundeAst, "D tx_disc_factura_nat.Visible=" + TRANSFORM(toNou.tx_disc_factura_nat.Visible) + " asteptat=" + TRANSFORM(!tlAscundeAst) + DO Assert WITH toNou.lb_disc_factura_ron.Visible == !tlAscundeAst, "D lb_disc_factura_ron.Visible=" + TRANSFORM(toNou.lb_disc_factura_ron.Visible) + " asteptat=" + TRANSFORM(!tlAscundeAst) + DO Assert WITH toNou.tx_disc_factura_procent.Visible == !tlAscundeAst, "D tx_disc_factura_procent.Visible=" + TRANSFORM(toNou.tx_disc_factura_procent.Visible) + " asteptat=" + TRANSFORM(!tlAscundeAst) + DO Assert WITH toNou.lb_disc_factura_procent_semn.Visible == !tlAscundeAst, "D lb_disc_factura_procent_semn.Visible=" + TRANSFORM(toNou.lb_disc_factura_procent_semn.Visible) + " asteptat=" + TRANSFORM(!tlAscundeAst) + DO Assert WITH toNou.clb_motiv_discount.Visible == !tlAscundeAst, "D clb_motiv_discount.Visible=" + TRANSFORM(toNou.clb_motiv_discount.Visible) + " asteptat=" + TRANSFORM(!tlAscundeAst) + + * Non-regresie: ck_discountevidentiat nu se ascunde niciodata (tine de discountul pe articole) + DO Assert WITH toNou.ck_discountevidentiat.Visible == .T., "D ck_discountevidentiat.Visible=" + TRANSFORM(toNou.ck_discountevidentiat.Visible) + " asteptat=.T. (non-regresie)" + + * E - coloana cSerie + * Grid nu are colectia .Objects (doar .Columns), deci do_exista_obiect() arunca eroare pe un + * Grid; TYPE()/PEMSTATUS raman .T./'O' dupa RemoveObject (vezi memoria pemstatus-dupa-removeobject). + * Existenta reala se verifica prin bucla pe .Columns(i).Name, ca do_exista_obiect dar pe colectia + * corecta pentru Grid. + LOCAL llCSerieExista, lnI + llCSerieExista = .F. + FOR lnI = 1 TO toNou.grd_factura.ColumnCount + IF UPPER(toNou.grd_factura.Columns(lnI).Name) == "CSERIE" + llCSerieExista = .T. + EXIT + ENDIF + ENDFOR + DO Assert WITH llCSerieExista == !tlStergeAst, "E cSerie exista=" + TRANSFORM(llCSerieExista) + " asteptat=" + TRANSFORM(!tlStergeAst) + + * Init:20887-20895 sterge 3 coloane (cVpretFtva/cVdiscountftva/cVvaldiminuatftva) daca + * poDate.in_valuta = 0, altfel 4 (cPretFtva/cDiscountctva/cPretCtva/cValdiminuatctva). + * oDateFactura.Init seteaza in_valuta = 1 pentru tnTip in (5,6,7,9,10,52) - ofacturare_comun.prg:254. + lnColBaza = IIF(INLIST(tnTip, 5, 6, 7, 9, 10, 52), 14 - 4, 14 - 3) + lnColAst = lnColBaza - IIF(tlStergeAst, 1, 0) + DO Assert WITH toNou.grd_factura.ColumnCount == lnColAst, "E ColumnCount=" + TRANSFORM(toNou.grd_factura.ColumnCount) + " asteptat=" + TRANSFORM(lnColAst) +ENDPROC + +PROCEDURE Reasezare + LOCAL loVizibil, loAscuns, lnGap, lnCkAst + gcCaz = "[reasezare] " + lnGap = 24 + + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 26301, 1) + poDate.nIdTipDoc = 5 + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(5) + loVizibil = CREATEOBJECT('frm_facturare_articole2') + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(5) + ENDIF + + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 26304, 4) + poDate.nIdTipDoc = 5 + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(5) + loAscuns = CREATEOBJECT('frm_facturare_articole2') + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(5) + ENDIF + + IF VARTYPE(loVizibil) <> 'O' OR VARTYPE(loAscuns) <> 'O' + DO Assert WITH .F., "Createobject pentru reasezare (tip 1 / tip 4)" + ELSE + * lb_total_tva are Anchor=12 (jos+dreapta - vezi ofacturare.vc2:17942). Creat fara .Show(), + * motorul de anchor al VFP repozitioneaza controalele ancorate la dreapta pastrand offsetul + * design-time fata de marginea din dreapta a formularului, suprascriind orice .Left pus + * programatic in Init - Left ramane 689 (design-time, ofacturare.vc2:17944) indiferent de + * ascunde_discount. E acelasi tipar ca "Anchor=4 face Top design-time sa conteze la rulare" + * (memoria vfp anchor), generalizat la ancorarea pe dreapta; nu e o regresie a S5-3b - firul + * de cod This.lb_total_tva.Left = lnLeft (aseaza_totaluri:18459) e neschimbat, doar ramura de + * care depinde lnLeft e noua. Proba pe lb_total_tva.Left necesita fereastra reala (§9.2, + * datorie deschisa); aici se verifica reasezarea prin ck_discountevidentiat (Anchor=4). + DO AfLog WITH "DIAG lb_total_tva.Left vizibil=" + TRANSFORM(loVizibil.lb_total_tva.Left) + " ascuns=" + TRANSFORM(loAscuns.lb_total_tva.Left) + " (Anchor=12 - neconcludent fara .Show(), vezi comentariu)" + DO Assert WITH loAscuns.ck_discountevidentiat.Left < loVizibil.ck_discountevidentiat.Left, "reasezare ck_discountevidentiat.Left ascuns=" + TRANSFORM(loAscuns.ck_discountevidentiat.Left) + " vizibil=" + TRANSFORM(loVizibil.ck_discountevidentiat.Left) + + lnCkAst = MAX(loAscuns.lb_disc_articole.Left + loAscuns.lb_disc_articole.Width, loAscuns.lb_disc_articole_ron.Left + loAscuns.lb_disc_articole_ron.Width) + lnGap + DO Assert WITH loAscuns.ck_discountevidentiat.Left == lnCkAst, "reasezare ck_discountevidentiat.Left=" + TRANSFORM(loAscuns.ck_discountevidentiat.Left) + " asteptat=" + TRANSFORM(lnCkAst) + ENDIF + + IF VARTYPE(loVizibil) == 'O' + loVizibil.Release() + ENDIF + RELEASE loVizibil + IF VARTYPE(loAscuns) == 'O' + loAscuns.Release() + ENDIF + RELEASE loAscuns +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s5_benzi2_ui.prg b/utile/Teste/facturare_unificat/test_s5_benzi2_ui.prg new file mode 100644 index 0000000..c361c45 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5_benzi2_ui.prg @@ -0,0 +1,413 @@ +* test_s5_benzi2_ui.prg +* UI VIZIBIL: capturi + geometrie pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) dupa +* restructurarea S7 - cele 30 de controale de sub grila mutate in ct_document / ct_contabilitate / +* ct_livrare / ct_incasare, iar comutarea mutata pe casetele chk_alte_date / chk_incasare. +* Masoara cele patru combinatii de casete: 0/0, 1/0, 0/1, 1/1. +* +* Enumerarea e RECURSIVA (vezi DumpSiAnalizeaza): o parcurgere plata a lui Thisform.Objects nu mai +* vede controalele mutate in containere si ar raporta tacut "lipsa". +* +* Rulare: powershell -ExecutionPolicy Bypass -File test_s5_benzi2_ui.ps1 (timeout >= 300s) +* Log: facturare_unificat\test_s5_benzi2_ui_log.txt ; capturi in screenshots_benzi2_S7_28_08\ ; +* geometrie in out\geom_benzi2_S7_28_08_.tsv (baseline nou, sect. 10.3 - nu atinge +* familia geom_benzi2_27_08_* / geom_grila_benzi2_27_08_*, criteriu inca valabil) + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcUILog, gcSyncDir, gnFail, gnPass +gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5_benzi2_ui_log.txt" +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_benzi2_S7_28_08\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) +gnFail = 0 +gnPass = 0 +PUBLIC gcRaport +gcRaport = "" +* arii pentru dump-ul recursiv; gnTrunc semnaleaza depasirea plafonului (altfel truncherea e tacuta) +PUBLIC gnN, gnTrunc, gnHGrila00, gnHGrila11 +PUBLIC ARRAY gaN[600], gaC[600], gaL[600], gaT[600], gaW[600], gaH[600], gaV[600], gaAL[600], gaAT[600], gaSk[600] +gnN = 0 +gnTrunc = 0 +gnHGrila00 = 0 +gnHGrila11 = 0 +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out") + MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out" +ENDIF + +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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnScadereStoc = 0 +* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel - +* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist" +IF !USED('saft_tip_facturi') + update_saft_tip_facturi() +ENDIF + +PRIVATE poDate, poGeneratorNumere, loForm, lcTsv, lcRaportFile +lcRaportFile = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_raport.txt" + +* document nou: poDate.incasat ramane 0 la construire - identic Scenariul A din test_s3b_incasare_nealocare.prg +poDate = CREATEOBJECT("oDateFactura", 25000, 1) +poDate.nIdTipDoc = 5 +poDate.totalctva = 1000 +DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + " poDate.incasat=" + TRANSFORM(poDate.incasat) +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") +poGeneratorNumere.ResetNumere() +DO ProbaSerii WITH poDate.nIdTipDoc +poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + +loForm = CREATEOBJECT('frm_facturare_articole2') +DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" +IF VARTYPE(loForm) <> 'O' + DO Final +ENDIF +* ObjExists e recursiv: opt_incasat traieste acum in ct_incasare, nu la nivel de formular +DO Assert WITH ObjExists(loForm, 'ct_incasare'), "ct_incasare prezent (poDate.tip intre 1 si 4, deci grupul de incasare exista)" +DO Assert WITH ObjExists(loForm, 'opt_incasat'), "opt_incasat prezent (in ct_incasare)" +DO Assert WITH ObjExists(loForm, 'Ct_clb_agent'), "Ct_clb_agent prezent (in ct_livrare) - dovada ca enumerarea coboara in containere" + +loForm.WindowType = 0 +loForm.Show() +loForm.WindowState = 2 +DOEVENTS FORCE + +* pas0: stare initiala dupa Createobject - ambele casete nebifate (Value=0 design-time). +* Nu se comuta nimic aici: pasul masoara exact starea de dupa construire + maximizare. +DO AfLog WITH "PAS0 stare initiala: chk_alte_date=" + TRANSFORM(loForm.chk_alte_date.Value) + " chk_incasare=" + TRANSFORM(loForm.chk_incasare.Value) +DO VerificaStare WITH loForm, 0, 0, "PAS0 ambele inchise" +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_stare_initiala.tsv" +DO DumpSiAnalizeaza WITH loForm, "ambele inchise (0/0)", lcTsv +DO HarnessStep WITH 0, 'stare_initiala', 6 + +* pas1: doar "Alte date" - caseta se seteaza INAINTE de comutare (metoda citeste caseta, nu invers) +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +DO AfLog WITH "PAS1 doar alte date: chk_alte_date=" + TRANSFORM(loForm.chk_alte_date.Value) + " chk_incasare=" + TRANSFORM(loForm.chk_incasare.Value) +DO VerificaStare WITH loForm, 1, 0, "PAS1 doar alte date" +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_alte_date.tsv" +DO DumpSiAnalizeaza WITH loForm, "doar alte date (1/0)", lcTsv +DO HarnessStep WITH 1, 'alte_date_deschis', 6 + +* pas2: doar "Incasare" - alte date se inchide la loc, incasarea se deschide. +* Bifarea aloca o incasare reala (chitanta) in MARIUSM_AUTO - vezi curatenia de la final. +loForm.chk_alte_date.Value = 0 +loForm.do_comuta_alte_date() +loForm.chk_incasare.Value = 1 +loForm.do_comuta_incasare() +DOEVENTS FORCE +DO AfLog WITH "PAS2 doar incasare: chk_alte_date=" + TRANSFORM(loForm.chk_alte_date.Value) + " chk_incasare=" + TRANSFORM(loForm.chk_incasare.Value) + " nmod=" + TRANSFORM(loForm.nmod_incasare()) +DO VerificaStare WITH loForm, 0, 1, "PAS2 doar incasare" +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_incasare.tsv" +DO DumpSiAnalizeaza WITH loForm, "doar incasare (0/1)", lcTsv +DO HarnessStep WITH 2, 'incasare_deschis', 6 + +* pas3: ambele deschise +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +DO AfLog WITH "PAS3 ambele deschise: chk_alte_date=" + TRANSFORM(loForm.chk_alte_date.Value) + " chk_incasare=" + TRANSFORM(loForm.chk_incasare.Value) +DO VerificaStare WITH loForm, 1, 1, "PAS3 ambele deschise" +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi2_S7_28_08_ambele.tsv" +DO DumpSiAnalizeaza WITH loForm, "ambele deschise (1/1)", lcTsv +DO HarnessStep WITH 3, 'ambele_deschise', 6 + +* grila e maxima cu ambele casete inchise si minima cu ambele deschise +DO Assert WITH gnHGrila00 > gnHGrila11, "grd_factura.Height: maxim la 0/0 (" + TRANSFORM(gnHGrila00) + ") > minim la 1/1 (" + TRANSFORM(gnHGrila11) + ")" +DO Assert WITH gnTrunc = 0, "dump recursiv fara truncare (plafon 600 obiecte)" + +STRTOFILE(gcRaport, lcRaportFile) +DO AfLog WITH "Raport geometrie scris in " + lcRaportFile + +* Curatenie obligatorie: bifarea casetei la pasul 2 a alocat o chitanta reala (sect. 8.3 punctul 2). +* Debifarea ruleaza ramura "fara incasare" din actualizeaza_tipincasare, care dezaloca 16/3/26. +loForm.chk_incasare.Value = 0 +loForm.do_comuta_incasare() +DO AfLog WITH "curatenie: chk_incasare=0, nmod=" + TRANSFORM(loForm.nmod_incasare()) + " poDate.incasat=" + TRANSFORM(poDate.incasat) +DO Assert WITH loForm.nmod_incasare() = 1, "dupa curatenie: nmod_incasare()=1 (fara incasare)" +DO Assert WITH poDate.incasat = 0, "dupa curatenie: poDate.incasat=0 (numarul de chitanta dezalocat)" + +loForm.Release() +RELEASE loForm + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE VerificaStare + * Asertiile sect. 10.4 pentru o combinatie de casete. Inaltimile/offseturile sunt constantele + * design-time ale containerelor (ct_incasare 96, ct_document->ct_livrare 268, decalaje 96/176), + * nu valori citite din oasezareoffset - altfel testul s-ar verifica pe sine. + LPARAMETERS toForm, tnAlte, tnInc, tcEticheta + LOCAL llAlte, llInc, lnHLinie, lnHInc, lnHAlte, lnGap, lnLinieTop, lnAlteTop + llAlte = (tnAlte = 1) + llInc = (tnInc = 1) + + DO Assert WITH toForm.chk_alte_date.Value = tnAlte, tcEticheta + ": chk_alte_date.Value=" + TRANSFORM(tnAlte) + DO Assert WITH toForm.chk_incasare.Value = tnInc, tcEticheta + ": chk_incasare.Value=" + TRANSFORM(tnInc) + DO Assert WITH toForm.lalte_date_deschis = llAlte, tcEticheta + ": lalte_date_deschis sincronizat cu caseta" + DO Assert WITH toForm.lincasare_deschis = llInc, tcEticheta + ": lincasare_deschis sincronizat cu caseta" + + DO Assert WITH toForm.ct_contabilitate.Visible = llAlte, tcEticheta + ": ct_contabilitate.Visible=" + TRANSFORM(llAlte) + DO Assert WITH toForm.ct_livrare.Visible = llAlte, tcEticheta + ": ct_livrare.Visible=" + TRANSFORM(llAlte) + DO Assert WITH toForm.ct_document.Objects.Count > 2, tcEticheta + ": ct_document are continut util (Objects.Count=" + TRANSFORM(toForm.ct_document.Objects.Count) + ")" + DO Assert WITH toForm.ct_document.Visible = llAlte, tcEticheta + ": ct_document.Visible=" + TRANSFORM(llAlte) + DO Assert WITH toForm.ct_incasare.Visible = llInc, tcEticheta + ": ct_incasare.Visible=" + TRANSFORM(llInc) + + lnHLinie = toForm.chk_alte_date.Height + lnHInc = IIF(llInc, 96, 0) + lnHAlte = IIF(llAlte, 268, 0) + lnGap = IIF(lnHInc > 0 AND lnHAlte > 0, 8, 0) + lnLinieTop = toForm.Height - 66 - (lnHLinie + lnHInc + lnGap + lnHAlte) - 4 + DO Assert WITH toForm.chk_incasare.Top = lnLinieTop, tcEticheta + ": linia de casete la Top=" + TRANSFORM(lnLinieTop) + DO Assert WITH toForm.chk_alte_date.Top = lnLinieTop, tcEticheta + ": chk_alte_date pe aceeasi linie" + DO Assert WITH toForm.grd_factura.Height = MAX(60, lnLinieTop - 4 - toForm.grd_factura.Top), tcEticheta + ": grd_factura.Height pana la 4px sub linia de casete" + + IF llInc + DO Assert WITH toForm.ct_incasare.Top = lnLinieTop + lnHLinie, tcEticheta + ": ct_incasare imediat sub linia de casete" + DO Assert WITH toForm.ct_incasare.Height = 96, tcEticheta + ": ct_incasare.Height=96" + DO Assert WITH toForm.nmod_incasare() = 2, tcEticheta + ": nmod_incasare()=2 (chitanta, opt_incasat.Value=1)" + ELSE + DO Assert WITH toForm.nmod_incasare() = 1, tcEticheta + ": nmod_incasare()=1 (fara incasare)" + ENDIF + + IF llAlte + lnAlteTop = lnLinieTop + lnHLinie + lnHInc + lnGap + DO Assert WITH toForm.ct_document.Top = lnAlteTop, tcEticheta + ": ct_document la lnAlteTop=" + TRANSFORM(lnAlteTop) + DO Assert WITH toForm.ct_contabilitate.Top - toForm.ct_document.Top = 96, tcEticheta + ": ct_contabilitate decalat 96 fata de ct_document" + DO Assert WITH toForm.ct_livrare.Top - toForm.ct_document.Top = 176, tcEticheta + ": ct_livrare decalat 176 fata de ct_document" + ENDIF + + IF llInc AND llAlte + DO Assert WITH toForm.ct_document.Top - (toForm.ct_incasare.Top + toForm.ct_incasare.Height) = 8, tcEticheta + ": gap de 8px intre ct_incasare si ct_document" + ENDIF + + IF !llAlte AND !llInc + gnHGrila00 = toForm.grd_factura.Height + ENDIF + IF llAlte AND llInc + gnHGrila11 = toForm.grd_factura.Height + ENDIF +ENDPROC + +PROCEDURE DumpSiAnalizeaza + * Enumerare RECURSIVA prin .Objects (ColectGrila): dupa S7 cele 30 de controale de sub grila + * stau in ct_document / ct_contabilitate / ct_livrare / ct_incasare, iar o parcurgere plata a + * lui Thisform.Objects nu le mai vede deloc. Scrie .tsv cu Name ca traseu punctat de la + * formular, geometria proprie, vizibilitatea EFECTIVA (proprie AND a parintilor) si + * AbsLeft/AbsTop acumulate pe coborare. Analiza (suprapuneri 2D, iesire din forma, perechi + * lipite <4px) lucreaza pe coordonate ABSOLUTE, doar intre controale efectiv vizibile. + * Perechile parinte-copil se sar (copilul e prin definitie in parinte), la fel shape-urile + * decorative de grup, care acopera tot containerul lor. + LPARAMETERS toForm, tcEticheta, tcTsvPath + LOCAL i, j, lcOut + gnN = 0 + lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(9) + "AbsLeft" + CHR(9) + "AbsTop" + CHR(9) + "Caption" + CHR(13) + CHR(10) + lcOut = lcOut + ColectGrila(toForm, "", 0, 0, 0, .T.) + STRTOFILE(lcOut, tcTsvPath) + DO AfLog WITH "GEOMETRIE [" + tcEticheta + "]: " + TRANSFORM(gnN) + " controale cu geometrie (recursiv, " + TRANSFORM(toForm.Objects.Count) + " la nivel de formular) -> " + tcTsvPath + IF gnTrunc > 0 + DO AfLog WITH "ATENTIE: dump truncat, " + TRANSFORM(gnTrunc) + " obiecte peste plafonul de 600" + ENDIF + + LOCAL lnAL, lnAT, lnAR, lnAB, lnBL, lnBT, lnBR, lnBB, lnOvX, lnOvY, lnGap + LOCAL lcSectiune + lcSectiune = "=== " + tcEticheta + " (forma " + TRANSFORM(toForm.Width) + "x" + TRANSFORM(toForm.Height) + ", " + TRANSFORM(gnN) + " obiecte) ===" + CHR(13) + CHR(10) + FOR i = 1 TO gnN + IF !gaV[i] OR gaSk[i] + LOOP + ENDIF + lnAL = gaAL[i] + lnAT = gaAT[i] + lnAR = gaAL[i] + gaW[i] + lnAB = gaAT[i] + gaH[i] + IF lnAL < 0 OR lnAT < 0 OR lnAR > toForm.Width OR lnAB > toForm.Height + lcSectiune = lcSectiune + "IESIT: " + gaN[i] + " (" + gaC[i] + ") Left=" + TRANSFORM(lnAL) + " Top=" + TRANSFORM(lnAT) + " Right=" + TRANSFORM(lnAR) + " Bottom=" + TRANSFORM(lnAB) + CHR(13) + CHR(10) + ENDIF + FOR j = i + 1 TO gnN + IF !gaV[j] OR gaSk[j] + LOOP + ENDIF + IF LEFT(gaN[j], LEN(gaN[i]) + 1) == gaN[i] + "." OR LEFT(gaN[i], LEN(gaN[j]) + 1) == gaN[j] + "." + LOOP + ENDIF + lnBL = gaAL[j] + lnBT = gaAT[j] + lnBR = gaAL[j] + gaW[j] + lnBB = gaAT[j] + gaH[j] + lnOvX = MIN(lnAR, lnBR) - MAX(lnAL, lnBL) + lnOvY = MIN(lnAB, lnBB) - MAX(lnAT, lnBT) + IF lnOvX > 0 AND lnOvY > 0 + lcSectiune = lcSectiune + "SUPRAPUNERE: " + gaN[i] + " (" + gaC[i] + ") x " + gaN[j] + " (" + gaC[j] + ") " + TRANSFORM(lnOvX) + "x" + TRANSFORM(lnOvY) + "px" + CHR(13) + CHR(10) + ELSE + IF lnOvY > 0 AND lnOvX <= 0 AND -lnOvX < 4 + lnGap = -lnOvX + lcSectiune = lcSectiune + "LIPIT-ORIZ: " + gaN[i] + " - " + gaN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10) + ENDIF + IF lnOvX > 0 AND lnOvY <= 0 AND -lnOvY < 4 + lnGap = -lnOvY + lcSectiune = lcSectiune + "LIPIT-VERT: " + gaN[i] + " - " + gaN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10) + ENDIF + ENDIF + ENDFOR + ENDFOR + gcRaport = gcRaport + lcSectiune + CHR(13) + CHR(10) +ENDPROC + +FUNCTION ColectGrila + * Recursie pe .Objects (nu PEMSTATUS) - garda Type('loO.Left')='N' fiindca nu orice membru + * are geometrie (separatoare, columns de grid etc. nu ajung aici, gridurile nu au .Objects). + * Umple ariile ga* pentru analiza si intoarce randurile TSV. gaSk marcheaza obiectele scoase + * din analiza de suprapuneri: shape-urile, care sunt chenare decorative peste continutul lor. + LPARAMETERS toContainer, tcPrefix, tnParentAbsLeft, tnParentAbsTop, tnDepth, tlParentVisEff + LOCAL i, loO, lcName, lnAbsL, lnAbsT, lcCaption, llVisEff, lcVisTxt, lcOut + IF tnDepth > 15 + RETURN "" + ENDIF + lcOut = "" + FOR i = 1 TO toContainer.Objects.Count + loO = toContainer.Objects(i) + IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' + lcName = IIF(EMPTY(tcPrefix), loO.Name, tcPrefix + "." + loO.Name) + lnAbsL = tnParentAbsLeft + loO.Left + lnAbsT = tnParentAbsTop + loO.Top + lcCaption = "" + IF TYPE('loO.Caption') = 'C' + lcCaption = loO.Caption + ELSE + IF TYPE('loO.Value') = 'C' + lcCaption = loO.Value + ENDIF + ENDIF + lcCaption = STRTRAN(lcCaption, CHR(9), " ") + lcCaption = LEFT(lcCaption, 40) + llVisEff = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) AND tlParentVisEff + lcVisTxt = TRANSFORM(llVisEff) + IF gnN < 600 + gnN = gnN + 1 + gaN[gnN] = lcName + gaC[gnN] = loO.Class + gaL[gnN] = loO.Left + gaT[gnN] = loO.Top + gaW[gnN] = loO.Width + gaH[gnN] = loO.Height + gaV[gnN] = llVisEff + gaAL[gnN] = lnAbsL + gaAT[gnN] = lnAbsT + gaSk[gnN] = (UPPER(loO.BaseClass) == "SHAPE") + ELSE + gnTrunc = gnTrunc + 1 + ENDIF + lcOut = lcOut + lcName + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + lcVisTxt + CHR(9) + TRANSFORM(lnAbsL) + CHR(9) + TRANSFORM(lnAbsT) + CHR(9) + lcCaption + CHR(13) + CHR(10) + IF TYPE('loO.Objects.Count') = 'N' + lcOut = lcOut + ColectGrila(loO, lcName, lnAbsL, lnAbsT, tnDepth + 1, llVisEff) + ENDIF + ENDIF + ENDFOR + RETURN lcOut +ENDFUNC + +PROCEDURE ProbaSerii + * apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor + * ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului + LPARAMETERS tnIdTipDoc + LOCAL lnOk, laErr[1], i, lcSql + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + FOR i = 1 TO 3 + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii") + IF lnOk > 0 + DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii")) + USE IN (SELECT("crsprobaserii")) + EXIT + ELSE + AERROR(laErr) + DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5]) + ENDIF + ENDFOR +ENDPROC + +FUNCTION ObjExists + * Cautare RECURSIVA: dupa S7 controalele de sub grila nu mai sunt in Thisform.Objects, ci in + * containerele lor - o cautare plata ar raporta tacut "lipseste". + LPARAMETERS toContainer, tcName + LOCAL i, loO + FOR i = 1 TO toContainer.Objects.Count + loO = toContainer.Objects(i) + IF UPPER(loO.Name) == UPPER(tcName) + RETURN .T. + ENDIF + IF TYPE('loO.Objects.Count') = 'N' + IF ObjExists(loO, tcName) + RETURN .T. + ENDIF + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO AfLog WITH "PASS: " + tcMsg + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL: " + tcMsg + ENDIF +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + DO HarnessDone WITH 'done' + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s5_benzi2_ui.ps1 b/utile/Teste/facturare_unificat/test_s5_benzi2_ui.ps1 new file mode 100644 index 0000000..47d5579 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5_benzi2_ui.ps1 @@ -0,0 +1,13 @@ +# test_s5_benzi2_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru +# test_s5_benzi2_ui.prg. Capturi S7 pe frm_facturare_articole2 (ofacturare.vc2), pe cele patru +# combinatii de casete (0/0, 1/0, 0/1, 1/1). +# Folderele sunt NOI: vfp_ui_harness.ps1 goleste ShotsDir/SyncDir la pornire, deci indreptarea lui +# spre screenshots_benzi2_27_08\ ar sterge capturile de referinta din 27.08. +# Rulare: powershell -ExecutionPolicy Bypass -File test_s5_benzi2_ui.ps1 (timeout >= 300s) +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_s5_benzi2_ui.prg') ` + -Steps @('stare_initiala','alte_date_deschis','incasare_deschis','ambele_deschise') ` + -SyncDir (Join-Path $Teste 'uisync_benzi2_S7_28_08') ` + -ShotsDir (Join-Path $Teste 'screenshots_benzi2_S7_28_08') diff --git a/utile/Teste/facturare_unificat/test_s5_benzi_ui.prg b/utile/Teste/facturare_unificat/test_s5_benzi_ui.prg new file mode 100644 index 0000000..ff7c4e0 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5_benzi_ui.prg @@ -0,0 +1,342 @@ +* test_s3b_dupa_ui.prg +* UI VIZIBIL: capturi "DUPA" pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2), dupa +* aplatizarea chenarelor (BorderWidth=0 pe containere, confirmata in binar). Copie a +* test_s3b_referinta_ui.prg cu ACELASI mediu / aceiasi 4 pasi / aceleasi etichete de pas, dar cu +* iesirile in fisiere separate (nu suprascrie referinta) ca sa poata fi comparate una langa alta. +* +* Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_dupa_ui.ps1 (timeout >= 300s) +* Log: facturare_unificat\test_s5_benzi_ui_log.txt ; capturi in screenshots_benzi_27_08\ ; +* geometrie in out\geom_stare_27_08_.tsv + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcUILog, gcSyncDir, gnFail, gnPass +gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5_benzi_ui_log.txt" +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_benzi_27_08\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) +gnFail = 0 +gnPass = 0 +PUBLIC gcRaport +gcRaport = "" +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out") + MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out" +ENDIF + +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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnScadereStoc = 0 +* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel - +* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist" +IF !USED('saft_tip_facturi') + update_saft_tip_facturi() +ENDIF + +PRIVATE poDate, poGeneratorNumere, loForm, lcTsv, lcRaportFile +lcRaportFile = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi_27_08_raport.txt" + +* document nou: poDate.incasat ramane 0 la construire - identic Scenariul A din test_s3b_incasare_nealocare.prg +poDate = CREATEOBJECT("oDateFactura", 25000, 1) +poDate.nIdTipDoc = 5 +poDate.totalctva = 1000 +DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + " poDate.incasat=" + TRANSFORM(poDate.incasat) +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") +poGeneratorNumere.ResetNumere() +DO ProbaSerii WITH poDate.nIdTipDoc +poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + +loForm = CREATEOBJECT('frm_facturare_articole2') +DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" +IF VARTYPE(loForm) <> 'O' + DO Final +ENDIF +DO Assert WITH ObjExists(loForm, 'opt_incasat'), "opt_incasat prezent (poDate.tip intre 1 si 4, deci grupul de incasare exista)" + +loForm.WindowType = 0 +loForm.Show() +loForm.WindowState = 2 +DOEVENTS FORCE + +* pas0: stare initiala dupa Createobject - ambele acordeoane plaite (lalte_date_deschis=.F., lincasare_deschis=.F. by design) +DO AfLog WITH "PAS0 stare initiala: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi_27_08_stare_initiala.tsv" +DO DumpSiAnalizeaza WITH loForm, "stare initiala (ambele plaite)", lcTsv +DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_benzi_27_08_stare_initiala.tsv" +DO HarnessStep WITH 0, 'stare_initiala', 6 + +* pas1: Alte date deschis - caseta se seteaza INAINTE de comutare (metoda citeste caseta) +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +DO AfLog WITH "PAS1 alte date deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi_27_08_alte_date.tsv" +DO DumpSiAnalizeaza WITH loForm, "Alte date deschis", lcTsv +DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_benzi_27_08_alte_date.tsv" +DO HarnessStep WITH 1, 'alte_date_deschis', 6 + +* pas2: Alte date inchis la loc, Incasare deschis +* bifarea casetei aloca o chitanta reala in MARIUSM_AUTO - vezi curatenia de dinainte de Release +loForm.chk_alte_date.Value = 0 +loForm.do_comuta_alte_date() +loForm.chk_incasare.Value = 1 +loForm.do_comuta_incasare() +DOEVENTS FORCE +DO AfLog WITH "PAS2 incasare deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi_27_08_incasare.tsv" +DO DumpSiAnalizeaza WITH loForm, "Incasare deschis", lcTsv +DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_benzi_27_08_incasare.tsv" +DO HarnessStep WITH 2, 'incasare_deschis', 6 + +* pas3: Alte date deschis din nou - ambele deschise simultan +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +DO AfLog WITH "PAS3 ambele deschise: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_benzi_27_08_ambele.tsv" +DO DumpSiAnalizeaza WITH loForm, "Ambele deschise", lcTsv +DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_benzi_27_08_ambele.tsv" +DO HarnessStep WITH 3, 'ambele_deschise', 6 + +STRTOFILE(gcRaport, lcRaportFile) +DO AfLog WITH "Raport geometrie scris in " + lcRaportFile + +* curatenie obligatorie: bifarea casetei la pasul 2 a alocat o chitanta reala in MARIUSM_AUTO, +* iar debifarea ruleaza ramura "fara incasare", care dezaloca 16/3/26 +loForm.chk_incasare.Value = 0 +loForm.do_comuta_incasare() +DO Assert WITH loForm.nmod_incasare() = 1, "dupa curatenie: nmod_incasare()=1 (fara incasare)" +loForm.Release() +RELEASE loForm + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE DumpSiAnalizeaza + * Parcurge Thisform.Objects (top-level, fara recursie in containere) - dupa S7 NU mai vede cele + * 30 de controale mutate in ct_document/ct_contabilitate/ct_livrare/ct_incasare; harta completa + * e cea scrisa de DumpGrilaRecursiv. Scrie .tsv cu + * Name/Class/Left/Top/Width/Height/Visible pentru fiecare obiect cu geometrie, apoi + * calculeaza suprapuneri (2D), iesire din zona utila a formularului si perechi lipite + * (<4px) pe orizontala/verticala, doar intre controale Visible=.T. Adauga sectiunea la gcRaport. + LPARAMETERS toForm, tcEticheta, tcTsvPath + LOCAL i, j, loO, lcOut, lnN, lnCount, llVis + LOCAL ARRAY laN[400], laC[400], laL[400], laT[400], laW[400], laH[400], laV[400] + lnN = 0 + lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(13) + CHR(10) + lnCount = toForm.Objects.Count + FOR i = 1 TO lnCount + loO = toForm.Objects(i) + IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' AND lnN < 400 + llVis = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) + lnN = lnN + 1 + laN[lnN] = loO.Name + laC[lnN] = loO.Class + laL[lnN] = loO.Left + laT[lnN] = loO.Top + laW[lnN] = loO.Width + laH[lnN] = loO.Height + laV[lnN] = llVis + lcOut = lcOut + loO.Name + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + TRANSFORM(llVis) + CHR(13) + CHR(10) + ENDIF + ENDFOR + STRTOFILE(lcOut, tcTsvPath) + DO AfLog WITH "GEOMETRIE [" + tcEticheta + "]: " + TRANSFORM(lnN) + " controale cu geometrie din " + TRANSFORM(lnCount) + " obiecte totale -> " + tcTsvPath + + LOCAL lnAL, lnAT, lnAR, lnAB, lnBL, lnBT, lnBR, lnBB, lnOvX, lnOvY, lnGap + LOCAL lcSectiune + lcSectiune = "=== " + tcEticheta + " (forma " + TRANSFORM(toForm.Width) + "x" + TRANSFORM(toForm.Height) + ") ===" + CHR(13) + CHR(10) + FOR i = 1 TO lnN + IF !laV[i] + LOOP + ENDIF + lnAL = laL[i] + lnAT = laT[i] + lnAR = laL[i] + laW[i] + lnAB = laT[i] + laH[i] + IF lnAL < 0 OR lnAT < 0 OR lnAR > toForm.Width OR lnAB > toForm.Height + lcSectiune = lcSectiune + "IESIT: " + laN[i] + " (" + laC[i] + ") Left=" + TRANSFORM(lnAL) + " Top=" + TRANSFORM(lnAT) + " Right=" + TRANSFORM(lnAR) + " Bottom=" + TRANSFORM(lnAB) + CHR(13) + CHR(10) + ENDIF + FOR j = i + 1 TO lnN + IF !laV[j] + LOOP + ENDIF + lnBL = laL[j] + lnBT = laT[j] + lnBR = laL[j] + laW[j] + lnBB = laT[j] + laH[j] + lnOvX = MIN(lnAR, lnBR) - MAX(lnAL, lnBL) + lnOvY = MIN(lnAB, lnBB) - MAX(lnAT, lnBT) + IF lnOvX > 0 AND lnOvY > 0 + lcSectiune = lcSectiune + "SUPRAPUNERE: " + laN[i] + " (" + laC[i] + ") x " + laN[j] + " (" + laC[j] + ") " + TRANSFORM(lnOvX) + "x" + TRANSFORM(lnOvY) + "px" + CHR(13) + CHR(10) + ELSE + IF lnOvY > 0 AND lnOvX <= 0 AND -lnOvX < 4 + lnGap = -lnOvX + lcSectiune = lcSectiune + "LIPIT-ORIZ: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10) + ENDIF + IF lnOvX > 0 AND lnOvY <= 0 AND -lnOvY < 4 + lnGap = -lnOvY + lcSectiune = lcSectiune + "LIPIT-VERT: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10) + ENDIF + ENDIF + ENDFOR + ENDFOR + gcRaport = gcRaport + lcSectiune + CHR(13) + CHR(10) +ENDPROC + +PROCEDURE DumpGrilaRecursiv + * Harta de geometrie recursiva: coboara in .Objects pe oricate niveluri (containere compozite + * clb_tx_simplu / ct_clb_cautare / etc.), scrie Name ca traseu punctat de la formular + * (Ct_clb_agent.clb_tx_cautare.Lb_simplu1), plus AbsLeft/AbsTop absolute fata de formular + * si Caption/Value taiat la 40 caractere - necesare ca sa se detecteze suprapunerile si + * textele taiate din interiorul containerelor, invizibile in harta plata geom_dupa_*.tsv. + LPARAMETERS toForm, tcTsvPath + LOCAL lcOut + lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(9) + "AbsLeft" + CHR(9) + "AbsTop" + CHR(9) + "Caption" + CHR(13) + CHR(10) + lcOut = lcOut + ColectGrila(toForm, "", 0, 0, 0, .T.) + STRTOFILE(lcOut, tcTsvPath) + DO AfLog WITH "GEOMETRIE-GRILA: scris " + tcTsvPath +ENDPROC + +FUNCTION ColectGrila + * Recursie pe .Objects (nu PEMSTATUS) - garda Type('loO.Left')='N' fiindca nu orice membru + * are geometrie (separatoare, columns de grid etc. nu ajung aici, gridurile nu au .Objects). + * coloana Visible e vizibilitatea EFECTIVA (proprie AND a parintelui) - un copil dintr-un + * container ascuns are Visible propriu .T. dar nu se deseneaza. + LPARAMETERS toContainer, tcPrefix, tnParentAbsLeft, tnParentAbsTop, tnDepth, tlParentVisEff + LOCAL i, loO, lcName, lnAbsL, lnAbsT, lcCaption, llVisEff, lcVisTxt, lcOut + IF tnDepth > 15 + RETURN "" + ENDIF + lcOut = "" + FOR i = 1 TO toContainer.Objects.Count + loO = toContainer.Objects(i) + IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' + lcName = IIF(EMPTY(tcPrefix), loO.Name, tcPrefix + "." + loO.Name) + lnAbsL = tnParentAbsLeft + loO.Left + lnAbsT = tnParentAbsTop + loO.Top + lcCaption = "" + IF TYPE('loO.Caption') = 'C' + lcCaption = loO.Caption + ELSE + IF TYPE('loO.Value') = 'C' + lcCaption = loO.Value + ENDIF + ENDIF + lcCaption = STRTRAN(lcCaption, CHR(9), " ") + lcCaption = LEFT(lcCaption, 40) + llVisEff = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) AND tlParentVisEff + lcVisTxt = TRANSFORM(llVisEff) + lcOut = lcOut + lcName + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + lcVisTxt + CHR(9) + TRANSFORM(lnAbsL) + CHR(9) + TRANSFORM(lnAbsT) + CHR(9) + lcCaption + CHR(13) + CHR(10) + IF TYPE('loO.Objects.Count') = 'N' + lcOut = lcOut + ColectGrila(loO, lcName, lnAbsL, lnAbsT, tnDepth + 1, llVisEff) + ENDIF + ENDIF + ENDFOR + RETURN lcOut +ENDFUNC + +PROCEDURE ProbaSerii + * apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor + * ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului + LPARAMETERS tnIdTipDoc + LOCAL lnOk, laErr[1], i, lcSql + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + FOR i = 1 TO 3 + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii") + IF lnOk > 0 + DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii")) + USE IN (SELECT("crsprobaserii")) + EXIT + ELSE + AERROR(laErr) + DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5]) + ENDIF + ENDFOR +ENDPROC + +FUNCTION ObjExists + * Cautare RECURSIVA: dupa S7 controalele de sub grila nu mai sunt in Thisform.Objects, ci in + * containerele lor - o cautare plata ar raporta tacut "lipseste". + LPARAMETERS toContainer, tcName + LOCAL i, loO + FOR i = 1 TO toContainer.Objects.Count + loO = toContainer.Objects(i) + IF UPPER(loO.Name) == UPPER(tcName) + RETURN .T. + ENDIF + IF TYPE('loO.Objects.Count') = 'N' + IF ObjExists(loO, tcName) + RETURN .T. + ENDIF + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO AfLog WITH "PASS: " + tcMsg + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL: " + tcMsg + ENDIF +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + DO HarnessDone WITH 'done' + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s5_benzi_ui.ps1 b/utile/Teste/facturare_unificat/test_s5_benzi_ui.ps1 new file mode 100644 index 0000000..06bdcbd --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5_benzi_ui.ps1 @@ -0,0 +1,12 @@ +# test_s3b_dupa_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru +# test_s5_benzi_ui.prg. Capturi "DUPA" pe frm_facturare_articole2 (ofacturare.vc2), dupa +# aplatizarea chenarelor - aceiasi 4 pasi si aceleasi nume de fisiere PNG ca la referinta, dar in +# folder separat (screenshots_benzi_27_08\), ca sa nu suprascrie screenshots_referinta\. +# Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_dupa_ui.ps1 (timeout >= 300s) +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_s5_benzi_ui.prg') ` + -Steps @('stare_initiala','alte_date_deschis','incasare_deschis','ambele_deschise') ` + -SyncDir (Join-Path $Teste 'uisync_benzi_27_08') ` + -ShotsDir (Join-Path $Teste 'screenshots_benzi_27_08') diff --git a/utile/Teste/facturare_unificat/test_s5_stare_ui.prg b/utile/Teste/facturare_unificat/test_s5_stare_ui.prg new file mode 100644 index 0000000..54cda26 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5_stare_ui.prg @@ -0,0 +1,342 @@ +* test_s3b_dupa_ui.prg +* UI VIZIBIL: capturi "DUPA" pe frm_facturare_articole2 (COMUN\clase\ofacturare.vc2), dupa +* aplatizarea chenarelor (BorderWidth=0 pe containere, confirmata in binar). Copie a +* test_s3b_referinta_ui.prg cu ACELASI mediu / aceiasi 4 pasi / aceleasi etichete de pas, dar cu +* iesirile in fisiere separate (nu suprascrie referinta) ca sa poata fi comparate una langa alta. +* +* Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_dupa_ui.ps1 (timeout >= 300s) +* Log: facturare_unificat\test_s5_stare_ui_log.txt ; capturi in screenshots_stare_27_08\ ; +* geometrie in out\geom_stare_27_08_.tsv + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcUILog, gcSyncDir, gnFail, gnPass +gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5_stare_ui_log.txt" +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_stare_27_08\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) +gnFail = 0 +gnPass = 0 +PUBLIC gcRaport +gcRaport = "" +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out") + MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out" +ENDIF + +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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnScadereStoc = 0 +* seriile de facturi (tipdoc 5) si de incasare (3/16/26) sunt pe utilizator in MARIUSM_AUTO +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "gnScadereStoc=" + TRANSFORM(gnScadereStoc) + +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa, rezolvabila doar din exe/IDE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +* grd_factura.cCodMat.cboCodmat e declarat AS combosql OF cautare.vcx, dar clasa e in _cb_base.vcx +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +* cboTipFactura (RowSourceType=3) citeste cursorul local saft_tip_facturi ca pe un tabel - +* fara el deschis explicit, Createobject('frm_facturare_articole2') da "File 'saft_tip_facturi.dbf' does not exist" +IF !USED('saft_tip_facturi') + update_saft_tip_facturi() +ENDIF + +PRIVATE poDate, poGeneratorNumere, loForm, lcTsv, lcRaportFile +lcRaportFile = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_stare_27_08_raport.txt" + +* document nou: poDate.incasat ramane 0 la construire - identic Scenariul A din test_s3b_incasare_nealocare.prg +poDate = CREATEOBJECT("oDateFactura", 25000, 1) +poDate.nIdTipDoc = 5 +poDate.totalctva = 1000 +DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) + " poDate.incasat=" + TRANSFORM(poDate.incasat) +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") +poGeneratorNumere.ResetNumere() +DO ProbaSerii WITH poDate.nIdTipDoc +poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + +loForm = CREATEOBJECT('frm_facturare_articole2') +DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" +IF VARTYPE(loForm) <> 'O' + DO Final +ENDIF +DO Assert WITH ObjExists(loForm, 'opt_incasat'), "opt_incasat prezent (poDate.tip intre 1 si 4, deci grupul de incasare exista)" + +loForm.WindowType = 0 +loForm.Show() +loForm.WindowState = 2 +DOEVENTS FORCE + +* pas0: stare initiala dupa Createobject - ambele acordeoane plaite (lalte_date_deschis=.F., lincasare_deschis=.F. by design) +DO AfLog WITH "PAS0 stare initiala: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_stare_27_08_stare_initiala.tsv" +DO DumpSiAnalizeaza WITH loForm, "stare initiala (ambele plaite)", lcTsv +DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_stare_27_08_stare_initiala.tsv" +DO HarnessStep WITH 0, 'stare_initiala', 6 + +* pas1: Alte date deschis - caseta se seteaza INAINTE de comutare (metoda citeste caseta) +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +DO AfLog WITH "PAS1 alte date deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_stare_27_08_alte_date.tsv" +DO DumpSiAnalizeaza WITH loForm, "Alte date deschis", lcTsv +DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_stare_27_08_alte_date.tsv" +DO HarnessStep WITH 1, 'alte_date_deschis', 6 + +* pas2: Alte date inchis la loc, Incasare deschis +* bifarea casetei aloca o chitanta reala in MARIUSM_AUTO - vezi curatenia de dinainte de Release +loForm.chk_alte_date.Value = 0 +loForm.do_comuta_alte_date() +loForm.chk_incasare.Value = 1 +loForm.do_comuta_incasare() +DOEVENTS FORCE +DO AfLog WITH "PAS2 incasare deschis: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_stare_27_08_incasare.tsv" +DO DumpSiAnalizeaza WITH loForm, "Incasare deschis", lcTsv +DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_stare_27_08_incasare.tsv" +DO HarnessStep WITH 2, 'incasare_deschis', 6 + +* pas3: Alte date deschis din nou - ambele deschise simultan +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +DO AfLog WITH "PAS3 ambele deschise: lalte_date_deschis=" + TRANSFORM(loForm.lalte_date_deschis) + " lincasare_deschis=" + TRANSFORM(loForm.lincasare_deschis) +lcTsv = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_stare_27_08_ambele.tsv" +DO DumpSiAnalizeaza WITH loForm, "Ambele deschise", lcTsv +DO DumpGrilaRecursiv WITH loForm, "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\geom_grila_stare_27_08_ambele.tsv" +DO HarnessStep WITH 3, 'ambele_deschise', 6 + +STRTOFILE(gcRaport, lcRaportFile) +DO AfLog WITH "Raport geometrie scris in " + lcRaportFile + +* curatenie obligatorie: bifarea casetei la pasul 2 a alocat o chitanta reala in MARIUSM_AUTO, +* iar debifarea ruleaza ramura "fara incasare", care dezaloca 16/3/26 +loForm.chk_incasare.Value = 0 +loForm.do_comuta_incasare() +DO Assert WITH loForm.nmod_incasare() = 1, "dupa curatenie: nmod_incasare()=1 (fara incasare)" +loForm.Release() +RELEASE loForm + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE DumpSiAnalizeaza + * Parcurge Thisform.Objects (top-level, fara recursie in containere) - dupa S7 NU mai vede cele + * 30 de controale mutate in ct_document/ct_contabilitate/ct_livrare/ct_incasare; harta completa + * e cea scrisa de DumpGrilaRecursiv. Scrie .tsv cu + * Name/Class/Left/Top/Width/Height/Visible pentru fiecare obiect cu geometrie, apoi + * calculeaza suprapuneri (2D), iesire din zona utila a formularului si perechi lipite + * (<4px) pe orizontala/verticala, doar intre controale Visible=.T. Adauga sectiunea la gcRaport. + LPARAMETERS toForm, tcEticheta, tcTsvPath + LOCAL i, j, loO, lcOut, lnN, lnCount, llVis + LOCAL ARRAY laN[400], laC[400], laL[400], laT[400], laW[400], laH[400], laV[400] + lnN = 0 + lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(13) + CHR(10) + lnCount = toForm.Objects.Count + FOR i = 1 TO lnCount + loO = toForm.Objects(i) + IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' AND lnN < 400 + llVis = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) + lnN = lnN + 1 + laN[lnN] = loO.Name + laC[lnN] = loO.Class + laL[lnN] = loO.Left + laT[lnN] = loO.Top + laW[lnN] = loO.Width + laH[lnN] = loO.Height + laV[lnN] = llVis + lcOut = lcOut + loO.Name + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + TRANSFORM(llVis) + CHR(13) + CHR(10) + ENDIF + ENDFOR + STRTOFILE(lcOut, tcTsvPath) + DO AfLog WITH "GEOMETRIE [" + tcEticheta + "]: " + TRANSFORM(lnN) + " controale cu geometrie din " + TRANSFORM(lnCount) + " obiecte totale -> " + tcTsvPath + + LOCAL lnAL, lnAT, lnAR, lnAB, lnBL, lnBT, lnBR, lnBB, lnOvX, lnOvY, lnGap + LOCAL lcSectiune + lcSectiune = "=== " + tcEticheta + " (forma " + TRANSFORM(toForm.Width) + "x" + TRANSFORM(toForm.Height) + ") ===" + CHR(13) + CHR(10) + FOR i = 1 TO lnN + IF !laV[i] + LOOP + ENDIF + lnAL = laL[i] + lnAT = laT[i] + lnAR = laL[i] + laW[i] + lnAB = laT[i] + laH[i] + IF lnAL < 0 OR lnAT < 0 OR lnAR > toForm.Width OR lnAB > toForm.Height + lcSectiune = lcSectiune + "IESIT: " + laN[i] + " (" + laC[i] + ") Left=" + TRANSFORM(lnAL) + " Top=" + TRANSFORM(lnAT) + " Right=" + TRANSFORM(lnAR) + " Bottom=" + TRANSFORM(lnAB) + CHR(13) + CHR(10) + ENDIF + FOR j = i + 1 TO lnN + IF !laV[j] + LOOP + ENDIF + lnBL = laL[j] + lnBT = laT[j] + lnBR = laL[j] + laW[j] + lnBB = laT[j] + laH[j] + lnOvX = MIN(lnAR, lnBR) - MAX(lnAL, lnBL) + lnOvY = MIN(lnAB, lnBB) - MAX(lnAT, lnBT) + IF lnOvX > 0 AND lnOvY > 0 + lcSectiune = lcSectiune + "SUPRAPUNERE: " + laN[i] + " (" + laC[i] + ") x " + laN[j] + " (" + laC[j] + ") " + TRANSFORM(lnOvX) + "x" + TRANSFORM(lnOvY) + "px" + CHR(13) + CHR(10) + ELSE + IF lnOvY > 0 AND lnOvX <= 0 AND -lnOvX < 4 + lnGap = -lnOvX + lcSectiune = lcSectiune + "LIPIT-ORIZ: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10) + ENDIF + IF lnOvX > 0 AND lnOvY <= 0 AND -lnOvY < 4 + lnGap = -lnOvY + lcSectiune = lcSectiune + "LIPIT-VERT: " + laN[i] + " - " + laN[j] + " gap=" + TRANSFORM(lnGap) + "px" + CHR(13) + CHR(10) + ENDIF + ENDIF + ENDFOR + ENDFOR + gcRaport = gcRaport + lcSectiune + CHR(13) + CHR(10) +ENDPROC + +PROCEDURE DumpGrilaRecursiv + * Harta de geometrie recursiva: coboara in .Objects pe oricate niveluri (containere compozite + * clb_tx_simplu / ct_clb_cautare / etc.), scrie Name ca traseu punctat de la formular + * (Ct_clb_agent.clb_tx_cautare.Lb_simplu1), plus AbsLeft/AbsTop absolute fata de formular + * si Caption/Value taiat la 40 caractere - necesare ca sa se detecteze suprapunerile si + * textele taiate din interiorul containerelor, invizibile in harta plata geom_dupa_*.tsv. + LPARAMETERS toForm, tcTsvPath + LOCAL lcOut + lcOut = "Name" + CHR(9) + "Class" + CHR(9) + "Left" + CHR(9) + "Top" + CHR(9) + "Width" + CHR(9) + "Height" + CHR(9) + "Visible" + CHR(9) + "AbsLeft" + CHR(9) + "AbsTop" + CHR(9) + "Caption" + CHR(13) + CHR(10) + lcOut = lcOut + ColectGrila(toForm, "", 0, 0, 0, .T.) + STRTOFILE(lcOut, tcTsvPath) + DO AfLog WITH "GEOMETRIE-GRILA: scris " + tcTsvPath +ENDPROC + +FUNCTION ColectGrila + * Recursie pe .Objects (nu PEMSTATUS) - garda Type('loO.Left')='N' fiindca nu orice membru + * are geometrie (separatoare, columns de grid etc. nu ajung aici, gridurile nu au .Objects). + * coloana Visible e vizibilitatea EFECTIVA (proprie AND a parintelui) - un copil dintr-un + * container ascuns are Visible propriu .T. dar nu se deseneaza. + LPARAMETERS toContainer, tcPrefix, tnParentAbsLeft, tnParentAbsTop, tnDepth, tlParentVisEff + LOCAL i, loO, lcName, lnAbsL, lnAbsT, lcCaption, llVisEff, lcVisTxt, lcOut + IF tnDepth > 15 + RETURN "" + ENDIF + lcOut = "" + FOR i = 1 TO toContainer.Objects.Count + loO = toContainer.Objects(i) + IF TYPE('loO.Left') = 'N' AND TYPE('loO.Top') = 'N' AND TYPE('loO.Width') = 'N' AND TYPE('loO.Height') = 'N' + lcName = IIF(EMPTY(tcPrefix), loO.Name, tcPrefix + "." + loO.Name) + lnAbsL = tnParentAbsLeft + loO.Left + lnAbsT = tnParentAbsTop + loO.Top + lcCaption = "" + IF TYPE('loO.Caption') = 'C' + lcCaption = loO.Caption + ELSE + IF TYPE('loO.Value') = 'C' + lcCaption = loO.Value + ENDIF + ENDIF + lcCaption = STRTRAN(lcCaption, CHR(9), " ") + lcCaption = LEFT(lcCaption, 40) + llVisEff = IIF(TYPE('loO.Visible') = 'L', loO.Visible, .T.) AND tlParentVisEff + lcVisTxt = TRANSFORM(llVisEff) + lcOut = lcOut + lcName + CHR(9) + loO.Class + CHR(9) + TRANSFORM(loO.Left) + CHR(9) + TRANSFORM(loO.Top) + CHR(9) + TRANSFORM(loO.Width) + CHR(9) + TRANSFORM(loO.Height) + CHR(9) + lcVisTxt + CHR(9) + TRANSFORM(lnAbsL) + CHR(9) + TRANSFORM(lnAbsT) + CHR(9) + lcCaption + CHR(13) + CHR(10) + IF TYPE('loO.Objects.Count') = 'N' + lcOut = lcOut + ColectGrila(loO, lcName, lnAbsL, lnAbsT, tnDepth + 1, llVisEff) + ENDIF + ENDIF + ENDFOR + RETURN lcOut +ENDFUNC + +PROCEDURE ProbaSerii + * apel direct al procedurii Oracle din creeaza_cursor_serii: logheaza eroarea reala (goExecutor + * ar deschide amessagebox modal, care agata rularea headless) si incalzeste starea pachetului + LPARAMETERS tnIdTipDoc + LOCAL lnOk, laErr[1], i, lcSql + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + FOR i = 1 TO 3 + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobaserii") + IF lnOk > 0 + DO AfLog WITH "proba serii OK la incercarea " + TRANSFORM(i) + ", pnRezultat=" + TRANSFORM(pnRezultat) + " randuri=" + TRANSFORM(RECCOUNT("crsprobaserii")) + USE IN (SELECT("crsprobaserii")) + EXIT + ELSE + AERROR(laErr) + DO AfLog WITH "proba serii ESEC la incercarea " + TRANSFORM(i) + ": " + TRANSFORM(laErr[1]) + " / " + TRANSFORM(laErr[2]) + " / " + TRANSFORM(laErr[5]) + ENDIF + ENDFOR +ENDPROC + +FUNCTION ObjExists + * Cautare RECURSIVA: dupa S7 controalele de sub grila nu mai sunt in Thisform.Objects, ci in + * containerele lor - o cautare plata ar raporta tacut "lipseste". + LPARAMETERS toContainer, tcName + LOCAL i, loO + FOR i = 1 TO toContainer.Objects.Count + loO = toContainer.Objects(i) + IF UPPER(loO.Name) == UPPER(tcName) + RETURN .T. + ENDIF + IF TYPE('loO.Objects.Count') = 'N' + IF ObjExists(loO, tcName) + RETURN .T. + ENDIF + ENDIF + ENDFOR + RETURN .F. +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO AfLog WITH "PASS: " + tcMsg + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL: " + tcMsg + ENDIF +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + DO HarnessDone WITH 'done' + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s5_stare_ui.ps1 b/utile/Teste/facturare_unificat/test_s5_stare_ui.ps1 new file mode 100644 index 0000000..aa90139 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5_stare_ui.ps1 @@ -0,0 +1,12 @@ +# test_s3b_dupa_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru +# test_s5_stare_ui.prg. Capturi "DUPA" pe frm_facturare_articole2 (ofacturare.vc2), dupa +# aplatizarea chenarelor - aceiasi 4 pasi si aceleasi nume de fisiere PNG ca la referinta, dar in +# folder separat (screenshots_stare_27_08\), ca sa nu suprascrie screenshots_referinta\. +# Rulare: powershell -ExecutionPolicy Bypass -File test_s3b_dupa_ui.ps1 (timeout >= 300s) +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_s5_stare_ui.prg') ` + -Steps @('stare_initiala','alte_date_deschis','incasare_deschis','ambele_deschise') ` + -SyncDir (Join-Path $Teste 'uisync_stare_27_08') ` + -ShotsDir (Join-Path $Teste 'screenshots_stare_27_08') diff --git a/utile/Teste/facturare_unificat/test_s5b_proforma.prg b/utile/Teste/facturare_unificat/test_s5b_proforma.prg new file mode 100644 index 0000000..c0e2b82 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5b_proforma.prg @@ -0,0 +1,580 @@ +* test_s5b_proforma.prg +* Headless: S5b in frm_facturare_articole2 (COMUN\clase\ofacturare.vc2). +* M1 - rutarea proformei: verificata STATIC (FILETOSTR + AT pe textul din arbore, fara Oracle, +* fara dialog) - Case poDate.eProforma = 1 e LITERALMENTE prima ramura din Do Case-ul lui +* do_scrie_factura (inaintea Case poDate.Tip = 4 si Case Inlist(poDate.Tip,3,21,25,28,42,47), +* ramurile Rol A / S4-4), iar apelul din acea ramura foloseste pack_facturare.scrie_proforma( +* cu toti cei 16 parametri reali (nu scrie_proforma_old, semnatura veche cu 5). A fost scoasa +* temporar, gresit banuita drept cauza a unui blocaj vfp9.exe - repusa dupa ce o rulare fara ea +* a reprodus identic blocajul (deci FILETOSTR nu era cauza). O rulare reala care ar emite o +* proforma la Oracle ar consuma un numar de document in MARIUSM_AUTO - datorie deschisa (vezi +* docs\raport_s5b_implementare.md). +* Logare DIAG: AfLog scrie si inchide fisierul la fiecare apel (flush per linie), deci un kill in +* mijlocul unei proceduri lasa in log ultima linie reala executata - folosita ca sa localizeze +* blocajul la instructiune, nu doar la procedura. +* M2 - marcheaza_linii_proforma: sentinela -1000/gestionabil=0 aplicata la salvare, pe toate +* liniile din crsfactura, cu restaurarea pozitiei curente (Recno). +* M3 - do_schimba_tipdoc: garda care blocheaza comutarea PROFORMA -> alt tip cat timp crsfactura +* are linii; sensurile FACTURA -> PROFORMA si "fara linii" raman libere. +* +* Proiectare (v2, dupa incidentul cu dialogul modal real din prima rulare): +* - poDate.eProforma se seteaza DIRECT, niciodata prin poDate.nIdTipDoc = 23 sau prin comutarea +* efectiva a tipului (nici la Createobject, nici prin do_schimba_tipdoc). Formularul se +* instantiaza mereu ca FACTURA (nIdTipDoc = 5, tip cu plaje de serii garantat in MARIUSM_AUTO). +* - do_schimba_tipdoc() se cheama DOAR in cazuri unde garda opreste executia inainte de +* alege_tipdoc/schimba_tipdoc (deci inainte de reincarcarea seriilor), sau unde tipul TINTA e +* FACTURA (are plaje). Sensul care ar comuta efectiv catre PROFORMA (fara plaje in acest mediu) +* NU se ruleaza - vezi TestGardaSensLiber. +* - Sonda RanduriSerii() (SQLEXEC direct pe verifica_cursor_serii, fara alocare) verifica plajele +* disponibile INAINTE de orice caz care ar putea comuta efectiv catre un tip nou. +* +* PLASA ANTI-MODAL, v3 - istoric complet in docs\raport_s5b_implementare.md: +* v1 (incident #2 initial): mock_amessagebox.prg incarcat o singura data la inceput, "verde" fara +* sa fi fost dovedit activ. +* v2: auto-proba prin SET PROCEDURE ADDITIVE + apel de proba - ea insasi auto-anulanta (detecta +* pierderea precedentei CHEMAND amessagebox(), exact apelul riscant). Inlocuita cu FUNCTION +* amessagebox definita DIRECT in acest .prg, pe baza experimentului A (precedenta .prg curent +* peste SET PROCEDURE - CONFIRMATA, dar testata doar pentru apel DIRECT din .prg). +* v3 (actuala): experimentul F a aratat ca precedenta din A NU se mosteneste in interiorul unei +* metode compilate SEPARAT (aici: do_schimba_tipdoc, metoda din ofacturare.vcx) - un apel +* amessagebox() facut din interiorul acelei metode NU foloseste FUNCTION amessagebox de mai jos, +* cade prin SET PROCEDURE chain. Deci FUNCTION amessagebox locala protejeaza doar apelurile +* DIRECTE din acest script (ex. proba din experimente); pentru apelul real din do_schimba_tipdoc +* e nevoie SI de reincarcarea `SET PROCEDURE TO mock_amessagebox.prg ADDITIVE` chiar inainte de +* fiecare apel riscant (SET PROCEDURE nu executa nimic, deci nu are cum sa deschida un dialog - +* spre deosebire de v2, unde proba insasi executa amessagebox()). Asta era, de fapt, mecanismul +* CORECT descris in incidentul #2 original din sarcina - confirmat acum experimental, nu doar +* presupus. NEVERIFICAT LA RULARE (nicio lansare disponibila dupa experimentul F) - apelurile +* TestGardaBlocheaza/TestGardaFaraLinii/TestGardaSensLiber raman comentate in lista principala. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5b_proforma.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5b_proforma.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; seriile de facturi (tipdoc 5) sunt pe utilizator -> gnIdUtil = 8. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5b_proforma.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) +gnFail = 0 +gnPass = 0 +gnSarit = 0 +gcCaz = "" +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 +* fara asta, un lacat Oracle blocheaza rularea la infinit, invizibil in log (tipar confirmat in test_s3b_emitere_paritate_2.prg) +SQLSETPROP(gnHandle, "QueryTimeOut", 45) +IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle + SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45) +ENDIF +* FUNCTION amessagebox e definita mai jos, in acest .prg - vezi PLASA ANTI-MODAL, v2, in antet +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "ENV OK" +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa (..\utile\gridextras), rezolvabila doar din exe/IDE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + +PRIVATE poDate, poGeneratorNumere +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") +gnScadereStoc = 0 + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +* grd_factura.cGestiune e legat la crsFactura.gestiune, camp inexistent in creeaza_facturacrs (nume_gestiune) +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +* sonda plaje - fara alocare, doar SQLEXEC direct pe verifica_cursor_serii (vezi RanduriSerii) +PUBLIC glFacturaAreplaje, glProformaAreplaje +LOCAL lnRandFactura, lnRandProforma +lnRandFactura = RanduriSerii(5) +lnRandProforma = RanduriSerii(23) +glFacturaAreplaje = (lnRandFactura > 0) +glProformaAreplaje = (lnRandProforma > 0) +DO AfLog WITH "pre-proba plaje: tip 5(FACTURA) randuri=" + TRANSFORM(lnRandFactura) + ; + " tip 23(PROFORMA) randuri=" + TRANSFORM(lnRandProforma) + ; + " -> PROFORMA " + IIF(glProformaAreplaje, "probabil", "NEPROBABIL in acest mediu") + +DO TestRutareProformaOrdine +DO TestMarcheazaLiniiProforma +DO TestMarcheazaLiniiProformaGol +* Experimentul D (coordonator): instrumenteaza operanzii conditiei gardei M3, FARA sa cheme +* do_schimba_tipdoc() - zero risc. TestGardaBlocheaza/TestGardaFaraLinii/TestGardaSensLiber raman +* comentate pentru aceasta rulare de diagnostic; se repun dupa ce D da raspunsul. +DO TestD_OperandGarda +* DO TestGardaBlocheaza +* DO TestGardaFaraLinii +* DO TestGardaSensLiber + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE TestRutareProformaOrdine + LOCAL lcTxt, lcWindow, lnPosMark, lnPosDoCase, lnPosProforma, lnPosTip4, lnPosInlist, ; + lnPosPrimulCase, lcApel, laMarkeri[16], lnI, llToti16 + gcCaz = "[M1 static: ordinea Do Case + forma apelului scrie_proforma] " + DO AfLog WITH "DIAG M1: start" + + lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2") + DO AfLog WITH "DIAG M1: FILETOSTR OK, len=" + TRANSFORM(LEN(lcTxt)) + IF EMPTY(lcTxt) + DO Assert WITH .F., "FILETOSTR ofacturare.vc2 a esuat/gol" + RETURN + ENDIF + + * Thisform.marcheaza_linii_proforma() apare o singura data in tot fisierul (metoda noua, doar in + * frm_facturare_articole2) - ancoreaza fereastra de cautare exact pe ramura noua din do_scrie_factura + lnPosMark = AT("Thisform.marcheaza_linii_proforma()", lcTxt) + DO Assert WITH lnPosMark > 0, "Thisform.marcheaza_linii_proforma() apelat din do_scrie_factura" + IF lnPosMark = 0 + RETURN + ENDIF + + lcWindow = SUBSTR(lcTxt, MAX(lnPosMark - 300, 1), 5000) + + lnPosDoCase = AT("Do Case", lcWindow) + lnPosProforma = AT("Case poDate.eProforma = 1", lcWindow) + lnPosTip4 = AT("Case poDate.Tip = 4", lcWindow) + lnPosInlist = AT("Case Inlist(poDate.Tip,3,21,25,28,42,47)", lcWindow) + + DO Assert WITH lnPosDoCase > 0 AND lnPosProforma > 0 AND lnPosTip4 > 0 AND lnPosInlist > 0, ; + "toate reperele gasite: DoCase=" + TRANSFORM(lnPosDoCase) + " eProforma=" + TRANSFORM(lnPosProforma) + ; + " Tip4=" + TRANSFORM(lnPosTip4) + " Inlist=" + TRANSFORM(lnPosInlist) + IF lnPosDoCase = 0 OR lnPosProforma = 0 OR lnPosTip4 = 0 OR lnPosInlist = 0 + RETURN + ENDIF + + DO Assert WITH lnPosDoCase < lnPosProforma AND lnPosProforma < lnPosTip4 AND lnPosTip4 < lnPosInlist, ; + "ordine: Do Case < Case eProforma=1 < Case Tip=4 < Case Inlist(3,21,25,28,42,47)" + + * Case eProforma=1 trebuie sa fie LITERALMENTE prima ramura - primul "Case " gasit dupa "Do Case" + * e chiar ea, nu doar "undeva inaintea" ramurilor S4-4 (Rol A) - o proforma tip 3/4 nu poate cadea + * pe ramura Rol A si sa ceara confirmarea "aviz de retur" + lnPosPrimulCase = AT("Case ", SUBSTR(lcWindow, lnPosDoCase + 7)) + lnPosDoCase + 7 - 1 + DO Assert WITH lnPosPrimulCase == lnPosProforma, ; + "Case eProforma=1 e prima ramura din Do Case (primul Case dupa Do Case), pozitie prim Case=" + ; + TRANSFORM(lnPosPrimulCase) + " pozitie eProforma=" + TRANSFORM(lnPosProforma) + + * forma apelului: pack_facturare.scrie_proforma cu 16 parametri (nu scrie_proforma_old cu 5) + lcApel = SUBSTR(lcWindow, lnPosProforma, lnPosTip4 - lnPosProforma) + DO Assert WITH "pack_facturare.scrie_proforma(" $ lcApel, "apelul contine pack_facturare.scrie_proforma(" + DO Assert WITH !("scrie_proforma_old" $ lcApel), "apelul NU foloseste scrie_proforma_old (semnatura veche, 5 parametri)" + + laMarkeri[1] = "pnTotalFtva" + laMarkeri[2] = "pnTotalTva" + laMarkeri[3] = "pnDiscount" + laMarkeri[4] = "serie_chit" + laMarkeri[5] = "nr_incasare" + laMarkeri[6] = "lcListaIncasare" + laMarkeri[7] = "id_delegat" + laMarkeri[8] = "id_masina" + laMarkeri[9] = "id_facturare" + laMarkeri[10] = "nListareDetaliata" + laMarkeri[11] = "dataora_exp" + laMarkeri[12] = "id_agent" + laMarkeri[13] = "text_aditional" + laMarkeri[14] = "discount_evidentiat" + laMarkeri[15] = "pnParametruAditional" + laMarkeri[16] = "nid_vanzare" + llToti16 = .T. + FOR lnI = 1 TO 16 + IF !(laMarkeri[lnI] $ lcApel) + llToti16 = .F. + DO AfLog WITH " lipseste parametrul [" + laMarkeri[lnI] + "] din apelul scrie_proforma" + ENDIF + ENDFOR + DO Assert WITH llToti16, "toti cei 16 parametri ai scrie_proforma prezenti in apel (semnatura reala, nu cea veche cu 5)" + DO AfLog WITH "DIAG M1: done" +ENDPROC + +PROCEDURE TestMarcheazaLiniiProforma + LOCAL loNou, lnRecnoInitial + gcCaz = "[M2 marcheaza_linii_proforma cu linii] " + + SELECT crsfactura + ZAP + APPEND BLANK + REPLACE denumire WITH "art1", gestionabil WITH 1, id_gestiune WITH 77 + APPEND BLANK + REPLACE denumire WITH "art2", gestionabil WITH 1, id_gestiune WITH 77 + APPEND BLANK + REPLACE denumire WITH "art3", gestionabil WITH 1, id_gestiune WITH 77 + GO 2 IN crsfactura + lnRecnoInitial = RECNO('crsfactura') + DO AfLog WITH "DIAG M2: crsfactura populat cu 3 randuri, Recno initial=" + TRANSFORM(lnRecnoInitial) + + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 27001, 1) + DO AfLog WITH "DIAG M2: poDate = Createobject(oDateFactura) OK" + poDate.nIdTipDoc = 5 + DO AfLog WITH "DIAG M2: poDate.nIdTipDoc = 5 OK" + poGeneratorNumere.ResetNumere() + DO AfLog WITH "DIAG M2: poGeneratorNumere.ResetNumere() OK" + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(5) + DO AfLog WITH "DIAG M2: creeaza_cursor_serii(5) OK, rezultat=" + TRANSFORM(poDate.rezultat_serii) + + DO AfLog WITH "DIAG M2: inainte de Createobject frm_facturare_articole2" + loNou = CREATEOBJECT('frm_facturare_articole2') + DO AfLog WITH "DIAG M2: Createobject frm_facturare_articole2 OK, vartype=" + VARTYPE(loNou) + IF VARTYPE(loNou) <> 'O' + DO Assert WITH .F., "Createobject frm_facturare_articole2" + ELSE + loNou.marcheaza_linii_proforma() + DO AfLog WITH "DIAG M2: marcheaza_linii_proforma() OK" + + LOCAL lnRecnoDupa + lnRecnoDupa = RECNO('crsfactura') + DO AfLog WITH "DIAG M2: Recno('crsfactura') OK, dupa=" + TRANSFORM(lnRecnoDupa) + DO Assert WITH lnRecnoDupa == lnRecnoInitial, "Recno restaurat, initial=" + TRANSFORM(lnRecnoInitial) + " dupa=" + TRANSFORM(lnRecnoDupa) + DO AfLog WITH "DIAG M2: Assert Recno OK" + + SELECT crsfactura + LOCAL llToateMarcate + llToateMarcate = .T. + SCAN + IF gestionabil <> 0 OR id_gestiune <> -1000 + llToateMarcate = .F. + ENDIF + ENDSCAN + DO AfLog WITH "DIAG M2: SCAN OK, llToateMarcate=" + TRANSFORM(llToateMarcate) + DO Assert WITH llToateMarcate, "toate liniile gestionabil=0 si id_gestiune=-1000" + GO m.lnRecnoDupa IN crsfactura + DO AfLog WITH "DIAG M2: GO OK" + + loNou.Release() + DO AfLog WITH "DIAG M2: loNou.Release() OK" + ENDIF + RELEASE loNou + DO AfLog WITH "DIAG M2: RELEASE loNou OK, rezultat_serii=" + TRANSFORM(poDate.rezultat_serii) + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO AfLog WITH "DIAG M2: dezaloca_numar OK" + ENDIF + DO AfLog WITH "DIAG M2: TestMarcheazaLiniiProforma TERMINAT" +ENDPROC + +PROCEDURE TestMarcheazaLiniiProformaGol + LOCAL loNou + gcCaz = "[M2 marcheaza_linii_proforma pe crsfactura gol] " + DO AfLog WITH "DIAG: intrat in TestMarcheazaLiniiProformaGol" + + SELECT crsfactura + ZAP + + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 27005, 1) + poDate.nIdTipDoc = 5 + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(5) + + loNou = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loNou) <> 'O' + DO Assert WITH .F., "Createobject frm_facturare_articole2" + ELSE + LOCAL llEroare + llEroare = .F. + TRY + loNou.marcheaza_linii_proforma() + CATCH + llEroare = .T. + ENDTRY + DO Assert WITH !llEroare, "marcheaza_linii_proforma nu arunca eroare pe crsfactura gol" + + loNou.Release() + ENDIF + RELEASE loNou + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + ENDIF +ENDPROC + +* Experimentul D (coordonator): reproduce exact contextul lui TestGardaBlocheaza (a treia +* instantiere a formularului, aceleasi valori) dar NU cheama do_schimba_tipdoc() - doar logheaza +* fiecare operand al conditiei gardei (ofacturare.vc2:19788) separat, plus conditia evaluata in +* test. Zero risc: nu se atinge nicio metoda de productie care ar putea deschide un dialog sau +* reincarca serii. +PROCEDURE TestD_OperandGarda + LOCAL loNou, lcValoare, lcValoareUpper, lnReccount, lnEProforma, llConditie + gcCaz = "[D operanzi garda, fara do_schimba_tipdoc] " + DO AfLog WITH "DIAG D: intrat in TestD_OperandGarda" + + SELECT crsfactura + ZAP + APPEND BLANK + REPLACE denumire WITH "art1" + DO AfLog WITH "DIAG D: crsfactura populat cu 1 rand" + + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 27010, 1) + poDate.nIdTipDoc = 5 + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(5) + DO AfLog WITH "DIAG D: creeaza_cursor_serii(5) OK, rezultat=" + TRANSFORM(poDate.rezultat_serii) + + loNou = CREATEOBJECT('frm_facturare_articole2') + DO AfLog WITH "DIAG D: Createobject frm_facturare_articole2 OK, vartype=" + VARTYPE(loNou) + IF VARTYPE(loNou) <> 'O' + DO Assert WITH .F., "Createobject frm_facturare_articole2" + ELSE + poDate.eProforma = 1 + loNou.clb_fdoc.cboFdoc.Value = "FACTURA" + DO AfLog WITH "DIAG D: proprietati setate (eProforma=1, cboFdoc.Value=FACTURA)" + + lcValoare = loNou.clb_fdoc.cboFdoc.Value + lcValoareUpper = UPPER(lcValoare) + lnReccount = RECCOUNT('crsfactura') + lnEProforma = poDate.eProforma + llConditie = (lnEProforma = 1 AND lcValoareUpper <> "PROFORMA" AND lnReccount > 0) + + DO AfLog WITH "DIAG D: cboFdoc.Value=[" + lcValoare + "] (lungime=" + TRANSFORM(LEN(lcValoare)) + ")" + DO AfLog WITH "DIAG D: UPPER(cboFdoc.Value)=[" + lcValoareUpper + "]" + DO AfLog WITH "DIAG D: poDate.eProforma=" + TRANSFORM(lnEProforma) + DO AfLog WITH "DIAG D: Reccount('crsfactura')=" + TRANSFORM(lnReccount) + DO AfLog WITH "DIAG D: CONDITIA GARDEI (eProforma=1 AND Upper(Value)<>PROFORMA AND Reccount>0) = " + TRANSFORM(llConditie) + IF llConditie + DO AfLog WITH "DIAG D: VERDICT: garda S-AR FI DECLANSAT (blocheaza) - do_schimba_tipdoc ar fi intrat pe ramura sigura" + ELSE + DO AfLog WITH "DIAG D: VERDICT: garda NU s-ar fi declansat - do_schimba_tipdoc ar fi CAZUT PRIN ea, spre alege_tipdoc/schimba_tipdoc" + ENDIF + + * nu se cheama do_schimba_tipdoc() - experimentul D se opreste aici, deliberat + loNou.Release() + DO AfLog WITH "DIAG D: loNou.Release() OK" + ENDIF + RELEASE loNou + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(5) + DO AfLog WITH "DIAG D: dezaloca_numar OK" + ENDIF + DO AfLog WITH "DIAG D: TestD_OperandGarda TERMINAT" +ENDPROC + +PROCEDURE TestGardaBlocheaza + LOCAL loNou + gcCaz = "[M3 garda blocheaza PROFORMA->FACTURA cu linii] " + DO AfLog WITH "DIAG: intrat in TestGardaBlocheaza" + + SELECT crsfactura + ZAP + APPEND BLANK + REPLACE denumire WITH "art1" + + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 27002, 1) + poDate.nIdTipDoc = 5 && FACTURA la instantiere - are plaje, sigur + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(5) + DO AfLog WITH "DIAG: TestGardaBlocheaza - creeaza_cursor_serii(5) OK, rezultat=" + TRANSFORM(poDate.rezultat_serii) + + loNou = CREATEOBJECT('frm_facturare_articole2') + DO AfLog WITH "DIAG: TestGardaBlocheaza - Createobject frm_facturare_articole2 OK" + IF VARTYPE(loNou) <> 'O' + DO Assert WITH .F., "Createobject frm_facturare_articole2" + ELSE + * eProforma setat DIRECT dupa instantiere - nu prin nIdTipDoc, nu comuta efectiv tipul + poDate.eProforma = 1 + loNou.clb_fdoc.cboFdoc.Value = "FACTURA" + gcMockUltimMesaj = "" + + * FUNCTION amessagebox locala (mai jos in acest .prg) NU protejeaza acest apel - experimentul F + * a demonstrat ca precedenta unei functii definite in .prg-ul curent NU se mosteneste in + * interiorul unei metode compilate separat (aici: do_schimba_tipdoc, metoda din ofacturare.vcx). + * Reincarcarea mock_amessagebox.prg chiar inainte de apel (fara nicio proba prin executie - + * SET PROCEDURE nu executa nimic, deci nu are cum sa deschida un dialog) e mecanismul corect + * pentru un apel facut din interiorul unei metode de clasa. + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE + loNou.do_schimba_tipdoc() + DO AfLog WITH "DIAG: TestGardaBlocheaza - do_schimba_tipdoc() OK" + + DO Assert WITH poDate.nIdTipDoc == 5, "poDate.nIdTipDoc neschimbat, ramas=" + TRANSFORM(poDate.nIdTipDoc) + DO Assert WITH "Stergeti articolele" $ gcMockUltimMesaj, "mesajul de refuz s-a declansat, primit=[" + gcMockUltimMesaj + "]" + DO Assert WITH UPPER(loNou.clb_fdoc.cboFdoc.Value) == "PROFORMA", "cboFdoc.Value readus pe PROFORMA, e=" + TRANSFORM(loNou.clb_fdoc.cboFdoc.Value) + + loNou.Release() + DO AfLog WITH "DIAG: TestGardaBlocheaza - loNou.Release() OK" + ENDIF + RELEASE loNou + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(5) + DO AfLog WITH "DIAG: TestGardaBlocheaza - dezaloca_numar OK" + ENDIF + DO AfLog WITH "DIAG: TestGardaBlocheaza TERMINAT" +ENDPROC + +PROCEDURE TestGardaFaraLinii + LOCAL loNou + gcCaz = "[M3 garda nu blocheaza fara linii, tinta FACTURA] " + DO AfLog WITH "DIAG: intrat in TestGardaFaraLinii" + + IF !glFacturaAreplaje + DO AfLog WITH "SARIT - " + gcCaz + "nu exista plaje de serii pentru tipul FACTURA in acest mediu" + gnSarit = gnSarit + 1 + RETURN + ENDIF + + SELECT crsfactura + ZAP + + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 27003, 1) + poDate.nIdTipDoc = 5 && FACTURA la instantiere + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(5) + DO AfLog WITH "DIAG: TestGardaFaraLinii - creeaza_cursor_serii(5) OK, rezultat=" + TRANSFORM(poDate.rezultat_serii) + + loNou = CREATEOBJECT('frm_facturare_articole2') + DO AfLog WITH "DIAG: TestGardaFaraLinii - Createobject frm_facturare_articole2 OK" + IF VARTYPE(loNou) <> 'O' + DO Assert WITH .F., "Createobject frm_facturare_articole2" + ELSE + * eProforma fortat direct la 1, dar tinta ramane FACTURA (are plaje) si crsfactura e gol + poDate.eProforma = 1 + loNou.clb_fdoc.cboFdoc.Value = "FACTURA" + gcMockUltimMesaj = "" + + * vezi TestGardaBlocheaza - reincarcare inainte de apel, mecanismul corect pentru un apel + * facut din interiorul unei metode de clasa (experimentul F) + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE + loNou.do_schimba_tipdoc() + DO AfLog WITH "DIAG: TestGardaFaraLinii - do_schimba_tipdoc() OK" + + DO Assert WITH !("Stergeti articolele" $ gcMockUltimMesaj), "fara dialog de refuz cand crsfactura e gol, primit=[" + gcMockUltimMesaj + "]" + + loNou.Release() + DO AfLog WITH "DIAG: TestGardaFaraLinii - loNou.Release() OK" + ENDIF + RELEASE loNou + IF poDate.rezultat_serii <> 0 + poGeneratorNumere.dezaloca_numar(5) + DO AfLog WITH "DIAG: TestGardaFaraLinii - dezaloca_numar OK" + ENDIF + DO AfLog WITH "DIAG: TestGardaFaraLinii TERMINAT" +ENDPROC + +PROCEDURE TestGardaSensLiber + LOCAL loNou, llConditieGarda + gcCaz = "[M3 sensul liber FACTURA->PROFORMA cu linii] " + + * Nesigur de rulat: ar comuta efectiv catre PROFORMA, ceea ce ar cere plaje de serii pentru + * tipul de document 23 - PROFORMA, absente in MARIUSM_AUTO (confirmat de sonda de mai sus). + * Nu se cheama do_schimba_tipdoc() aici. Se evalueaza static conditia gardei: cu eProforma=0 + * (pornind ca FACTURA) garda nu trebuie sa opreasca trecerea, indiferent daca exista linii. + DO AfLog WITH "SARIT (rulare reala) - " + gcCaz + "nu exista plaje de serii pentru tipul PROFORMA in acest mediu; se evalueaza static conditia gardei" + gnSarit = gnSarit + 1 + + SELECT crsfactura + ZAP + APPEND BLANK + REPLACE denumire WITH "art1" + APPEND BLANK + REPLACE denumire WITH "art2" + + poDate = NULL + poDate = CREATEOBJECT("oDateFactura", 27004, 1) + poDate.nIdTipDoc = 5 && FACTURA + + loNou = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loNou) <> 'O' + DO Assert WITH .F., "Createobject frm_facturare_articole2" + ELSE + DO Assert WITH poDate.eProforma == 0, "precontitie eProforma=0 dupa nIdTipDoc=5" + loNou.clb_fdoc.cboFdoc.Value = "PROFORMA" + + * conditia gardei din do_schimba_tipdoc (ofacturare.vc2) evaluata direct, fara sa se cheme metoda + llConditieGarda = (poDate.eProforma = 1 AND UPPER(loNou.clb_fdoc.cboFdoc.Value) <> "PROFORMA" AND RECCOUNT('crsfactura') > 0) + DO Assert WITH !llConditieGarda, "conditia gardei e falsa cand eProforma=0 (sensul liber FACTURA->PROFORMA nu e blocat)" + + loNou.Release() + ENDIF + RELEASE loNou +ENDPROC + +* cate randuri de plaja intoarce verifica_cursor_serii pentru un tip de document, fara sa aloce +FUNCTION RanduriSerii + LPARAMETERS tnIdTipDoc + LOCAL lnOk, lnRanduri, lcSql + LOCAL ARRAY laErr[1] + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lnRanduri = -1 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobapl") + IF lnOk > 0 + lnRanduri = RECCOUNT("crsprobapl") + USE IN (SELECT("crsprobapl")) + ELSE + AERROR(laErr) + DO AfLog WITH "pre-proba plaje tip " + TRANSFORM(tnIdTipDoc) + " ESEC: " + TRANSFORM(laErr[2]) + ENDIF + RETURN lnRanduri +ENDFUNC + +* FUNCTION amessagebox definita AICI, in .prg-ul care se executa acum - confirmat experimental +* (experimentul A, docs\raport_s5b_implementare.md) ca o procedura/functie din PRG-ul curent are +* precedenta NECONDITIONATA fata de orice SET PROCEDURE ... ADDITIVE, deci apelul nu poate rezolva +* niciodata catre amessagebox() real din COMUN\programe\oproceduri_comune.prg. Corp copiat identic +* din mock_amessagebox.prg (aceeasi semantica: gcMockUltimMesaj/gnMockUltimTip pentru asertii pe +* textul dialogului, gnMockRaspuns/gnMockRaspunsTotal pentru raspunsuri configurabile per caz). +FUNCTION amessagebox + LPARAMETERS tcMessage, tnDialogBoxType, tcTitle, tcFont, tnTimeOut, tnTimeoutValue + LOCAL lnRaspuns + IF TYPE('gnMockRaspunsTotal') = 'N' AND 'Actualizati totalul facturii' $ tcMessage + lnRaspuns = gnMockRaspunsTotal + ELSE + lnRaspuns = IIF(TYPE('gnMockRaspuns') = 'N', gnMockRaspuns, 6) + ENDIF + IF TYPE('gcMockUltimMesaj') = 'C' + gcMockUltimMesaj = TRANSFORM(tcMessage) + gnMockUltimTip = IIF(TYPE('tnDialogBoxType') = 'N', tnDialogBoxType, 0) + ENDIF + RETURN lnRaspuns +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s5c_emitere_reala_ui.prg b/utile/Teste/facturare_unificat/test_s5c_emitere_reala_ui.prg new file mode 100644 index 0000000..1fca809 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5c_emitere_reala_ui.prg @@ -0,0 +1,1151 @@ +* test_s5c_emitere_reala_ui.prg +* S5c, proba CAPAT-LA-CAPAT pe flux real (pasii C0-C10 din docs\propunere_s5c_factura_din_proforma.md +* par. 5.3): dintr-o proforma EMISA se genereaza o factura reala prin frm_facturare_articole2, si se +* verifica in Oracle cele patru clauze din "Gata cand" - numar nou, gestiune descarcata ca la un +* document necopiat, rand TIP = 4 in VANZARI_CORESP catre proforma sursa, proforma nemarcata FACTURAT. +* +* C0 - sonda plaje (tipdoc 5 FACTURA, 6 AVIZ, 23 PROFORMA) si sonda cursor_preturi pe tip 1 / 22 +* C0b - sonda note de verificat (daca > 0, "Do Form verificare" s-ar deschide; e ocolit prin stub) +* C1 - emitere PROFORMA reala (nIdTipDoc = 23 -> eProforma = 1 prin nIdTipDoc_Assign) +* C2 - semnalul de copiere: completeaza_setari_document(, .T.) pe poDate nou +* C3 - liniile documentului copiat, pe CALEA VIE a formularului v2: do_adauga_articol_cautat +* (cautare in grid), nu do_adauga_tot - cod mort pe v2, fara niciun caction si fara apelant +* C4 - do_scrie_factura() -> .T., poDate.nid_vanzare = id nou +* C5 - VANZARI: eproforma = 0 si numar_act diferit de al proformei +* C6 - VANZARI_CORESP: exact un rand sters=0, tip=4, fact=, aviz= +* C7 - VANZARI.FACTURAT pe proforma: 0/NULL, neschimbat fata de starea dinainte +* C8 - VANZARI_CANTITATI pe liniile proformei: 0 randuri +* C9 - gestiunea: profilul VANZARI_DETALII al facturii din proforma == cel al documentului de +* control de la C10 (paritate; cu gnScadereStoc = 0 nu se poate cere id_gestiune > 0 fara +* dialoguri modale per linie - vezi raportul) +* C10 - neregresie: al doilea document emis in aceeasi sesiune, pe ACELASI poDate dupa Reset(1) +* (exact bucla din factureaza, ofacturare.prg:428-441), NU primeste legatura TIP = 4 +* +* CONSUMA NUMERE DE DOCUMENT REALE in MARIUSM_AUTO: o proforma + doua documente. Nimic nu se sterge. +* +* Mediu, capcane deja platite: +* - stub_verificare PRIMUL in SET PATH (plain, nu ADDITIVE), ca "Do Form verificare" sa nu fie modal; +* - crsfactura are nevoie de coloana "gestiune" (grd_factura.cGestiune e legat la ea, iar +* creeaza_facturacrs nu o are) - fara ea frm_facturare_articole2 agata la CREATEOBJECT; +* - gnIdUtil = 8 INAINTE de creeaza_cursor_serii (seriile sunt pe utilizator); +* - gnIdSucursala ramane cel dat de mediu (NULL): plaja de proforma ID_PLAJA=67 are ID_SUCURSALA +* NULL, iar fortarea sucursalei 167 ar aduce si plaja 54 -> doua plaje -> dialog de alegere; +* - gnScadereStoc = 0, altfel apar dialoguri modale per linie; +* - mock_amessagebox incarcat cu SET PROCEDURE ADDITIVE si REINCARCAT chiar inainte de fiecare apel +* riscant (o FUNCTION definita in acest .prg NU castiga pentru apelurile din metodele .vcx); +* - driver pe Timer pentru MESSAGEBOX_FORM (formular modal propriu, neacoperit de mock). +* +* Rulare: powershell -ExecutionPolicy Bypass -File test_s5c_emitere_reala_ui.ps1 +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_emitere_reala_ui.log +* (mirror pentru harness: ...\facturare_unificat\test_s5c_emitere_reala_ui_log.txt) + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +SET MULTILOCKS ON +CLOSE DATABASES + +PUBLIC gcLog, gcUILog, gcSyncDir, gnPass, gnFail, gnSarit, gcCaz +PUBLIC gcDir +gcDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\" +gcLog = gcDir + "out\test_s5c_emitere_reala_ui.log" +gcUILog = gcDir + "test_s5c_emitere_reala_ui_log.txt" +gcSyncDir = gcDir + "uisync_s5c\" +IF !DIRECTORY(gcDir + "out") + MD (gcDir + "out") +ENDIF +IF !DIRECTORY(gcSyncDir) + MD (gcSyncDir) +ENDIF +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog) +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) +gnPass = 0 +gnFail = 0 +gnSarit = 0 +gcCaz = "" + +* rezultate intermediare, vizibile in toate procedurile +PUBLIC gnIdProf, gnNrProf, gcSerieProf, gnIdFact, gnNrFact, gnIdCtrl +PUBLIC gnTipDoc, gnIdTipDocFact, glProformaEmisa, gnFacturatInainte, gdZiCurs, glPlajaProforma +PUBLIC gcStrategieLinii +gcStrategieLinii = '' +gnIdProf = 0 +gnNrProf = 0 +gcSerieProf = "" +gnIdFact = 0 +gnNrFact = 0 +gnIdCtrl = 0 +gnTipDoc = 0 +gnIdTipDocFact = 5 +glProformaEmisa = .F. +glPlajaProforma = .F. +gnFacturatInainte = -1 +gdZiCurs = {} + +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + *-- stub_verificare PRIMUL (SET PATH plain): test_init_env_auto_roafacturare face SET PATH ADDITIVE, + *-- care adauga DUPA, deci stubul pastreaza prioritatea fata de COMUN\FERESTRE + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + + 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 + SQLSETPROP(gnHandle, "QueryTimeOut", 60) + IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle + SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 60) + ENDIF + + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + SET CLASSLIB TO gridextras.vcx ADDITIVE + SET CLASSLIB TO _cb_base.vcx ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE + *-- mock ULTIMUL: la nume duplicat castiga fisierul de proceduri deschis cel mai recent + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE + + PUBLIC gcMockUltimMesaj, gnMockUltimTip + gcMockUltimMesaj = "" + gnMockUltimTip = 0 + + *-- gnButon / pnButon sunt publice in aplicatia reala; driverul pe Timer si do_scrie_factura + *-- trebuie sa scrie in aceeasi variabila, nu in cate un private de scop + IF TYPE('gnButon') = 'U' + PUBLIC gnButon + ENDIF + IF TYPE('pnButon') = 'U' + PUBLIC pnButon + ENDIF + gnButon = 1 + pnButon = 1 + + IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final + ENDIF + gnScadereStoc = 0 + gnModTotFact = 0 + gnFactSeturi = 0 + gnListareAvizBonFiscal = 0 + gnid_part_casa = 0 + *-- cu gnIdSucursala NULL, cursor_preturi intoarce un articol fara cota de TVA si emiterea + *-- moare cu "Nu a fost gasita cota de TVA! (FACT-013)". 167 e sucursala cu date complete. + gnIdSucursala = 167 + goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]) + gnIdUtil = 8 + goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) + DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) + " gcS=" + TRANSFORM(gcS) + ; + " gnLuna=" + TRANSFORM(gnLuna) + " gnAn=" + TRANSFORM(gnAn) + ; + " gnIdSucursala=" + TRANSFORM(gnIdSucursala) + " gnScadereStoc=" + TRANSFORM(gnScadereStoc) + + *-- driver pe Timer pentru formularele modale proprii (MESSAGEBOX_FORM), neacoperite de mock + PUBLIC goDrv5c + goDrv5c = CREATEOBJECT('driverModal5c') + _SCREEN.AddObject('tmrDrv5c', 'Timer') + _SCREEN.tmrDrv5c.Interval = 200 + BINDEVENT(_SCREEN.tmrDrv5c, 'Timer', goDrv5c, 'Executa') + _SCREEN.tmrDrv5c.Enabled = .T. + _SCREEN.Caption = 'S5c - factura din proforma (proba capat-la-capat)' + + PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest + poDate = NULL + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + + gdZiCurs = DataCursValid() + DO AfLog WITH "zi_curs folosita pentru toate documentele: " + DTOC(gdZiCurs) + + DO TestC0_Sonde + DO HarnessStep WITH 0, 'env_gata', 20 + + DO TestC1_EmiteProforma + DO HarnessStep WITH 1, 'proforma_emisa', 20 + + DO TestC2C4_FacturaDinProforma + DO HarnessStep WITH 2, 'factura_emisa', 20 + + DO TestC5C8_VerificariOracle + + DO TestC10_Neregresie + DO HarnessStep WITH 3, 'neregresie_emis', 20 + + DO TestC9_ParitateGestiune + + IF TYPE('_SCREEN.tmrDrv5c') = 'O' + _SCREEN.tmrDrv5c.Enabled = .F. + ENDIF + DO Final + +CATCH TO loExcTop + DO AfLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExcTop.ErrorNo) + ' Message=' + loExcTop.Message + ; + ' Proc=' + loExcTop.Procedure + ' Line=' + TRANSFORM(loExcTop.LineNo) + ' [' + loExcTop.LineContents + ']' + TRY + IF TYPE('poDate') = 'O' AND !ISNULL(poDate) AND NVL(poDate.nid_vanzare, 0) >= 9999999999 + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO AfLog WITH 'numar dezalocat dupa abandon' + ENDIF + CATCH TO loExcDez + DO AfLog WITH 'dezalocare esuata: ' + loExcDez.Message + ENDTRY + DO Final +ENDTRY + +QUIT + +*================================================================================== +* C0 - sondele de mediu: plaje de serii si disponibilitatea articolelor pe tip +*================================================================================== +PROCEDURE TestC0_Sonde + LOCAL lnR5, lnR6, lnR23, lnArt1, lnArt22, lnNote + gcCaz = "[C0 sonde mediu] " + + gnIdUtil = 8 + lnR5 = RanduriSerii(5) + lnR6 = RanduriSerii(6) + lnR23 = RanduriSerii(23) + DO AfLog WITH "C0 plaje: tipdoc 5(FACTURA)=" + TRANSFORM(lnR5) + " tipdoc 6(AVIZ)=" + TRANSFORM(lnR6) + ; + " tipdoc 23(PROFORMA)=" + TRANSFORM(lnR23) + + glPlajaProforma = (lnR23 = 1) + IF !glPlajaProforma + DO Sarit WITH "C0: tipdoc 23 (PROFORMA) are " + TRANSFORM(lnR23) + " plaje (nu exact una) - C1 nu se ruleaza" + ENDIF + IF lnR5 <= 0 AND lnR6 <= 0 + DO Sarit WITH "C0: nu exista plaje nici pentru tipdoc 5, nici pentru 6 - documentul copiat nu se poate numerota" + ENDIF + + *-- ce tip de operatie are articole reale in acest mediu; tip 1 (factura din lista de preturi) + *-- da nIdTipDoc = 5 FACTURA, tip 22 (aviz din lista de preturi) da nIdTipDoc = 6 AVIZ + lnArt1 = ArticoleDisponibile(1) + lnArt22 = ArticoleDisponibile(22) + DO AfLog WITH "C0 cursor_preturi: tip 1 -> " + TRANSFORM(lnArt1) + " articole, tip 22 -> " + TRANSFORM(lnArt22) + " articole" + + DO CASE + CASE lnArt1 > 0 AND lnR5 > 0 + gnTipDoc = 1 + gnIdTipDocFact = 5 + CASE lnArt22 > 0 AND lnR6 > 0 + gnTipDoc = 22 + gnIdTipDocFact = 6 + OTHERWISE + gnTipDoc = 0 + ENDCASE + DO AfLog WITH "C0 ales: tip operatie=" + TRANSFORM(gnTipDoc) + " nIdTipDoc document copiat=" + TRANSFORM(gnIdTipDocFact) + ; + IIF(gnTipDoc = 22, " (AVIZ, nu FACTURA - tip 1 nu are articole in acest mediu)", "") + DO Assert WITH gnTipDoc > 0, "exista un tip de operatie cu articole reale si plaja de numere" + + *-- C0b: note de verificat pe firma de test. Traseul e oricum liber (stub_verificare), dar + *-- se consemneaza pentru raport. + lnNote = -1 + TRY + lnNote = QNum([select nvl(pack_contafin.verifica_note_contabile(1),0) as n from dual], 'n') + CATCH TO loExcN + DO AfLog WITH "C0b: verifica_note_contabile a esuat (" + loExcN.Message + ")" + ENDTRY + DO AfLog WITH "C0b note de verificat = " + TRANSFORM(lnNote) + ; + IIF(lnNote > 0, " -> in productie s-ar deschide Do Form verificare (aici: stub_verificare)", " -> traseu liber") +ENDPROC + +*================================================================================== +* C1 - emiterea unei proforme reale +*================================================================================== +PROCEDURE TestC1_EmiteProforma + LOCAL lnScris + gcCaz = "[C1 emitere proforma] " + IF gnTipDoc = 0 + DO Sarit WITH "C1 sarit: nu exista tip de operatie utilizabil" + RETURN + ENDIF + IF !glPlajaProforma + DO Sarit WITH "C1 sarit: plajele de proforma nu permit emiterea fara dialog de alegere a seriei" + RETURN + ENDIF + + IF !PregatesteDocument(gnTipDoc, 23) + DO Sarit WITH "C1 sarit: pregatirea documentului proforma a esuat (vezi liniile de mai sus)" + RETURN + ENDIF + DO Assert WITH poDate.eProforma = 1, "poDate.eProforma = 1 dupa nIdTipDoc = 23 (proprietate derivata), e=" + TRANSFORM(poDate.eProforma) + + lnScris = ScrieDocument("C1 proforma") + IF !lnScris + DO Sarit WITH "C1 sarit: proforma nu s-a scris - restul probei foloseste o proforma existenta" + DO CurataDocument + RETURN + ENDIF + + gnIdProf = NVL(poDate.nid_vanzare, 0) + gnNrProf = NVL(poDate.nract, 0) + gcSerieProf = ALLTRIM(NVL(poDate.serie_act, '')) + glProformaEmisa = .T. + DO AfLog WITH "C1 PROFORMA emisa: id_vanzare=" + TRANSFORM(gnIdProf) + " serie=[" + gcSerieProf + "] numar=" + TRANSFORM(gnNrProf) + DO Assert WITH gnIdProf > 0, "proforma are id_vanzare real (" + TRANSFORM(gnIdProf) + ")" + DO Assert WITH QNum([select nvl(eproforma,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n') = 1, ; + "VANZARI.EPROFORMA = 1 pe documentul scris" + + DO CurataDocument +ENDPROC + +*================================================================================== +* C2-C4 - copierea proformei si emiterea documentului real +*================================================================================== +PROCEDURE TestC2C4_FacturaDinProforma + LOCAL loSursa, lnScris + gcCaz = "[C2 semnal copiere] " + + IF gnIdProf <= 0 + *-- fallback: o proforma deja emisa in MARIUSM_AUTO (C1 sarit). Se cere sa aiba linii, ca sa + *-- fie o sursa reala de copiere, si sa nu fie inca facturata. + gnIdProf = QNum([select nvl(max(v.id_vanzare),0) as n from vanzari v where v.sters = 0 ] + ; + [and nvl(v.eproforma,0) = 1 and nvl(v.facturat,0) = 0 ] + ; + [and exists (select 1 from vanzari_detalii d where d.id_vanzare = v.id_vanzare)], 'n') + IF gnIdProf <= 0 + gnIdProf = QNum([select nvl(max(id_vanzare),0) as n from vanzari where sters = 0 ] + ; + [and nvl(eproforma,0) = 1 and nvl(facturat,0) = 0], 'n') + ENDIF + IF gnIdProf <= 0 + gnIdProf = QNum([select nvl(max(id_vanzare),0) as n from vanzari where sters = 0 and nvl(eproforma,0) = 1], 'n') + ENDIF + IF gnIdProf <= 0 + DO Sarit WITH "C2-C4 sarit: nu exista nicio proforma in schema" + RETURN + ENDIF + gnNrProf = QNum([select nvl(numar_act,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n') + DO AfLog WITH "C2 sursa = proforma EXISTENTA id_vanzare=" + TRANSFORM(gnIdProf) + " numar=" + TRANSFORM(gnNrProf) + ; + " tip=" + TRANSFORM(QNum([select nvl(tip,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n')) + ; + " linii=" + TRANSFORM(QNum([select count(*) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdProf), 'n')) + ; + " linii cu gestiune=" + TRANSFORM(QNum([select count(*) as n from vanzari_detalii where nvl(id_gestiune,0) > 0 ] + ; + [and id_vanzare = ] + TRANSFORM(gnIdProf), 'n')) + ENDIF + + gnFacturatInainte = QNum([select nvl(facturat,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n') + DO AfLog WITH "C2 VANZARI.FACTURAT pe proforma, INAINTE = " + TRANSFORM(gnFacturatInainte) + + loSursa = SursaProforma(gnIdProf) + IF ISNULL(loSursa) + DO Sarit WITH "C2-C4 sarit: nu s-a putut citi randul proformei din VANZARI" + RETURN + ENDIF + + IF !PregatesteDocument(gnTipDoc, gnIdTipDocFact, loSursa) + DO Sarit WITH "C2-C4 sarit: pregatirea documentului copiat a esuat" + RETURN + ENDIF + + DO Assert WITH poDate.lProformaSursa = .T., "poDate.lProformaSursa = .T. dupa completeaza_setari_document(sursa, .T.)" + DO Assert WITH poDate.nIdProformaSursa = gnIdProf, "poDate.nIdProformaSursa = " + TRANSFORM(gnIdProf) + ", e=" + TRANSFORM(poDate.nIdProformaSursa) + DO Assert WITH poDate.eProforma = 0, "documentul copiat NU e proforma (eProforma=0), e=" + TRANSFORM(poDate.eProforma) + + gcCaz = "[C3 articole] " + DO Assert WITH RECCOUNT('crsfactura') > 0, "do_adauga_articol_cautat a produs linii in crsfactura (" + TRANSFORM(RECCOUNT('crsfactura')) + ")" + *-- proba directa a lui FACT-013 pe calea vie: cota se deriva din proc_tvav in do_adauga_articol_cautat + DO Assert WITH LiniiCu('id_jtva_coloana > 0') = RECCOUNT('crsfactura'), ; + "toate liniile au id_jtva_coloana > 0 (fara FACT-013), linii cu cota=" + TRANSFORM(LiniiCu('id_jtva_coloana > 0')) + ; + " din " + TRANSFORM(RECCOUNT('crsfactura')) + DO Assert WITH LiniiCu('cantitate > 0') = RECCOUNT('crsfactura'), ; + "toate liniile au cantitate > 0 dupa tastarea in grid, linii=" + TRANSFORM(LiniiCu('cantitate > 0')) + + gcCaz = "[C4 do_scrie_factura] " + lnScris = ScrieDocument("C4 factura din proforma") + DO Assert WITH lnScris, "do_scrie_factura() a intors .T." + IF lnScris + gnIdFact = NVL(poDate.nid_vanzare, 0) + gnNrFact = NVL(poDate.nract, 0) + DO AfLog WITH "C4 document emis: id_vanzare=" + TRANSFORM(gnIdFact) + " serie=[" + ALLTRIM(NVL(poDate.serie_act,'')) + ; + "] numar=" + TRANSFORM(gnNrFact) + DO Assert WITH gnIdFact > 0 AND gnIdFact < 9999999999, "poDate.nid_vanzare e id real (" + TRANSFORM(gnIdFact) + ")" + ENDIF + + *-- formularul si cursoarele se elibereaza, dar poDate RAMANE - C10 il refoloseste, ca bucla din factureaza + DO CurataFormular +ENDPROC + +*================================================================================== +* C5-C8 - verificarile in Oracle +*================================================================================== +PROCEDURE TestC5C8_VerificariOracle + LOCAL lnEpro, lnNr, lnCoresp, lnFact, lnCant, lnSumaCant + IF gnIdFact <= 0 + gcCaz = "[C5-C8] " + DO Sarit WITH "C5-C8 sarite: documentul din proforma nu s-a scris" + RETURN + ENDIF + + gcCaz = "[C5 numar nou] " + lnEpro = QNum([select nvl(eproforma,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdFact), 'n') + lnNr = QNum([select nvl(numar_act,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdFact), 'n') + DO AfLog WITH "C5 VANZARI(" + TRANSFORM(gnIdFact) + "): eproforma=" + TRANSFORM(lnEpro) + " numar_act=" + TRANSFORM(lnNr) + ; + " (proforma avea numar_act=" + TRANSFORM(gnNrProf) + ")" + DO Assert WITH lnEpro = 0, "documentul emis NU e proforma (VANZARI.EPROFORMA = 0)" + DO Assert WITH lnNr > 0 AND lnNr <> gnNrProf, "documentul are numar propriu, diferit de al proformei" + + gcCaz = "[C6 legatura TIP = 4] " + lnCoresp = QNum([select count(*) as n from vanzari_coresp where sters = 0 and tip = 4 and id_vanzare_fact = ] + ; + TRANSFORM(gnIdFact) + [ and id_vanzare_aviz = ] + TRANSFORM(gnIdProf), 'n') + DO AfLog WITH "C6 VANZARI_CORESP sters=0 tip=4 fact=" + TRANSFORM(gnIdFact) + " aviz=" + TRANSFORM(gnIdProf) + " -> " + TRANSFORM(lnCoresp) + DO Assert WITH lnCoresp = 1, "exact un rand TIP = 4 catre proforma sursa" + + gcCaz = "[C7 proforma nemarcata FACTURAT] " + lnFact = QNum([select nvl(facturat,0) as n from vanzari where id_vanzare = ] + TRANSFORM(gnIdProf), 'n') + DO AfLog WITH "C7 VANZARI.FACTURAT pe proforma, DUPA = " + TRANSFORM(lnFact) + " (inainte " + TRANSFORM(gnFacturatInainte) + ")" + IF glProformaEmisa + DO Assert WITH lnFact = 0, "proforma NU e marcata FACTURAT (0 sau NULL)" + ELSE + DO AfLog WITH "C7 informativ: proforma imprumutata avea deja FACTURAT=" + TRANSFORM(gnFacturatInainte) + ENDIF + DO Assert WITH lnFact = gnFacturatInainte, "FACTURAT neschimbat de emiterea facturii" + + gcCaz = "[C8 proforma nu misca stocul] " + lnCant = QNum([select count(*) as n from vanzari_cantitati vc, vanzari_detalii vd ] + ; + [where vc.id_vanzare_det = vd.id_vanzare_det and vd.id_vanzare = ] + TRANSFORM(gnIdProf), 'n') + DO AfLog WITH "C8 VANZARI_CANTITATI pe liniile proformei -> " + TRANSFORM(lnCant) + IF glProformaEmisa + DO Assert WITH lnCant = 0, "proforma nu are randuri in VANZARI_CANTITATI" + ELSE + DO AfLog WITH "C8 informativ (proforma nu a fost emisa de acest test)" + ENDIF + + lnSumaCant = QNum([select nvl(sum(cantitate),0) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdFact), 'n') + DO AfLog WITH "C9a VANZARI_DETALII pe documentul emis: sum(cantitate) = " + TRANSFORM(lnSumaCant) + DO Assert WITH lnSumaCant > 0, "documentul emis are linii cu cantitate > 0" +ENDPROC + +*================================================================================== +* C10 - al doilea document in aceeasi sesiune, pe ACELASI poDate dupa Reset(1) +*================================================================================== +PROCEDURE TestC10_Neregresie + LOCAL lnScris, lnCoresp + gcCaz = "[C10 neregresie semnal] " + IF gnIdFact <= 0 + DO Sarit WITH "C10 sarit: documentul din proforma nu s-a scris" + RETURN + ENDIF + IF TYPE('poDate') <> 'O' OR ISNULL(poDate) + DO Sarit WITH "C10 sarit: poDate nu mai exista" + RETURN + ENDIF + + *-- exact ce face bucla din factureaza (ofacturare.prg:428-441) la raspuns DA + poDate.Reset(1) + poDateGestiuneDest.Reset() + DO Assert WITH poDate.lProformaSursa = .F., "dupa Reset(1) lProformaSursa = .F., e=" + TRANSFORM(poDate.lProformaSursa) + DO Assert WITH poDate.nIdProformaSursa = 0, "dupa Reset(1) nIdProformaSursa = 0, e=" + TRANSFORM(poDate.nIdProformaSursa) + + IF !PregatesteDocument(gnTipDoc, gnIdTipDocFact, NULL, .T.) + DO Sarit WITH "C10 sarit: pregatirea documentului de control a esuat" + RETURN + ENDIF + + lnScris = ScrieDocument("C10 document de control") + IF !lnScris + DO Sarit WITH "C10 sarit: documentul de control nu s-a scris" + DO CurataDocument + RETURN + ENDIF + gnIdCtrl = NVL(poDate.nid_vanzare, 0) + DO AfLog WITH "C10 document de control emis: id_vanzare=" + TRANSFORM(gnIdCtrl) + " numar=" + TRANSFORM(NVL(poDate.nract,0)) + + lnCoresp = QNum([select count(*) as n from vanzari_coresp where tip = 4 and id_vanzare_fact = ] + TRANSFORM(gnIdCtrl), 'n') + DO AfLog WITH "C10 VANZARI_CORESP tip=4 fact=" + TRANSFORM(gnIdCtrl) + " -> " + TRANSFORM(lnCoresp) + DO Assert WITH lnCoresp = 0, "al doilea document NU primeste legatura TIP = 4 (semnalul e curatat de Reset)" + + DO CurataDocument +ENDPROC + +*================================================================================== +* C9 - paritatea profilului de gestiune intre documentul din proforma si cel de control +*================================================================================== +PROCEDURE TestC9_ParitateGestiune + LOCAL lnL1, lnL2, lnG1, lnG2, lnC1, lnC2 + gcCaz = "[C9 gestiune, paritate] " + IF gnIdFact <= 0 OR gnIdCtrl <= 0 + DO Sarit WITH "C9 sarit: lipseste unul dintre cele doua documente comparate" + RETURN + ENDIF + lnL1 = QNum([select count(*) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdFact), 'n') + lnL2 = QNum([select count(*) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdCtrl), 'n') + lnG1 = QNum([select count(*) as n from vanzari_detalii where nvl(id_gestiune,0) > 0 and id_vanzare = ] + TRANSFORM(gnIdFact), 'n') + lnG2 = QNum([select count(*) as n from vanzari_detalii where nvl(id_gestiune,0) > 0 and id_vanzare = ] + TRANSFORM(gnIdCtrl), 'n') + lnC1 = QNum([select nvl(sum(cantitate),0) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdFact), 'n') + lnC2 = QNum([select nvl(sum(cantitate),0) as n from vanzari_detalii where id_vanzare = ] + TRANSFORM(gnIdCtrl), 'n') + DO AfLog WITH "C9 din proforma (" + TRANSFORM(gnIdFact) + "): linii=" + TRANSFORM(lnL1) + " cu id_gestiune=" + TRANSFORM(lnG1) + ; + " sum(cantitate)=" + TRANSFORM(lnC1) + DO AfLog WITH "C9 de control (" + TRANSFORM(gnIdCtrl) + "): linii=" + TRANSFORM(lnL2) + " cu id_gestiune=" + TRANSFORM(lnG2) + ; + " sum(cantitate)=" + TRANSFORM(lnC2) + DO Assert WITH lnL1 = lnL2, "acelasi numar de linii ca documentul necopiat" + DO Assert WITH lnG1 = lnG2, "acelasi numar de linii cu id_gestiune ca documentul necopiat" + DO Assert WITH ABS(lnC1 - lnC2) < 0.0005, "aceeasi cantitate totala ca documentul necopiat" +ENDPROC + +*================================================================================== +* Pregatirea unui document: poDate + serie/numar + articole + cursoare + formular +* toSursa <> NULL -> ramura de copiere din completeaza_setari_document +* tlRefolosestePoDate = .T. -> nu se creeaza poDate nou (C10, dupa Reset) +*================================================================================== +FUNCTION PregatesteDocument + LPARAMETERS tnTip, tnIdTipDoc, toSursa, tlRefolosestePoDate + LOCAL lnIdSet, lnArt, ldDoc, lnAdaugate + *-- frm_facturare_articole2.Init isi pune This.lCopiere din PARAMETRUL sau toFactura + *-- (ofacturare.vc2:20850 si :20915), iar factureaza il creeaza FARA parametru + *-- (ofacturare.prg:248) - deci pe v2 lCopiere ramane .F. si la copiere. Se reproduce identic. + lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10 + IF !tlRefolosestePoDate + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + ELSE + poDate.id_set = lnIdSet + poDate.Tip = tnTip + ENDIF + + poDate.nIdTipDoc = tnIdTipDoc + + IF TYPE('toSursa') = 'O' AND !ISNULL(toSursa) + poDate.completeaza_setari_document(toSursa, .T.) + *-- nIdTipDoc se pastreaza: completeaza_setari_document nu il atinge pe ramura de copiere + poDate.nIdTipDoc = tnIdTipDoc + ENDIF + + *-- la copiere clientul si delegatul vin din proforma; valorile de mai jos sunt doar plasa + IF EMPTY(NVL(poDate.id_client, 0)) + poDate.id_client = 463 + ENDIF + IF EMPTY(NVL(poDate.id_delegat, 0)) + poDate.id_delegat = 256 + ENDIF + + *-- documentul se dateaza in luna deschisa a mediului + IF MONTH(poDate.Data) <> gnLuna OR YEAR(poDate.Data) <> gnAn + ldDoc = DATE(gnAn, gnLuna, MIN(DAY(poDate.Data), 28)) + poDate.dataireg = ldDoc + poDate.dataact = ldDoc + poDate.datascad = ldDoc + 30 + DO AfLog WITH " document datat in luna deschisa: " + DTOC(ldDoc) + ENDIF + *-- cursor_preturi refuza o zi fara curs EURO ("Nu este setat cursul din data de ..."); + *-- se foloseste ultima zi acoperita de VCURS din luna deschisa + poDate.zi_curs = gdZiCurs + + *-- gnIdUtil = 8 INAINTE de creeaza_cursor_serii (seriile sunt pe utilizator) + gnIdUtil = 8 + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + DO AfLog WITH " creeaza_cursor_serii(" + TRANSFORM(poDate.nIdTipDoc) + ") -> rezultat_serii=" + TRANSFORM(poDate.rezultat_serii) + IF poDate.rezultat_serii = 3 + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + ENDIF + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + *-- gnIdUtil ramane 8: listele de preturi sunt pe utilizator, iar cu -3 cursor_preturi + *-- intoarce zero articole + DO AfLog WITH " serie_act=[" + TRANSFORM(NVL(poDate.serie_act,'')) + "] nract=" + TRANSFORM(NVL(poDate.nract,0)) + IF EMPTY(NVL(poDate.nract, 0)) + DO AfLog WITH " EROARE: nu s-a alocat numar de document" + RETURN .F. + ENDIF + + USE IN (SELECT('jtva_coloane')) + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + DO LogJtva + lnArt = IncarcaArticole() + IF lnArt <= 0 + DO AfLog WITH " EROARE: nu exista articole utilizabile" + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + RETURN .F. + ENDIF + DO AfLog WITH " crslinii5c Reccount=" + TRANSFORM(lnArt) + + *-- crsfactura are nevoie de coloana "gestiune" (grd_factura.cGestiune e legat la ea); fara ea + *-- frm_facturare_articole2 agata la CREATEOBJECT pe combo-ul coloanei + creeaza_facturacrs([crsfactura]) + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + IF poDate.in_valuta = 1 + SELECT DISTINCT Curs, nume_val, id_valuta, multiplicator FROM crsarticole WITH (Buffering = .T.) ; + WHERE tip_valuta = 1 ORDER BY nume_val INTO CURSOR crscursuri + SELECT crscursuri + poDate.Curs = Curs + poDate.multiplicator = multiplicator + ELSE + citeste_cursuri_zi(poDate.zi_curs) + IF USED('crscursuri') AND RECCOUNT('crscursuri') = 0 + USE IN crscursuri + ENDIF + ENDIF + + IF TYPE('crsarticole.nume_lista_preturi') <> 'U' + IF USED('crspolitici') + USE IN crspolitici + ENDIF + CREATE CURSOR crspolitici (id_pol N(20), nume_lista_preturi c(100)) + INSERT INTO crspolitici(id_pol, nume_lista_preturi) VALUES (-9999, '') + INSERT INTO crspolitici(id_pol, nume_lista_preturi) ; + SELECT DISTINCT id_pol, nume_lista_preturi FROM crsarticole ORDER BY nume_lista_preturi + ENDIF + + *-- pe traseul v2 din factureaza (ramura llFacturareNoua) crsarticole NU exista: formularul se + *-- deschide doar cu crsfactura, iar liniile se cauta in grid. Se inchide dupa ce crspolitici + *-- si crscursuri au fost construite, ca formularul sa vada exact ce vede in productie. + IF USED('crsarticole') + USE IN crsarticole + ENDIF + + PUBLIC goFrm5c + goFrm5c = CREATEOBJECT('frm_facturare_articole2') + DO AfLog WITH " CREATEOBJECT frm_facturare_articole2 OK, VARTYPE=" + VARTYPE(goFrm5c) + ; + " lCopiere=" + TRANSFORM(goFrm5c.lCopiere) + goFrm5c.WindowType = 0 + goFrm5c.Show() + DOEVENTS FORCE + DO AfLog WITH " formular afisat modeless" + + lnAdaugate = AdaugaLiniiCautate(1) + DOEVENTS FORCE + DO AfLog WITH " linii adaugate prin do_adauga_articol_cautat: " + TRANSFORM(lnAdaugate) + ; + " -> Reccount(crsfactura)=" + TRANSFORM(RECCOUNT('crsfactura')) + DO LogLiniiFactura + goFrm5c.do_calculeaza_totaluri() + DOEVENTS FORCE + DO AfLog WITH " totaluri: nbazaron=" + TRANSFORM(goFrm5c.nbazaron) + " ntvaron=" + TRANSFORM(goFrm5c.ntvaron) + + RETURN (RECCOUNT('crsfactura') > 0) +ENDFUNC + +*================================================================================== +* Calea VIE de adaugare a liniilor pe frm_facturare_articole2 pentru tipurile din +* lista de preturi (1, 22, 5, 29, 7, 10, 45): cautare in grid, nu incarcare in masa. +* Reproduce exact grd_factura.cDenumire.cCboDenumire.LostFocus (ofacturare.vc2:21647): +* APPEND BLANK pe crsfactura (But_nou1 / do_adauga) -> SCATTER randul articolului -> +* do_adauga_articol_cautat(loArticol, loArticol.cantitate). +* Cantitatea se tasteaza apoi in grid: do_initializeaza_articol o zeroeaza pentru tipurile +* 1,2,5,6,22,23,29,41,7,10 (ofacturare.vc2:19692-19695), deci o scriem noi si recalculam +* linia ca in LostFocus-ul coloanelor de valori. +*================================================================================== +FUNCTION AdaugaLiniiCautate + LPARAMETERS tnCantitate + LOCAL lnAdaugate, loArticol, loArt, llOk + lnAdaugate = 0 + IF !USED('crslinii5c') OR RECCOUNT('crslinii5c') = 0 + DO AfLog WITH " AdaugaLiniiCautate: crslinii5c gol" + RETURN 0 + ENDIF + SELECT crslinii5c + GO TOP + SCAN + SCATTER NAME loArticol MEMO + SELECT crsfactura + APPEND BLANK + llOk = .F. + TRY + llOk = goFrm5c.do_adauga_articol_cautat(loArticol, NVL(loArticol.cantitate, 1)) + CATCH TO loExcAd + DO AfLog WITH " do_adauga_articol_cautat CATCH " + TRANSFORM(loExcAd.ErrorNo) + " " + ; + loExcAd.Message + " Line=" + TRANSFORM(loExcAd.LineNo) + ENDTRY + IF llOk + lnAdaugate = lnAdaugate + 1 + SELECT crsfactura + REPLACE cantitate WITH tnCantitate + SCATTER NAME loArt MEMO + loArt = calculeaza_totaluri(loArt) + GATHER NAME loArt MEMO + ELSE + DO AfLog WITH " linia pentru id_articol=" + TRANSFORM(crslinii5c.id_articol) + " a fost refuzata" + SELECT crsfactura + IF !EOF() AND !BOF() + DELETE + ENDIF + ENDIF + SELECT crslinii5c + ENDSCAN + SELECT crsfactura + GO TOP + RETURN lnAdaugate +ENDFUNC + +*-- do_scrie_factura, cu mock-ul reincarcat chiar inainte (SET PROCEDURE nu executa nimic, deci +*-- reincarcarea insasi nu poate deschide un dialog) +FUNCTION ScrieDocument + LPARAMETERS tcEticheta + LOCAL llScris, loAC + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE + *-- inainte_de_do_termin citeste gnButon; simpla atribuire il creeaza vizibil pentru apelati + gnButon = 1 + pnButon = 1 + llScris = .F. + + *-- do_scrie_factura se cheama direct, ca in rularea precedenta, dar precedat de cele doua + *-- atribuiri pe care le face inainte_de_do_termin inainte de el (ofacturare.vc2:20684 si + *-- :20764): fara dataora_exp, scrie_factura2 primeste to_date('00000000000000') si Oracle + *-- raspunde ORA-01843. inainte_de_do_termin intreg NU se cheama: valideaza_antet deschide + *-- dialoguri modale de antet care au omorat procesul - ramane datorie deschisa. + loAC = NULL + TRY + loAC = goFrm5c.ActiveControl + CATCH TO loExcAC + DO AfLog WITH " " + tcEticheta + ": ActiveControl indisponibil (" + loExcAC.Message + ")" + ENDTRY + DO AfLog WITH " " + tcEticheta + ": ActiveControl VARTYPE=" + VARTYPE(loAC) + ; + IIF(VARTYPE(loAC) = 'O', " [" + loAC.Name + "]", "") + + poDate.totalctva = goFrm5c.ntotalron + IF EMPTY(NVL(poDate.dataora_exp, {})) + poDate.dataora_exp = Get_Ora() + ENDIF + DO AfLog WITH " " + tcEticheta + ": apelez do_scrie_factura(), totalctva=" + ; + TRANSFORM(poDate.totalctva) + " dataora_exp=" + TRANSFORM(poDate.dataora_exp) + TRY + llScris = goFrm5c.do_scrie_factura() + CATCH TO loExcS + DO AfLog WITH " " + tcEticheta + ": CATCH ErrorNo=" + TRANSFORM(loExcS.ErrorNo) + " " + loExcS.Message + ; + " Proc=" + loExcS.Procedure + " Line=" + TRANSFORM(loExcS.LineNo) + ENDTRY + DOEVENTS FORCE + DO AfLog WITH " " + tcEticheta + ": do_scrie_factura() -> " + TRANSFORM(llScris) + ; + " poDate.nid_vanzare=" + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + IF !llScris + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + ENDIF + RETURN llScris +ENDFUNC + +*-- articolele reale ale tipului curent +FUNCTION IncarcaArticole + LOCAL lcSql, lnSucces + lcSql = [{call ] + gcS + [.pack_facturare.cursor_preturi(?poDate.zi_curs,?poDate.tip,?poDate.id_valuta,] + ; + [?poDate.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + IF USED('crsarticole') + USE IN crsarticole + ENDIF + lnSucces = goExecutor.oExecute(lcSql, [crsarticole]) + IF lnSucces < 0 + DO AfLog WITH " EROARE cursor_preturi: " + goExecutor.oPrelucrareEroare() + RETURN 0 + ENDIF + IF RECCOUNT('crsarticole') = 0 + RETURN 0 + ENDIF + *-- crsarticole ramane intreg (crspolitici se construieste din el, ca in productie). Liniile + *-- documentului se aleg separat, in crslinii5c: cel mult doua, cu pret si cu cota de TVA + *-- prezenta in jtva_coloane - un articol fara cota duce la "Nu a fost gasita cota de TVA! + *-- (FACT-013)" in initializeaza_date_factura. Gestionabilele se incearca primele: numai ele + *-- pot proba clauza "descarca gestiunea normal". + IF USED('crslinii5c') + USE IN crslinii5c + ENDIF + SELECT TOP 2 a.* FROM crsarticole a INNER JOIN jtva_coloane j ; + ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(Nvl(a.proc_tvav,0), 2) ; + WHERE Nvl(a.gestionabil,0) = 1 AND Nvl(a.pret,0) > 0 ; + ORDER BY a.id_articol INTO CURSOR crslinii5c READWRITE + gcStrategieLinii = "gestionabile cu cota in jtva_coloane" + IF RECCOUNT('crslinii5c') = 0 + USE IN crslinii5c + SELECT TOP 2 a.* FROM crsarticole a INNER JOIN jtva_coloane j ; + ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(Nvl(a.proc_tvav,0), 2) ; + WHERE Nvl(a.gestionabil,0) = 0 AND Nvl(a.pret,0) > 0 ; + ORDER BY a.id_articol INTO CURSOR crslinii5c READWRITE + gcStrategieLinii = "negestionabile cu cota in jtva_coloane" + ENDIF + IF RECCOUNT('crslinii5c') = 0 + USE IN crslinii5c + SELECT TOP 2 * FROM crsarticole ORDER BY id_articol INTO CURSOR crslinii5c READWRITE + gcStrategieLinii = "primele doua din lista (nicio potrivire de cota)" + ENDIF + DO AfLog WITH " strategie linii: " + gcStrategieLinii + GO TOP IN crslinii5c + SCAN + DO AfLog WITH " linie: id_articol=" + TRANSFORM(crslinii5c.id_articol) + " [" + ; + ALLTRIM(TRANSFORM(crslinii5c.denumire)) + "] pret=" + TRANSFORM(crslinii5c.pret) + ; + " proc_tvav=" + TRANSFORM(crslinii5c.proc_tvav) + " gestionabil=" + TRANSFORM(crslinii5c.gestionabil) + ENDSCAN + GO TOP IN crslinii5c + RETURN RECCOUNT('crslinii5c') +ENDFUNC + +*-- sonda read-only: cate articole intoarce cursor_preturi pentru un tip de operatie +FUNCTION ArticoleDisponibile + LPARAMETERS tnTip + LOCAL lnRez, lcSql, lnSucces, lnIdSet + PRIVATE poDateSonda + lnRez = 0 + lnIdSet = 25000 + tnTip - 1 + gnScadereStoc * 10 + poDateSonda = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + lcSql = [{call ] + gcS + [.pack_facturare.cursor_preturi(?gdZiCurs,?poDateSonda.tip,?poDateSonda.id_valuta,] + ; + [?poDateSonda.id_gestiune_init,?gnLuna,?gnAn,?gnIdUtil,?gnIdSucursala)}] + IF USED('crssonda') + USE IN crssonda + ENDIF + lnSucces = goExecutor.oExecute(lcSql, [crssonda]) + IF lnSucces < 0 + DO AfLog WITH " sonda articole tip " + TRANSFORM(tnTip) + " ESEC: " + goExecutor.oPrelucrareEroare() + ELSE + lnRez = RECCOUNT('crssonda') + ENDIF + IF USED('crssonda') + USE IN crssonda + ENDIF + RELEASE poDateSonda + RETURN lnRez +ENDFUNC + +*-- obiect sursa echivalent cu SCATTER NAME loFactura MEMO din crsFacturi, pe randul proformei +FUNCTION SursaProforma + LPARAMETERS tnIdProf + LOCAL loSursa, lnQ + IF USED('crsprofsrc') + USE IN crsprofsrc + ENDIF + *-- randul se citeste din FACT_VFACTURI2, view-ul din spatele lui crsFacturi + *-- (oproceduri_facturare.prg:463): do_copiaza face SCATTER exact pe el, deci si numele + *-- clientului trebuie sa fie cel real - unul inventat schimba validarile de antet + lnQ = goExecutor.oExecute([select id_vanzare, nvl(eproforma,0) as eproforma, serie_act, numar_act, ] + ; + [id_part, client, id_lucrare, lucrare, id_sectie, sectie, id_agent, nume_agent, ] + ; + [id_delegat, delegat, bidelegat, cnpdelegat, nrinmat, id_masina, tip ] + ; + [from fact_vfacturi2 where id_vanzare = ] + TRANSFORM(tnIdProf), 'crsprofsrc') + IF lnQ < 0 OR !USED('crsprofsrc') OR RECCOUNT('crsprofsrc') = 0 + DO AfLog WITH " view FACT_VFACTURI2 indisponibil (" + goExecutor.oPrelucrareEroare() + ; + "), revin la VANZARI" + lnQ = goExecutor.oExecute([select v.id_vanzare, nvl(v.eproforma,0) as eproforma, v.serie_act, v.numar_act, ] + ; + [v.id_part, ' ' as client, v.id_lucrare, ' ' as lucrare, v.id_sectie, ' ' as sectie, ] + ; + [v.id_agent, ' ' as nume_agent, v.id_delegat, ' ' as delegat, ' ' as bidelegat, ] + ; + [' ' as cnpdelegat, ' ' as nrinmat, v.id_masina, v.tip ] + ; + [from vanzari v where v.id_vanzare = ] + TRANSFORM(tnIdProf), 'crsprofsrc') + ENDIF + IF lnQ < 0 OR !USED('crsprofsrc') OR RECCOUNT('crsprofsrc') = 0 + DO AfLog WITH " EROARE citire proforma sursa: " + goExecutor.oPrelucrareEroare() + RETURN NULL + ENDIF + SELECT crsprofsrc + GO TOP + loSursa = CREATEOBJECT('Empty') + AddProperty(loSursa, 'id_vanzare', crsprofsrc.id_vanzare) + AddProperty(loSursa, 'eproforma', crsprofsrc.eproforma) + AddProperty(loSursa, 'serie_act', NVL(crsprofsrc.serie_act, '')) + AddProperty(loSursa, 'numar_act', NVL(crsprofsrc.numar_act, 0)) + AddProperty(loSursa, 'id_part', crsprofsrc.id_part) + AddProperty(loSursa, 'client', ALLTRIM(NVL(crsprofsrc.client, ''))) + AddProperty(loSursa, 'id_lucrare', crsprofsrc.id_lucrare) + AddProperty(loSursa, 'lucrare', ALLTRIM(NVL(crsprofsrc.lucrare, ''))) + AddProperty(loSursa, 'id_sectie', crsprofsrc.id_sectie) + AddProperty(loSursa, 'sectie', ALLTRIM(NVL(crsprofsrc.sectie, ''))) + AddProperty(loSursa, 'id_agent', crsprofsrc.id_agent) + AddProperty(loSursa, 'nume_agent', ALLTRIM(NVL(crsprofsrc.nume_agent, ''))) + AddProperty(loSursa, 'id_delegat', crsprofsrc.id_delegat) + AddProperty(loSursa, 'delegat', ALLTRIM(NVL(crsprofsrc.delegat, ''))) + AddProperty(loSursa, 'BIdelegat', ALLTRIM(NVL(crsprofsrc.bidelegat, ''))) + AddProperty(loSursa, 'CNPdelegat', ALLTRIM(NVL(crsprofsrc.cnpdelegat, ''))) + AddProperty(loSursa, 'nrinmat', ALLTRIM(NVL(crsprofsrc.nrinmat, ''))) + AddProperty(loSursa, 'id_masina', crsprofsrc.id_masina) + AddProperty(loSursa, 'tip', crsprofsrc.tip) + DO AfLog WITH " sursa proforma: id_vanzare=" + TRANSFORM(loSursa.id_vanzare) + " eproforma=" + TRANSFORM(loSursa.eproforma) + ; + " serie=[" + ALLTRIM(TRANSFORM(loSursa.serie_act)) + "] numar=" + TRANSFORM(loSursa.numar_act) + ; + " tip=" + TRANSFORM(loSursa.tip) + USE IN crsprofsrc + RETURN loSursa +ENDFUNC + +PROCEDURE CurataFormular + IF TYPE('goFrm5c') = 'O' AND !ISNULL(goFrm5c) + TRY + goFrm5c.Release() + CATCH TO loExcR + DO AfLog WITH " Release formular: CATCH " + TRANSFORM(loExcR.ErrorNo) + " " + loExcR.Message + ENDTRY + ENDIF + goFrm5c = NULL + LOCAL lcC, lnI, laC[7] + laC[1] = 'crspolitici' + laC[2] = 'crscursuri' + laC[3] = 'crsfactura' + laC[4] = 'crsarticole' + laC[5] = 'crsfacturaset' + laC[6] = 'crsfacturafinala' + laC[7] = 'crslinii5c' + FOR lnI = 1 TO 7 + lcC = laC[lnI] + IF USED(lcC) + USE IN (lcC) + ENDIF + ENDFOR +ENDPROC + +PROCEDURE CurataDocument + DO CurataFormular + IF TYPE('poDate') = 'O' AND !ISNULL(poDate) + poDate = NULL + ENDIF +ENDPROC + +*================================================================================== +* Utilitare +*================================================================================== +PROCEDURE LogJtva + LOCAL lcCote + lcCote = '' + IF !USED('jtva_coloane') + DO AfLog WITH " jtva_coloane INEXISTENT" + RETURN + ENDIF + SELECT jtva_coloane + SCAN + lcCote = lcCote + ' ' + TRANSFORM(jtva_coloane.id_jtva_coloana) + '/' + ; + TRANSFORM(ROUND((jtva_coloane.cota_tva + 100) / 100, 2)) + ENDSCAN + GO TOP IN jtva_coloane + DO AfLog WITH " jtva_coloane: " + TRANSFORM(RECCOUNT('jtva_coloane')) + " randuri (id/proc_tvav):" + lcCote +ENDPROC + +*-- cate linii din crsfactura satisfac o conditie (expresie VFP peste campurile cursorului) +FUNCTION LiniiCu + LPARAMETERS tcCond + LOCAL lnR, lnN + IF !USED('crsfactura') + RETURN 0 + ENDIF + lnN = 0 + lnR = RECNO('crsfactura') + SELECT crsfactura + GO TOP + SCAN + IF EVALUATE(tcCond) + lnN = lnN + 1 + ENDIF + ENDSCAN + IF BETWEEN(lnR, 1, RECCOUNT('crsfactura')) + GO lnR IN crsfactura + ENDIF + RETURN lnN +ENDFUNC + +PROCEDURE LogLiniiFactura + LOCAL lnR + IF !USED('crsfactura') + RETURN + ENDIF + lnR = RECNO('crsfactura') + SELECT crsfactura + GO TOP + SCAN + DO AfLog WITH " crsfactura: id_articol=" + TRANSFORM(crsfactura.id_articol) + ; + " cantitate=" + TRANSFORM(crsfactura.cantitate) + ; + " pretftva=" + TRANSFORM(crsfactura.pretftva) + ; + " proc_tvav=" + TRANSFORM(crsfactura.proc_tvav) + ; + " id_jtva_coloana=" + TRANSFORM(crsfactura.id_jtva_coloana) + ; + " id_gestiune=" + TRANSFORM(crsfactura.id_gestiune) + ENDSCAN + IF BETWEEN(lnR, 1, RECCOUNT('crsfactura')) + GO lnR IN crsfactura + ENDIF +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + SET SAFETY OFF + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO AfLog WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + TRANSFORM(tcProg) + ':' + TRANSFORM(tnLine) + '] ' + TRANSFORM(tcMsg) +ENDPROC + +PROCEDURE Assert + 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 Sarit + LPARAMETERS tcMsg + gnSarit = gnSarit + 1 + DO AfLog WITH 'SARIT: ' + gcCaz + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH '' + DO AfLog WITH 'DOCUMENTE CONSUMATE: proforma id_vanzare=' + TRANSFORM(gnIdProf) + ' numar=' + TRANSFORM(gnNrProf) + ; + ' | din proforma id_vanzare=' + TRANSFORM(gnIdFact) + ' numar=' + TRANSFORM(gnNrFact) + ; + ' | control id_vanzare=' + TRANSFORM(gnIdCtrl) + DO AfLog WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' sarit=' + TRANSFORM(gnSarit) + DO AfLog WITH 'END ' + TTOC(DATETIME()) + DO HarnessDone WITH 'gata pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' sarit=' + TRANSFORM(gnSarit) + QUIT +ENDPROC + +*-- ultima zi din luna deschisa acoperita de VCURS pentru EURO; cursor_preturi refuza o zi fara curs +FUNCTION DataCursValid + LOCAL ldRez, lcSql, lnQ, lcUltima + ldRez = DATE(gnAn, gnLuna, 1) + lcUltima = TRANSFORM(gnAn) + PADL(TRANSFORM(gnLuna), 2, '0') + '01' + IF USED('crscurszi') + USE IN crscurszi + ENDIF + lcSql = [select to_char(max(data),'YYYYMMDD') as d from vcurs ] + ; + [where upper(nume_val) = 'EURO' and data <= last_day(to_date('] + lcUltima + [','YYYYMMDD'))] + lnQ = goExecutor.oExecute(lcSql, 'crscurszi') + IF lnQ >= 0 AND USED('crscurszi') AND RECCOUNT('crscurszi') > 0 + GO TOP IN crscurszi + IF !ISNULL(crscurszi.d) AND LEN(ALLTRIM(crscurszi.d)) = 8 + ldRez = CTOD(SUBSTR(crscurszi.d,7,2) + '/' + SUBSTR(crscurszi.d,5,2) + '/' + SUBSTR(crscurszi.d,1,4)) + ENDIF + ELSE + DO AfLog WITH " DataCursValid ESEC: " + goExecutor.oPrelucrareEroare() + ENDIF + IF USED('crscurszi') + USE IN crscurszi + ENDIF + RETURN ldRez +ENDFUNC + +*-- cate randuri de plaja intoarce verifica_cursor_serii pentru un tip de document, fara sa aloce +FUNCTION RanduriSerii + LPARAMETERS tnIdTipDoc + LOCAL lnOk, lnRanduri, lcSql + LOCAL ARRAY laErr[1] + PRIVATE pnIdTipDoc, pnRezultat + pnIdTipDoc = tnIdTipDoc + pnRezultat = 0 + lnRanduri = -1 + lcSql = "{call " + gcS + ".pack_serii_numere.verifica_cursor_serii(?pnIdTipDoc,?gnIdUtil,?gnIdSucursala,?@pnRezultat)}" + lnOk = SQLEXEC(gnHandle, lcSql, "crsprobapl") + IF lnOk > 0 + lnRanduri = RECCOUNT("crsprobapl") + USE IN (SELECT("crsprobapl")) + ELSE + AERROR(laErr) + DO AfLog WITH ' sonda plaje tip ' + TRANSFORM(tnIdTipDoc) + ' ESEC: ' + TRANSFORM(laErr[2]) + ENDIF + RETURN lnRanduri +ENDFUNC + +*-- interogare scalara; -999999 = esec +FUNCTION QNum + LPARAMETERS tcSql, tcCamp + LOCAL lnQ, lnVal + lnVal = -999999 + IF USED('crsq5c') + USE IN crsq5c + ENDIF + lnQ = goExecutor.oExecute(tcSql, 'crsq5c') + IF lnQ >= 0 AND USED('crsq5c') AND RECCOUNT('crsq5c') > 0 + GO TOP IN crsq5c + lnVal = NVL(EVALUATE('crsq5c.' + tcCamp), 0) + ELSE + DO AfLog WITH ' QNum ESEC [' + tcSql + '] -> ' + goExecutor.oPrelucrareEroare() + ENDIF + IF USED('crsq5c') + USE IN crsq5c + ENDIF + RETURN lnVal +ENDFUNC + +*================================================================================== +*-- driverModal5c: apasa automat Da/OK pe formularele modale proprii (MESSAGEBOX_FORM), +*-- care nu trec prin amessagebox si deci nu sunt acoperite de mock +DEFINE CLASS driverModal5c AS Custom + nUltimTick = 0 + nUltimPuls = 0 + nUltimStrain = 0 + nApasari = 0 + nAcelasi = 0 + cUltimText = '' + + PROCEDURE Executa + LOCAL lnI, loMsgForm, loStrain, lcClasa, lcTxt, llGata + TRY + llGata = .F. + loMsgForm = NULL + loStrain = NULL + FOR lnI = 1 TO _SCREEN.FormCount + lcClasa = UPPER(_SCREEN.Forms(lnI).Class) + IF 'MESSAGEBOX_FORM' $ lcClasa + loMsgForm = _SCREEN.Forms(lnI) + EXIT + ENDIF + IF !('FRM_FACTURARE_ARTICOLE2' $ lcClasa) AND ISNULL(loStrain) + loStrain = _SCREEN.Forms(lnI) + ENDIF + ENDFOR + + *-- formular strain blocant (ex. "Do Form verificare", ofacturare.vc2:20242): in productie + *-- operatorul il inchide cu Termin. Se face acelasi lucru: gnButon = 1 + Release. + IF ISNULL(loMsgForm) AND !ISNULL(loStrain) AND (SECONDS() - This.nUltimStrain > 3) + This.nUltimStrain = SECONDS() + DO AfLog WITH ' [timer] formular strain Class=[' + loStrain.Class + '] Name=[' + ; + loStrain.Name + '] Caption=[' + TRANSFORM(loStrain.Caption) + '] -> gnButon=1, Release' + gnButon = 1 + pnButon = 1 + loStrain.Release() + ENDIF + *-- puls: daca timerul inceteaza sa mai scrie, blocajul e intr-un dialog nativ care + *-- opreste bucla de evenimente, nu intr-un MESSAGEBOX_FORM + IF SECONDS() - This.nUltimPuls > 5 + This.nUltimPuls = SECONDS() + lcTxt = '' + FOR lnI = 1 TO _SCREEN.FormCount + lcTxt = lcTxt + ' ' + _SCREEN.Forms(lnI).Class + ENDFOR + DO AfLog WITH ' [timer] puls FormCount=' + TRANSFORM(_SCREEN.FormCount) + lcTxt + ENDIF + *-- fara RETURN: in VFP, RETURN in interiorul unui TRY da eroarea 2060 + IF ISNULL(loMsgForm) OR (SECONDS() - This.nUltimTick < 1.5) + llGata = .T. + ENDIF + IF !llGata + *-- racire de 1.5s: apasarile la 200ms reintra in Boton_Click pe un formular deja + *-- in curs de inchidere si omoara procesul vfp9 + This.nUltimTick = SECONDS() + This.nApasari = This.nApasari + 1 + lcTxt = '' + IF PEMSTATUS(loMsgForm, 'edtMensaje', 5) + lcTxt = LEFT(STRTRAN(STRTRAN(TRANSFORM(loMsgForm.edtMensaje.Value), CHR(13), ' '), CHR(10), ' '), 300) + ENDIF + DO AfLog WITH ' [timer] modal #' + TRANSFORM(This.nApasari) + ' Caption=[' + ; + TRANSFORM(loMsgForm.Caption) + '] text=[' + lcTxt + ']' + IF lcTxt == This.cUltimText + This.nAcelasi = This.nAcelasi + 1 + ELSE + This.nAcelasi = 1 + This.cUltimText = lcTxt + ENDIF + DO CASE + CASE This.nApasari > 40 + DO AfLog WITH ' [timer] peste 40 de dialoguri modale - opresc driverul' + _SCREEN.tmrDrv5c.Enabled = .F. + CASE This.nAcelasi > 3 + DO AfLog WITH ' [timer] acelasi dialog de ' + TRANSFORM(This.nAcelasi) + ' ori - Hide()' + loMsgForm.Hide() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) + loMsgForm.cmgBotones.cmdYes.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) + loMsgForm.cmgBotones.cmdOk.Click() + ENDCASE + ENDIF + CATCH TO loExcMsg + DO AfLog WITH ' [timer] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_unificat/test_s5c_emitere_reala_ui.ps1 b/utile/Teste/facturare_unificat/test_s5c_emitere_reala_ui.ps1 new file mode 100644 index 0000000..49a8216 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5c_emitere_reala_ui.ps1 @@ -0,0 +1,17 @@ +# test_s5c_emitere_reala_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru +# test_s5c_emitere_reala_ui.prg (S5c, proba capat-la-capat: factura din proforma, pasii C0-C10). +# Rulare VIZIBILA (vfp9 -A, fereastra impinsa off-screen de harness), NU -A -T: sub -A -T +# coloanele de grid nu se materializeaza. +# Folderele de sincronizare/capturi sunt noi - harness-ul le goleste la pornire. +# Rulare: powershell -ExecutionPolicy Bypass -File test_s5c_emitere_reala_ui.ps1 (timeout >= 600s) +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +Get-ChildItem -Path $Teste -Filter '*.FXP' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue +Get-ChildItem -Path $Teste -Filter '*.fxp' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_s5c_emitere_reala_ui.prg') ` + -Steps @('env_gata','proforma_emisa','factura_emisa','neregresie_emis') ` + -StepTimeoutSec 180 ` + -ReadyTimeoutSec 240 ` + -SyncDir (Join-Path $Teste 'uisync_s5c') ` + -ShotsDir (Join-Path $Teste 'screenshots_s5c_01_09') diff --git a/utile/Teste/facturare_unificat/test_s5c_legatura_sql.prg b/utile/Teste/facturare_unificat/test_s5c_legatura_sql.prg new file mode 100644 index 0000000..7a025f3 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5c_legatura_sql.prg @@ -0,0 +1,199 @@ +* test_s5c_legatura_sql.prg +* Headless (-A -T): S5c, contractul Oracle al legaturii proforma -> factura, izolat de UI. +* Ruleaza EXACT blocul anonim pe care il trimite scrie_legatura_proforma() (ofacturare_comun.prg): +* begin pack_facturare.nid_vanzare := ; pack_facturare.clistaid := ''; +* pack_facturare.scrie_corespondente_vanzari(4); end; +* B1 - numaratoarea initiala a randurilor TIP = 4 din VANZARI_CORESP +* B2 - alege o proforma reala si o factura reala fara corespondente (daca nu exista, SARIT) +* B3 - blocul anonim, in tranzactie MANUALA +* B4 - randul TIP = 4 factura -> proforma exista si e unic +* B5 - efectul colateral masurat: VANZARI.AVIZE al facturii contine seria+numarul proformei +* B6 - ROLLBACK; numaratoarea TIP = 4 revine la valoarea de la B1 (testul nu lasa date in urma) +* +* Nu emite documente si nu consuma numere. Toate scrierile sunt anulate de ROLLBACK-ul de la B6; +* Final() mai face un rollback defensiv si readuce conexiunea pe tranzactie automata. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5c_legatura_sql.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_legatura_sql.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz, gnH, glManual +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_legatura_sql.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) +gnFail = 0 +gnPass = 0 +gnSarit = 0 +gcCaz = "" +glManual = .F. +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 +SQLSETPROP(gnHandle, "QueryTimeOut", 45) +IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle + SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45) +ENDIF +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) + +* toate scrierile si toate citirile trec prin goExecutor -> tranzactia se deschide pe handle-ul LUI, +* altfel ROLLBACK-ul de la B6 ar anula alta sesiune decat cea care a scris +gnH = IIF(TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0, goExecutor.nHandle, gnHandle) +DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) + " goExecutor.nHandle=" + TRANSFORM(gnH) + +DO TestLegaturaTip4 + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE TestLegaturaTip4 + LOCAL lnInainte, lnProf, lnFact, lnDupaInsert, lnAvize, lnDupaRollback, lnSucces + gcCaz = "[B legatura TIP = 4 pe contractul Oracle] " + + * B1 + lnInainte = ValoareScalara([select count(*) as nr from vanzari_coresp where tip = 4]) + DO Assert WITH lnInainte >= 0, "B1 numaratoare initiala TIP = 4 citita, e=" + TRANSFORM(lnInainte) + IF lnInainte < 0 + RETURN + ENDIF + DO AfLog WITH "B1: vanzari_coresp tip=4 inainte = " + TRANSFORM(lnInainte) + + * B2 - nu se inventeaza date: fara proforma sau fara factura libera, pasul e SARIT + lnProf = ValoareScalara([select id_vanzare as nr from (select id_vanzare from vanzari ] + ; + [where sters = 0 and nvl(eproforma,0) = 1 order by id_vanzare desc) where rownum = 1]) + lnFact = ValoareScalara([select id_vanzare as nr from (select v.id_vanzare from vanzari v ] + ; + [where v.sters = 0 and nvl(v.eproforma,0) = 0 and v.tip in (1,5,7,10) ] + ; + [and not exists (select 1 from vanzari_coresp c where c.id_vanzare_fact = v.id_vanzare) ] + ; + [order by v.id_vanzare desc) where rownum = 1]) + DO AfLog WITH "B2: lnProf=" + TRANSFORM(lnProf) + " lnFact=" + TRANSFORM(lnFact) + IF lnProf <= 0 OR lnFact <= 0 + DO AfLog WITH "SARIT - " + gcCaz + "nu exista in MARIUSM_AUTO o proforma (lnProf=" + TRANSFORM(lnProf) + ; + ") si/sau o factura fara corespondente (lnFact=" + TRANSFORM(lnFact) + ")" + gnSarit = gnSarit + 1 + RETURN + ENDIF + + * tranzactie manuala pe handle-ul lui goExecutor - acelasi tipar ca do_deschide_tranzactie + goExecutor.oExecuta([select * from dual]) + lnSucces = SQLSETPROP(gnH, "Transactions", 2) + IF lnSucces < 0 + DO Assert WITH .F., "trecerea pe tranzactie manuala a esuat - testul NU se ruleaza (ar lasa date)" + RETURN + ENDIF + glManual = .T. + DO AfLog WITH "tranzactie MANUALA deschisa pe handle " + TRANSFORM(gnH) + + * B3 - blocul anonim, identic cu cel construit de scrie_legatura_proforma() + lnSucces = goExecutor.oExecute([begin pack_facturare.nid_vanzare := ] + ALLTRIM(STR(lnFact, 20, 0)) + [;] + ; + [ pack_facturare.clistaid := '] + ALLTRIM(STR(lnProf, 20, 0)) + [';] + ; + [ pack_facturare.scrie_corespondente_vanzari(4); end;]) + DO Assert WITH lnSucces >= 0, "B3 blocul anonim s-a executat fara eroare Oracle, succes=" + TRANSFORM(lnSucces) + ; + " eroare=" + IIF(lnSucces < 0, TRANSFORM(goExecutor.cEroare), "") + IF lnSucces < 0 + DO FaRollback + RETURN + ENDIF + + * B4 + lnDupaInsert = ValoareScalara([select count(*) as nr from vanzari_coresp where sters = 0 and tip = 4 ] + ; + [and id_vanzare_fact = ] + ALLTRIM(STR(lnFact, 20, 0)) + ; + [ and id_vanzare_aviz = ] + ALLTRIM(STR(lnProf, 20, 0))) + DO Assert WITH lnDupaInsert = 1, "B4 exact un rand TIP = 4 factura -> proforma, e=" + TRANSFORM(lnDupaInsert) + DO AfLog WITH "B4: randuri tip=4 fact=" + TRANSFORM(lnFact) + " aviz=" + TRANSFORM(lnProf) + " -> " + TRANSFORM(lnDupaInsert) + + * B5 - efectul colateral din 1.5, masurat nu presupus: comparatia se face in SQL, ca sa nu depinda + * de formatarea numarului in VFP + lnAvize = ValoareScalara([select count(*) as nr from vanzari f where f.id_vanzare = ] + ALLTRIM(STR(lnFact, 20, 0)) + ; + [ and f.avize like '%' || (select nvl(p.serie_act,'') || chr(32) || p.numar_act from vanzari p ] + ; + [where p.id_vanzare = ] + ALLTRIM(STR(lnProf, 20, 0)) + [) || '%']) + DO Assert WITH lnAvize = 1, "B5 VANZARI.AVIZE al facturii contine seria+numarul proformei (efect colateral cunoscut), e=" + ; + TRANSFORM(lnAvize) + DO AfLog WITH "B5: VANZARI.AVIZE contine seria+numarul proformei -> " + TRANSFORM(lnAvize) + + * B6 + DO FaRollback + lnDupaRollback = ValoareScalara([select count(*) as nr from vanzari_coresp where tip = 4]) + DO Assert WITH lnDupaRollback = lnInainte, ; + "B6 dupa ROLLBACK numaratoarea TIP = 4 revine la valoarea initiala, inainte=" + TRANSFORM(lnInainte) + ; + " dupa=" + TRANSFORM(lnDupaRollback) + DO AfLog WITH "B6: vanzari_coresp tip=4 dupa rollback = " + TRANSFORM(lnDupaRollback) +ENDPROC + +PROCEDURE FaRollback + LOCAL lnSucces + IF !glManual + RETURN + ENDIF + lnSucces = SQLROLLBACK(gnH) + DO AfLog WITH "ROLLBACK succes=" + TRANSFORM(lnSucces) + SQLSETPROP(gnH, "Transactions", 1) + glManual = .F. +ENDPROC + +FUNCTION ValoareScalara + LPARAMETERS tcSql + LOCAL lnRez, lnSucces + lnRez = -1 + lnSucces = goExecutor.oExecute(tcSql, [crsscalar]) + IF lnSucces >= 0 AND USED('crsscalar') + IF RECCOUNT('crsscalar') > 0 + SELECT crsscalar + GO TOP + lnRez = NVL(crsscalar.nr, 0) + ELSE + lnRez = 0 + ENDIF + USE IN (SELECT('crsscalar')) + ELSE + DO AfLog WITH "SQL ESEC: " + TRANSFORM(goExecutor.cEroare) + " | " + tcSql + ENDIF + RETURN lnRez +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + * rollback defensiv: daca testul a cazut in mijloc, nimic nu ramane scris + IF glManual + DO AfLog WITH "rollback defensiv (tranzactia era inca deschisa)" + DO FaRollback + ENDIF + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s5c_rutare_copiere.prg b/utile/Teste/facturare_unificat/test_s5c_rutare_copiere.prg new file mode 100644 index 0000000..b161f21 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5c_rutare_copiere.prg @@ -0,0 +1,233 @@ +* test_s5c_rutare_copiere.prg +* Headless (-A -T), static, FARA Oracle: probeaza RUTAREA copierii unui document, nu formularul. +* Testul UI existent instantiaza frm_facturare_articole2 direct si sare peste rutarea din +* factureaza() - de aceea nu a prins ca scrie_legatura_proforma() lipsea de pe calea reala (v1). +* R1 - copiere_factura cheama factureaza(toFactura.Tip, toFactura), fara plFacturareNoua +* R2 - plFacturareNoua e declarat Private numai in Clase\ofundal_facturare.vc2 (doua situri) +* si nu apare deloc in COMUN\programe\oproceduri_facturare.prg +* R3 - deci pe calea de copiere llFacturareNoua = .F. -> se emite pe frm_facturare_articole (v1) +* R4 - completeaza_setari_document(toFactura, .T.) se cheama INAINTE de comutarea v1/v2, +* deci poDate.lProformaSursa se ridica si pe traseul v1 +* R5 - scrie_legatura_proforma() apare de doua ori in ofacturare.vc2: o data in v1, o data in v2 +* R6 - in do_scrie_factura din v1 apelul e conditionat de If m.llReturn si e inainte de +* do_inchide_tranzactie(1) (aceeasi tranzactie) +* R7 - acelasi lucru in do_scrie_factura din v2 (neregresie fata de S5c) +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5c_rutare_copiere.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_rutare_copiere.log + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz, gcVc2, gcPrgRut, gcPrgFact, gcFundal +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_rutare_copiere.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) +gnFail = 0 +gnPass = 0 +gnSarit = 0 +gcCaz = "" +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() + +gcVc2 = "D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2" +gcPrgRut = "D:\ROA\ROAFACTURARE\COMUN\programe\oproceduri_facturare.prg" +gcPrgFact = "D:\ROA\ROAFACTURARE\COMUN\programe\ofacturare.prg" +gcFundal = "D:\ROA\ROAFACTURARE\Clase\ofundal_facturare.vc2" + +DO TestCopiereFaraSteagulNou +DO TestSteagulNouDoarPeButoaneleNoi +DO TestSemnalulSeSeteazaInainteDeRutare +DO TestApelPeAmbeleFormulare +DO TestApelInV1 +DO TestApelInV2 + +DO Final + +*---------------------------------------------------------------------------------------- +* R1: copiere_factura ruteaza catre factureaza fara sa ridice plFacturareNoua +PROCEDURE TestCopiereFaraSteagulNou + LOCAL lcTxt, lcProc + gcCaz = "[R1 copiere_factura -> factureaza fara plFacturareNoua] " + lcTxt = FILETOSTR(gcPrgRut) + IF EMPTY(lcTxt) + DO Assert WITH .F., "FILETOSTR oproceduri_facturare.prg a esuat/gol" + RETURN + ENDIF + lcProc = Fereastra(lcTxt, "PROCEDURE copiere_factura", "ENDPROC") + IF EMPTY(lcProc) + DO Assert WITH .F., "nu s-a putut izola PROCEDURE copiere_factura" + RETURN + ENDIF + DO AfLog WITH "DIAG R1: copiere_factura len=" + TRANSFORM(LEN(lcProc)) + DO Assert WITH "factureaza(toFactura.Tip, toFactura)" $ lcProc, ; + "copiere_factura cheama factureaza(toFactura.Tip, toFactura)" + DO Assert WITH OCCURS("plFacturareNoua", lcTxt) = 0, ; + "plFacturareNoua nu apare in oproceduri_facturare.prg, ocurente=" + ; + TRANSFORM(OCCURS("plFacturareNoua", lcTxt)) +ENDPROC + +* R2 + R3: steagul e ridicat numai de butoanele "Facturare (nou)" / "Avize (nou)" +PROCEDURE TestSteagulNouDoarPeButoaneleNoi + LOCAL lcFundal, lcFact + gcCaz = "[R2/R3 plFacturareNoua ridicat numai in ofundal_facturare] " + lcFundal = FILETOSTR(gcFundal) + lcFact = FILETOSTR(gcPrgFact) + IF EMPTY(lcFundal) OR EMPTY(lcFact) + DO Assert WITH .F., "FILETOSTR ofundal_facturare.vc2 / ofacturare.prg a esuat/gol" + RETURN + ENDIF + DO Assert WITH OCCURS("Private plFacturareNoua", lcFundal) = 2, ; + "doua declaratii Private plFacturareNoua in ofundal_facturare.vc2, ocurente=" + ; + TRANSFORM(OCCURS("Private plFacturareNoua", lcFundal)) + DO Assert WITH OCCURS("Private plFacturareNoua", lcFact) = 0, ; + "ofacturare.prg doar citeste steagul, nu il declara" + DO Assert WITH "llFacturareNoua = (Type('plFacturareNoua') = 'L'" $ lcFact, ; + "factureaza decide v1/v2 dupa Type('plFacturareNoua')" + * fara declaratie pe lantul de apel, Type() da 'U' -> llFacturareNoua = .F. -> v1 + DO Assert WITH "ofrmdetaliifactura = Createobject('frm_facturare_articole2')" $ lcFact, ; + "ramura llFacturareNoua = .T. instantiaza v2 (deci ramura .F. ramane pe v1)" +ENDPROC + +* R4: semnalul lProformaSursa se ridica inaintea comutarii v1/v2, deci si pe traseul v1 +PROCEDURE TestSemnalulSeSeteazaInainteDeRutare + LOCAL lcTxt, lnSetare, lnComutare + gcCaz = "[R4 completeaza_setari_document inainte de comutarea v1/v2] " + lcTxt = FILETOSTR(gcPrgFact) + IF EMPTY(lcTxt) + DO Assert WITH .F., "FILETOSTR ofacturare.prg a esuat/gol" + RETURN + ENDIF + lnSetare = AT("poDate.completeaza_setari_document(m.toFactura, .T.)", lcTxt) + lnComutare = AT("llFacturareNoua = (Type('plFacturareNoua')", lcTxt) + DO Assert WITH lnSetare > 0, "completeaza_setari_document(m.toFactura, .T.) prezent, poz=" + TRANSFORM(lnSetare) + DO Assert WITH lnComutare > 0, "comutarea v1/v2 prezenta, poz=" + TRANSFORM(lnComutare) + IF lnSetare > 0 AND lnComutare > 0 + DO Assert WITH lnSetare < lnComutare, ; + "semnalul se ridica INAINTE de rutare (comun ambelor formulare), setare=" + ; + TRANSFORM(lnSetare) + " comutare=" + TRANSFORM(lnComutare) + ENDIF +ENDPROC + +* R5: apelul exista pe ambele formulare, cate o singura data +PROCEDURE TestApelPeAmbeleFormulare + LOCAL lcTxt, lcV1, lcV2 + gcCaz = "[R5 apelul e si pe v1 si pe v2] " + lcTxt = FILETOSTR(gcVc2) + IF EMPTY(lcTxt) + DO Assert WITH .F., "FILETOSTR ofacturare.vc2 a esuat/gol" + RETURN + ENDIF + DO Assert WITH OCCURS("scrie_legatura_proforma()", lcTxt) = 2, ; + "doua apeluri scrie_legatura_proforma() in ofacturare.vc2, ocurente=" + ; + TRANSFORM(OCCURS("scrie_legatura_proforma()", lcTxt)) + lcV1 = FereastraClasa(lcTxt, 1) + lcV2 = FereastraClasa(lcTxt, 2) + DO Assert WITH !EMPTY(lcV1), "clasa frm_facturare_articole (v1) izolata" + DO Assert WITH !EMPTY(lcV2), "clasa frm_facturare_articole2 (v2) izolata" + IF !EMPTY(lcV1) + DO Assert WITH OCCURS("scrie_legatura_proforma()", lcV1) = 1, ; + "un apel in clasa v1, ocurente=" + TRANSFORM(OCCURS("scrie_legatura_proforma()", lcV1)) + ENDIF + IF !EMPTY(lcV2) + DO Assert WITH OCCURS("scrie_legatura_proforma()", lcV2) = 1, ; + "un apel in clasa v2, ocurente=" + TRANSFORM(OCCURS("scrie_legatura_proforma()", lcV2)) + ENDIF +ENDPROC + +* R6: pozitia si conditia apelului in do_scrie_factura din v1 +PROCEDURE TestApelInV1 + gcCaz = "[R6 v1: apel conditionat, inainte de COMMIT] " + DO VerificaMetoda WITH 1, "If m.llReturn" +ENDPROC + +* R7: acelasi lucru in v2 (neregresie) +PROCEDURE TestApelInV2 + gcCaz = "[R7 v2: apel conditionat, inainte de COMMIT] " + DO VerificaMetoda WITH 2, "If llReturn" +ENDPROC + +PROCEDURE VerificaMetoda + LPARAMETERS tnVersiune, tcGarda + LOCAL lcTxt, lcClasa, lcMetoda, lnApel, lnCommit, lcSecventa + lcTxt = FILETOSTR(gcVc2) + lcClasa = FereastraClasa(lcTxt, tnVersiune) + IF EMPTY(lcClasa) + DO Assert WITH .F., "clasa nu s-a putut izola" + RETURN + ENDIF + lcMetoda = Fereastra(lcClasa, CHR(9) + "PROCEDURE do_scrie_factura" + CHR(13), CHR(9) + "ENDPROC") + IF EMPTY(lcMetoda) + DO Assert WITH .F., "nu s-a putut izola do_scrie_factura" + RETURN + ENDIF + DO AfLog WITH "DIAG: do_scrie_factura v" + TRANSFORM(tnVersiune) + " len=" + TRANSFORM(LEN(lcMetoda)) + lnApel = AT("scrie_legatura_proforma()", lcMetoda) + lnCommit = AT("Thisform.do_inchide_tranzactie(1)", lcMetoda) + DO Assert WITH lnApel > 0, "apelul e in do_scrie_factura, poz=" + TRANSFORM(lnApel) + DO Assert WITH lnCommit > 0, "do_inchide_tranzactie(1) prezent, poz=" + TRANSFORM(lnCommit) + IF lnApel > 0 AND lnCommit > 0 + DO Assert WITH lnApel < lnCommit, ; + "apelul e INAINTE de do_inchide_tranzactie(1), apel=" + TRANSFORM(lnApel) + ; + " commit=" + TRANSFORM(lnCommit) + ENDIF + lcSecventa = tcGarda + CHR(13) + CHR(10) + REPLICATE(CHR(9), 4) + "llReturn = scrie_legatura_proforma()" + DO Assert WITH lcSecventa $ lcMetoda, ; + "apelul e in ramura " + tcGarda + " (nu neconditionat)" +ENDPROC + +*---------------------------------------------------------------------------------------- +* felie de text intre un marcaj de start si primul marcaj de sfarsit de dupa el +FUNCTION Fereastra + LPARAMETERS tcTxt, tcStart, tcEnd + LOCAL lnStart, lnEnd + lnStart = AT(tcStart, tcTxt) + IF lnStart = 0 + RETURN "" + ENDIF + lnEnd = AT(tcEnd, SUBSTR(tcTxt, lnStart)) + IF lnEnd = 0 + RETURN "" + ENDIF + RETURN SUBSTR(tcTxt, lnStart, lnEnd + LEN(tcEnd) - 1) +ENDFUNC + +* corpul clasei frm_facturare_articole (tnVersiune = 1) sau frm_facturare_articole2 (tnVersiune = 2) +FUNCTION FereastraClasa + LPARAMETERS tcTxt, tnVersiune + LOCAL lnV1, lnV2 + lnV1 = AT("DEFINE CLASS frm_facturare_articole AS", tcTxt) + lnV2 = AT("DEFINE CLASS frm_facturare_articole2 AS", tcTxt) + IF lnV1 = 0 OR lnV2 = 0 OR lnV1 >= lnV2 + RETURN "" + ENDIF + IF tnVersiune = 1 + RETURN SUBSTR(tcTxt, lnV1, lnV2 - lnV1) + ENDIF + RETURN SUBSTR(tcTxt, lnV2) +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s5c_semnal_proforma.prg b/utile/Teste/facturare_unificat/test_s5c_semnal_proforma.prg new file mode 100644 index 0000000..8a4c32b --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s5c_semnal_proforma.prg @@ -0,0 +1,305 @@ +* test_s5c_semnal_proforma.prg +* Headless (-A -T): S5c, semnalul "sursa era proforma" pe oDateFactura (COMUN\programe\ofacturare_comun.prg) +* si pozitia apelului scrie_legatura_proforma() in frm_facturare_articole2.do_scrie_factura +* (COMUN\clase\ofacturare.vc2). +* A1 - completeaza_setari_document(sursa cu eproforma=1, .T.) seteaza lProformaSursa/nIdProformaSursa/listaid +* A2 - aceeasi cale cu eproforma=0 nu ridica semnalul +* A3 - Reset() curata semnalul (fara asta, al doilea document din aceeasi sesiune ar primi legatura falsa) +* A4 - sursa fara proprietatea eproforma: garda PEMSTATUS tine, fara eroare +* A5 - static: apelul scrie_legatura_proforma() e INAINTE de do_inchide_tranzactie(1) (deci inainte de COMMIT) +* A6 - static: apelul e in ramura If llReturn, nu neconditionat; cate o data in v1 si in v2 +* A7 - runtime: functia e vizibila si iese curat cand nu exista poDate +* A8 - runtime: cu lProformaSursa = .F. iese fara SQL +* A9 - runtime: garda Between pe nid_vanzare (ramas 9999999999) opreste apelul +* +* Nu emite documente, nu scrie in Oracle. Conexiunea Oracle se face doar pentru globalele de mediu +* (gnZileScadentaFact, gnDiscountEvidentiat) folosite de oDateFactura.Reset. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s5c_semnal_proforma.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_semnal_proforma.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s5c_semnal_proforma.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) +gnFail = 0 +gnPass = 0 +gnSarit = 0 +gcCaz = "" +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 +SQLSETPROP(gnHandle, "QueryTimeOut", 45) +IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle + SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45) +ENDIF +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "ENV OK" + +PRIVATE poDate +poDate = NULL + +DO TestSemnalCopiereProforma +DO TestSemnalCopiereNeproforma +DO TestResetCurataSemnal +DO TestSursaFaraEproforma +DO TestPozitieApelInaintePreCommit +DO TestApelCondionatSiNumaiInV2 +DO TestFunctieVizibilaFaraPoDate +DO TestFunctieIeseFaraSemnal +DO TestGardaNidVanzareInitial + +DO Final + +*---------------------------------------------------------------------------------------- +* obiect sursa echivalent cu SCATTER NAME loFactura MEMO din crsFacturi (campurile citite de +* completeaza_setari_document, ramura de copiere) +FUNCTION SursaCopiere + LPARAMETERS tnEProforma, tlFaraEproforma + LOCAL loSursa + loSursa = CREATEOBJECT('Empty') + AddProperty(loSursa, 'id_lucrare', 111) + AddProperty(loSursa, 'lucrare', 'LUCRARE TEST') + AddProperty(loSursa, 'id_sectie', 2) + AddProperty(loSursa, 'sectie', 'SECTIA 2') + AddProperty(loSursa, 'id_agent', 3) + AddProperty(loSursa, 'nume_agent', 'AGENT TEST') + AddProperty(loSursa, 'id_delegat', 4) + AddProperty(loSursa, 'delegat', 'DELEGAT TEST') + AddProperty(loSursa, 'BIdelegat', 'XX') + AddProperty(loSursa, 'CNPdelegat', '1234567890123') + AddProperty(loSursa, 'nrinmat', 'B00XYZ') + AddProperty(loSursa, 'id_masina', 5) + AddProperty(loSursa, 'id_vanzare', 4242424) + AddProperty(loSursa, 'serie_act', 'PRO') + AddProperty(loSursa, 'numar_act', 77) + AddProperty(loSursa, 'id_part', 6) + AddProperty(loSursa, 'client', 'CLIENT TEST') + IF !tlFaraEproforma + AddProperty(loSursa, 'eproforma', tnEProforma) + ENDIF + RETURN loSursa +ENDFUNC + +PROCEDURE TestSemnalCopiereProforma + LOCAL loSursa, loD + gcCaz = "[A1 copiere din proforma] " + loSursa = SursaCopiere(1, .F.) + loD = CREATEOBJECT('oDateFactura', 0, 5) + loD.completeaza_setari_document(loSursa, .T.) + DO Assert WITH loD.lProformaSursa = .T., "lProformaSursa = .T., e=" + TRANSFORM(loD.lProformaSursa) + DO Assert WITH loD.nIdProformaSursa = loSursa.id_vanzare, ; + "nIdProformaSursa = id_vanzare sursa (" + TRANSFORM(loSursa.id_vanzare) + "), e=" + TRANSFORM(loD.nIdProformaSursa) + DO Assert WITH loD.listaid = loSursa.id_vanzare, "listaid neatins de modificare, e=" + TRANSFORM(loD.listaid) + DO Assert WITH loD.lCopiere = .T., "lCopiere = .T. (ramura de copiere chiar s-a executat)" + RELEASE loD, loSursa +ENDPROC + +PROCEDURE TestSemnalCopiereNeproforma + LOCAL loSursa, loD + gcCaz = "[A2 copiere din document non-proforma] " + loSursa = SursaCopiere(0, .F.) + loD = CREATEOBJECT('oDateFactura', 0, 5) + loD.completeaza_setari_document(loSursa, .T.) + DO Assert WITH loD.lProformaSursa = .F., "lProformaSursa = .F., e=" + TRANSFORM(loD.lProformaSursa) + DO Assert WITH loD.nIdProformaSursa = 0, "nIdProformaSursa = 0, e=" + TRANSFORM(loD.nIdProformaSursa) + RELEASE loD, loSursa +ENDPROC + +PROCEDURE TestResetCurataSemnal + LOCAL loSursa, loD + gcCaz = "[A3 Reset curata semnalul] " + loSursa = SursaCopiere(1, .F.) + loD = CREATEOBJECT('oDateFactura', 0, 5) + loD.completeaza_setari_document(loSursa, .T.) + DO Assert WITH loD.lProformaSursa = .T., "preconditie: semnalul e ridicat inainte de Reset" + loD.Reset(5) + DO Assert WITH loD.lProformaSursa = .F., "dupa Reset lProformaSursa = .F., e=" + TRANSFORM(loD.lProformaSursa) + DO Assert WITH loD.nIdProformaSursa = 0, "dupa Reset nIdProformaSursa = 0, e=" + TRANSFORM(loD.nIdProformaSursa) + RELEASE loD, loSursa +ENDPROC + +PROCEDURE TestSursaFaraEproforma + LOCAL loSursa, loD, llEroare + gcCaz = "[A4 sursa fara proprietatea eproforma] " + loSursa = SursaCopiere(0, .T.) + loD = CREATEOBJECT('oDateFactura', 0, 5) + llEroare = .F. + TRY + loD.completeaza_setari_document(loSursa, .T.) + CATCH + llEroare = .T. + ENDTRY + DO Assert WITH !llEroare, "garda PEMSTATUS: nu se arunca eroare pe o sursa fara eproforma" + DO Assert WITH loD.lProformaSursa = .F., "lProformaSursa = .F., e=" + TRANSFORM(loD.lProformaSursa) + DO Assert WITH loD.nIdProformaSursa = 0, "nIdProformaSursa = 0, e=" + TRANSFORM(loD.nIdProformaSursa) + RELEASE loD, loSursa +ENDPROC + +* fereastra de text a metodei frm_facturare_articole2.do_scrie_factura: ancorata pe +* Thisform.marcheaza_linii_proforma() (apare o singura data in tot fisierul, doar in v2 - vezi +* test_s5b_proforma.prg) si terminata pe primul ENDPROC de dupa +FUNCTION FereastraDoScrieFactura + LPARAMETERS tcTxt + LOCAL lnStart, lnEnd + lnStart = AT("Thisform.marcheaza_linii_proforma()", tcTxt) + IF lnStart = 0 + RETURN "" + ENDIF + lnEnd = AT("ENDPROC", SUBSTR(tcTxt, lnStart)) + IF lnEnd = 0 + RETURN "" + ENDIF + RETURN SUBSTR(tcTxt, lnStart, lnEnd) +ENDFUNC + +PROCEDURE TestPozitieApelInaintePreCommit + LOCAL lcTxt, lcMetoda, lnApel, lnCommit + gcCaz = "[A5 static: apelul e inainte de COMMIT] " + lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2") + IF EMPTY(lcTxt) + DO Assert WITH .F., "FILETOSTR ofacturare.vc2 a esuat/gol" + RETURN + ENDIF + lcMetoda = FereastraDoScrieFactura(lcTxt) + IF EMPTY(lcMetoda) + DO Assert WITH .F., "nu s-a putut izola do_scrie_factura din frm_facturare_articole2" + RETURN + ENDIF + DO AfLog WITH "DIAG A5: fereastra do_scrie_factura len=" + TRANSFORM(LEN(lcMetoda)) + lnApel = AT("scrie_legatura_proforma()", lcMetoda) + lnCommit = AT("Thisform.do_inchide_tranzactie(1)", lcMetoda) + DO Assert WITH lnApel > 0, "scrie_legatura_proforma() apelat din do_scrie_factura, poz=" + TRANSFORM(lnApel) + DO Assert WITH lnCommit > 0, "do_inchide_tranzactie(1) prezent in metoda, poz=" + TRANSFORM(lnCommit) + IF lnApel > 0 AND lnCommit > 0 + DO Assert WITH lnApel < lnCommit, ; + "apelul e INAINTE de do_inchide_tranzactie(1) (aceeasi tranzactie), apel=" + TRANSFORM(lnApel) + ; + " commit=" + TRANSFORM(lnCommit) + ENDIF +ENDPROC + +PROCEDURE TestApelCondionatSiNumaiInV2 + LOCAL lcTxt, lcMetoda, lcSecventa + gcCaz = "[A6 static: apel conditionat, o data in v1 si o data in v2] " + lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2") + IF EMPTY(lcTxt) + DO Assert WITH .F., "FILETOSTR ofacturare.vc2 a esuat/gol" + RETURN + ENDIF + lcMetoda = FereastraDoScrieFactura(lcTxt) + IF EMPTY(lcMetoda) + DO Assert WITH .F., "nu s-a putut izola do_scrie_factura din frm_facturare_articole2" + RETURN + ENDIF + * linia de apel e precedata imediat de If llReturn - exact textul scris la write-back + lcSecventa = "If llReturn" + CHR(13) + CHR(10) + REPLICATE(CHR(9), 4) + "llReturn = scrie_legatura_proforma()" + DO Assert WITH lcSecventa $ lcMetoda, "apelul e in ramura If llReturn (nu neconditionat)" + DO Assert WITH OCCURS("scrie_legatura_proforma", lcTxt) = 2, ; + "scrie_legatura_proforma apare de doua ori in ofacturare.vc2 (v1 si v2), ocurente=" + ; + TRANSFORM(OCCURS("scrie_legatura_proforma", lcTxt)) + DO Assert WITH OCCURS("scrie_legatura_proforma", lcMetoda) = 1, ; + "unica ocurenta e chiar in do_scrie_factura din frm_facturare_articole2" +ENDPROC + +PROCEDURE TestFunctieVizibilaFaraPoDate + LOCAL llRez, llEroare + gcCaz = "[A7 runtime: functia e vizibila si iese curat cand poDate nu e obiect] " + poDate = NULL + llEroare = .F. + llRez = .F. + TRY + llRez = scrie_legatura_proforma() + CATCH + llEroare = .T. + ENDTRY + DO Assert WITH !llEroare, "scrie_legatura_proforma() e vizibila (SET PROCEDURE ofacturare_comun.prg)" + DO Assert WITH TYPE('poDate') <> 'O', "preconditie: Type('poDate') <> 'O', e=" + TYPE('poDate') + DO Assert WITH llRez = .T., "intoarce .T. cand poDate nu e obiect, e=" + TRANSFORM(llRez) +ENDPROC + +PROCEDURE TestFunctieIeseFaraSemnal + LOCAL llRez + gcCaz = "[A8 runtime: iese fara SQL cand lProformaSursa = .F.] " + poDate = CREATEOBJECT('oDateFactura', 0, 5) + poDate.lProformaSursa = .F. + poDate.nIdProformaSursa = 0 + poDate.nid_vanzare = 123456 + llRez = scrie_legatura_proforma() + DO Assert WITH llRez = .T., "intoarce .T. fara sa cheme Oracle, e=" + TRANSFORM(llRez) + poDate = NULL +ENDPROC + +PROCEDURE TestGardaNidVanzareInitial + LOCAL llRez, lnInainte + gcCaz = "[A9 runtime: garda Between pe nid_vanzare ramas 9999999999] " + poDate = CREATEOBJECT('oDateFactura', 0, 5) + poDate.lProformaSursa = .T. + poDate.nIdProformaSursa = 4242424 + DO Assert WITH poDate.nid_vanzare = 9999999999, ; + "preconditie: nid_vanzare are valoarea initiala, e=" + TRANSFORM(poDate.nid_vanzare) + lnInainte = NumarLegaturi(4242424) + llRez = scrie_legatura_proforma() + DO Assert WITH llRez = .T., "intoarce .T. (garda opreste apelul, nu il raporteaza ca eroare), e=" + TRANSFORM(llRez) + DO Assert WITH NumarLegaturi(4242424) = lnInainte, ; + "nu s-a scris nicio legatura pentru id fictiv, inainte=" + TRANSFORM(lnInainte) + ; + " dupa=" + TRANSFORM(NumarLegaturi(4242424)) + poDate = NULL +ENDPROC + +FUNCTION NumarLegaturi + LPARAMETERS tnIdProforma + LOCAL lcSql, lnRez + lnRez = -1 + lcSql = [select count(*) as nr from vanzari_coresp where tip = 4 and id_vanzare_aviz = ] + ; + ALLTRIM(STR(tnIdProforma, 20, 0)) + IF goExecutor.oExecute(lcSql, [crsnrleg]) >= 0 AND USED('crsnrleg') + lnRez = crsnrleg.nr + USE IN (SELECT('crsnrleg')) + ENDIF + RETURN lnRez +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s6_0_schela.prg b/utile/Teste/facturare_unificat/test_s6_0_schela.prg new file mode 100644 index 0000000..3a91ccc --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_0_schela.prg @@ -0,0 +1,139 @@ +*!* 01.09.2026 +*!* Headless: valideaza schela de comparatie S6-0 (lib_comparatie_documente.prg) pe perechea deja +*!* emisa de S5c - SSS 645 (id_vanzare 1111) si SSS 646 (id_vanzare 1112). NU emite nimic, doar +*!* SELECT. Verifica: jonctiunea serie_act+nract gaseste id_vanzare corect, CompDoc ruleaza toate +*!* cele patru comparatii fara eroare Oracle, iar cifrele raportate (linii VANZARI_DETALII, randuri +*!* ACT, RUL gol) corespund cu ce s-a verificat deja manual pe MARIUSM_AUTO. +*!* +*!* Cele doua documente nu sunt v1/v2 (unul copiat din proforma, unul de control, ambele pe v2) - +*!* CompDoc e asteptat sa raporteze FAIL-uri legitime; un FAIL legitim raportat corect e succes +*!* pentru aceasta proba. +*!* +*!* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_0_schela.prg" +*!* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_0_schela.log +*!* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_0_schela.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) +gnFail = 0 +gnPass = 0 +gnSarit = 0 +gcCaz = "" +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 +SQLSETPROP(gnHandle, "QueryTimeOut", 45) +IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle + SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45) +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) + +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE + +DO TestSchela + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE TestSchela + LOCAL nId1, nId2, nFailCompDoc + gcCaz = "[S6-0 schela SSS 645 vs SSS 646] " + + nId1 = CdocGasesteIdVanzare('SSS', 645) + nId2 = CdocGasesteIdVanzare('SSS', 646) + DO Assert WITH nId1 = 1111, "jonctiune serie_act+nract gaseste id_vanzare pt SSS 645, e=" + TRANSFORM(nId1) + DO Assert WITH nId2 = 1112, "jonctiune serie_act+nract gaseste id_vanzare pt SSS 646, e=" + TRANSFORM(nId2) + + nFailCompDoc = CompDoc('SSS', 645, 'SSS', 646, ALLTRIM(gcCaz)) + DO Assert WITH nFailCompDoc >= 0, "CompDoc a rulat fara eroare Oracle, esecuri raportate=" + TRANSFORM(nFailCompDoc) + DO AfLog WITH "CompDoc a intors esecuri=" + TRANSFORM(nFailCompDoc) + ; + " (documentele nu sunt v1/v2 - esecuri legitime asteptate, vezi raport)" + + DO VerificaLinii + DO VerificaAct + DO VerificaRul +ENDPROC + +PROCEDURE VerificaLinii + LOCAL n1, n2 + n1 = ValoareScalaraLocala([select count(*) as nr from vanzari_detalii where sters = 0 and id_vanzare = 1111]) + n2 = ValoareScalaraLocala([select count(*) as nr from vanzari_detalii where sters = 0 and id_vanzare = 1112]) + DO Assert WITH n1 = 2, "VANZARI_DETALII are 2 linii pe SSS 645 (id_vanzare 1111), e=" + TRANSFORM(n1) + DO Assert WITH n2 = 2, "VANZARI_DETALII are 2 linii pe SSS 646 (id_vanzare 1112), e=" + TRANSFORM(n2) +ENDPROC + +PROCEDURE VerificaAct + LOCAL n1, n2 + n1 = ValoareScalaraLocala([select count(*) as nr from act where sters = 0 and serie_act = 'SSS' and nract = 645]) + n2 = ValoareScalaraLocala([select count(*) as nr from act where sters = 0 and serie_act = 'SSS' and nract = 646]) + DO Assert WITH n1 = 4, "ACT are 4 randuri pe SSS 645, e=" + TRANSFORM(n1) + DO Assert WITH n2 = 4, "ACT are 4 randuri pe SSS 646, e=" + TRANSFORM(n2) +ENDPROC + +PROCEDURE VerificaRul + LOCAL n1, n2 + n1 = ValoareScalaraLocala([select count(*) as nr from rul where sters = 0 and serie_act = 'SSS' and nract = 645]) + n2 = ValoareScalaraLocala([select count(*) as nr from rul where sters = 0 and serie_act = 'SSS' and nract = 646]) + DO Assert WITH n1 = 0, "RUL gol pe SSS 645 (gnScadereStoc = 0), e=" + TRANSFORM(n1) + DO Assert WITH n2 = 0, "RUL gol pe SSS 646 (gnScadereStoc = 0), e=" + TRANSFORM(n2) +ENDPROC + +FUNCTION ValoareScalaraLocala + LPARAMETERS tcSql + LOCAL lnRez, lnSucces + lnRez = -1 + lnSucces = goExecutor.oExecute(tcSql, [crsverif]) + IF lnSucces >= 0 AND USED('crsverif') + IF RECCOUNT('crsverif') > 0 + SELECT crsverif + GO TOP + lnRez = NVL(crsverif.nr, 0) + ELSE + lnRez = 0 + ENDIF + USE IN (SELECT('crsverif')) + ELSE + DO AfLog WITH "SQL ESEC: " + TRANSFORM(goExecutor.oPrelucrareEroare()) + " | " + tcSql + ENDIF + RETURN lnRez +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s6_0_schela.ps1 b/utile/Teste/facturare_unificat/test_s6_0_schela.ps1 new file mode 100644 index 0000000..89e826e --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_0_schela.ps1 @@ -0,0 +1,28 @@ +$ErrorActionPreference = 'Stop' +$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat' +$prg = Join-Path $dir 'test_s6_0_schela.prg' +$log = Join-Path $dir 'out\test_s6_0_schela.log' +$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' + +$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_0_schela*' } +if ($viu) { + "Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua." + exit 1 +} + +Set-Location $dir +Remove-Item *.FXP, *.fxp -ErrorAction SilentlyContinue +Remove-Item $log -ErrorAction SilentlyContinue + +$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru +"lansat PID " + $p.Id +$null = $p.WaitForExit(240000) +if (-not $p.HasExited) { + "INCA RULEAZA dupa 240s - omor instanta (filtrat pe CommandLine)" + Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_0_schela*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force } +} +if (Test-Path $log) { + Get-Content $log | Select-String -Pattern '^(PASS|FAIL|REZUMAT|TOTAL|START|END|=====|ENV OK|ERROR|CompDoc)' +} else { + "Log inexistent: $log" +} diff --git a/utile/Teste/facturare_unificat/test_s6_1_lista_preturi.prg b/utile/Teste/facturare_unificat/test_s6_1_lista_preturi.prg new file mode 100644 index 0000000..61689f7 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_1_lista_preturi.prg @@ -0,0 +1,844 @@ +* test_s6_1_lista_preturi.prg +* VIZIBIL (grid): proba de paritate v1 vs v2 pe LISTA DE PRETURI (tip 1, tipdoc 5, seria SSS). +* Emite 2 documente REALE in MARIUSM_AUTO@ROA_CENTRAL, cu ACEEASI doua articole (id_articol, +* pret, proc_tvav) si aceeasi cantitate pe ambele forme, ca sa fie comparabile prin CompDoc. +* +* Traseul probat, verificat pe cod (nu presupus) - vezi PROCEDURE AsertiuniRutare: +* v1: incarca_cursor_articole() INAINTE de formular (ofacturare.prg:299, ca in factureaza()) -> +* crsarticole (candidati). Butonul VIU pentru tip 1 e But_urmator1 (caction = do_urmator, +* ofacturare.vc2:11389), care cheama Thisform.do_adauga_articol() (:14868) - tlImplicit=.F., +* care pentru un articol negestionabil arata modal frm_articol_factura (cantitate/pret) - +* interactiune reala, interzisa pe masina partajata (nicio tastare/click injectat). But_ +* urmator_tot1 (do_adauga_tot) NU e vizibil pentru tip 1 (Init nu-l aprinde la Inlist(poDate. +* tip,1,5,7,10), ofacturare.vc2:15275) - deci nu e o alternativa reala. +* OCOLIRE DECLARATA: se cheama Thisform.do_adauga_articol(.T.) direct - ACEEASI functie pe +* care do_urmator() o cheama, doar cu tlImplicit=.T. (parametrul pe care il foloseste si +* do_adauga_tot pentru alte tipuri) - pentru gnScadereStoc=0 asta NU arata niciun formular +* (ofacturare.vc2:13021-13029: ofrmadarticol=Createobject(...); If !tlImplicit ... Else +* poArticol=calculeaza_totaluri(poArticol) - ramura fara Show()). Cantitatea (zeroita de +* do_initializeaza_articol pentru tip 1, :13890) se scrie explicit dupa adaugare, ca pe v2. +* v2: tipul 1 e in llCautareInLinie (Inlist(poDate.tip,1,22,5,29,7,10,45), :19563) - do_incarca_ +* articole NU incarca nimic in masa. Liniile intra prin cautarea in grid: +* grd_factura.cDenumire.cCboDenumire.LostFocus / cCodMat.cboCodmat.LostFocus (:21647-21695) +* cheama Thisform.do_adauga_articol_cautat(loArticol, loArticol.cantitate) dupa ce combo-ul a +* gasit randul. Cautarea insasi (tastare in caseta) nu se poate automatiza fara input real +* injectat - se reproduce exact ce face handler-ul DUPA ce combo-ul a gasit randul: APPEND +* BLANK pe crsfactura + do_adauga_articol_cautat(loArticol, cantitate), tehnica validata la +* S5c (test_s5c_emitere_reala_ui.prg, AdaugaLiniiCautate). +* +* Mod VIZIBIL, prin vfp_ui_harness.ps1 (ca la S5c): fereastra reala, off-screen, fara input real +* injectat - doar apeluri de metode / Click() pe obiecte. FRM_ALTE_DATE (v1, .Show(1) neconditionat +* pentru tip <> 30, inainte_de_do_termin) se inchide cu do_termin(), NU Release() - condus de un +* Timer + driver, tiparul validat la S5c/S6-3. +* +* Rulare: powershell -ExecutionPolicy Bypass -File test_s6_1_lista_preturi.ps1 (timeout >= 600s) +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_1_lista_preturi.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167; +* gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat +PUBLIC gcUltimaSerie, gnUltimulNract, goDriverS61, gcClaseVazute +PUBLIC gcSyncDir, gcUILog, gnCantitateAleasa + +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_1_lista_preturi.log" +IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out") + MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out" +ENDIF +gcUILog = gcLog +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_s61\" +IF !DIRECTORY(gcSyncDir) + MD (gcSyncDir) +ENDIF +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog) +gnPass = 0 +gnFail = 0 +gnErr = 0 +gcCaz = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +gcUltimaSerie = "" +gnUltimulNract = 0 +gcClaseVazute = ";" +gcNumere = "" +gnCantitateAleasa = 2 +gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg" + +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE +DO HarnessInit + +*-- poDate & co. se declara SI se initializeaza la nivelul programului principal: metodele din .vcx +*-- le vad numai daca variabila exista deja pe stiva de sub ele (capcana platita la S8). +PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest +poDate = NULL +poGeneratorNumere = NULL +poDateGestiuneDest = NULL + +ON ERROR DO S61Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + *-- stub_verificare PRIMUL: "Do Form verificare" (ofacturare.vc2:14404 / :20126) rezolva la stub + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + + 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 S61Log WITH 'EROARE: conectare Oracle esuata' + DO S61Final + ENDIF + SQLSETPROP(gnHandle, "QueryTimeOut", 45) + DO S61Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE + SET PROCEDURE TO (gcMock) ADDITIVE + + IF !actualizeaza_optiuni_program() + DO S61Log WITH 'EROARE: actualizeaza_optiuni_program()' + DO S61Final + ENDIF + gnScadereStoc = 0 + gnFactSeturi = 0 + gnIdSucursala = 167 + goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]) + gnIdUtil = 8 + goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) + DO S61Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ; + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ; + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + + *-- cboTipFactura cere RowSource pe saft_tip_facturi la constructia formularului v2 + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + PUBLIC gdZiCurs + gdZiCurs = DataCursValid() + DO S61Log WITH ' zi_curs folosita pentru toate documentele: ' + DTOC(gdZiCurs) + + *-- driver + timer: FRM_ALTE_DATE (v1, .Show(1) neconditionat la inainte_de_do_termin) si + *-- formele modale MESSAGEBOX_FORM nu trec prin functia amessagebox - mock-ul nu le acopera. + *-- Tehnica validata la S5c/S6-3. + goDriverS61 = CREATEOBJECT('driverS61') + _SCREEN.AddObject('tmrS61', 'Timer') + _SCREEN.tmrS61.Interval = 200 + BINDEVENT(_SCREEN.tmrS61, 'Timer', goDriverS61, 'Executa') + _SCREEN.tmrS61.Enabled = .T. + DO S61Log WITH 'DIAG SET_PATH stub inca in fata: ' + FULLPATH('verificare.scx') + + DO HarnessStep WITH 0, 'env gata', 8 + + DO S61Log WITH CHR(13) + CHR(10) + '===== ALEGEREA A DOUA ARTICOLE (comune v1 si v2) =====' + IF !AlegeArticole() + DO Assert WITH .F., 'alegerea celor doua articole a esuat - vezi log' + DO S61Final + ENDIF + + DO S61Log WITH CHR(13) + CHR(10) + '===== RUTARE (structural, inainte de orice emitere) =====' + DO AsertiuniRutare + + LOCAL lnIdV1, lnIdV2, lcSer1, lnNr1, lcSer2, lnNr2 + STORE 0 TO lnIdV1, lnIdV2, lnNr1, lnNr2 + STORE '' TO lcSer1, lcSer2 + + DO S61Log WITH CHR(13) + CHR(10) + '===== EMITERE v1 (frm_facturare_articole) =====' + lnIdV1 = EmiteProtejat('v1') + lcSer1 = gcUltimaSerie + lnNr1 = gnUltimulNract + DO HarnessStep WITH 1, 'v1 emis', 8 + + DO S61Log WITH CHR(13) + CHR(10) + '===== EMITERE v2 (frm_facturare_articole2) =====' + lnIdV2 = EmiteProtejat('v2') + lcSer2 = gcUltimaSerie + lnNr2 = gnUltimulNract + DO HarnessStep WITH 2, 'v2 emis', 8 + + IF lnIdV1 > 0 AND lnIdV2 > 0 + DO S61Log WITH CHR(13) + CHR(10) + '===== CompDoc lista-preturi v1(' + lcSer1 + ' ' + TRANSFORM(lnNr1) + ; + ') vs v2(' + lcSer2 + ' ' + TRANSFORM(lnNr2) + ') =====' + DO Compara WITH lcSer1, lnNr1, lcSer2, lnNr2 + ELSE + DO Assert WITH .F., 'ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdV1) + ; + ' v2 id_vanzare=' + TRANSFORM(lnIdV2) + ')' + ENDIF + DO HarnessStep WITH 3, 'compdoc gata', 8 + + DO S61Final + +CATCH TO loExc + DO S61Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ; + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO S61Final +ENDTRY + +QUIT + +*================================================================================== +* Alegerea celor doua articole comune v1/v2: sonda cu incarca_cursor_articole (traseul real +* de pe v1), apoi TOP 2 negestionabile cu pret>0 si cota prezenta in jtva_coloane (evita orice +* dialog de confirmare cantitate pe v1). Rezultat: crsAleseS61 (2 randuri, READWRITE). +FUNCTION AlegeArticole + LOCAL loRez, lcStrategie + poDate = CREATEOBJECT("oDateFactura", 25000, 1) + poDate.id_client = 463 + poDate.id_delegat = 256 + poDate.zi_curs = gdZiCurs + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + + loRez = incarca_cursor_articole(1, .F., poGeneratorNumere) + DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'sonda: incarca_cursor_articole(1) a adus articole' + DO S61Log WITH ' sonda: crsarticole=' + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)') + IF !USED('crsarticole') OR RECCOUNT('crsarticole') = 0 + DO Goleste + RETURN .F. + ENDIF + + *-- jtva_coloane trebuie construit din jtva_coloane_temp INAINTE de orice JOIN pe el - altfel + *-- SELECT-ul de mai jos referentiaza un alias inexistent si VFP arata dialogul nativ "Look In" + *-- (fara eroare prinsa de ON ERROR, rulare atarnata - capcana gasita la S6-1) + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + *-- TOP 30 candidati, apoi se aleg in VFP primele doua cu id_articol DISTINCT (acelasi articol + *-- poate aparea de mai multe ori in crsarticole, o data per politica de pret) + DO Inchide WITH 'crsCandS61' + SELECT TOP 30 a.* FROM crsarticole a INNER JOIN jtva_coloane j ; + ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(NVL(a.proc_tvav,0), 2) ; + WHERE NVL(a.gestionabil,0) = 0 AND NVL(a.pret,0) > 0 ; + ORDER BY a.id_articol INTO CURSOR crsCandS61 READWRITE + lcStrategie = 'negestionabile cu cota in jtva_coloane' + IF RECCOUNT('crsCandS61') < 2 + DO Inchide WITH 'crsCandS61' + SELECT TOP 30 a.* FROM crsarticole a INNER JOIN jtva_coloane j ; + ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(NVL(a.proc_tvav,0), 2) ; + WHERE NVL(a.pret,0) > 0 ; + ORDER BY a.id_articol INTO CURSOR crsCandS61 READWRITE + lcStrategie = 'orice cu cota in jtva_coloane (gestionabile incluse)' + ENDIF + IF RECCOUNT('crsCandS61') < 2 + DO Inchide WITH 'crsCandS61' + SELECT TOP 30 * FROM crsarticole ORDER BY id_articol INTO CURSOR crsCandS61 READWRITE + lcStrategie = 'primele din lista (nicio potrivire de cota)' + ENDIF + + DO Inchide WITH 'crsAleseS61' + SELECT * FROM crsCandS61 WHERE .F. INTO CURSOR crsAleseS61 READWRITE + LOCAL lnUltimulId, loRowS61 + lnUltimulId = -1 + SELECT crsCandS61 + SCAN + IF id_articol <> lnUltimulId + SCATTER MEMO NAME loRowS61 + INSERT INTO crsAleseS61 FROM NAME loRowS61 + lnUltimulId = id_articol + ENDIF + IF RECCOUNT('crsAleseS61') >= 2 + EXIT + ENDIF + ENDSCAN + DO Inchide WITH 'crsCandS61' + DO Assert WITH RECCOUNT('crsAleseS61') = 2, 'doua articole DISTINCTE alese pentru S6-1, e=' + TRANSFORM(RECCOUNT('crsAleseS61')) + DO S61Log WITH ' strategie: ' + lcStrategie + SELECT crsAleseS61 + SCAN + DO S61Log WITH ' ales: id_articol=' + TRANSFORM(id_articol) + ' [' + ALLTRIM(TRANSFORM(denumire)) + ; + '] pret=' + TRANSFORM(pret) + ' proc_tvav=' + TRANSFORM(proc_tvav) + ' gestionabil=' + TRANSFORM(NVL(gestionabil,0)) + ENDSCAN + + DO Inchide WITH 'crsarticole' + DO Goleste + RETURN (RECCOUNT('crsAleseS61') = 2) +ENDFUNC + +*================================================================================== +* Rutarea, structural: butonul viu de pe fiecare forma si confirmarea ca tipul 1 e in +* llCautareInLinie pe v2 (deci NU e cablat pe do_incarca_articole). +PROCEDURE AsertiuniRutare + LOCAL lcTxt + gcCaz = '[RUTARE] ' + lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2") + IF EMPTY(lcTxt) + DO Assert WITH .F., 'FILETOSTR ofacturare.vc2 a esuat/gol' + RETURN + ENDIF + DO Assert WITH OCCURS("caction = do_urmator,", lcTxt) = 1, ; + 'un singur caction = do_urmator (butonul Adauga, viu pe v1 pentru tip 1)' + DO Assert WITH "Thisform.do_adauga_articol()" $ lcTxt, ; + 'do_urmator cheama Thisform.do_adauga_articol() - aceeasi functie apelata direct in test (tlImplicit=.T.)' + DO Assert WITH "Inlist(poDate.tip, 1, 22, 5, 29, 7, 10, 45)" $ lcTxt, ; + 'llCautareInLinie contine tipul 1 (v2 sare incarcarea in masa pentru lista de preturi)' + DO Assert WITH OCCURS("PROCEDURE grd_factura.cDenumire.cCboDenumire.LostFocus", lcTxt) = 1, ; + 'un singur handler cDenumire.cCboDenumire.LostFocus' + DO Assert WITH OCCURS("PROCEDURE grd_factura.cCodMat.cboCodmat.LostFocus", lcTxt) = 1, ; + 'un singur handler cCodMat.cboCodmat.LostFocus' + DO Assert WITH OCCURS("Thisform.do_adauga_articol_cautat(loArticol, loArticol.cantitate)", lcTxt) = 2, ; + 'ambele handlere de cautare in grid cheama do_adauga_articol_cautat(loArticol, loArticol.cantitate)' +ENDPROC + +*================================================================================== +* EmiteV1: traseul real de pe v1 pentru tip 1 - incarca_cursor_articole() inainte de formular, +* candidatii restransi la cele doua articole alese, apoi do_adauga_articol(.T.) - vezi ocolirea +* declarata in antetul fisierului. +FUNCTION EmiteV1 + LOCAL lnIdVz, lcSerie, lnNract, oform, loRez, lnI, lnFact + lnIdVz = 0 + lcSerie = '' + lnNract = 0 + gcUltimaSerie = '' + gnUltimulNract = 0 + gcCaz = '[lista-preturi-v1] ' + + DO CuratieCrs + poDate = CREATEOBJECT("oDateFactura", 25000, 1) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + poDate.nIdTipDoc = 5 + poDate.id_client = 463 + poDate.id_delegat = 256 + poDate.zi_curs = gdZiCurs + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + DO Assert WITH poDate.rezultat_serii = 3, 'v1: rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii) + IF poDate.rezultat_serii <> 3 + DO Goleste + RETURN 0 + ENDIF + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + DO S61Log WITH ' v1: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ; + ' nract=' + TRANSFORM(poDate.nract) + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + *-- traseul real: incarca_cursor_articole (ofacturare.prg:299, apelul din factureaza() pe v1); + *-- functia isi creeaza singura crsfactura (:544) + loRez = incarca_cursor_articole(1, .F., poGeneratorNumere) + DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'v1: incarca_cursor_articole a adus articole' + IF !((loRez.nSucces >= 0) AND loRez.lArticole) + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v1, fara articole);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Goleste + RETURN 0 + ENDIF + + *-- inlocuiesc candidatii proaspat incarcati cu EXACT cele doua randuri alese in AlegeArticole + *-- (acelasi id_pol/pret/proc_tvav ca pe v2) - filtrarea pe DOAR id_articol nu ajunge, acelasi + *-- articol poate aparea de mai multe ori in crsarticole (o data per politica de pret): masurat, + *-- 9 randuri in loc de 2, capcana gasita la S6-1 (prima rulare a produs 9 linii pe v1) + USE IN crsarticole + SELECT * FROM crsAleseS61 INTO CURSOR crsarticole READWRITE + DO Assert WITH RECCOUNT('crsarticole') = 2, 'v1: cele doua articole alese gasite in crsarticole, e=' + TRANSFORM(RECCOUNT('crsarticole')) + + oform = CREATEOBJECT('frm_facturare_articole') + IF VARTYPE(oform) <> 'O' + DO Assert WITH .F., 'v1: Createobject frm_facturare_articole' + DO Goleste + RETURN 0 + ENDIF + oform.WindowType = 0 + oform.Show() + DOEVENTS FORCE + + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + DO Assert WITH LOWER(ALLTRIM(oform.but_urmator1.cAction)) == 'do_urmator', 'v1: butonul Adauga duce la do_urmator' + DO Assert WITH oform.but_urmator1.Visible, 'v1: butonul Adauga e VIZIBIL pentru tip 1' + + *-- ocolire declarata (vezi antetul fisierului): do_adauga_articol(.T.) direct, in loc de + *-- but_urmator1.Click() -> do_urmator() -> do_adauga_articol() cu modal frm_articol_factura + FOR lnI = 1 TO RECCOUNT('crsarticole') + SELECT crsarticole + GO lnI + oform.do_adauga_articol(.T.) + ENDFOR + DOEVENTS FORCE + + lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) + DO S61Log WITH ' v1: dupa adaugare crsfactura=' + TRANSFORM(lnFact) + DO Assert WITH lnFact = 2, 'v1: crsfactura are exact 2 linii dupa adaugare, e=' + TRANSFORM(lnFact) + IF lnFact = 0 + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v1, fara linii);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Elibereaza WITH oform + DO Goleste + RETURN 0 + ENDIF + + *-- do_initializeaza_articol zeroeste cantitatea pentru tip 1 (ofacturare.vc2:13890) - se + *-- seteaza explicit, la fel ca pe v2, ca documentele sa fie comparabile + DO SeteazaCantitati WITH 'crsfactura' + + oform.do_calculeaza_totaluri() + DOEVENTS FORCE + + lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act)) + lnNract = poDate.nract + + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + DO S61Log WITH ' v1: [pas] but_termin1.Click' + oform.but_termin1.Click() + DOEVENTS FORCE + DO S61Log WITH ' v1: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + DO S61Log WITH ' v1: apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + + lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract) + IF lnIdVz < 0 + lnIdVz = 0 + ENDIF + DO Assert WITH lnIdVz > 0, 'v1: documentul exista in VANZARI (serie_act+numar_act), e=' + TRANSFORM(lnIdVz) + + IF lnIdVz > 0 + gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (v1);' + ELSE + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (v1, nescris);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + lcSerie = '' + lnNract = 0 + ENDIF + + DO Elibereaza WITH oform + DO Goleste + gcUltimaSerie = lcSerie + gnUltimulNract = lnNract + RETURN lnIdVz +ENDFUNC + +*================================================================================== +* EmiteV2: traseul real de pe v2 pentru tip 1 - crsfactura gol inainte de formular, apoi +* APPEND BLANK + do_adauga_articol_cautat per articol (reproduce exact handler-ul grid-ului, +* vezi antetul fisierului si AsertiuniRutare). +FUNCTION EmiteV2 + LOCAL lnIdVz, lcSerie, lnNract, oform, loArticol, lnAdaugate, llOk, lnFact + lnIdVz = 0 + lcSerie = '' + lnNract = 0 + gcUltimaSerie = '' + gnUltimulNract = 0 + gcCaz = '[lista-preturi-v2] ' + + DO CuratieCrs + poDate = CREATEOBJECT("oDateFactura", 25000, 1) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + poDate.nIdTipDoc = 5 + poDate.id_client = 463 + poDate.id_delegat = 256 + poDate.zi_curs = gdZiCurs + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + DO Assert WITH poDate.rezultat_serii = 3, 'v2: rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii) + IF poDate.rezultat_serii <> 3 + DO Goleste + RETURN 0 + ENDIF + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + DO S61Log WITH ' v2: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ; + ' nract=' + TRANSFORM(poDate.nract) + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + *-- v2: crsfactura gol INAINTE de formular (ca in factureaza(), ramura llFacturareNoua) + DO PregatesteFacturaCrs + + oform = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(oform) <> 'O' + DO Assert WITH .F., 'v2: Createobject frm_facturare_articole2' + DO Goleste + RETURN 0 + ENDIF + oform.WindowType = 0 + oform.Show() + DOEVENTS FORCE + + lnAdaugate = 0 + llOk = .F. + SELECT crsAleseS61 + GO TOP + SCAN + SCATTER NAME loArticol MEMO + SELECT crsfactura + APPEND BLANK + llOk = .F. + TRY + llOk = oform.do_adauga_articol_cautat(loArticol, NVL(loArticol.cantitate, 1)) + CATCH TO loExcAd + DO S61Log WITH ' v2: do_adauga_articol_cautat CATCH ' + TRANSFORM(loExcAd.ErrorNo) + ' ' + loExcAd.Message + ENDTRY + IF llOk + lnAdaugate = lnAdaugate + 1 + ELSE + SELECT crsfactura + IF !EOF() AND !BOF() + DELETE + ENDIF + ENDIF + SELECT crsAleseS61 + ENDSCAN + DOEVENTS FORCE + DO S61Log WITH ' v2: linii adaugate prin do_adauga_articol_cautat=' + TRANSFORM(lnAdaugate) + DO Assert WITH lnAdaugate = 2, 'v2: cele doua articole adaugate prin do_adauga_articol_cautat, e=' + TRANSFORM(lnAdaugate) + + lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) + DO Assert WITH lnFact = 2, 'v2: crsfactura are exact 2 linii, e=' + TRANSFORM(lnFact) + IF lnFact = 0 + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v2, fara linii);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Elibereaza WITH oform + DO Goleste + RETURN 0 + ENDIF + + DO SeteazaCantitati WITH 'crsfactura' + + oform.do_calculeaza_totaluri() + DOEVENTS FORCE + + lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act)) + lnNract = poDate.nract + + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + DO S61Log WITH ' v2: [pas] but_termin1.Click' + oform.but_termin1.Click() + DOEVENTS FORCE + DO S61Log WITH ' v2: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + DO S61Log WITH ' v2: apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + + lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract) + IF lnIdVz < 0 + lnIdVz = 0 + ENDIF + DO Assert WITH lnIdVz > 0, 'v2: documentul exista in VANZARI (serie_act+numar_act), e=' + TRANSFORM(lnIdVz) + + IF lnIdVz > 0 + gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (v2);' + ELSE + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (v2, nescris);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + lcSerie = '' + lnNract = 0 + ENDIF + + DO Elibereaza WITH oform + DO Goleste + gcUltimaSerie = lcSerie + gnUltimulNract = lnNract + RETURN lnIdVz +ENDFUNC + +*================================================================================== +* Seteaza cantitatea (zeroita de do_initializeaza_articol pentru tip 1) pe toate liniile din +* crsfactura si recalculeaza linia, ca la S5c (AdaugaLiniiCautate). +PROCEDURE SeteazaCantitati + LPARAMETERS tcAlias + LOCAL loArt + SELECT (tcAlias) + SCAN + REPLACE cantitate WITH gnCantitateAleasa + SCATTER NAME loArt MEMO + loArt = calculeaza_totaluri(loArt) + GATHER NAME loArt MEMO + ENDSCAN +ENDPROC + +*================================================================================== +* Izolarea unei emiteri: o exceptie intr-un caz nu trebuie sa opreasca restul suitei. +FUNCTION EmiteProtejat + LPARAMETERS tcForma + LOCAL lnRez, lnI + lnRez = 0 + TRY + IF tcForma == 'v1' + lnRez = EmiteV1() + ELSE + lnRez = EmiteV2() + ENDIF + CATCH TO loExcEm + DO S61Log WITH ' EXCEPTIE in ' + tcForma + ': ErrorNo=' + TRANSFORM(loExcEm.ErrorNo) + ; + ' Message=' + loExcEm.Message + ' Proc=' + loExcEm.Procedure + ':' + TRANSFORM(loExcEm.LineNo) + ; + ' [' + TRANSFORM(loExcEm.LineContents) + ']' + DO Assert WITH .F., tcForma + ': emiterea a mers pana la capat fara exceptie (ErrorNo=' + ; + TRANSFORM(loExcEm.ErrorNo) + ')' + lnRez = 0 + gcUltimaSerie = '' + gnUltimulNract = 0 + TRY + goExecutor.oExecute("ROLLBACK") + CATCH + ENDTRY + TRY + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + ; + TRANSFORM(poDate.nract) + ' (' + tcForma + ', dupa exceptie);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + CATCH + ENDTRY + FOR lnI = _SCREEN.FormCount TO 1 STEP -1 + TRY + _SCREEN.Forms(lnI).Release() + CATCH + ENDTRY + ENDFOR + DO CuratieCrs + DO Goleste + ENDTRY + RETURN lnRez +ENDFUNC + +*================================================================================== +PROCEDURE Compara + LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2 + LOCAL nFail + gcCaz = '[CompDoc lista-preturi] ' + nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-1 lista-preturi v1(' + TRANSFORM(tnNr1) + ') vs v2(' + TRANSFORM(tnNr2) + ')') + DO Assert WITH nFail >= 0, 'CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail) + DO S61Log WITH ' CompDoc esecuri totale=' + TRANSFORM(nFail) +ENDPROC + +*================================================================================== +* crsfactura + coloana "gestiune" ceruta de coloana combo a grilei pe v2 +PROCEDURE PregatesteFacturaCrs + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp +ENDPROC + +PROCEDURE Elibereaza + LPARAMETERS toForm + IF TYPE('toForm') = 'O' AND !ISNULL(toForm) + TRY + toForm.Release() + CATCH + ENDTRY + ENDIF + DO CuratieCrs +ENDPROC + +PROCEDURE Goleste + poDate = NULL + poGeneratorNumere = NULL + poDateGestiuneDest = NULL +ENDPROC + +PROCEDURE CuratieCrs + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticoleSel' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'jtva_coloane' +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +* "SSS 645" - forma in care poDate.descriere se compune in productie +FUNCTION NumarDoc + LPARAMETERS tcSerie, tnNumar + LOCAL lcS + lcS = ALLTRIM(NVL(tcSerie, '')) + RETURN ALLTRIM(IIF(EMPTY(lcS), '', lcS + ' ') + ALLTRIM(STR(NVL(tnNumar, 0), 20, 0))) +ENDFUNC + +* ultima zi din luna deschisa acoperita de VCURS pentru EURO - cursor_preturi refuza o zi fara curs +FUNCTION DataCursValid + LOCAL ldRez, lcSql, lnQ, lcUltima + ldRez = DATE(gnAn, gnLuna, 1) + lcUltima = TRANSFORM(gnAn) + PADL(TRANSFORM(gnLuna), 2, '0') + '01' + IF USED('crscurszi') + USE IN crscurszi + ENDIF + lcSql = [select to_char(max(data),'YYYYMMDD') as d from vcurs ] + ; + [where upper(nume_val) = 'EURO' and data <= last_day(to_date('] + lcUltima + [','YYYYMMDD'))] + lnQ = goExecutor.oExecute(lcSql, 'crscurszi') + IF lnQ >= 0 AND USED('crscurszi') AND RECCOUNT('crscurszi') > 0 + GO TOP IN crscurszi + IF !ISNULL(crscurszi.d) AND LEN(ALLTRIM(crscurszi.d)) = 8 + ldRez = CTOD(SUBSTR(crscurszi.d,7,2) + '/' + SUBSTR(crscurszi.d,5,2) + '/' + SUBSTR(crscurszi.d,1,4)) + ENDIF + ELSE + DO S61Log WITH ' DataCursValid ESEC: ' + goExecutor.oPrelucrareEroare() + ENDIF + IF USED('crscurszi') + USE IN crscurszi + ENDIF + RETURN ldRez +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO S61Log WITH 'PASS: ' + gcCaz + tcMsg + ELSE + gnFail = gnFail + 1 + DO S61Log WITH 'FAIL: ' + gcCaz + tcMsg + ENDIF +ENDPROC + +PROCEDURE S61Log + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE S61Err + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnErr = gnErr + 1 + DO S61Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE S61Final + LOCAL lnI + IF TYPE('_SCREEN.tmrS61') = 'O' + _SCREEN.tmrS61.Enabled = .F. + TRY + _SCREEN.RemoveObject('tmrS61') + CATCH + ENDTRY + ENDIF + *-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (rulare atarnata), + *-- deci se inchid explicit inainte + FOR lnI = _SCREEN.FormCount TO 1 STEP -1 + TRY + _SCREEN.Forms(lnI).Release() + CATCH + ENDTRY + ENDFOR + *-- registrul numerelor SSS direct din baza: singura sursa care spune care numar e SCRIS si + *-- care e ARS (alocat si nescris) + TRY + IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ; + [where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 750 order by numar_act], 'crsNrSSS') >= 0 + DO S61Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-750):' + SELECT crsNrSSS + SCAN + DO S61Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ENDSCAN + USE IN crsNrSSS + ENDIF + CATCH + ENDTRY + DO S61Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere + DO S61Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr) + DO S61Log WITH 'END ' + TTOC(DATETIME()) + DO HarnessDone WITH 'done' + QUIT +ENDPROC + +*================================================================================== +* driverS61: apasa automat pe formele modale care nu trec prin functia amessagebox - +* MESSAGEBOX_FORM (cmdYes/cmdOk) si FRM_ALTE_DATE de pe v1 (do_termin, NU Release). +* Garda de reintrare lBusy: do_termin cedeaza controlul buclei de mesaje. +DEFINE CLASS driverS61 AS Custom + nUltimAlteDate = 0 + lBusy = .F. + + PROCEDURE Executa + IF This.lBusy + RETURN + ENDIF + This.lBusy = .T. + IF TYPE('_SCREEN.tmrS61') = 'O' + _SCREEN.tmrS61.Enabled = .F. + ENDIF + TRY + LOCAL lnI, loMsgForm, loAlteDate, lcClasa + loMsgForm = NULL + loAlteDate = NULL + FOR lnI = 1 TO _SCREEN.FormCount + lcClasa = UPPER(_SCREEN.Forms(lnI).Class) + IF 'MESSAGEBOX_FORM' $ lcClasa + loMsgForm = _SCREEN.Forms(lnI) + ENDIF + IF lcClasa == 'FRM_ALTE_DATE' + loAlteDate = _SCREEN.Forms(lnI) + ENDIF + IF !(lcClasa $ gcClaseVazute) + gcClaseVazute = gcClaseVazute + lcClasa + ';' + DO S61Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' + ENDIF + ENDFOR + IF !ISNULL(loMsgForm) + TRY + LOCAL lcTextMsg + lcTextMsg = '' + TRY + lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value)) + CATCH + ENDTRY + DO S61Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']' + DO CASE + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) + DO S61Log WITH ' [driver msg] apas cmgBotones.cmdYes' + loMsgForm.cmgBotones.cmdYes.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) + DO S61Log WITH ' [driver msg] apas cmgBotones.cmdOk' + loMsgForm.cmgBotones.cmdOk.Click() + ENDCASE + CATCH TO loExcMsg + DO S61Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message + ENDTRY + ELSE + IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1) + This.nUltimAlteDate = SECONDS() + TRY + DO S61Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ; + TRANSFORM(NVL(poDate.id_delegat, 0)) + ')' + loAlteDate.do_termin() + CATCH TO loExcAD + DO S61Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message + ENDTRY + ENDIF + ENDIF + CATCH TO loExcTop + DO S61Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message + FINALLY + IF TYPE('_SCREEN.tmrS61') = 'O' + _SCREEN.tmrS61.Enabled = .T. + ENDIF + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_unificat/test_s6_1_lista_preturi.ps1 b/utile/Teste/facturare_unificat/test_s6_1_lista_preturi.ps1 new file mode 100644 index 0000000..d359722 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_1_lista_preturi.ps1 @@ -0,0 +1,16 @@ +# test_s6_1_lista_preturi.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru +# test_s6_1_lista_preturi.prg (S6-1, paritate v1 vs v2 pe lista de preturi, tip 1). +# Rulare VIZIBILA (vfp9 -A, fereastra impinsa off-screen de harness), NU -A -T: sub -A -T +# coloanele de grid nu se materializeaza. +# Rulare: powershell -ExecutionPolicy Bypass -File test_s6_1_lista_preturi.ps1 (timeout >= 600s) +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +Get-ChildItem -Path $Teste -Filter '*.FXP' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue +Get-ChildItem -Path $Teste -Filter '*.fxp' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_s6_1_lista_preturi.prg') ` + -Steps @('env_gata','v1_emis','v2_emis','compdoc_gata') ` + -StepTimeoutSec 120 ` + -ReadyTimeoutSec 180 ` + -SyncDir (Join-Path $Teste 'uisync_s61') ` + -ShotsDir (Join-Path $Teste 'screenshots_s61') diff --git a/utile/Teste/facturare_unificat/test_s6_2_comanda_contract.prg b/utile/Teste/facturare_unificat/test_s6_2_comanda_contract.prg new file mode 100644 index 0000000..6387f1c --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_2_comanda_contract.prg @@ -0,0 +1,669 @@ +* test_s6_2_comanda_contract.prg +* Headless: proba de paritate v1 vs v2 pe doua surse care trec prin incarcare in masa +* (do_incarca_articole / incarca_cursor_articole): COMANDA (tip 3) si CONTRACT (tip 2). +* Emite 4 documente REALE in Oracle (MARIUSM_AUTO@ROA_CENTRAL, tipdoc 5, seria SSS): +* comanda v1 (frm_facturare_articole) <- listaid 2479 (client FETCU RELU, 3 linii) +* comanda v2 (frm_facturare_articole2) <- listaid 2478 (client BALOI IRINA, 9 linii) +* contract v1 (frm_facturare_articole) <- listaid 20 (client ABC PLOIESTI, 4 articole) +* contract v2 (frm_facturare_articole2) <- listaid 222 (client ABSOLUT SRL, 3 articole) +* Surse diferite intre v1 si v2 (nu aceeasi comanda/contract de doua ori) - o comanda/un contract +* se marcheaza facturat la prima emitere, deci reemiterea pe v2 din aceeasi sursa ar da 0 articole. +* Comparatia foloseste schela lib_comparatie_documente.prg (CompDoc), plus o comparatie separata +* pe campurile de CONFIGURATIE (nu depind de sursa: TIP, IN_VALUTA, ID_VALUTA, MULTIPLICATOR, +* DISCOUNT_EVIDENTIAT, TVA_INCASARE, TIP_FACTURA, TIP_SAFT, COEFICIENT_K) - acestea trebuie sa fie +* identice v1/v2 chiar daca sursele difera; diferentele de VANZARI_DETALII/ACT legate de sursa +* (cantitati, client, id_gestiune) sunt asteptate si se argumenteaza in raport, nu se raporteaza +* ca esecuri. +* +* Transferul crsarticole -> crsfactura foloseste do_adauga_tot() pe ambele formulare: +* - pe v1 e calea reala (butonul "Adauga tot" e cablat, caction = do_adauga_tot); +* - pe v2 metoda EXISTA in cod dar NU are niciun caction/buton care s-o declanseze (cod mort, +* confirmat deja pentru lista de preturi in S6-0/3.1 - aici se confirma ca acelasi lucru e +* valabil si pentru comanda/contract). Vezi AsertiuniRutare si raportul. +* mock_amessagebox.prg neutralizeaza aMessageBox-ul din bucla do_adauga_tot ("ati selectat toata +* cantitatea?") - pe contract (tip 2), crsarticole.cantitate nu se decrementeaza cu gnScadereStoc=0 +* (do_initializeaza_articol zeroeste doar copia scatter-uita, nu cursorul sursa), deci acel dialog +* ar aparea o data per linie fara mock. +* +* FRM_ALTE_DATE (numai pe v1, deschis neconditionat de frm_facturare_articole.inainte_de_do_termin, +* ofacturare.vc2:15076) refuza sa se inchida cat timp poDate.id_delegat e gol +* (ferestre_cere_date.vc2:3073) - se precompleteaza poDate.id_delegat=39 (delegat real din +* vnom_delegati, MARIUSM_AUTO) identic pe v1 si v2, iar driverul apasa Termin +* (loForm.do_termin()), nu Release() - Release() ar sari peste scrierea lui poDate.ntip_incasare. +* gnFactSeturi=0 elimina FRM_ARTICOLE_COMPUSE (ofacturare.vc2:15028). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_2_comanda_contract.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_2_comanda_contract.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8; gnIdSucursala = 167; gnScadereStoc = 0; gnFactSeturi = 0. + +SET SAFETY OFF +SET TALK OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog, gnPass, gnFail, gcCaz, gcUltimaSerie, gnUltimulNract +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_2_comanda_contract.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) +gnPass = 0 +gnFail = 0 +gcCaz = "" + +ON ERROR DO S62Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + *-- stub_verificare PRIMUL (SET PATH plain) - "Do Form verificare" (ofacturare.vc2:14404/:20126) + *-- rezolva la stub, nu la formularul real (tehnica validata in test_s3b_emitere_reala.prg) + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + + 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 S62Log WITH 'EROARE: conectare Oracle esuata' + DO S62Final + ENDIF + DO S62Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + SQLSETPROP(gnHandle, "QueryTimeOut", 45) + + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE + *-- mock amessagebox: la nume duplicat castiga fisierul deschis cel mai recent - se incarca ULTIM + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg" ADDITIVE + + PUBLIC gcMockUltimMesaj, gnMockUltimTip + gcMockUltimMesaj = '' + gnMockUltimTip = 0 + + IF !actualizeaza_optiuni_program() + DO S62Log WITH 'EROARE: actualizeaza_optiuni_program()' + DO S62Final + ENDIF + gnScadereStoc = 0 + gnFactSeturi = 0 + gnIdSucursala = 167 + goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]) + gnIdUtil = 8 + goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) + DO S62Log WITH 'actualizeaza_optiuni_program OK, gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ; + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + + *-- cboTipFactura (frm_facturare_articole2) cere RowSource pe saft_tip_facturi la constructie + *-- (tehnica validata in test_s4_3_neregresie_masa.prg) + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + *-- driver+timer: unele confirmari (ex. "Doriti sa se inchida comanda?" pe tip=3) folosesc o + *-- forma modala MESSAGEBOX_FORM, nu functia amessagebox() - mock_amessagebox nu le acopera. + *-- Tehnica validata in test_s3b_emitere_reala.prg: un Timer pe _SCREEN scaneaza _SCREEN.Forms + *-- si apasa automat cmdYes/cmdOk, ca raspunsul implicit "Da" al utilizatorului. + PUBLIC goDriverMsg, gcClaseVazuteS62 + gcClaseVazuteS62 = ';' + goDriverMsg = CREATEOBJECT('driverMessageboxForm') + _SCREEN.AddObject('tmrS62Msg', 'Timer') + _SCREEN.tmrS62Msg.Interval = 200 + BINDEVENT(_SCREEN.tmrS62Msg, 'Timer', goDriverMsg, 'Executa') + _SCREEN.tmrS62Msg.Enabled = .T. + DO S62Log WITH 'driver MESSAGEBOX_FORM + timer pregatiti' + + *-- dovada ca stubul verificare ramane in fata dupa tot setup-ul, la momentul emiterii + DO S62Log WITH 'DIAG SET_PATH=' + SET('PATH') + DO S62Log WITH 'DIAG FULLPATH_VERIFICARE=' + FULLPATH('verificare.scx') + + LOCAL lnIdVzC1, lcSerieC1, lnNractC1, lnIdVzC2, lcSerieC2, lnNractC2 + LOCAL lnIdVzT1, lcSerieT1, lnNractT1, lnIdVzT2, lcSerieT2, lnNractT2 + lnIdVzC1 = 0 + lnIdVzC2 = 0 + lnIdVzT1 = 0 + lnIdVzT2 = 0 + lcSerieC1 = '' + lcSerieC2 = '' + lcSerieT1 = '' + lcSerieT2 = '' + lnNractC1 = 0 + lnNractC2 = 0 + lnNractT1 = 0 + lnNractT2 = 0 + + DO S62Log WITH CHR(13) + CHR(10) + '===== EMITERE COMANDA (tip 3) - v1 listaid=2479, v2 listaid=2478 =====' + lnIdVzC1 = EmiteMasa(3, 2479, .F., 'comanda-v1') + lcSerieC1 = gcUltimaSerie + lnNractC1 = gnUltimulNract + lnIdVzC2 = EmiteMasa(3, 2478, .T., 'comanda-v2') + lcSerieC2 = gcUltimaSerie + lnNractC2 = gnUltimulNract + + DO S62Log WITH CHR(13) + CHR(10) + '===== EMITERE CONTRACT (tip 2) - v1 listaid=20, v2 listaid=222 =====' + lnIdVzT1 = EmiteMasa(2, 20, .F., 'contract-v1') + lcSerieT1 = gcUltimaSerie + lnNractT1 = gnUltimulNract + lnIdVzT2 = EmiteMasa(2, 222, .T., 'contract-v2') + lcSerieT2 = gcUltimaSerie + lnNractT2 = gnUltimulNract + + DO S62Log WITH CHR(13) + CHR(10) + '===== ASERTIUNI STATICE DE RUTARE (ce probeaza / ce nu probeaza acest test) =====' + DO AsertiuniRutare + + IF lnIdVzC1 > 0 AND lnIdVzC2 > 0 + DO S62Log WITH CHR(13) + CHR(10) + '===== CompDoc COMANDA v1(' + TRANSFORM(lcSerieC1) + ' ' + TRANSFORM(lnNractC1) + ; + ') vs v2(' + TRANSFORM(lcSerieC2) + ' ' + TRANSFORM(lnNractC2) + ') =====' + DO CompareazaSurse WITH lcSerieC1, lnNractC1, lcSerieC2, lnNractC2, 'comanda' + ELSE + DO Assert WITH .F., 'comanda: ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdVzC1) + ' v2 id_vanzare=' + TRANSFORM(lnIdVzC2) + ')' + ENDIF + + IF lnIdVzT1 > 0 AND lnIdVzT2 > 0 + DO S62Log WITH CHR(13) + CHR(10) + '===== CompDoc CONTRACT v1(' + TRANSFORM(lcSerieT1) + ' ' + TRANSFORM(lnNractT1) + ; + ') vs v2(' + TRANSFORM(lcSerieT2) + ' ' + TRANSFORM(lnNractT2) + ') =====' + DO CompareazaSurse WITH lcSerieT1, lnNractT1, lcSerieT2, lnNractT2, 'contract' + ELSE + DO Assert WITH .F., 'contract: ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdVzT1) + ' v2 id_vanzare=' + TRANSFORM(lnIdVzT2) + ')' + ENDIF + + DO S62Final + +CATCH TO loExc + DO S62Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ; + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO S62Final +ENDTRY + +QUIT + +*================================================================================== +* EmiteMasa: emite un document REAL prin incarcare in masa (comanda/contract), pe forma indicata. +* Intoarce id_vanzare (0 daca emiterea a esuat); serie_act/nract se intorc prin gcUltimaSerie/ +* gnUltimulNract (variabile PUBLIC, citite de apelant imediat dupa apel). +FUNCTION EmiteMasa + LPARAMETERS tnTip, tnListaId, tlFormNou, tcEticheta + LOCAL tnIdVz, tcSerieAct, tnNract + tnIdVz = 0 + tcSerieAct = '' + tnNract = 0 + gcUltimaSerie = '' + gnUltimulNract = 0 + + PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest + LOCAL loSursa, lnIdSet, oform, llOk, loRez, lnScris + + DO S62Log WITH '--- ' + tcEticheta + ' (tip=' + TRANSFORM(tnTip) + ' listaid=' + TRANSFORM(tnListaId) + ; + ', forma=' + IIF(tlFormNou, 'NOUA (v2)', 'VECHE (v1)') + ') ---' + + IF tnTip = 3 + loSursa = CreeazaSursaComanda(tnListaId) + ELSE + loSursa = CreeazaSursaContract(tnListaId) + ENDIF + IF ISNULL(loSursa) + DO Assert WITH .F., tcEticheta + ': sursa reala citita din Oracle pentru listaid=' + TRANSFORM(tnListaId) + RETURN 0 + ENDIF + DO Assert WITH .T., tcEticheta + ': sursa reala citita, id_part=' + TRANSFORM(loSursa.id_part) + + lnIdSet = 25000 + tnTip - 1 + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip, loSursa) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + + *-- delegat real (vnom_delegati, MARIUSM_AUTO), identic pe v1 si v2: fara el + *-- frm_alte_date.inainte_de_do_termin (ferestre_cere_date.vc2:3073) respinge la infinit + poDate.id_delegat = 39 + DO Assert WITH poDate.id_delegat = 39, tcEticheta + ': poDate.id_delegat precompletat' + + DO Assert WITH TRANSFORM(poDate.listaid) == TRANSFORM(tnListaId), ; + tcEticheta + ': poDate.listaid provine din toSursa (Init cu parametru), e=' + TRANSFORM(poDate.listaid) + DO Assert WITH poDate.id_client = loSursa.id_part, tcEticheta + ': poDate.id_client din toSursa' + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + DO S62Log WITH ' poDate.nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' rezultat_serii=' + TRANSFORM(poDate.rezultat_serii) + IF poDate.rezultat_serii <> 3 + DO Assert WITH .F., tcEticheta + ': rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii) + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + RETURN 0 + ENDIF + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + DO S62Log WITH ' serie_act=' + TRANSFORM(poDate.serie_act) + ' nract=' + TRANSFORM(poDate.nract) + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC'$UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + IF tlFormNou + *-- v2 reala: crsfactura gol se creeaza INAINTE de formular (ca in factureaza(), ramura + *-- llFacturareNoua) - articolele se incarca DUPA, prin metoda do_incarca_articole + DO PregatesteFacturaCrs + oform = CREATEOBJECT('frm_facturare_articole2') + oform.WindowType = 0 + oform.Show() + DOEVENTS FORCE + DO S62Log WITH ' formular creat (v2 frm_facturare_articole2)' + llOk = oform.do_incarca_articole() + ELSE + *-- v1 reala: incarca_cursor_articole() se cheama INAINTE de formular (ca in factureaza(), + *-- ramura veche) - functia isi creeaza singura crsfactura + loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere) + llOk = (loRez.nSucces >= 0) AND loRez.lArticole + oform = CREATEOBJECT('frm_facturare_articole') + oform.WindowType = 0 + oform.Show() + DOEVENTS FORCE + DO S62Log WITH ' formular creat (v1 frm_facturare_articole)' + ENDIF + + DO Assert WITH llOk, tcEticheta + ': incarcarea sursei (incarca_cursor_articole) a reusit' + DO S62Log WITH ' incarcare -> Reccount(crsarticole)=' + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)') + + IF !llOk OR !USED('crsarticole') OR RECCOUNT('crsarticole') = 0 + DO S62Log WITH ' ABANDON: fara articole de incarcat pentru ' + tcEticheta + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + IF TYPE('oform') = 'O' AND !ISNULL(oform) + oform.Release() + ENDIF + DO CuratieCrs + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + RETURN 0 + ENDIF + + *-- transfer crsarticole -> crsfactura: do_adauga_tot() pe ambele forme (vezi antetul + *-- fisierului si AsertiuniRutare pt statutul cablarii pe v1 vs v2) + oform.do_adauga_tot() + DOEVENTS FORCE + DO S62Log WITH ' do_adauga_tot() -> Reccount(crsfactura)=' + TRANSFORM(RECCOUNT('crsfactura')) + ; + ' ultimul mesaj mock=[' + ALLTRIM(gcMockUltimMesaj) + ']' + DO Assert WITH RECCOUNT('crsfactura') > 0, tcEticheta + ': crsfactura populat dupa do_adauga_tot' + + *-- diagnostic id_jtva_coloana: cine ramane pe 0 si cu ce proc_tvav + LOCAL lnSelDiag, lnRauDiag, lnAratDiag + lnSelDiag = SELECT() + lnRauDiag = 0 + lnAratDiag = 0 + SELECT crsfactura + SCAN + IF NVL(crsfactura.id_jtva_coloana, 0) <= 0 + lnRauDiag = lnRauDiag + 1 + IF lnAratDiag < 5 + lnAratDiag = lnAratDiag + 1 + DO S62Log WITH ' [diag jtva] rand=' + TRANSFORM(RECNO()) + ' id_articol=' + TRANSFORM(crsfactura.id_articol) + ; + ' id_jtva=' + TRANSFORM(NVL(crsfactura.id_jtva_coloana,0)) + ' proc_tvav=' + TRANSFORM(NVL(crsfactura.proc_tvav,-1)) + ; + ' cant=' + TRANSFORM(crsfactura.cantitate) + ENDIF + ENDIF + ENDSCAN + DO S62Log WITH ' [diag jtva] crsfactura randuri cu id_jtva_coloana<=0: ' + TRANSFORM(lnRauDiag) + ' din ' + TRANSFORM(RECCOUNT('crsfactura')) + IF USED('jtva_coloane') + SELECT jtva_coloane + DO S62Log WITH ' [diag jtva] cursor jtva_coloane: reccount=' + TRANSFORM(RECCOUNT()) + ' filtru=[' + FILTER() + ']' + SET FILTER TO + LOCATE FOR cota_tva = 24 + DO S62Log WITH ' [diag jtva] locate cota_tva=24 -> found=' + TRANSFORM(FOUND()) + ' id=' + TRANSFORM(IIF(FOUND(), jtva_coloane.id_jtva_coloana, -1)) + ELSE + DO S62Log WITH ' [diag jtva] cursorul jtva_coloane NU e deschis in aceasta sesiune' + ENDIF + SELECT (lnSelDiag) + + oform.do_calculeaza_totaluri() + DOEVENTS FORCE + + tcSerieAct = ALLTRIM(NVL(poDate.serie_act, '')) + tnNract = poDate.nract + + lnScris = oform.do_termin() + DO S62Log WITH ' do_termin() -> ' + TRANSFORM(lnScris) + ' poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + ; + ' ultimul mesaj mock=[' + ALLTRIM(gcMockUltimMesaj) + ']' + + *-- do_termin() intoarce mereu .T. (_frm_base.vc2:363, DoDefault fara RETURN) si nid_vanzare + *-- ramane santinela la esec: singura dovada e randul din VANZARI, pe serie_act + nract. + tnIdVz = CdocGasesteIdVanzare(tcSerieAct, tnNract) + IF tnIdVz < 0 + tnIdVz = 0 + ENDIF + DO S62Log WITH ' verificare in VANZARI pe ' + tcSerieAct + ' ' + TRANSFORM(tnNract) + ' -> id_vanzare=' + TRANSFORM(tnIdVz) + DO Assert WITH tnIdVz > 0, tcEticheta + ': documentul exista in VANZARI (jonctiune serie_act+nract), e=' + TRANSFORM(tnIdVz) + + IF tnIdVz > 0 + DO S62Log WITH ' SCRIS: id_vanzare=' + TRANSFORM(tnIdVz) + ' serie_act=' + tcSerieAct + ' nract=' + TRANSFORM(tnNract) + ELSE + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + tcSerieAct = '' + tnNract = 0 + ENDIF + + IF TYPE('oform') = 'O' AND !ISNULL(oform) + oform.Release() + ENDIF + oform = NULL + + DO CuratieCrs + RELEASE poDate, poGeneratorNumere, poDateGestiuneDest + gcUltimaSerie = tcSerieAct + gnUltimulNract = tnNract + RETURN tnIdVz +ENDFUNC + +*================================================================================== +* crsfactura + coloana "gestiune" ceruta de coloana combo a grilei pe v2 (tehnica validata +* in test_s4_3_neregresie_masa.prg) - aplicata identic si pe v1, inofensiv acolo. +PROCEDURE PregatesteFacturaCrs + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp +ENDPROC + +PROCEDURE CuratieCrs + DO InchideCrs WITH 'crsarticole' + DO InchideCrs WITH 'crsarticole1' + DO InchideCrs WITH 'crsfactura' + DO InchideCrs WITH 'crscursuri' + DO InchideCrs WITH 'crspolitici' + DO InchideCrs WITH 'crscontracte' + DO InchideCrs WITH 'crsgestiunidest' + DO InchideCrs WITH 'crsCtrTemp' + DO InchideCrs WITH 'crsComTemp' + DO InchideCrs WITH 'jtva_coloane' +ENDPROC + +PROCEDURE InchideCrs + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +*================================================================================== +* Sursa reala pentru comanda (tnTip=3): campurile citite de oDateFactura.Init pe ramura +* tnTip=3 (ofacturare_comun.prg): id_part, nume, cod_fiscal, id_comanda, nr_comanda, id_sectie. +FUNCTION CreeazaSursaComanda + LPARAMETERS tnIdComanda + LOCAL lnQ, loSursa + loSursa = NULL + lnQ = goExecutor.oExecute([select c.id_part, p.nume, p.cod_fiscal, c.id_comanda, c.nr_comanda, c.id_sectie ] + ; + [from comenzi c, nom_parteneri p where c.id_part = p.id_part and c.id_comanda = ] + TRANSFORM(tnIdComanda), 'crsSursaCom') + IF lnQ < 0 OR !USED('crsSursaCom') OR RECCOUNT('crsSursaCom') <> 1 + DO S62Log WITH ' EROARE sursa comanda ' + TRANSFORM(tnIdComanda) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare()) + IF USED('crsSursaCom') + USE IN crsSursaCom + ENDIF + RETURN loSursa + ENDIF + SELECT crsSursaCom + SCATTER NAME loSursa MEMO + USE IN crsSursaCom + *-- poDate.listaid = loSursa.id_comanda (ofacturare_comun.prg:322), fara conversie - v2 + *-- (do_scrie_factura, ofacturare.vc2:20167) cere Val(poDate.listaid), deci listaid trebuie + *-- caracter; SCATTER dintr-o coloana Oracle numerica da tip N, nu C - convertim aici, ca sursa + *-- reala (goComanda) sa ajunga la fel ca in productie, nu doar ca TRANSFORM() sa coincida. + loSursa.id_comanda = ALLTRIM(TRANSFORM(loSursa.id_comanda)) + loSursa.nr_comanda = ALLTRIM(TRANSFORM(loSursa.nr_comanda)) + RETURN loSursa +ENDFUNC + +* Sursa reala pentru contract (tnTip=2): campurile citite de oDateFactura.Init pe ramura tip 2/6/52 +* sunt id_part, denumire, cod_fiscal, id_ctr, contract, id_sectie, sectie, id_responsabil, +* responsabil, id_valuta, nume_val. FACT_VCONTRACTE nu are ultimele sase - se completeaza cu +* valori neutre (0/'' /RON), la fel pe v1 si v2, deci comparatia de configuratie ramane valida. +FUNCTION CreeazaSursaContract + LPARAMETERS tnIdCtr + LOCAL lnQ, loSursa + loSursa = NULL + lnQ = goExecutor.oExecute([select ct.id_part, p.denumire, p.cod_fiscal, ct.id_ctr, ct.contract ] + ; + [from fact_vcontracte ct, nom_parteneri p where ct.id_part = p.id_part and ct.id_ctr = ] + TRANSFORM(tnIdCtr), 'crsSursaCtr') + IF lnQ < 0 OR !USED('crsSursaCtr') OR RECCOUNT('crsSursaCtr') <> 1 + DO S62Log WITH ' EROARE sursa contract ' + TRANSFORM(tnIdCtr) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare()) + IF USED('crsSursaCtr') + USE IN crsSursaCtr + ENDIF + RETURN loSursa + ENDIF + SELECT crsSursaCtr + SCATTER NAME loSursa MEMO + USE IN crsSursaCtr + ADDPROPERTY(loSursa, 'id_sectie', 0) + ADDPROPERTY(loSursa, 'sectie', '') + ADDPROPERTY(loSursa, 'id_responsabil', 0) + ADDPROPERTY(loSursa, 'responsabil', '') + ADDPROPERTY(loSursa, 'id_valuta', 1) + ADDPROPERTY(loSursa, 'nume_val', 'RON') + RETURN loSursa +ENDFUNC + +*================================================================================== +* Asertiuni statice (text, fara rulare) - documenteaza exact ce traseu de productie ramane +* neprobat de acest test: v1 nu are metoda de forma pentru incarcare (calea reala trece prin +* functia procedurala incarca_cursor_articole, apelata din factureaza() INAINTE de formular); +* do_adauga_tot() e cablat pe un buton viu doar pe v1 - pe v2 metoda exista dar nu e apelata +* de niciun caption/buton in productie (acest test o cheama direct, ca S6-0/S3.1 a stabilit +* deja pentru lista de preturi). +PROCEDURE AsertiuniRutare + LOCAL lcTxt + lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2") + IF EMPTY(lcTxt) + DO Assert WITH .F., "FILETOSTR ofacturare.vc2 a esuat/gol" + RETURN + ENDIF + DO Assert WITH OCCURS("PROCEDURE do_incarca_articole", lcTxt) = 1, ; + "do_incarca_articole exista o singura data in fisier (doar pe v2) - v1 nu are metoda de " + ; + "forma pentru incarcare, calea reala e prin incarca_cursor_articole() apelata din factureaza()" + DO Assert WITH "caction = do_adauga_tot" $ lcTxt, ; + "exista un caction = do_adauga_tot in fisier (butonul viu e pe v1)" + DO Assert WITH OCCURS("caction = do_adauga_tot", lcTxt) = 1, ; + "un singur caction = do_adauga_tot in tot fisierul - v2 NU are niciun buton cablat pt " + ; + "aceasta metoda (cod mort pe v2; acest test o cheama direct, deci nu probeaza ruta UI reala pe v2)" + DO Assert WITH OCCURS("PROCEDURE do_adauga_tot", lcTxt) = 2, ; + "do_adauga_tot exista de doua ori (o data pe fiecare clasa) - metoda exista pe v2, doar cablarea lipseste" +ENDPROC + +*================================================================================== +* CompareazaSurse: ruleaza schela CompDoc (structura VANZARI/VANZARI_DETALII/ACT/RUL) si, separat, +* o comparatie pe campurile de CONFIGURATIE care nu depind de sursa (trebuie sa fie identice v1/v2 +* chiar daca sursele - comenzi/contracte diferite - nu sunt). +PROCEDURE CompareazaSurse + LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip + LOCAL nFail + nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-2 ' + tcTip + ' v1(' + TRANSFORM(tnNr1) + ') vs v2(' + TRANSFORM(tnNr2) + ')') + DO Assert WITH nFail >= 0, tcTip + ': CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail) + DO S62Log WITH ' CompDoc ' + tcTip + ' esecuri totale=' + TRANSFORM(nFail) + ; + ' (surse diferite - vezi raportul pentru argumentarea camp cu camp)' + DO ComparaCampuriConfig WITH tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip +ENDPROC + +PROCEDURE ComparaCampuriConfig + LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip + LOCAL nId1, nId2, lnQ + nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1) + nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2) + IF nId1 <= 0 OR nId2 <= 0 + DO Assert WITH .F., tcTip + ': jonctiune serie_act+nract gaseste ambele id_vanzare (v1=' + ; + TRANSFORM(nId1) + ' v2=' + TRANSFORM(nId2) + ')' + RETURN + ENDIF + lnQ = goExecutor.oExecute([select id_vanzare, tip, in_valuta, id_valuta, multiplicator, ] + ; + [discount_evidentiat, tva_incasare, nvl(tip_factura,0) as tip_factura, nvl(tip_saft,0) as tip_saft, ] + ; + [nvl(coeficient_k,0) as coeficient_k from vanzari where id_vanzare in (] + TRANSFORM(nId1) + [,] + TRANSFORM(nId2) + [)], 'crsCfg') + IF lnQ < 0 OR RECCOUNT('crsCfg') <> 2 + DO Assert WITH .F., tcTip + ': citire campuri de configuratie din VANZARI (Reccount asteptat 2)' + IF USED('crsCfg') + USE IN crsCfg + ENDIF + RETURN + ENDIF + LOCAL lnTip1, lnTip2, lnInVal1, lnInVal2, lnIdVal1, lnIdVal2, lnMul1, lnMul2, lnDisc1, lnDisc2 + LOCAL lnTvaInc1, lnTvaInc2, lnTipFact1, lnTipFact2, lnTipSaft1, lnTipSaft2, lnCoef1, lnCoef2 + SELECT crsCfg + LOCATE FOR id_vanzare = nId1 + lnTip1 = tip + lnInVal1 = in_valuta + lnIdVal1 = id_valuta + lnMul1 = multiplicator + lnDisc1 = discount_evidentiat + lnTvaInc1 = tva_incasare + lnTipFact1 = tip_factura + lnTipSaft1 = tip_saft + lnCoef1 = coeficient_k + LOCATE FOR id_vanzare = nId2 + lnTip2 = tip + lnInVal2 = in_valuta + lnIdVal2 = id_valuta + lnMul2 = multiplicator + lnDisc2 = discount_evidentiat + lnTvaInc2 = tva_incasare + lnTipFact2 = tip_factura + lnTipSaft2 = tip_saft + lnCoef2 = coeficient_k + USE IN crsCfg + + DO Assert WITH lnTip1 = lnTip2, tcTip + ': VANZARI.TIP identic (config, nu sursa) v1=' + TRANSFORM(lnTip1) + ' v2=' + TRANSFORM(lnTip2) + DO Assert WITH lnInVal1 = lnInVal2, tcTip + ': IN_VALUTA identic v1=' + TRANSFORM(lnInVal1) + ' v2=' + TRANSFORM(lnInVal2) + DO Assert WITH lnIdVal1 = lnIdVal2, tcTip + ': ID_VALUTA identic v1=' + TRANSFORM(lnIdVal1) + ' v2=' + TRANSFORM(lnIdVal2) + DO Assert WITH lnMul1 = lnMul2, tcTip + ': MULTIPLICATOR identic v1=' + TRANSFORM(lnMul1) + ' v2=' + TRANSFORM(lnMul2) + DO Assert WITH lnDisc1 = lnDisc2, tcTip + ': DISCOUNT_EVIDENTIAT identic v1=' + TRANSFORM(lnDisc1) + ' v2=' + TRANSFORM(lnDisc2) + DO Assert WITH lnTvaInc1 = lnTvaInc2, tcTip + ': TVA_INCASARE identic v1=' + TRANSFORM(lnTvaInc1) + ' v2=' + TRANSFORM(lnTvaInc2) + DO Assert WITH lnTipFact1 = lnTipFact2, tcTip + ': TIP_FACTURA identic v1=' + TRANSFORM(lnTipFact1) + ' v2=' + TRANSFORM(lnTipFact2) + DO Assert WITH lnTipSaft1 = lnTipSaft2, tcTip + ': TIP_SAFT identic v1=' + TRANSFORM(lnTipSaft1) + ' v2=' + TRANSFORM(lnTipSaft2) + DO Assert WITH lnCoef1 = lnCoef2, tcTip + ': COEFICIENT_K identic v1=' + TRANSFORM(lnCoef1) + ' v2=' + TRANSFORM(lnCoef2) +ENDPROC + +*================================================================================== +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO S62Log WITH 'PASS: ' + tcMsg + ELSE + gnFail = gnFail + 1 + DO S62Log WITH 'FAIL: ' + tcMsg + ENDIF +ENDPROC + +PROCEDURE S62Log + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE S62Err + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + DO S62Log WITH 'ON ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE S62Final + IF TYPE('_SCREEN.tmrS62Msg') = 'O' + _SCREEN.tmrS62Msg.Enabled = .F. + ENDIF + DO S62Log WITH CHR(13) + CHR(10) + 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + DO S62Log WITH 'END ' + TTOC(DATETIME()) + QUIT +ENDPROC + +*================================================================================== +* driverMessageboxForm: cauta o forma MESSAGEBOX_FORM printre _SCREEN.Forms si-i apasa automat +* cmdYes/cmdOk (raspunsul implicit "Da"/"OK"), ca sa nu blocheze rularea headless. Tehnica identica +* cu driverAlteDateAD din test_s3b_emitere_reala.prg (partea de MESSAGEBOX_FORM). +* Trateaza in plus FRM_ALTE_DATE (numai pe v1, deschis neconditionat de +* frm_facturare_articole.inainte_de_do_termin - ofacturare.vc2:15076): apasa Termin +* (loForm.do_termin(), nu Release()) ca sa se execute inainte_de_do_termin si sa se scrie +* poDate.ntip_incasare exact ca pe traseul real - un Release() ar sari peste acea scriere si ar +* fabrica o diferenta falsa fata de v2, unde codul echivalent ruleaza inline +* (ofacturare.vc2:20785-20808). Valideaza doar daca poDate.id_delegat e completat dinainte +* (vezi EmiteMasa) - altfel inainte_de_do_termin respinge din nou si formularul ramane deschis. +* Niciun tratament generic "strain -> Release()": clasele principale FRM_FACTURARE_ARTICOLE si +* FRM_FACTURARE_ARTICOLE2 nu sunt atinse de acest driver in niciun fel. +DEFINE CLASS driverMessageboxForm AS Custom + nUltimAlteDate = 0 + lBusy = .F. + + PROCEDURE Executa + *-- garda de reintrare: do_termin() declanseaza intern Release()/SetFocus, care cedeaza + *-- controlul buclei de mesaje Windows - fara ea, Timer-ul se reintra in timp ce + *-- formularul e pe cale sa se elibereze (obiect pe jumatate distrus -> eroare 1924 "nu e + *-- obiect"), observat empiric la prima rulare. lBusy e verificat/setat sincron, inainte + *-- de orice cod care ar putea ceda controlul - opreste reintrarea chiar daca Timer.Enabled + *-- nu apuca sa opreasca un WM_TIMER deja pus in coada. + IF This.lBusy + RETURN + ENDIF + This.lBusy = .T. + IF TYPE('_SCREEN.tmrS62Msg') = 'O' + _SCREEN.tmrS62Msg.Enabled = .F. + ENDIF + TRY + LOCAL lnI, loMsgForm, loAlteDate, lcClasa + loMsgForm = NULL + loAlteDate = NULL + FOR lnI = 1 TO _SCREEN.FormCount + lcClasa = UPPER(_SCREEN.Forms(lnI).Class) + IF 'MESSAGEBOX_FORM' $ lcClasa + loMsgForm = _SCREEN.Forms(lnI) + ENDIF + IF lcClasa == 'FRM_ALTE_DATE' + loAlteDate = _SCREEN.Forms(lnI) + DO S62Log WITH ' [diag alte_date] gasit la index=' + TRANSFORM(lnI) + ; + ' FormCount=' + TRANSFORM(_SCREEN.FormCount) + ' VARTYPE(loAlteDate)=' + VARTYPE(loAlteDate) + ENDIF + IF !(lcClasa $ gcClaseVazuteS62) + gcClaseVazuteS62 = gcClaseVazuteS62 + lcClasa + ';' + DO S62Log WITH ' [diag timer] forma noua vazuta: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' + ENDIF + ENDFOR + IF !ISNULL(loMsgForm) + TRY + LOCAL lcTextMsg + lcTextMsg = '' + TRY + lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value)) + CATCH + ENDTRY + DO S62Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']' + DO CASE + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) + DO S62Log WITH ' [driver msg] messagebox_form: apas cmgBotones.cmdYes' + loMsgForm.cmgBotones.cmdYes.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) + DO S62Log WITH ' [driver msg] messagebox_form: apas cmgBotones.cmdOk' + loMsgForm.cmgBotones.cmdOk.Click() + ENDCASE + CATCH TO loExcMsg + DO S62Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message + ENDTRY + ELSE IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1) + This.nUltimAlteDate = SECONDS() + TRY + DO S62Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ; + TRANSFORM(NVL(poDate.id_delegat, 0)) + ') VARTYPE=' + VARTYPE(loAlteDate) + ; + ' TYPE=' + TYPE('loAlteDate') + loAlteDate.do_termin() + CATCH TO loExcAD + DO S62Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message + ; + ' VARTYPE=' + VARTYPE(loAlteDate) + ' TYPE=' + TYPE('loAlteDate') + ENDTRY + ENDIF + CATCH TO loExcTop + DO S62Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message + FINALLY + IF TYPE('_SCREEN.tmrS62Msg') = 'O' + _SCREEN.tmrS62Msg.Enabled = .T. + ENDIF + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_unificat/test_s6_2_comanda_contract.ps1 b/utile/Teste/facturare_unificat/test_s6_2_comanda_contract.ps1 new file mode 100644 index 0000000..edfb4fa --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_2_comanda_contract.ps1 @@ -0,0 +1,28 @@ +$ErrorActionPreference = 'Stop' +$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat' +$prg = Join-Path $dir 'test_s6_2_comanda_contract.prg' +$log = Join-Path $dir 'out\test_s6_2_comanda_contract.log' +$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' + +$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_2_comanda_contract*' } +if ($viu) { + "Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua." + exit 1 +} + +Set-Location $dir +Remove-Item *.FXP, *.fxp -ErrorAction SilentlyContinue +Remove-Item $log -ErrorAction SilentlyContinue + +$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru +"lansat PID " + $p.Id +$null = $p.WaitForExit(280000) +if (-not $p.HasExited) { + "INCA RULEAZA dupa 280s - omor instanta (filtrat pe CommandLine)" + Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_2_comanda_contract*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force } +} +if (Test-Path $log) { + Get-Content $log | Select-String -Pattern '^(PASS|FAIL|REZUMAT|TOTAL|START|END|=====|ENV OK|ERROR|CompDoc|DIAG|---| )' +} else { + "Log inexistent: $log" +} diff --git a/utile/Teste/facturare_unificat/test_s6_2_compdoc_comanda.prg b/utile/Teste/facturare_unificat/test_s6_2_compdoc_comanda.prg new file mode 100644 index 0000000..5b903ce --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_2_compdoc_comanda.prg @@ -0,0 +1,116 @@ +* test_s6_2_compdoc_comanda.prg +* Headless, fara formulare: compara documentele deja emise de S6-2 pentru COMANDA - +* v1 SSS 654 (id_vanzare 1113) vs v2 SSS 656 (id_vanzare 1114) - CompDoc (schela) + campuri de +* configuratie (TIP, IN_VALUTA, ID_VALUTA, MULTIPLICATOR, DISCOUNT_EVIDENTIAT, TVA_INCASARE, +* TIP_FACTURA, TIP_SAFT, COEFICIENT_K). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_2_compdoc_comanda.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_2_compdoc_comanda.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO. + +SET SAFETY OFF +SET TALK OFF +CLOSE DATABASES + +PUBLIC gcLog, gnPass, gnFail +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_2_compdoc_comanda.log" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog) +gnPass = 0 +gnFail = 0 + +TRY + 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 CLog WITH 'EROARE: conectare Oracle esuata' + DO CFinal + ENDIF + DO CLog WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE + + LOCAL nFail + nFail = CompDoc('SSS', 654, 'SSS', 656, 'S6-2 comanda v1(654) vs v2(656)') + DO Assert WITH nFail >= 0, 'CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail) + DO CLog WITH 'CompDoc esecuri totale=' + TRANSFORM(nFail) + + LOCAL nId1, nId2, lnQ + nId1 = CdocGasesteIdVanzare('SSS', 654) + nId2 = CdocGasesteIdVanzare('SSS', 656) + DO Assert WITH nId1 = 1113, 'jonctiune serie_act+nract gaseste id_vanzare pt SSS 654, e=' + TRANSFORM(nId1) + DO Assert WITH nId2 = 1114, 'jonctiune serie_act+nract gaseste id_vanzare pt SSS 656, e=' + TRANSFORM(nId2) + + IF nId1 > 0 AND nId2 > 0 + lnQ = goExecutor.oExecute([select id_vanzare, tip, in_valuta, id_valuta, multiplicator, ] + ; + [discount_evidentiat, tva_incasare, nvl(tip_factura,0) as tip_factura, nvl(tip_saft,0) as tip_saft, ] + ; + [nvl(coeficient_k,0) as coeficient_k from vanzari where id_vanzare in (] + TRANSFORM(nId1) + [,] + TRANSFORM(nId2) + [)], 'crsCfg') + IF lnQ < 0 OR RECCOUNT('crsCfg') <> 2 + DO Assert WITH .F., 'citire campuri de configuratie din VANZARI (Reccount asteptat 2)' + ELSE + LOCAL lnTip1, lnTip2, lnInVal1, lnInVal2, lnIdVal1, lnIdVal2, lnMul1, lnMul2, lnDisc1, lnDisc2 + LOCAL lnTvaInc1, lnTvaInc2, lnTipFact1, lnTipFact2, lnTipSaft1, lnTipSaft2, lnCoef1, lnCoef2 + SELECT crsCfg + LOCATE FOR id_vanzare = nId1 + lnTip1 = tip + lnInVal1 = in_valuta + lnIdVal1 = id_valuta + lnMul1 = multiplicator + lnDisc1 = discount_evidentiat + lnTvaInc1 = tva_incasare + lnTipFact1 = tip_factura + lnTipSaft1 = tip_saft + lnCoef1 = coeficient_k + LOCATE FOR id_vanzare = nId2 + lnTip2 = tip + lnInVal2 = in_valuta + lnIdVal2 = id_valuta + lnMul2 = multiplicator + lnDisc2 = discount_evidentiat + lnTvaInc2 = tva_incasare + lnTipFact2 = tip_factura + lnTipSaft2 = tip_saft + lnCoef2 = coeficient_k + USE IN crsCfg + + DO Assert WITH lnTip1 = lnTip2, 'VANZARI.TIP identic v1=' + TRANSFORM(lnTip1) + ' v2=' + TRANSFORM(lnTip2) + DO Assert WITH lnInVal1 = lnInVal2, 'IN_VALUTA identic v1=' + TRANSFORM(lnInVal1) + ' v2=' + TRANSFORM(lnInVal2) + DO Assert WITH lnIdVal1 = lnIdVal2, 'ID_VALUTA identic v1=' + TRANSFORM(lnIdVal1) + ' v2=' + TRANSFORM(lnIdVal2) + DO Assert WITH lnMul1 = lnMul2, 'MULTIPLICATOR identic v1=' + TRANSFORM(lnMul1) + ' v2=' + TRANSFORM(lnMul2) + DO Assert WITH lnDisc1 = lnDisc2, 'DISCOUNT_EVIDENTIAT identic v1=' + TRANSFORM(lnDisc1) + ' v2=' + TRANSFORM(lnDisc2) + DO Assert WITH lnTvaInc1 = lnTvaInc2, 'TVA_INCASARE identic v1=' + TRANSFORM(lnTvaInc1) + ' v2=' + TRANSFORM(lnTvaInc2) + DO Assert WITH lnTipFact1 = lnTipFact2, 'TIP_FACTURA identic v1=' + TRANSFORM(lnTipFact1) + ' v2=' + TRANSFORM(lnTipFact2) + DO Assert WITH lnTipSaft1 = lnTipSaft2, 'TIP_SAFT identic v1=' + TRANSFORM(lnTipSaft1) + ' v2=' + TRANSFORM(lnTipSaft2) + DO Assert WITH lnCoef1 = lnCoef2, 'COEFICIENT_K identic v1=' + TRANSFORM(lnCoef1) + ' v2=' + TRANSFORM(lnCoef2) + ENDIF + ENDIF + + DO CFinal + +CATCH TO loExc + DO CLog WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ; + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + DO CFinal +ENDTRY + +QUIT + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO CLog WITH 'PASS: ' + tcMsg + ELSE + gnFail = gnFail + 1 + DO CLog WITH 'FAIL: ' + tcMsg + ENDIF +ENDPROC + +PROCEDURE CLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE CFinal + DO CLog WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + DO CLog WITH 'END ' + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s6_3_aviz_retur.prg b/utile/Teste/facturare_unificat/test_s6_3_aviz_retur.prg new file mode 100644 index 0000000..ee5ce93 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_3_aviz_retur.prg @@ -0,0 +1,1008 @@ +* test_s6_3_aviz_retur.prg +* Headless: proba de paritate v1 vs v2 pe celelalte doua surse cu cantitati fixate de documentul +* sursa: AVIZ (tip 4, pack_facturare.cursor_avize) si RETUR in lei (tip 8, cursor_retur). +* Emite 4 documente REALE in MARIUSM_AUTO@ROA_CENTRAL (tipdoc 5, seria SSS): +* aviz v1 (frm_facturare_articole) / aviz v2 (frm_facturare_articole2) +* retur v1 (frm_facturare_articole) / retur v2 (frm_facturare_articole2) +* Surse DIFERITE intre v1 si v2, obligatoriu: prima emitere consuma sursa (avizul se marcheaza +* facturat, cantitatea returnabila se epuizeaza), deci acelasi document ar da 0 linii a doua oara. +* Sursele se aleg din date la rulare, preferand o pereche cu acelasi numar de linii - id-uri fixe +* nu tin de la o rulare la alta. +* +* Traseul probat este cel REAL pe fiecare forma, nu metoda interna: +* v1: incarca_cursor_articole() INAINTE de formular (ca in factureaza(), ofacturare.prg:299), +* apoi butonul "Adauga tot" -> but_urmator_tot1.Click() (caction = do_adauga_tot, +* ofacturare.vc2:11407-11409; Init il face vizibil pe tip 4 la :15319 si pe 8/9 la :15389) +* v2: crsfactura gol INAINTE de formular, apoi butonul "Incarca articole" -> +* but_incarca_articole.Click() (caction = do_incarca_articole), care cheama do_adauga_tot +* prin Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47, 8, 9) - cablarea W1 din S8 +* Emiterea trece prin but_termin1.Click() pe ambele, niciodata prin do_termin() direct. +* Un test care instantiaza formularul si cheama metoda probeaza codul, nu traseul (lectia S5c/S4b). +* +* Antetul se compune ca in productie, fara formularele modale de cautare (cauta_alfa): +* tip 4: do_cauta_avize (ofacturare_antet.prg:73-86) - listaid = lista de id_vanzare a avizelor +* nefacturate ale clientului, descriere = lista numerelor, plus id_comanda_aviz +* tip 8: do_cauta_facturi (ofacturare_antet.prg:459-468) - listaid = lista de id_vanzare a +* facturilor sursa, descriere = lista numerelor, text_aditional = 'RETUR FACTURA ...' +* +* FRM_ALTE_DATE apare numai pe v1 (frm_facturare_articole.inainte_de_do_termin, ofacturare.vc2:15076, +* .Show(1) neconditionat pentru tip <> 30) si se inchide apasand Termin (loForm.do_termin()), nu +* Release(): Release() ar sari peste inainte_de_do_termin, unde se scrie poDate.ntip_incasare, si ar +* fabrica un esec fals de paritate pe campurile de incasare. Cere poDate.id_delegat completat dinainte +* (ferestre_cere_date.vc2:3073), la fel pe v1 si v2. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_3_aviz_retur.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3_aviz_retur.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167; +* gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat +PUBLIC gcUltimaSerie, gnUltimulNract, goDriverS63, gcClaseVazute, gcRaspunsMsgForm +PUBLIC gnIntrebariRetur, gnAvizReturDeschis + +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3_aviz_retur.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) +gnPass = 0 +gnFail = 0 +gnErr = 0 +gcCaz = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +gcUltimaSerie = "" +gnUltimulNract = 0 +gcClaseVazute = ";" +gcRaspunsMsgForm = "NU" +gnIntrebariRetur = 0 +gnAvizReturDeschis = 0 +gcNumere = "" +gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg" + +*-- poDate & co. se declara SI se initializeaza la nivelul programului principal: metodele din .vcx +*-- le vad numai daca variabila exista deja pe stiva de sub ele (capcana platita la S8: un PRIVATE +*-- declarat intr-o procedura si asignat in alta ramane invizibil in forma). +*-- pnTotalDiscountAvize e cerut prin referinta de cursor_avize (ofacturare.prg:495). +PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil +poDate = NULL +poGeneratorNumere = NULL +poDateGestiuneDest = NULL +pnTotalDiscountAvize = 0 +plVizibil = .F. + +ON ERROR DO S63Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + *-- stub_verificare PRIMUL: "Do Form verificare" (ofacturare.vc2:14404 / :20126) rezolva la stub + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + + 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 S63Log WITH 'EROARE: conectare Oracle esuata' + DO S63Final + ENDIF + SQLSETPROP(gnHandle, "QueryTimeOut", 45) + DO S63Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE + SET PROCEDURE TO (gcMock) ADDITIVE + + IF !actualizeaza_optiuni_program() + DO S63Log WITH 'EROARE: actualizeaza_optiuni_program()' + DO S63Final + ENDIF + gnScadereStoc = 0 + gnFactSeturi = 0 + gnIdSucursala = 167 + goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]) + gnIdUtil = 8 + goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) + DO S63Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ; + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ; + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + ; + ' gl406=' + TRANSFORM(TYPE('gl406') = 'L' AND gl406) + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + + *-- cboTipFactura cere RowSource pe saft_tip_facturi la constructia formularului v2 + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + *-- driver + timer: FRM_ALTE_DATE (v1) si formele modale MESSAGEBOX_FORM nu trec prin functia + *-- amessagebox, deci mock-ul nu le acopera. Tehnica validata la S6-2. + goDriverS63 = CREATEOBJECT('driverS63') + _SCREEN.AddObject('tmrS63', 'Timer') + _SCREEN.tmrS63.Interval = 200 + BINDEVENT(_SCREEN.tmrS63, 'Timer', goDriverS63, 'Executa') + _SCREEN.tmrS63.Enabled = .T. + DO S63Log WITH 'DIAG SET_PATH stub inca in fata: ' + FULLPATH('verificare.scx') + + LOCAL lnIdA1, lcSerA1, lnNrA1, lnIdA2, lcSerA2, lnNrA2 + LOCAL lnIdR1, lcSerR1, lnNrR1, lnIdR2, lcSerR2, lnNrR2 + STORE 0 TO lnIdA1, lnIdA2, lnIdR1, lnIdR2, lnNrA1, lnNrA2, lnNrR1, lnNrR2 + STORE '' TO lcSerA1, lcSerA2, lcSerR1, lcSerR2 + + DO S63Log WITH CHR(13) + CHR(10) + '===== ALEGEREA SURSELOR DIN DATE =====' + DO AlegeSurseAviz + DO AlegeSurseRetur + + DO S63Log WITH CHR(13) + CHR(10) + '===== RUTARE (structural, inainte de orice emitere) =====' + DO AsertiuniRutare + + IF USED('crsSurseAviz') AND RECCOUNT('crsSurseAviz') >= 2 + DO S63Log WITH CHR(13) + CHR(10) + '===== EMITERE AVIZ (tip 4) =====' + GO 1 IN crsSurseAviz + lnIdA1 = EmiteProtejat(4, 'crsSurseAviz', .F., 'aviz-v1') + lcSerA1 = gcUltimaSerie + lnNrA1 = gnUltimulNract + GO 2 IN crsSurseAviz + lnIdA2 = EmiteProtejat(4, 'crsSurseAviz', .T., 'aviz-v2') + lcSerA2 = gcUltimaSerie + lnNrA2 = gnUltimulNract + ELSE + DO Assert WITH .F., 'aviz: doua surse distincte cu articole gasite in date (vezi alegerea surselor)' + ENDIF + + IF USED('crsSurseRetur') AND RECCOUNT('crsSurseRetur') >= 2 + DO S63Log WITH CHR(13) + CHR(10) + '===== EMITERE RETUR (tip 8, lei) =====' + GO 1 IN crsSurseRetur + lnIdR1 = EmiteProtejat(8, 'crsSurseRetur', .F., 'retur-v1') + lcSerR1 = gcUltimaSerie + lnNrR1 = gnUltimulNract + GO 2 IN crsSurseRetur + lnIdR2 = EmiteProtejat(8, 'crsSurseRetur', .T., 'retur-v2') + lcSerR2 = gcUltimaSerie + lnNrR2 = gnUltimulNract + ELSE + DO Assert WITH .F., 'retur: doua surse distincte cu articole gasite in date (vezi alegerea surselor)' + ENDIF + + IF lnIdA1 > 0 AND lnIdA2 > 0 + DO S63Log WITH CHR(13) + CHR(10) + '===== CompDoc AVIZ v1(' + lcSerA1 + ' ' + TRANSFORM(lnNrA1) + ; + ') vs v2(' + lcSerA2 + ' ' + TRANSFORM(lnNrA2) + ') =====' + DO Compara WITH lcSerA1, lnNrA1, lcSerA2, lnNrA2, 'aviz' + ELSE + DO Assert WITH .F., 'aviz: ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdA1) + ; + ' v2 id_vanzare=' + TRANSFORM(lnIdA2) + ')' + ENDIF + + IF lnIdR1 > 0 AND lnIdR2 > 0 + DO S63Log WITH CHR(13) + CHR(10) + '===== CompDoc RETUR v1(' + lcSerR1 + ' ' + TRANSFORM(lnNrR1) + ; + ') vs v2(' + lcSerR2 + ' ' + TRANSFORM(lnNrR2) + ') =====' + DO Compara WITH lcSerR1, lnNrR1, lcSerR2, lnNrR2, 'retur' + ELSE + DO Assert WITH .F., 'retur: ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdR1) + ; + ' v2 id_vanzare=' + TRANSFORM(lnIdR2) + ')' + ENDIF + + DO S63Final + +CATCH TO loExc + DO S63Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ; + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO S63Final +ENDTRY + +QUIT + +*================================================================================== +* Sursele pentru AVIZ (tip 4). Filtrul e cel din caut_avize (oproceduri_facturare.prg:2038): +* vanzari, tip in (21,22,26,42), facturat = 0. O sursa = UN aviz (selectorul din productie e +* multi-select, deci si un singur aviz e o alegere legitima); un aviz per sursa da mult mai multi +* candidati, deci sanse reale sa existe o pereche cu acelasi numar de linii. +PROCEDURE AlegeSurseAviz + LOCAL lnQ, lnI, lnLinii + CREATE CURSOR crsCandAviz (idpart N(20), nume C(100), listaid M, descr M, linii N(10), idcom N(20)) + + DO AsigurSurseAvizVii WITH 20, 10 + + *-- vitalitate la sursa, in WHERE: multe avize nefacturate sunt fixturi moarte (toate liniile + *-- cu cantitate 0, ramase din rulari anterioare) - fara acest filtru se aduna la nesfarsit, + *-- sunt mereu mai noi (deci primele in ORDER BY id_vanzare DESC), si ii impinge pe cei vii + *-- oricat de mult s-ar ridica limita de scanare de mai jos (verificat pe Oracle: elimina exact + *-- cele fara vreo linie cu cantitate reala, pastreaza restul) + lnQ = goExecutor.oExecute([select a.id_vanzare, a.id_part, p.nume, a.serie_act, a.numar_act, ] + ; + [(case when a.tip in (21,42) then nvl(a.id_comanda,0) else 0 end) as id_comanda ] + ; + [from vanzari a, nom_parteneri p ] + ; + [where a.id_part = p.id_part and a.sters = 0 and a.tip in (21,22,26,42) and a.facturat = 0 ] + ; + [ and exists (select 1 from vanzari_detalii d ] + ; + [ where d.id_vanzare = a.id_vanzare and d.sters = 0 and d.cantitate > 0) ] + ; + STRTRAN(gcCondSucursala, [id_sucursala], [a.id_sucursala]) + ; + [ and upper(p.nume) not like '%CLIENT%' order by a.id_vanzare desc], 'crsAvLista') + IF lnQ < 0 OR !USED('crsAvLista') + DO Assert WITH .F., 'aviz: lista avizelor nefacturate citita din Oracle' + RETURN + ENDIF + DO S63Log WITH ' aviz: avize nefacturate vii (cu cel putin o linie cu cantitate>0) = ' + TRANSFORM(RECCOUNT('crsAvLista')) + + lnI = 0 + SELECT crsAvLista + SCAN WHILE lnI < 25 + lnI = lnI + 1 + LOCAL lnIdAv, lnIdPart, lcNume, lcDescr, lnComanda + lnIdAv = crsAvLista.id_vanzare + lnIdPart = crsAvLista.id_part + lcNume = ALLTRIM(NVL(crsAvLista.nume, '')) + lcDescr = NumarDoc(crsAvLista.serie_act, crsAvLista.numar_act) + lnComanda = NVL(crsAvLista.id_comanda, 0) + poDate = CREATEOBJECT('empty') + ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(lnIdAv))) + pnTotalDiscountAvize = 0 + DO Inchide WITH 'crsSonda' + lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}], 'crsSonda') + lnLinii = IIF(lnQ >= 0 AND USED('crsSonda'), RECCOUNT('crsSonda'), 0) + LOCAL lnValAv + lnValAv = ValoareSonda(lnLinii) + DO Inchide WITH 'crsSonda' + DO S63Log WITH ' aviz candidat: aviz ' + TRANSFORM(lnIdAv) + ' [' + lcDescr + '] client ' + ; + TRANSFORM(lnIdPart) + ' [' + lcNume + '] -> linii=' + TRANSFORM(lnLinii) + ' valoare=' + TRANSFORM(lnValAv) + IF lnLinii > 0 AND lnValAv <> 0 + INSERT INTO crsCandAviz (idpart, nume, listaid, descr, linii, idcom) ; + VALUES (lnIdPart, lcNume, ALLTRIM(TRANSFORM(lnIdAv)), lcDescr, lnLinii, lnComanda) + ENDIF + SELECT crsAvLista + ENDSCAN + DO Inchide WITH 'crsAvLista' + poDate = NULL + + DO AlegePereche WITH 'crsCandAviz', 'crsSurseAviz', 'aviz' +ENDPROC + +*================================================================================== +* Reumple sursele de aviz cand scad sub prag, ca testul sa nu depinda de un rezervor +* pregatit manual: emite tnLot avize noi in AVZ13, clona a avizului 684, cu baza de +* numerotare calculata la rulare (max(numar_act) pe serie), nu hardcodata. +PROCEDURE AsigurSurseAvizVii + LPARAMETERS tnPrag, tnLot + LOCAL lnQ, lnVii, lcSql + + lnQ = goExecutor.oExecute([select count(distinct d.id_vanzare) as nr from vanzari_detalii d ] + ; + [join vanzari a on a.id_vanzare = d.id_vanzare ] + ; + [where a.tip in (21,22,26,42) and a.facturat = 0 and a.sters = 0 and d.sters = 0 ] + ; + [and d.cantitate <> nvl((select sum(c.cantitate) from vanzari_cantitati c ] + ; + [where c.id_vanzare_det_aviz = d.id_vanzare_det and c.sters = 0), 0)], 'crsViiCount') + lnVii = IIF(lnQ >= 0 AND USED('crsViiCount'), NVL(crsViiCount.nr, 0), 0) + DO Inchide WITH 'crsViiCount' + DO S63Log WITH ' aviz: pool AVZ13 surse vii = ' + TRANSFORM(lnVii) + ' (prag=' + TRANSFORM(tnPrag) + ')' + IF lnVii >= tnPrag + RETURN + ENDIF + DO S63Log WITH ' aviz: pool sub prag, emit ' + TRANSFORM(tnLot) + ' avize noi in AVZ13' + + lcSql = [declare ] + ; + [ c_nrbaza number; ] + ; + [ c_nravize constant number := ] + TRANSFORM(tnLot) + [; ] + ; + [ c_serie constant varchar2(10) := 'AVZ13'; ] + ; + [ c_sablon constant number := 684; ] + ; + [ c_act_sablon constant number := 111906; ] + ; + [ v_nr number; v_id number; v_cod number; ] + ; + [begin ] + ; + [ select nvl(max(numar_act),0) into c_nrbaza from vanzari where serie_act = c_serie; ] + ; + [ for i in 1 .. c_nravize loop ] + ; + [ v_nr := c_nrbaza + i; ] + ; + [ select seq_cod.nextval into v_cod from dual; ] + ; + [ merge into vanzari t ] + ; + [ using (select v.*, v_nr as nr_nou, v_cod as cod_nou from vanzari v where v.id_vanzare = c_sablon) s ] + ; + [ on (t.serie_act = c_serie and t.numar_act = s.nr_nou) ] + ; + [ when matched then update set t.facturat = 0, t.sters = 0, t.id_fact = null, ] + ; + [ t.data_facturat = null, t.id_utilfact = null, t.total_fara_tva = 730, ] + ; + [ t.total_tva = 138.7, t.total_cu_tva = 868.7, t.valoare_achizitie = 0 ] + ; + [ when not matched then insert ] + ; + [ (id_vanzare, id_util, dataora, sters, id_lucrare, id_part, numar_act, nr_persoane, ] + ; + [ nrinmat, facturat, data_facturat, id_utilfact, id_punctvanzare, id_comanda, tip, ] + ; + [ id_gestiune, cod, id_delegat, id_masina, data_act, id_agent, discount, ] + ; + [ discount_evidentiat, text_aditional, in_valuta, serie_act, id_sucursala, id_ruta, ] + ; + [ id_sectie, diftotftva, diftottva, dataora_exp, afisare_scadenta, tva_incasare, ] + ; + [ id_facturare, listare_detaliata, valoare_achizitie, total_fara_tva, total_tva, ] + ; + [ total_cu_tva, id_valuta, curs, multiplicator, eproforma) ] + ; + [ values ] + ; + [ (0, s.id_util, sysdate, 0, s.id_lucrare, s.id_part, s.nr_nou, s.nr_persoane, ] + ; + [ s.nrinmat, 0, null, null, s.id_punctvanzare, null, s.tip, ] + ; + [ s.id_gestiune, s.cod_nou, s.id_delegat, s.id_masina, trunc(sysdate), s.id_agent, s.discount, ] + ; + [ s.discount_evidentiat, s.text_aditional, s.in_valuta, c_serie, s.id_sucursala, s.id_ruta, ] + ; + [ s.id_sectie, s.diftotftva, s.diftottva, sysdate, s.afisare_scadenta, s.tva_incasare, ] + ; + [ s.id_facturare, s.listare_detaliata, 0, 730, 138.7, ] + ; + [ 868.7, s.id_valuta, s.curs, s.multiplicator, 0); ] + ; + [ select id_vanzare, cod into v_id, v_cod from vanzari where serie_act = c_serie and numar_act = v_nr; ] + ; + [ merge into vanzari_detalii t ] + ; + [ using (select v_id as id_vanzare, 4294507316 as id_articol, 2 as id_pol, 100 as pret, ] + ; + [ 3 as cantitate, 0 as pret_achizitie from dual union all ] + ; + [ select v_id, 4294507331, 36, 70, 1, 0 from dual union all ] + ; + [ select v_id, 4294506670, 35, 180, 2, null from dual) s ] + ; + [ on (t.id_vanzare = s.id_vanzare and t.id_articol = s.id_articol and t.id_pol = s.id_pol) ] + ; + [ when matched then update set t.pret = s.pret, t.cantitate = s.cantitate, ] + ; + [ t.pret_achizitie = s.pret_achizitie, t.sters = 0 ] + ; + [ when not matched then insert ] + ; + [ (id_vanzare, id_articol, id_pol, pret, validat, sters, proc_tvav, cantitate, diferenta, ] + ; + [ discount_unitar, id_gestiune, cont, id_valuta, pret_cu_tva, pret_achizitie, custodie, ] + ; + [ id_jtva_coloana, descarcat, pretd, id_valutad, lot, serie) ] + ; + [ values ] + ; + [ (s.id_vanzare, s.id_articol, s.id_pol, s.pret, 0, 0, 1.19, s.cantitate, 0, ] + ; + [ 0, null, null, 3, 0, s.pret_achizitie, 0, ] + ; + [ 31, 0, 0, null, null, null); ] + ; + [ merge into act t ] + ; + [ using (select a.*, v_cod as cod_nou, v_nr as nr_nou from act a where a.id_act = c_act_sablon) s ] + ; + [ on (t.cod = s.cod_nou and t.scd = '418' and t.scc = '4428') ] + ; + [ when matched then update set t.nract = s.nr_nou, t.serie_act = c_serie, t.sters = 0, ] + ; + [ t.dataireg = trunc(sysdate), t.dataact = trunc(sysdate) ] + ; + [ when not matched then insert ] + ; + [ (luna, an, cod, dataireg, nract, dataact, explicatia, scd, ascd, scc, ascc, suma, ] + ; + [ id_factd, id_factc, pereched, perechec, suma_val, curs, datascad, neimpozab, nnir, ] + ; + [ id_util, dataora, id_responsabil, id_venchelt, id_sectie, id_set, id_fact, id_partd, ] + ; + [ id_partc, id_sucursala, id_fdoc, sters, id_lucrare, id_gestin, id_gestout, id_valuta, ] + ; + [ proc_tva, id_ctr, id_jtva_coloana, serie_act, validat, taxcode, paymentcode) ] + ; + [ values ] + ; + [ (to_number(to_char(sysdate,'mm')), to_number(to_char(sysdate,'yyyy')), s.cod_nou, ] + ; + [ trunc(sysdate), s.nr_nou, trunc(sysdate), s.explicatia, '418', s.ascd, '4428', s.ascc, ] + ; + [ 138.7, s.id_factd, 0, s.pereched, 0, 0, 0, s.datascad, s.neimpozab, s.nnir, ] + ; + [ s.id_util, sysdate, s.id_responsabil, s.id_venchelt, s.id_sectie, s.id_set, 0, s.id_partd, ] + ; + [ s.id_partc, s.id_sucursala, s.id_fdoc, 0, s.id_lucrare, s.id_gestin, s.id_gestout, ] + ; + [ s.id_valuta, 1.19, s.id_ctr, 32, c_serie, s.validat, s.taxcode, s.paymentcode); ] + ; + [ end loop; ] + ; + [ commit; ] + ; + [end;] + + goExecutor.oExecuta(lcSql) + DO S63Log WITH ' aviz: pool AVZ13 completat cu ' + TRANSFORM(tnLot) + ' avize noi' +ENDPROC + +*================================================================================== +* Sursele pentru RETUR in lei (tip 8). Filtrul e cel din caut_facturi_multiple_client +* (oproceduri_facturare.prg:2110): fact_vfacturi, tip in (1,2,3,4,5,6,10,-1,-2,-3,-4,-11), +* in_valuta = 0. O sursa = o singura factura (lista de un element), ca la alegerea uzuala. +PROCEDURE AlegeSurseRetur + LOCAL lnQ, lnI, lnLinii + CREATE CURSOR crsCandRetur (idpart N(20), nume C(100), listaid M, descr M, linii N(10), idcom N(20)) + + lnQ = goExecutor.oExecute([select f.id_vanzare, f.id_part, p.nume, f.serie_act, f.numar_act ] + ; + [from fact_vfacturi f, nom_parteneri p ] + ; + [where f.id_part = p.id_part and f.sters = 0 and f.tip in (1,2,3,4,5,6,10,-1,-2,-3,-4,-11) ] + ; + [and f.in_valuta = 0 and f.tip <> 4 ] + STRTRAN(gcCondSucursala, [id_sucursala], [f.id_sucursala]) + ; + [ and upper(p.nume) not like '%CLIENT%' order by f.id_vanzare desc], 'crsRetLista') + IF lnQ < 0 OR !USED('crsRetLista') + DO Assert WITH .F., 'retur: lista facturilor returnabile citita din Oracle' + RETURN + ENDIF + DO S63Log WITH ' retur: facturi returnabile in lei = ' + TRANSFORM(RECCOUNT('crsRetLista')) + + lnI = 0 + SELECT crsRetLista + SCAN WHILE lnI < 20 + lnI = lnI + 1 + LOCAL lnIdVz, lnIdP, lcNm, lcNr + lnIdVz = crsRetLista.id_vanzare + lnIdP = crsRetLista.id_part + lcNm = ALLTRIM(NVL(crsRetLista.nume, '')) + lcNr = NumarDoc(crsRetLista.serie_act, crsRetLista.numar_act) + poDate = CREATEOBJECT('empty') + ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(lnIdVz))) + ADDPROPERTY(poDate, 'in_valuta', 0) + DO Inchide WITH 'crsSonda' + lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_retur(?poDate.in_valuta,?poDate.listaid,?gnIdUtil)}], 'crsSonda') + lnLinii = IIF(lnQ >= 0 AND USED('crsSonda'), RECCOUNT('crsSonda'), 0) + LOCAL lnValRet + lnValRet = ValoareSonda(lnLinii) + DO Inchide WITH 'crsSonda' + DO S63Log WITH ' retur candidat: factura ' + TRANSFORM(lnIdVz) + ' [' + lcNr + '] client ' + ; + TRANSFORM(lnIdP) + ' -> linii=' + TRANSFORM(lnLinii) + ' valoare=' + TRANSFORM(lnValRet) + IF lnLinii > 0 AND lnValRet <> 0 + INSERT INTO crsCandRetur (idpart, nume, listaid, descr, linii, idcom) ; + VALUES (lnIdP, lcNm, ALLTRIM(TRANSFORM(lnIdVz)), lcNr, lnLinii, 0) + ENDIF + SELECT crsRetLista + ENDSCAN + DO Inchide WITH 'crsRetLista' + poDate = NULL + + DO AlegePereche WITH 'crsCandRetur', 'crsSurseRetur', 'retur' +ENDPROC + +*================================================================================== +* Din candidatii gasiti, alege DOUA surse distincte, preferand o pereche cu acelasi numar de linii: +* liniile difera oricum ca articole (surse diferite), dar un numar egal de linii face comparatia +* VANZARI_DETALII interpretabila in loc de un esec garantat pe "numar de linii diferit". +PROCEDURE AlegePereche + LPARAMETERS tcCandidati, tcRezultat, tcEticheta + LOCAL lnI, lnJ, lnCnt, lnA, lnB + DO Inchide WITH tcRezultat + lnCnt = IIF(USED(tcCandidati), RECCOUNT(tcCandidati), 0) + DO S63Log WITH ' ' + tcEticheta + ': candidati cu articole = ' + TRANSFORM(lnCnt) + IF lnCnt < 2 + DO Assert WITH .F., tcEticheta + ': cel putin 2 surse cu articole in date, e=' + TRANSFORM(lnCnt) + RETURN + ENDIF + + lnA = 0 + lnB = 0 + FOR lnI = 1 TO lnCnt - 1 + FOR lnJ = lnI + 1 TO lnCnt + GO lnI IN (tcCandidati) + LOCAL lnLinI + lnLinI = EVALUATE(tcCandidati + '.linii') + GO lnJ IN (tcCandidati) + IF lnA = 0 AND EVALUATE(tcCandidati + '.linii') = lnLinI + lnA = lnI + lnB = lnJ + ENDIF + ENDFOR + ENDFOR + IF lnA = 0 + lnA = 1 + lnB = 2 + DO S63Log WITH ' ' + tcEticheta + ': nicio pereche cu acelasi numar de linii - se iau primii doi candidati' + ENDIF + + SELECT * FROM (tcCandidati) WHERE RECNO() = lnA OR RECNO() = lnB INTO CURSOR (tcRezultat) READWRITE + SELECT (tcRezultat) + SCAN + DO S63Log WITH ' ' + tcEticheta + ' sursa ' + TRANSFORM(RECNO()) + ': client ' + ; + TRANSFORM(idpart) + ' [' + ALLTRIM(nume) + '] listaid=[' + ALLTRIM(listaid) + ; + '] descriere=[' + ALLTRIM(descr) + '] linii=' + TRANSFORM(linii) + ENDSCAN + DO Assert WITH RECCOUNT(tcRezultat) = 2, tcEticheta + ': doua surse distincte alese, e=' + TRANSFORM(RECCOUNT(tcRezultat)) + DO Inchide WITH tcCandidati +ENDPROC + +*================================================================================== +* EmiteS63: emite un document REAL pe forma indicata, din sursa pe care e pozitionat tcCursorSursa. +* Intoarce id_vanzare (0 = esec); serie/numar se intorc prin gcUltimaSerie / gnUltimulNract. +FUNCTION EmiteS63 + LPARAMETERS tnTip, tcCursorSursa, tlFormNou, tcEticheta + LOCAL lnIdVz, lcSerie, lnNract, oform, loRez, llOk, lnArt, lnFact, lcClasa + lnIdVz = 0 + lcSerie = '' + lnNract = 0 + gcUltimaSerie = '' + gnUltimulNract = 0 + gcCaz = '[' + tcEticheta + '] ' + + LOCAL lnIdPart, lcNume, lcLista, lcDescr, lnIdCom + SELECT (tcCursorSursa) + lnIdPart = idpart + lcNume = ALLTRIM(nume) + lcLista = ALLTRIM(listaid) + lcDescr = ALLTRIM(descr) + lnIdCom = idcom + + DO S63Log WITH '--- ' + tcEticheta + ' (tip=' + TRANSFORM(tnTip) + ' listaid=[' + lcLista + '] client=' + ; + TRANSFORM(lnIdPart) + ' [' + lcNume + '], forma=' + IIF(tlFormNou, 'NOUA (v2)', 'VECHE (v1)') + ') ---' + + DO CuratieCrs + poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip - 1, tnTip) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + + *-- antetul, exact ca dupa cautarea din productie (do_cauta_avize / do_cauta_facturi) + poDate.id_client = lnIdPart + poDate.nume_client = lcNume + poDate.listaid = lcLista + poDate.descriere = lcDescr + IF tnTip = 4 + *-- do_cauta_avize adauga mereu proprietatea, chiar cand niciun aviz nu vine din comanda + *-- (ofacturare_antet.prg:80); e citita in interogarea de antet, ofacturare.prg:954 + ADDPROPERTY(poDate, 'id_comanda_aviz', lnIdCom) + ELSE + poDate.text_aditional = [RETUR FACTURA ] + lcDescr + ENDIF + poDate.id_delegat = 39 + IF EMPTY(NVL(poDate.id_fdoc, 0)) + poDate.id_fdoc = 1 + ENDIF + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + IF poDate.rezultat_serii <> 3 + DO Assert WITH .F., tcEticheta + ': rezultat_serii = 3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii) + DO Goleste + RETURN 0 + ENDIF + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + DO S63Log WITH ' nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ; + ' nract=' + TRANSFORM(poDate.nract) + ' in_valuta=' + TRANSFORM(poDate.in_valuta) + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + gcMockApeluri = '' + IF tlFormNou + *-- v2: crsfactura gol INAINTE de formular (ca in factureaza(), ramura llFacturareNoua); + *-- articolele se incarca DUPA, prin butonul "Incarca articole" + DO PregatesteFacturaCrs + oform = CREATEOBJECT('frm_facturare_articole2') + lcClasa = 'frm_facturare_articole2' + ELSE + *-- v1: incarca_cursor_articole() INAINTE de formular (ca in factureaza(), ramura veche); + *-- functia isi creeaza singura crsfactura + pnTotalDiscountAvize = 0 + loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere) + llOk = (loRez.nSucces >= 0) AND loRez.lArticole + DO S63Log WITH ' incarca_cursor_articole -> nSucces=' + TRANSFORM(loRez.nSucces) + ; + ' lArticole=' + TRANSFORM(loRez.lArticole) + ' crsarticole=' + ; + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)') + DO Assert WITH llOk, tcEticheta + ': incarca_cursor_articole a adus articole' + IF !llOk + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (' + tcEticheta + ');' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Goleste + RETURN 0 + ENDIF + oform = CREATEOBJECT('frm_facturare_articole') + lcClasa = 'frm_facturare_articole' + ENDIF + IF VARTYPE(oform) <> 'O' + DO Assert WITH .F., tcEticheta + ': Createobject ' + lcClasa + DO Goleste + RETURN 0 + ENDIF + oform.WindowType = 0 + oform.Show() + DOEVENTS FORCE + + *-- traseul real: butonul, nu metoda. Mock-ul se reincarca imediat inainte, ca sa castige + *-- rezolutia de nume pentru amessagebox-ul apelat din interiorul .vcx (descoperirea S5b). + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + IF tlFormNou + DO Assert WITH LOWER(ALLTRIM(oform.but_incarca_articole.cAction)) == 'do_incarca_articole', ; + tcEticheta + ': butonul Incarca articole duce la do_incarca_articole' + oform.but_incarca_articole.Click() + ELSE + DO Assert WITH LOWER(ALLTRIM(oform.but_urmator_tot1.cAction)) == 'do_adauga_tot', ; + tcEticheta + ': butonul Adauga tot duce la do_adauga_tot' + DO Assert WITH oform.but_urmator_tot1.Visible, ; + tcEticheta + ': butonul Adauga tot e VIZIBIL pe v1 pentru tipul ' + TRANSFORM(tnTip) + ' (Init il aprinde)' + oform.but_urmator_tot1.Click() + ENDIF + DOEVENTS FORCE + + lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0) + lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) + DO S63Log WITH ' dupa Click: crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact) + DO S63Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + DO Assert WITH lnFact > 0, tcEticheta + ': crsfactura populat dupa apasarea butonului, e=' + TRANSFORM(lnFact) + + IF lnFact = 0 + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (' + tcEticheta + ');' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Elibereaza WITH oform + DO Goleste + RETURN 0 + ENDIF + + DO S63Log WITH ' [pas] do_calculeaza_totaluri' + oform.do_calculeaza_totaluri() + DOEVENTS FORCE + DO S63Log WITH ' [pas] do_calculeaza_totaluri OK, ntotalron=' + TRANSFORM(oform.ntotalron) + + lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act)) + lnNract = poDate.nract + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + DO S63Log WITH ' [pas] but_termin1.Click' + LOCAL lnIntrInainte, lnAvRetInainte + lnIntrInainte = gnIntrebariRetur + lnAvRetInainte = gnAvizReturDeschis + oform.but_termin1.Click() + DOEVENTS FORCE + DO S63Log WITH ' intrebarea "avizul de retur" pe acest caz: ' + TRANSFORM(gnIntrebariRetur - lnIntrInainte) + ; + '; FRM_DATE_AVIZ_RETUR deschis: ' + TRANSFORM(gnAvizReturDeschis - lnAvRetInainte) + DO S63Log WITH ' but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + DO S63Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + *-- poDate.nid_vanzare NU e o dovada de scriere: la esec ramane santinela 9999999999 pusa de + *-- pachetul Oracle. Singura dovada e randul din VANZARI, cautat pe SERIE_ACT + NRACT. + lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract) + IF lnIdVz < 0 + lnIdVz = 0 + ENDIF + DO S63Log WITH ' verificare in VANZARI pe ' + lcSerie + ' ' + TRANSFORM(lnNract) + ' -> id_vanzare=' + TRANSFORM(lnIdVz) + DO Assert WITH lnIdVz > 0, tcEticheta + ': documentul exista in VANZARI (jonctiune serie_act+numar_act), e=' + TRANSFORM(lnIdVz) + + IF lnIdVz > 0 + gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (' + tcEticheta + ');' + ELSE + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', nescris);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + lcSerie = '' + lnNract = 0 + ENDIF + + DO Elibereaza WITH oform + DO Goleste + gcUltimaSerie = lcSerie + gnUltimulNract = lnNract + RETURN lnIdVz +ENDFUNC + +*================================================================================== +* Izolarea unei emiteri: o exceptie intr-un caz nu trebuie sa opreasca restul suitei. TRY/CATCH e +* AICI, nu in EmiteS63 - VFP refuza RETURN in interiorul unui bloc TRY (eroarea 2060). +* Dupa o exceptie: ROLLBACK explicit (tranzactia poate ramane deschisa in mijlocul scrierii), +* dezalocarea numarului (altfel se arde) si eliberarea formularelor ramase. +FUNCTION EmiteProtejat + LPARAMETERS tnTip, tcCursorSursa, tlFormNou, tcEticheta + LOCAL lnRez, lnI + lnRez = 0 + TRY + lnRez = EmiteS63(tnTip, tcCursorSursa, tlFormNou, tcEticheta) + CATCH TO loExcEm + DO S63Log WITH ' EXCEPTIE in ' + tcEticheta + ': ErrorNo=' + TRANSFORM(loExcEm.ErrorNo) + ; + ' Message=' + loExcEm.Message + ' Proc=' + loExcEm.Procedure + ':' + TRANSFORM(loExcEm.LineNo) + ; + ' [' + TRANSFORM(loExcEm.LineContents) + ']' + DO Assert WITH .F., tcEticheta + ': emiterea a mers pana la capat fara exceptie (ErrorNo=' + ; + TRANSFORM(loExcEm.ErrorNo) + ')' + lnRez = 0 + gcUltimaSerie = '' + gnUltimulNract = 0 + TRY + goExecutor.oExecute("ROLLBACK") + CATCH + ENDTRY + TRY + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + ; + TRANSFORM(poDate.nract) + ' (' + tcEticheta + ', dupa exceptie);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + CATCH + ENDTRY + FOR lnI = _SCREEN.FormCount TO 1 STEP -1 + TRY + _SCREEN.Forms(lnI).Release() + CATCH + ENDTRY + ENDFOR + DO CuratieCrs + DO Goleste + ENDTRY + RETURN lnRez +ENDFUNC + +*================================================================================== +* Rutarea, structural: butonul viu de pe fiecare forma si gatarea cablarii pe tipurile 4/8/9. +PROCEDURE AsertiuniRutare + LOCAL lcTxt + gcCaz = '[RUTARE] ' + lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2") + IF EMPTY(lcTxt) + DO Assert WITH .F., 'FILETOSTR ofacturare.vc2 a esuat/gol' + RETURN + ENDIF + DO Assert WITH OCCURS("caction = do_adauga_tot", lcTxt) = 1, ; + 'un singur caction = do_adauga_tot in fisier (butonul viu e pe v1)' + DO Assert WITH OCCURS("caction = do_incarca_articole", lcTxt) = 1, ; + 'un singur caction = do_incarca_articole in fisier (butonul viu e pe v2)' + DO Assert WITH "If Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47, 8, 9)" $ lcTxt, ; + 'cablarea din do_incarca_articole contine tipurile 4 (aviz) si 8, 9 (retur)' + DO Assert WITH !("Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47, 8, 9, 24)" $ lcTxt), ; + 'tipul 24 (aviz retur) NU e cablat pe v2 - datoria D2, ii lipsesc trei Inlist' +ENDPROC + +*================================================================================== +PROCEDURE Compara + LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip + LOCAL nFail + gcCaz = '[CompDoc ' + tcTip + '] ' + nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-3 ' + tcTip + ' v1(' + TRANSFORM(tnNr1) + ') vs v2(' + TRANSFORM(tnNr2) + ')') + DO Assert WITH nFail >= 0, tcTip + ': CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail) + DO S63Log WITH ' CompDoc ' + tcTip + ' esecuri totale=' + TRANSFORM(nFail) + ; + ' (surse diferite - fiecare divergenta se argumenteaza in raport)' + DO ComparaConfig WITH tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip +ENDPROC + +* Campurile de CONFIGURATIE nu depind de sursa: trebuie sa fie identice v1/v2 chiar cu surse diferite. +PROCEDURE ComparaConfig + LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip + LOCAL nId1, nId2, lnQ + nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1) + nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2) + IF nId1 <= 0 OR nId2 <= 0 + DO Assert WITH .F., tcTip + ': jonctiune serie_act+nract gaseste ambele id_vanzare (v1=' + ; + TRANSFORM(nId1) + ' v2=' + TRANSFORM(nId2) + ')' + RETURN + ENDIF + lnQ = goExecutor.oExecute([select id_vanzare, tip, in_valuta, id_valuta, multiplicator, ] + ; + [discount_evidentiat, tva_incasare, nvl(tip_factura,0) as tip_factura, nvl(tip_saft,0) as tip_saft, ] + ; + [nvl(coeficient_k,0) as coeficient_k, nvl(id_delegat,0) as id_delegat, nvl(tip_incasat,0) as tip_incasat ] + ; + [from vanzari where id_vanzare in (] + TRANSFORM(nId1) + [,] + TRANSFORM(nId2) + [)], 'crsCfg') + IF lnQ < 0 OR RECCOUNT('crsCfg') <> 2 + DO Assert WITH .F., tcTip + ': citire campuri de configuratie din VANZARI (Reccount asteptat 2)' + DO Inchide WITH 'crsCfg' + RETURN + ENDIF + LOCAL ARRAY laC1[12], laC2[12] + SELECT crsCfg + LOCATE FOR id_vanzare = nId1 + SCATTER TO laC1 + LOCATE FOR id_vanzare = nId2 + SCATTER TO laC2 + DO Inchide WITH 'crsCfg' + + LOCAL ARRAY laNume[11] + laNume[1] = 'TIP' + laNume[2] = 'IN_VALUTA' + laNume[3] = 'ID_VALUTA' + laNume[4] = 'MULTIPLICATOR' + laNume[5] = 'DISCOUNT_EVIDENTIAT' + laNume[6] = 'TVA_INCASARE' + laNume[7] = 'TIP_FACTURA' + laNume[8] = 'TIP_SAFT' + laNume[9] = 'COEFICIENT_K' + laNume[10] = 'ID_DELEGAT' + laNume[11] = 'TIP_INCASAT' + LOCAL lnI + FOR lnI = 1 TO 11 + DO Assert WITH CdocEgal(laC1[lnI + 1], laC2[lnI + 1]), ; + tcTip + ': ' + laNume[lnI] + ' identic (configuratie, nu sursa) v1=' + TRANSFORM(laC1[lnI + 1]) + ; + ' v2=' + TRANSFORM(laC2[lnI + 1]) + ENDFOR +ENDPROC + +*================================================================================== +* crsfactura + coloana "gestiune" ceruta de coloana combo a grilei pe v2 +PROCEDURE PregatesteFacturaCrs + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp +ENDPROC + +PROCEDURE Elibereaza + LPARAMETERS toForm + IF TYPE('toForm') = 'O' AND !ISNULL(toForm) + TRY + toForm.Release() + CATCH + ENDTRY + ENDIF + DO CuratieCrs +ENDPROC + +PROCEDURE Goleste + poDate = NULL + poGeneratorNumere = NULL + poDateGestiuneDest = NULL +ENDPROC + +PROCEDURE CuratieCrs + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'crsComTemp' + DO Inchide WITH 'crsartselectate' + DO Inchide WITH 'jtva_coloane' +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +* Valoarea sursei, din cursorul-sonda: o sursa cu valoare 0 declanseaza dialogul "Factura are +* totalul 0. Doriti sa continuati?" si ar produce un document fara continut de comparat. +* -1 = necunoscut (cursorul nu are campurile), deci nu se filtreaza. +FUNCTION ValoareSonda + LPARAMETERS tnLinii + LOCAL lnVal, lcPret, lcExpr + lnVal = -1 + *-- cursor_avize / cursor_retur intorc coloana PRET, nu PRETFTVA: cu numele fixat pe pretftva + *-- valoarea ramanea -1 pe orice sursa, deci filtrul "valoare <> 0" nu respingea nimic + IF tnLinii > 0 AND USED('crsSonda') AND TYPE('crsSonda.cantitate') = 'N' + lcPret = '' + DO CASE + CASE TYPE('crsSonda.pretftva') = 'N' + lcPret = 'pretftva' + CASE TYPE('crsSonda.pret') = 'N' + lcPret = 'pret' + CASE TYPE('crsSonda.pretctva') = 'N' + lcPret = 'pretctva' + ENDCASE + IF !EMPTY(lcPret) + lcExpr = 'ABS(NVL(cantitate, 0) * NVL(' + lcPret + ', 0))' + SELECT crsSonda + SUM &lcExpr TO lnVal + ENDIF + ENDIF + RETURN lnVal +ENDFUNC + +* "SSS 645" - forma in care do_cauta_avize / do_cauta_facturi compun poDate.descriere +FUNCTION NumarDoc + LPARAMETERS tcSerie, tnNumar + LOCAL lcS + lcS = ALLTRIM(NVL(tcSerie, '')) + RETURN ALLTRIM(IIF(EMPTY(lcS), '', lcS + ' ') + ALLTRIM(STR(NVL(tnNumar, 0), 20, 0))) +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO S63Log WITH 'PASS: ' + gcCaz + tcMsg + ELSE + gnFail = gnFail + 1 + DO S63Log WITH 'FAIL: ' + gcCaz + tcMsg + ENDIF +ENDPROC + +PROCEDURE S63Log + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE S63Err + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnErr = gnErr + 1 + DO S63Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE S63Final + LOCAL lnI + IF TYPE('_SCREEN.tmrS63') = 'O' + _SCREEN.tmrS63.Enabled = .F. + TRY + _SCREEN.RemoveObject('tmrS63') + CATCH + ENDTRY + ENDIF + *-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (caseta modala = + *-- rulare atarnata), asa ca se inchid explicit inainte (capcana platita la S8) + FOR lnI = _SCREEN.FormCount TO 1 STEP -1 + TRY + _SCREEN.Forms(lnI).Release() + CATCH + ENDTRY + ENDFOR + *-- registrul numerelor SSS direct din baza: singura sursa care spune care numar e SCRIS si care + *-- e ARS (alocat si nescris). Raportul de sesiune se face pe asta, nu pe jurnalul din memorie. + TRY + IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ; + [where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 720 order by numar_act], 'crsNrSSS') >= 0 + DO S63Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-720):' + SELECT crsNrSSS + SCAN + DO S63Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ENDSCAN + USE IN crsNrSSS + ENDIF + CATCH + ENDTRY + DO S63Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere + DO S63Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr) + DO S63Log WITH 'END ' + TTOC(DATETIME()) + QUIT +ENDPROC + +*================================================================================== +* driverS63: apasa automat pe formele modale care nu trec prin functia amessagebox - +* MESSAGEBOX_FORM (cmdYes/cmdOk) si FRM_ALTE_DATE de pe v1 (do_termin, NU Release). +* Garda de reintrare lBusy: do_termin cedeaza controlul buclei de mesaje. +* Nu atinge in niciun fel FRM_FACTURARE_ARTICOLE / FRM_FACTURARE_ARTICOLE2. +DEFINE CLASS driverS63 AS Custom + nUltimAlteDate = 0 + lBusy = .F. + + PROCEDURE Executa + IF This.lBusy + RETURN + ENDIF + This.lBusy = .T. + IF TYPE('_SCREEN.tmrS63') = 'O' + _SCREEN.tmrS63.Enabled = .F. + ENDIF + TRY + LOCAL lnI, loMsgForm, loAlteDate, lcClasa, loAvizRetur + loMsgForm = NULL + loAlteDate = NULL + loAvizRetur = NULL + FOR lnI = 1 TO _SCREEN.FormCount + lcClasa = UPPER(_SCREEN.Forms(lnI).Class) + IF 'MESSAGEBOX_FORM' $ lcClasa + loMsgForm = _SCREEN.Forms(lnI) + ENDIF + IF lcClasa == 'FRM_ALTE_DATE' + loAlteDate = _SCREEN.Forms(lnI) + ENDIF + IF 'DATE_AVIZ_RETUR' $ lcClasa + loAvizRetur = _SCREEN.Forms(lnI) + ENDIF + IF !(lcClasa $ gcClaseVazute) + gcClaseVazute = gcClaseVazute + lcClasa + ';' + DO S63Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' + ENDIF + ENDFOR + *-- plasa de siguranta: daca totusi se deschide FRM_DATE_AVIZ_RETUR (modal, nedrivabil), + *-- se elibereaza ca sa nu atarne rularea; cazul se marcheaza neconcludent in log + IF !ISNULL(loAvizRetur) + gnAvizReturDeschis = gnAvizReturDeschis + 1 + DO S63Log WITH ' [driver] FRM_DATE_AVIZ_RETUR deschis - eliberat fortat (caz neconcludent)' + TRY + loAvizRetur.Release() + CATCH + ENDTRY + ENDIF + IF !ISNULL(loMsgForm) + TRY + LOCAL lcTextMsg + lcTextMsg = '' + TRY + lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value)) + CATCH + ENDTRY + DO S63Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']' + IF 'avizul de retur' $ LOWER(lcTextMsg) + gnIntrebariRetur = gnIntrebariRetur + 1 + ENDIF + DO CASE + *-- raspunsul NU e "Da" implicit: singura confirmare de pe acest traseu e + *-- "Doriti sa se inregistreze si avizul de retur?", iar un Da deschide + *-- FRM_DATE_AVIZ_RETUR - modal, nedrivabil headless (masurat: a atarnat rularea). + *-- Avizul de retur e al doilea document, in afara perimetrului S6-3. + CASE ('avizul de retur' $ LOWER(lcTextMsg) OR 'totalul 0' $ LOWER(lcTextMsg)) ; + AND gcRaspunsMsgForm == 'NU' AND PEMSTATUS(loMsgForm.cmgBotones, 'cmdNo', 5) + DO S63Log WITH ' [driver msg] apas cmgBotones.cmdNo' + loMsgForm.cmgBotones.cmdNo.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) + DO S63Log WITH ' [driver msg] apas cmgBotones.cmdYes' + loMsgForm.cmgBotones.cmdYes.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) + DO S63Log WITH ' [driver msg] apas cmgBotones.cmdOk' + loMsgForm.cmgBotones.cmdOk.Click() + ENDCASE + CATCH TO loExcMsg + DO S63Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message + ENDTRY + ELSE + IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1) + This.nUltimAlteDate = SECONDS() + TRY + DO S63Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ; + TRANSFORM(NVL(poDate.id_delegat, 0)) + ')' + loAlteDate.do_termin() + CATCH TO loExcAD + DO S63Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message + ENDTRY + ENDIF + ENDIF + CATCH TO loExcTop + DO S63Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message + FINALLY + IF TYPE('_SCREEN.tmrS63') = 'O' + _SCREEN.tmrS63.Enabled = .T. + ENDIF + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_unificat/test_s6_3_aviz_retur.ps1 b/utile/Teste/facturare_unificat/test_s6_3_aviz_retur.ps1 new file mode 100644 index 0000000..dd51068 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_3_aviz_retur.ps1 @@ -0,0 +1,28 @@ +$ErrorActionPreference = 'Stop' +$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat' +$prg = Join-Path $dir 'test_s6_3_aviz_retur.prg' +$log = Join-Path $dir 'out\test_s6_3_aviz_retur.log' +$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' + +$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_3_aviz_retur*' } +if ($viu) { + "Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua." + exit 1 +} + +Set-Location $dir +Remove-Item (Join-Path $dir 'test_s6_3_aviz_retur.FXP') -ErrorAction SilentlyContinue +Remove-Item $log -ErrorAction SilentlyContinue + +$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru +"lansat PID " + $p.Id +$null = $p.WaitForExit(300000) +if (-not $p.HasExited) { + "ATARNAT dupa 300s - omor instanta (filtrat pe CommandLine)" + Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_3_aviz_retur*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force } +} +if (Test-Path $log) { + Get-Content $log +} else { + "Log inexistent: $log" +} diff --git a/utile/Teste/facturare_unificat/test_s6_3b_v2_primul.prg b/utile/Teste/facturare_unificat/test_s6_3b_v2_primul.prg new file mode 100644 index 0000000..4c17ae8 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_3b_v2_primul.prg @@ -0,0 +1,1019 @@ +* test_s6_3b_v2_primul.prg +* Elimina confundul din raport_s6_3_aviz_retur.md: pana acum v2 a emis INTOTDEAUNA dupa v1, in +* aceeasi sesiune Oracle, iar de doua ori dupa o exceptie rollback-uita. Aici se emite EXCLUSIV pe +* v2 (frm_facturare_articole2), intr-o sesiune Oracle proaspata, v2 PRIMUL: intai avizul (tip 4), +* apoi returul (tip 8). Nicio emitere pe v1. +* +* Diferenta fata de test_s6_3_aviz_retur.prg, in afara de "doar v2": +* - NICIUN bloc TRY pe traseul de emitere. Izolarea se face pe ON ERROR, iar handlerul tipareste +* stiva completa cu ASTACKINFO(): obiectul de exceptie VFP nu poarta apelantul, deci +* "Proc=oexecute:330" e punctul de aruncare, nu cauza (D-A, eroarea 1472). +* - sursele sunt FIXATE la cele din raport, ca rularea sa fie comparabila: aviz 131 (D-A) si +* factura 1115 = SSS 659 (D-C). Daca o sursa nu mai e disponibila, se spune care si de ce. +* +* Perechea v1 pentru CompDoc NU se reemite: se refolosesc documentele v1 deja scrise, +* aviz SSS 661 (id_vanzare 1117) si retur SSS 670 (id_vanzare 1121). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_3b_v2_primul.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3b_v2_primul.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167; +* gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat +PUBLIC gcUltimaSerie, gnUltimulNract, goDriverS63b, gcClaseVazute, gcRaspunsMsgForm +PUBLIC gnIntrebariRetur, gnAvizReturDeschis, glInEmitere, gnFatal, gnStivaTiparita + +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3b_v2_primul.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) +gnPass = 0 +gnFail = 0 +gnErr = 0 +gcCaz = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +gcUltimaSerie = "" +gnUltimulNract = 0 +gcClaseVazute = ";" +gcRaspunsMsgForm = "NU" +gnIntrebariRetur = 0 +gnAvizReturDeschis = 0 +glInEmitere = .F. +gnFatal = 0 +gnStivaTiparita = 0 +gcNumere = "" +gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg" + +*-- sursele fixate din raportul S6-3, ca rularea sa fie comparabila cu cele cinci de dinainte +*-- exceptie avizul: sursa se consuma la fiecare rulare, deci se alege la rulare (AlegeSursaAviz) +PUBLIC gnSursaAviz, gnSursaRetur, gcV1SerAviz, gnV1NrAviz, gcV1SerRetur, gnV1NrRetur +gnSursaAviz = 0 +gnSursaRetur = 1115 +gcV1SerAviz = 'SSS' +gnV1NrAviz = 661 +gcV1SerRetur = 'SSS' +gnV1NrRetur = 670 + +PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil +poDate = NULL +poGeneratorNumere = NULL +poDateGestiuneDest = NULL +pnTotalDiscountAvize = 0 +plVizibil = .F. + +*-- FARA TRY pe traseul de emitere: numai asa handlerul vede stiva reala (TRY/CATCH are prioritate +*-- fata de ON ERROR si ar inghiti-o inainte sa apuce ASTACKINFO sa o citeasca). +ON ERROR DO S63bErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + +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 S63bLog WITH 'EROARE: conectare Oracle esuata' + DO S63bFinal +ENDIF +SQLSETPROP(gnHandle, "QueryTimeOut", 45) +DO S63bLog WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE +SET PROCEDURE TO (gcMock) ADDITIVE + +IF !actualizeaza_optiuni_program() + DO S63bLog WITH 'EROARE: actualizeaza_optiuni_program()' + DO S63bFinal +ENDIF +gnScadereStoc = 0 +gnFactSeturi = 0 +gnIdSucursala = 167 +goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]) +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO S63bLog WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ; + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ; + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + ; + ' gl406=' + TRANSFORM(TYPE('gl406') = 'L' AND gl406) + +update_jtva_coloane([JV], [jtva_coloane_temp]) +update_saft_taxtable() + +IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod +ENDIF + +*-- spionul de SQL: BINDEVENT pe goExecutor.oExecute, cu delegatul chemat INAINTE de metoda. +*-- Nu schimba rezultatul apelului; e singurul mod de a vedea sirul REAL trimis, inclusiv cand e +*-- .NULL. (concatenare cu un camp nepazit de Nvl) - caz in care oExecute cade pe This.cSql. +PUBLIC goSpionSql, glSpionActiv, glOpresteLaPretdNul +glSpionActiv = .F. +glOpresteLaPretdNul = .F. +goSpionSql = CREATEOBJECT('spionSql') +BINDEVENT(goExecutor, 'oExecute', goSpionSql, 'Vede', 1) +BINDEVENT(goExecutor, 'oExecuta', goSpionSql, 'Vede', 1) + +goDriverS63b = CREATEOBJECT('driverS63b') +_SCREEN.AddObject('tmrS63b', 'Timer') +_SCREEN.tmrS63b.Interval = 200 +BINDEVENT(_SCREEN.tmrS63b, 'Timer', goDriverS63b, 'Executa') +_SCREEN.tmrS63b.Enabled = .T. + +PUBLIC gnIdAvizV2, gnIdReturV2, gcSerAvizV2, gnNrAvizV2, gcSerReturV2, gnNrReturV2 +PUBLIC gnIdAvizV1Ctrl, gcSerAvizV1Ctrl, gnNrAvizV1Ctrl +PUBLIC gnIdReturV1Ctrl, gcSerReturV1Ctrl, gnNrReturV1Ctrl +STORE 0 TO gnIdAvizV2, gnIdReturV2, gnNrAvizV2, gnNrReturV2, gnIdAvizV1Ctrl, gnNrAvizV1Ctrl +STORE 0 TO gnIdReturV1Ctrl, gnNrReturV1Ctrl +STORE '' TO gcSerAvizV2, gcSerReturV2, gcSerAvizV1Ctrl, gcSerReturV1Ctrl + +DO S63bLog WITH CHR(13) + CHR(10) + '===== DISPONIBILITATEA SURSELOR FIXATE =====' +PUBLIC glAvizOk, glReturOk, gnLiniiAviz, gnLiniiRetur, gnIdPartAviz, gcNumeAviz, gcDescrAviz +PUBLIC gnIdComAviz, gnIdPartRetur, gcNumeRetur, gcDescrRetur +DO AlegeSursaAviz +DO VerificaSursaAviz +DO VerificaSursaRetur + +DO S63bLog WITH CHR(13) + CHR(10) + '===== EMITERE V2, PRIMA SI SINGURA (aviz tip 4, sursa ' + TRANSFORM(gnSursaAviz) + ') =====' +IF glAvizOk + DO EmiteAvizV2 + IF gnFatal <> 0 + DO DupaAbort WITH 'aviz-v2' + ENDIF +ELSE + DO Assert WITH .F., 'aviz-v2: sursa fixata ' + TRANSFORM(gnSursaAviz) + ' inca disponibila' +ENDIF + +*-- controlul lui D-A: sursa NU s-a consumat (v2 a esuat), deci acelasi aviz se poate incerca acum +*-- pe v1, in aceeasi sesiune. Singura proba care separa "defect al lui v2" de "cod comun + date". +DO S63bLog WITH CHR(13) + CHR(10) + '===== CONTROL: acelasi aviz ' + TRANSFORM(gnSursaAviz) + ' pe v1, dupa v2 =====' +IF glAvizOk AND gnIdAvizV2 = 0 + DO ControlAvizV1 + IF gnFatal <> 0 + DO DupaAbort WITH 'aviz-v1-CONTROL' + ENDIF +ELSE + DO S63bLog WITH ' control sarit (v2 a scris documentul sau sursa nu era disponibila)' +ENDIF + +DO S63bLog WITH CHR(13) + CHR(10) + '===== EMITERE V2 (retur tip 8, sursa ' + TRANSFORM(gnSursaRetur) + ') =====' +IF glReturOk + DO EmiteReturV2 + IF gnFatal <> 0 + DO DupaAbort WITH 'retur-v2' + ENDIF +ELSE + DO Assert WITH .F., 'retur-v2: sursa fixata ' + TRANSFORM(gnSursaRetur) + ' inca disponibila' +ENDIF + +*-- controlul lui D-C, simetric cu cel al lui D-A: aceeasi factura sursa, aceeasi sesiune, pe v1. +*-- Sursa nu s-a consumat, fiindca v2 a esuat inainte de scriere. +DO S63bLog WITH CHR(13) + CHR(10) + '===== CONTROL: acelasi retur din factura ' + TRANSFORM(gnSursaRetur) + ' pe v1, dupa v2 =====' +IF glReturOk AND gnIdReturV2 = 0 + DO ControlReturV1 + IF gnFatal <> 0 + DO DupaAbort WITH 'retur-v1-CONTROL' + ENDIF +ELSE + DO S63bLog WITH ' control sarit (v2 a scris documentul sau sursa nu era disponibila)' +ENDIF + +*-- Sursele fixate cad pe amandoua formele, deci nu spun nimic despre v2. Ca sa se stabileasca daca +*-- v2 poate emite tip 4 / tip 8 (pana acum n-a scris niciun asemenea document), se incearca surse +*-- de rezerva, sarind peste cele cu pretd NULL inainte de a arde un numar. +glOpresteLaPretdNul = .T. +IF gnIdAvizV2 = 0 + DO S63bLog WITH CHR(13) + CHR(10) + '===== REZERVA: aviz pe v2, alte surse =====' + DO IncearcaAlt WITH 'aviz', '632,683,667' +ENDIF +IF gnIdReturV2 = 0 + DO S63bLog WITH CHR(13) + CHR(10) + '===== REZERVA: retur pe v2, alte surse =====' + DO IncearcaAlt WITH 'retur', '1114,1113,1112' +ENDIF +glOpresteLaPretdNul = .F. + +DO S63bLog WITH CHR(13) + CHR(10) + '===== CompDoc (jumatatea v1 e refolosita, nu reemisa) =====' +IF gnIdAvizV2 > 0 + DO Compara WITH gcV1SerAviz, gnV1NrAviz, gcSerAvizV2, gnNrAvizV2, 'aviz' +ELSE + DO Assert WITH .F., 'aviz: v2 a scris documentul (fara el nu exista pereche de comparat)' +ENDIF +IF gnIdReturV2 > 0 + DO Compara WITH gcV1SerRetur, gnV1NrRetur, gcSerReturV2, gnNrReturV2, 'retur' +ELSE + DO Assert WITH .F., 'retur: v2 a scris documentul (fara el nu exista pereche de comparat)' +ENDIF + +DO S63bFinal + +*================================================================================== +* Alege sursa de aviz la rulare: filtrul din caut_avize plus conditia de cantitate ramasa din +* pack_facturare.cursor_avize (A.CANTITATE <> NVL(B.CANTITATE, 0)). Un id fixat nu tine: sursa se +* factureaza la prima rulare si nu mai trece filtrul la a doua. +PROCEDURE AlegeSursaAviz + LOCAL lnQ + IF gnSursaAviz > 0 + RETURN + ENDIF + DO Inchide WITH 'crsAvLib' + lnQ = goExecutor.oExecute([select a.id_vanzare from vanzari a, nom_parteneri p ] + ; + [where a.id_part = p.id_part and a.sters = 0 and a.tip in (21,22,26,42) and a.facturat = 0 ] + ; + [and upper(p.nume) not like '%CLIENT%' ] + ; + [and exists (select 1 from vanzari_detalii d where d.id_vanzare = a.id_vanzare and d.sters = 0 ] + ; + [and d.cantitate <> nvl((select sum(c.cantitate) from vanzari_cantitati c ] + ; + [where c.id_vanzare_det_aviz = d.id_vanzare_det and c.sters = 0), 0)) ] + ; + [order by a.id_vanzare desc], 'crsAvLib') + IF lnQ >= 0 AND USED('crsAvLib') AND RECCOUNT('crsAvLib') > 0 + SELECT crsAvLib + GO TOP + gnSursaAviz = crsAvLib.id_vanzare + ENDIF + DO Inchide WITH 'crsAvLib' + DO S63bLog WITH ' sursa aviz aleasa la rulare: ' + TRANSFORM(gnSursaAviz) + DO Assert WITH gnSursaAviz > 0, 'aviz: exista in date un aviz nefacturat cu cantitate ramasa' +ENDPROC + +*================================================================================== +* Sursa avizului: exact filtrul din caut_avize (oproceduri_facturare.prg:2038) plus id-ul ales. +PROCEDURE VerificaSursaAviz + LOCAL lnQ, lnLinii + glAvizOk = .F. + gnLiniiAviz = 0 + gnIdPartAviz = 0 + gcNumeAviz = '' + gcDescrAviz = '' + gnIdComAviz = 0 + lnQ = goExecutor.oExecute([select a.id_vanzare, a.id_part, p.nume, a.serie_act, a.numar_act, a.tip, a.facturat, ] + ; + [(case when a.tip in (21,42) then nvl(a.id_comanda,0) else 0 end) as id_comanda ] + ; + [from vanzari a, nom_parteneri p ] + ; + [where a.id_part = p.id_part and a.sters = 0 and a.id_vanzare = ] + TRANSFORM(gnSursaAviz), 'crsAvOne') + IF lnQ < 0 OR !USED('crsAvOne') OR RECCOUNT('crsAvOne') = 0 + DO S63bLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': INEXISTENT in vanzari' + RETURN + ENDIF + SELECT crsAvOne + GO TOP + DO S63bLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': tip=' + TRANSFORM(tip) + ' facturat=' + TRANSFORM(facturat) + ; + ' client=' + TRANSFORM(id_part) + ' [' + ALLTRIM(NVL(nume, '')) + '] doc=' + NumarDoc(serie_act, numar_act) + IF !INLIST(NVL(tip, 0), 21, 22, 26, 42) OR NVL(facturat, 1) <> 0 + DO S63bLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': NU mai trece filtrul caut_avize (tip in 21,22,26,42 si facturat=0)' + DO Inchide WITH 'crsAvOne' + RETURN + ENDIF + gnIdPartAviz = crsAvOne.id_part + gcNumeAviz = ALLTRIM(NVL(crsAvOne.nume, '')) + gcDescrAviz = NumarDoc(crsAvOne.serie_act, crsAvOne.numar_act) + gnIdComAviz = NVL(crsAvOne.id_comanda, 0) + DO Inchide WITH 'crsAvOne' + + poDate = CREATEOBJECT('empty') + ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(gnSursaAviz))) + pnTotalDiscountAvize = 0 + DO Inchide WITH 'crsSonda' + lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}], 'crsSonda') + lnLinii = IIF(lnQ >= 0 AND USED('crsSonda'), RECCOUNT('crsSonda'), 0) + DO S63bLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': cursor_avize -> linii=' + TRANSFORM(lnLinii) + DO Inchide WITH 'crsSonda' + poDate = NULL + gnLiniiAviz = lnLinii + glAvizOk = (lnLinii > 0) + DO Assert WITH glAvizOk, 'aviz-v2: sursa fixata ' + TRANSFORM(gnSursaAviz) + ' da articole, linii=' + TRANSFORM(lnLinii) + + *-- diagnostic pentru D-B: ce raspunde functia Oracle INAINTE de orice scriere + DO Inchide WITH 'crsRamasDiag' + lnQ = goExecutor.oExecute([SELECT pack_facturare.exista_ramas_avize_lista('] + ALLTRIM(TRANSFORM(gnSursaAviz)) + ; + [') AS ramas FROM dual], 'crsRamasDiag') + IF lnQ >= 0 AND USED('crsRamasDiag') AND RECCOUNT('crsRamasDiag') > 0 + DO S63bLog WITH ' [D-B diag] exista_ramas_avize_lista(' + TRANSFORM(gnSursaAviz) + ') INAINTE de emitere = ' + ; + TRANSFORM(crsRamasDiag.ramas) + ENDIF + DO Inchide WITH 'crsRamasDiag' +ENDPROC + +*================================================================================== +* Sursa returului: filtrul din caut_facturi_multiple_client (oproceduri_facturare.prg:2110). +PROCEDURE VerificaSursaRetur + LOCAL lnQ, lnLinii + glReturOk = .F. + gnLiniiRetur = 0 + gnIdPartRetur = 0 + gcNumeRetur = '' + gcDescrRetur = '' + lnQ = goExecutor.oExecute([select f.id_vanzare, f.id_part, p.nume, f.serie_act, f.numar_act, f.tip, f.in_valuta ] + ; + [from fact_vfacturi f, nom_parteneri p ] + ; + [where f.id_part = p.id_part and f.sters = 0 and f.id_vanzare = ] + TRANSFORM(gnSursaRetur), 'crsRetOne') + IF lnQ < 0 OR !USED('crsRetOne') OR RECCOUNT('crsRetOne') = 0 + DO S63bLog WITH ' factura ' + TRANSFORM(gnSursaRetur) + ': INEXISTENTA in fact_vfacturi' + RETURN + ENDIF + SELECT crsRetOne + GO TOP + DO S63bLog WITH ' factura ' + TRANSFORM(gnSursaRetur) + ': tip=' + TRANSFORM(tip) + ' in_valuta=' + TRANSFORM(in_valuta) + ; + ' client=' + TRANSFORM(id_part) + ' [' + ALLTRIM(NVL(nume, '')) + '] doc=' + NumarDoc(serie_act, numar_act) + gnIdPartRetur = crsRetOne.id_part + gcNumeRetur = ALLTRIM(NVL(crsRetOne.nume, '')) + gcDescrRetur = NumarDoc(crsRetOne.serie_act, crsRetOne.numar_act) + DO Inchide WITH 'crsRetOne' + + poDate = CREATEOBJECT('empty') + ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(gnSursaRetur))) + ADDPROPERTY(poDate, 'in_valuta', 0) + DO Inchide WITH 'crsSonda' + lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_retur(?poDate.in_valuta,?poDate.listaid,?gnIdUtil)}], 'crsSonda') + lnLinii = IIF(lnQ >= 0 AND USED('crsSonda'), RECCOUNT('crsSonda'), 0) + DO S63bLog WITH ' factura ' + TRANSFORM(gnSursaRetur) + ': cursor_retur -> linii=' + TRANSFORM(lnLinii) + DO Inchide WITH 'crsSonda' + poDate = NULL + gnLiniiRetur = lnLinii + glReturOk = (lnLinii > 0) + DO Assert WITH glReturOk, 'retur-v2: sursa fixata ' + TRANSFORM(gnSursaRetur) + ' da articole, linii=' + TRANSFORM(lnLinii) +ENDPROC + +*================================================================================== +PROCEDURE EmiteAvizV2 + LOCAL lnId + lnId = EmiteUnu(4, ALLTRIM(TRANSFORM(gnSursaAviz)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, 'aviz-v2', .T.) + gnIdAvizV2 = lnId + gcSerAvizV2 = gcUltimaSerie + gnNrAvizV2 = gnUltimulNract +ENDPROC + +PROCEDURE EmiteReturV2 + LOCAL lnId + lnId = EmiteUnu(8, ALLTRIM(TRANSFORM(gnSursaRetur)), gnIdPartRetur, gcNumeRetur, gcDescrRetur, 0, 'retur-v2', .T.) + gnIdReturV2 = lnId + gcSerReturV2 = gcUltimaSerie + gnNrReturV2 = gnUltimulNract +ENDPROC + +*-- Controlul lui D-A: ACEEASI sursa (aviz 131), aceeasi sesiune, DUPA incercarea pe v2 (care nu a +*-- consumat-o, fiindca a esuat). Daca v1 trece pe unde v2 cade, D-A e un defect al lui v2; daca +*-- v1 cade identic, cauza e in codul comun plus datele sursei, nu in v2. +PROCEDURE ControlAvizV1 + gnIdAvizV1Ctrl = EmiteUnu(4, ALLTRIM(TRANSFORM(gnSursaAviz)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, 'aviz-v1-CONTROL', .F.) + gcSerAvizV1Ctrl = gcUltimaSerie + gnNrAvizV1Ctrl = gnUltimulNract +ENDPROC + +PROCEDURE IncearcaAlt + LPARAMETERS tcFel, tcListaSurse + LOCAL lnI, lnSursa, lnId + FOR lnI = 1 TO GETWORDCOUNT(tcListaSurse, ',') + lnSursa = VAL(GETWORDNUM(tcListaSurse, lnI, ',')) + IF tcFel == 'aviz' + gnSursaAviz = lnSursa + DO VerificaSursaAviz + IF !glAvizOk + LOOP + ENDIF + lnId = EmiteUnu(4, ALLTRIM(TRANSFORM(lnSursa)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, ; + 'aviz-v2-REZERVA-' + TRANSFORM(lnSursa), .T.) + IF gnFatal <> 0 + DO DupaAbort WITH 'aviz-v2-REZERVA-' + TRANSFORM(lnSursa) + LOOP + ENDIF + IF lnId > 0 + gnIdAvizV2 = lnId + gcSerAvizV2 = gcUltimaSerie + gnNrAvizV2 = gnUltimulNract + EXIT + ENDIF + ELSE + gnSursaRetur = lnSursa + DO VerificaSursaRetur + IF !glReturOk + LOOP + ENDIF + lnId = EmiteUnu(8, ALLTRIM(TRANSFORM(lnSursa)), gnIdPartRetur, gcNumeRetur, gcDescrRetur, 0, ; + 'retur-v2-REZERVA-' + TRANSFORM(lnSursa), .T.) + IF gnFatal <> 0 + DO DupaAbort WITH 'retur-v2-REZERVA-' + TRANSFORM(lnSursa) + LOOP + ENDIF + IF lnId > 0 + gnIdReturV2 = lnId + gcSerReturV2 = gcUltimaSerie + gnNrReturV2 = gnUltimulNract + EXIT + ENDIF + ENDIF + ENDFOR +ENDPROC + +PROCEDURE ControlReturV1 + gnIdReturV1Ctrl = EmiteUnu(8, ALLTRIM(TRANSFORM(gnSursaRetur)), gnIdPartRetur, gcNumeRetur, gcDescrRetur, 0, 'retur-v1-CONTROL', .F.) + gcSerReturV1Ctrl = gcUltimaSerie + gnNrReturV1Ctrl = gnUltimulNract +ENDPROC + +*================================================================================== +* Emiterea pe v2, pe traseul real (butonul, nu metoda). Fara TRY: o eroare cade pe ON ERROR, +* care tipareste stiva si intoarce controlul in programul principal. +FUNCTION EmiteUnu + LPARAMETERS tnTip, tcLista, tnIdPart, tcNume, tcDescr, tnIdCom, tcEticheta, tlFormNou + LOCAL lnIdVz, lcSerie, lnNract, oform, lnArt, lnFact, loRez, llOk + lnIdVz = 0 + lcSerie = '' + lnNract = 0 + gcUltimaSerie = '' + gnUltimulNract = 0 + gcCaz = '[' + tcEticheta + '] ' + + DO S63bLog WITH '--- ' + tcEticheta + ' (tip=' + TRANSFORM(tnTip) + ' listaid=[' + tcLista + '] client=' + ; + TRANSFORM(tnIdPart) + ' [' + tcNume + '], forma=' + IIF(tlFormNou, 'NOUA (v2)', 'VECHE (v1)') + ') ---' + + DO CuratieCrs + poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip - 1, tnTip) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + + poDate.id_client = tnIdPart + poDate.nume_client = tcNume + poDate.listaid = tcLista + poDate.descriere = tcDescr + IF tnTip = 4 + ADDPROPERTY(poDate, 'id_comanda_aviz', tnIdCom) + ELSE + poDate.text_aditional = [RETUR FACTURA ] + tcDescr + ENDIF + poDate.id_delegat = 39 + IF EMPTY(NVL(poDate.id_fdoc, 0)) + poDate.id_fdoc = 1 + ENDIF + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + IF poDate.rezultat_serii <> 3 + DO Assert WITH .F., tcEticheta + ': rezultat_serii = 3, e=' + TRANSFORM(poDate.rezultat_serii) + DO Goleste + RETURN 0 + ENDIF + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act)) + lnNract = poDate.nract + gcUltimaSerie = lcSerie + gnUltimulNract = lnNract + gcNumere = gcNumere + 'ALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ');' + DO S63bLog WITH ' nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + lcSerie + ; + ' nract=' + TRANSFORM(lnNract) + ' in_valuta=' + TRANSFORM(poDate.in_valuta) + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + IF tlFormNou + DO PregatesteFacturaCrs + oform = CREATEOBJECT('frm_facturare_articole2') + ELSE + *-- v1: incarca_cursor_articole() INAINTE de formular, ca in factureaza() (ofacturare.prg:299) + pnTotalDiscountAvize = 0 + loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere) + llOk = (loRez.nSucces >= 0) AND loRez.lArticole + DO S63bLog WITH ' incarca_cursor_articole -> nSucces=' + TRANSFORM(loRez.nSucces) + ; + ' lArticole=' + TRANSFORM(loRez.lArticole) + ' crsarticole=' + ; + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)') + DO Assert WITH llOk, tcEticheta + ': incarca_cursor_articole a adus articole' + IF !llOk + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', fara linii);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Goleste + gcUltimaSerie = '' + gnUltimulNract = 0 + RETURN 0 + ENDIF + oform = CREATEOBJECT('frm_facturare_articole') + ENDIF + IF VARTYPE(oform) <> 'O' + DO Assert WITH .F., tcEticheta + ': Createobject formular' + DO Goleste + RETURN 0 + ENDIF + oform.WindowType = 0 + oform.Show() + DOEVENTS FORCE + + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + glInEmitere = .T. + IF tlFormNou + DO Assert WITH LOWER(ALLTRIM(oform.but_incarca_articole.cAction)) == 'do_incarca_articole', ; + tcEticheta + ': butonul Incarca articole duce la do_incarca_articole' + oform.but_incarca_articole.Click() + ELSE + DO Assert WITH LOWER(ALLTRIM(oform.but_urmator_tot1.cAction)) == 'do_adauga_tot', ; + tcEticheta + ': butonul Adauga tot duce la do_adauga_tot' + oform.but_urmator_tot1.Click() + ENDIF + glInEmitere = .F. + DOEVENTS FORCE + + lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0) + lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) + DO S63bLog WITH ' dupa Click: crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact) + DO S63bLog WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + DO Assert WITH lnFact > 0, tcEticheta + ': crsfactura populat dupa apasarea butonului, e=' + TRANSFORM(lnFact) + + IF lnFact = 0 + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', fara linii);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Elibereaza WITH oform + DO Goleste + gcUltimaSerie = '' + gnUltimulNract = 0 + RETURN 0 + ENDIF + + DO DumpNuluri WITH 'crsfactura', tcEticheta + + *-- pe sursele de rezerva nu se mai arde un numar degeaba: pretd NULL duce garantat la 1472, + *-- fiindca do_scrie_articole il concateneaza fara Nvl (ofacturare.vc2:14224 v1 / :19928 v2) + IF glOpresteLaPretdNul AND PretdAreNul() + DO S63bLog WITH ' ' + tcEticheta + ': crsfactura are pretd NULL - emitere anulata inainte de Termin (ar da 1472)' + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', pretd NULL);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Elibereaza WITH oform + DO Goleste + gcUltimaSerie = '' + gnUltimulNract = 0 + RETURN 0 + ENDIF + + oform.do_calculeaza_totaluri() + DOEVENTS FORCE + DO S63bLog WITH ' do_calculeaza_totaluri OK, ntotalron=' + TRANSFORM(oform.ntotalron) + + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + DO S63bLog WITH ' [pas] but_termin1.Click (fara TRY - o eroare cade pe ON ERROR cu ASTACKINFO)' + LOCAL lnIntrInainte, lnAvRetInainte + lnIntrInainte = gnIntrebariRetur + lnAvRetInainte = gnAvizReturDeschis + glInEmitere = .T. + glSpionActiv = .T. + oform.but_termin1.Click() + glSpionActiv = .F. + glInEmitere = .F. + DOEVENTS FORCE + DO S63bLog WITH ' intrebarea "avizul de retur" pe acest caz: ' + TRANSFORM(gnIntrebariRetur - lnIntrInainte) + ; + '; FRM_DATE_AVIZ_RETUR deschis: ' + TRANSFORM(gnAvizReturDeschis - lnAvRetInainte) + DO S63bLog WITH ' but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + ; + ' (santinela 9999999999 NU e dovada de scriere)' + DO S63bLog WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + + lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract) + IF lnIdVz < 0 + lnIdVz = 0 + ENDIF + DO S63bLog WITH ' verificare in VANZARI pe ' + lcSerie + ' ' + TRANSFORM(lnNract) + ' -> id_vanzare=' + TRANSFORM(lnIdVz) + DO Assert WITH lnIdVz > 0, tcEticheta + ': documentul exista in VANZARI (jonctiune serie_act+numar_act), e=' + TRANSFORM(lnIdVz) + + IF lnIdVz > 0 + gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (' + tcEticheta + ');' + ELSE + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', nescris);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + gcUltimaSerie = '' + gnUltimulNract = 0 + ENDIF + + DO Elibereaza WITH oform + DO Goleste + RETURN lnIdVz +ENDFUNC + +*================================================================================== +* Curatenia dupa un RETURN TO MASTER declansat din handlerul de eroare: tranzactia poate fi +* deschisa, numarul alocat si nescris, formularele inca vii. +PROCEDURE DupaAbort + LPARAMETERS tcEticheta + LOCAL lnI, lnIdVz, lcSerie, lnNr + glInEmitere = .F. + glSpionActiv = .F. + gnFatal = 0 + DO S63bLog WITH ' [abort] revenit in programul principal dupa eroare fatala in ' + tcEticheta + lcSerie = gcUltimaSerie + lnNr = gnUltimulNract + TRY + goExecutor.oExecute("ROLLBACK") + CATCH + ENDTRY + lnIdVz = 0 + IF !EMPTY(lcSerie) AND lnNr > 0 + lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNr) + IF lnIdVz < 0 + lnIdVz = 0 + ENDIF + ENDIF + DO S63bLog WITH ' [abort] verificare in VANZARI pe ' + lcSerie + ' ' + TRANSFORM(lnNr) + ' -> id_vanzare=' + TRANSFORM(lnIdVz) + DO Assert WITH .F., tcEticheta + ': emiterea a mers pana la capat fara eroare' + IF lnIdVz > 0 + gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNr) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (' + tcEticheta + ');' + ELSE + TRY + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNr) + ' (' + tcEticheta + ', dupa eroare);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + CATCH + ENDTRY + gcUltimaSerie = '' + gnUltimulNract = 0 + ENDIF + FOR lnI = _SCREEN.FormCount TO 1 STEP -1 + TRY + _SCREEN.Forms(lnI).Release() + CATCH + ENDTRY + ENDFOR + DO CuratieCrs + DO Goleste +ENDPROC + +*================================================================================== +PROCEDURE Compara + LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip + LOCAL nFail + gcCaz = '[CompDoc ' + tcTip + '] ' + DO S63bLog WITH CHR(13) + CHR(10) + '--- CompDoc ' + tcTip + ' v1(' + tcSerie1 + ' ' + TRANSFORM(tnNr1) + ; + ', refolosit) vs v2(' + tcSerie2 + ' ' + TRANSFORM(tnNr2) + ') ---' + nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-3b ' + tcTip + ' v1(' + TRANSFORM(tnNr1) + ') vs v2(' + TRANSFORM(tnNr2) + ')') + DO Assert WITH nFail >= 0, tcTip + ': CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail) + DO S63bLog WITH ' CompDoc ' + tcTip + ' esecuri totale=' + TRANSFORM(nFail) + ' (surse diferite - fiecare divergenta se argumenteaza in raport)' + DO ComparaConfig WITH tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip +ENDPROC + +PROCEDURE ComparaConfig + LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip + LOCAL nId1, nId2, lnQ + nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1) + nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2) + IF nId1 <= 0 OR nId2 <= 0 + DO Assert WITH .F., tcTip + ': jonctiune serie_act+nract gaseste ambele id_vanzare (v1=' + ; + TRANSFORM(nId1) + ' v2=' + TRANSFORM(nId2) + ')' + RETURN + ENDIF + lnQ = goExecutor.oExecute([select id_vanzare, tip, in_valuta, id_valuta, multiplicator, ] + ; + [discount_evidentiat, tva_incasare, nvl(tip_factura,0) as tip_factura, nvl(tip_saft,0) as tip_saft, ] + ; + [nvl(coeficient_k,0) as coeficient_k, nvl(id_delegat,0) as id_delegat, nvl(tip_incasat,0) as tip_incasat ] + ; + [from vanzari where id_vanzare in (] + TRANSFORM(nId1) + [,] + TRANSFORM(nId2) + [)], 'crsCfg') + IF lnQ < 0 OR RECCOUNT('crsCfg') <> 2 + DO Assert WITH .F., tcTip + ': citire campuri de configuratie din VANZARI (Reccount asteptat 2)' + DO Inchide WITH 'crsCfg' + RETURN + ENDIF + LOCAL ARRAY laC1[12], laC2[12] + SELECT crsCfg + LOCATE FOR id_vanzare = nId1 + SCATTER TO laC1 + LOCATE FOR id_vanzare = nId2 + SCATTER TO laC2 + DO Inchide WITH 'crsCfg' + + LOCAL ARRAY laNume[11] + laNume[1] = 'TIP' + laNume[2] = 'IN_VALUTA' + laNume[3] = 'ID_VALUTA' + laNume[4] = 'MULTIPLICATOR' + laNume[5] = 'DISCOUNT_EVIDENTIAT' + laNume[6] = 'TVA_INCASARE' + laNume[7] = 'TIP_FACTURA' + laNume[8] = 'TIP_SAFT' + laNume[9] = 'COEFICIENT_K' + laNume[10] = 'ID_DELEGAT' + laNume[11] = 'TIP_INCASAT' + LOCAL lnI + FOR lnI = 1 TO 11 + DO Assert WITH CdocEgal(laC1[lnI + 1], laC2[lnI + 1]), ; + tcTip + ': ' + laNume[lnI] + ' identic (configuratie, nu sursa) v1=' + TRANSFORM(laC1[lnI + 1]) + ; + ' v2=' + TRANSFORM(laC2[lnI + 1]) + ENDFOR +ENDPROC + +*================================================================================== +PROCEDURE PregatesteFacturaCrs + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp +ENDPROC + +PROCEDURE Elibereaza + LPARAMETERS toForm + IF TYPE('toForm') = 'O' AND !ISNULL(toForm) + TRY + toForm.Release() + CATCH + ENDTRY + ENDIF + DO CuratieCrs +ENDPROC + +PROCEDURE Goleste + poDate = NULL + poGeneratorNumere = NULL + poDateGestiuneDest = NULL +ENDPROC + +PROCEDURE CuratieCrs + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'crsComTemp' + DO Inchide WITH 'crsartselectate' + DO Inchide WITH 'jtva_coloane' +ENDPROC + +*-- Campurile NULL din crsfactura sunt cauza directa a lui 1472: do_scrie_articole concateneaza +*-- majoritatea coloanelor FARA Nvl (ofacturare.vc2:19918-19943), iar un singur NULL face intreg +*-- lcSql .NULL. -> Empty(.NULL.) e .T. -> oExecute il inlocuieste cu This.cSql, gol. +PROCEDURE DumpNuluri + LPARAMETERS tcAlias, tcEticheta + LOCAL lnI, lnC, lcNule, lcNume + IF !USED(tcAlias) + RETURN + ENDIF + SELECT (tcAlias) + lnC = FCOUNT(tcAlias) + SCAN + lcNule = '' + FOR lnI = 1 TO lnC + lcNume = FIELD(lnI, tcAlias) + IF ISNULL(EVALUATE(tcAlias + '.' + lcNume)) + lcNule = lcNule + IIF(EMPTY(lcNule), '', ', ') + LOWER(lcNume) + ENDIF + ENDFOR + DO S63bLog WITH ' [nuluri ' + tcAlias + ' rand ' + TRANSFORM(RECNO()) + '/' + TRANSFORM(RECCOUNT(tcAlias)) + ; + '] ' + IIF(EMPTY(lcNule), '(niciun camp NULL)', lcNule) + ENDSCAN + GO TOP IN (tcAlias) +ENDPROC + +FUNCTION PretdAreNul + LOCAL llNul + llNul = .F. + IF !USED('crsfactura') OR TYPE('crsfactura.pretd') = 'U' + RETURN .F. + ENDIF + SELECT crsfactura + SCAN + IF ISNULL(crsfactura.pretd) + llNul = .T. + ENDIF + ENDSCAN + GO TOP IN crsfactura + RETURN llNul +ENDFUNC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +FUNCTION NumarDoc + LPARAMETERS tcSerie, tnNumar + LOCAL lcS + lcS = ALLTRIM(NVL(tcSerie, '')) + RETURN ALLTRIM(IIF(EMPTY(lcS), '', lcS + ' ') + ALLTRIM(STR(NVL(tnNumar, 0), 20, 0))) +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO S63bLog WITH 'PASS: ' + gcCaz + tcMsg + ELSE + gnFail = gnFail + 1 + DO S63bLog WITH 'FAIL: ' + gcCaz + tcMsg + ENDIF +ENDPROC + +PROCEDURE S63bLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +*================================================================================== +* Handlerul de eroare. Singurul loc din care se poate citi stiva apelantului: obiectul de exceptie +* VFP poarta doar punctul de aruncare, iar aici inca nu s-a derulat nimic. +PROCEDURE S63bErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnErr = gnErr + 1 + DO S63bLog WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + TRANSFORM(tcProg) + ':' + TRANSFORM(tnLine) + '] ' + TRANSFORM(tcMsg) + DO S63bLog WITH ' MESSAGE(1)=[' + TRANSFORM(MESSAGE(1)) + '] SYS(2018)=[' + TRANSFORM(SYS(2018)) + ']' + DO LogStiva + IF glInEmitere + gnFatal = tnErr + DO S63bLog WITH ' -> eroare in timpul emiterii: RETURN TO MASTER' + RETURN TO MASTER + ENDIF +ENDPROC + +PROCEDURE LogStiva + LOCAL lnN, lnI, lcLin + LOCAL ARRAY laS[1, 1] + gnStivaTiparita = gnStivaTiparita + 1 + lnN = 0 + TRY + lnN = ASTACKINFO(laS) + CATCH + ENDTRY + IF lnN <= 0 + DO S63bLog WITH ' ASTACKINFO indisponibil' + RETURN + ENDIF + DO S63bLog WITH ' --- ASTACKINFO, ' + TRANSFORM(lnN) + ' niveluri (de sus in jos) ---' + FOR lnI = lnN TO 1 STEP -1 + lcLin = '' + IF ALEN(laS, 2) >= 5 + lcLin = ALLTRIM(STRTRAN(TRANSFORM(laS[lnI, 5]), CHR(9), ' ')) + ENDIF + DO S63bLog WITH ' #' + PADL(TRANSFORM(laS[lnI, 1]), 3) + ' ' + ; + PADR(ALLTRIM(TRANSFORM(laS[lnI, 3])), 46) + ' linia ' + PADL(TRANSFORM(laS[lnI, 4]), 6) + ; + ' [' + lcLin + '] <' + ALLTRIM(TRANSFORM(laS[lnI, 2])) + '>' + ENDFOR + DO S63bLog WITH ' --- sfarsit ASTACKINFO ---' +ENDPROC + +PROCEDURE S63bFinal + LOCAL lnI + IF TYPE('_SCREEN.tmrS63b') = 'O' + _SCREEN.tmrS63b.Enabled = .F. + TRY + _SCREEN.RemoveObject('tmrS63b') + CATCH + ENDTRY + ENDIF + FOR lnI = _SCREEN.FormCount TO 1 STEP -1 + TRY + _SCREEN.Forms(lnI).Release() + CATCH + ENDTRY + ENDFOR + TRY + IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ; + [where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 720 order by numar_act], 'crsNrSSS') >= 0 + DO S63bLog WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-720):' + SELECT crsNrSSS + SCAN + DO S63bLog WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ENDSCAN + USE IN crsNrSSS + ENDIF + CATCH + ENDTRY + DO S63bLog WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere + DO S63bLog WITH 'STIVE TIPARITE: ' + TRANSFORM(gnStivaTiparita) + DO S63bLog WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr) + DO S63bLog WITH 'END ' + TTOC(DATETIME()) + QUIT +ENDPROC + +*================================================================================== +* spionSql: tipareste fiecare SQL trimis prin goExecutor in timpul emiterii. TYPE-ul e tiparit +* explicit, pentru ca un lcSql .NULL. arata la fel ca unul gol in log, dar are alt efect: +* Empty(.NULL.) e .T., deci oExecute il inlocuieste cu This.cSql (oproceduri_comune.prg:198-202). +DEFINE CLASS spionSql AS Custom + nOrdine = 0 + + PROCEDURE Vede + LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect + IF !glSpionActiv + RETURN + ENDIF + This.nOrdine = This.nOrdine + 1 + LOCAL lcT, lcV + lcT = VARTYPE(tcSql, .T.) + DO CASE + CASE lcT == 'X' + lcV = '<<< .NULL. >>>' + CASE VARTYPE(tcSql) <> 'C' + lcV = '<<< netip-caracter: ' + lcT + ' >>>' + CASE EMPTY(tcSql) + lcV = '<<< SIR GOL, len=' + TRANSFORM(LEN(tcSql)) + ' >>>' + OTHERWISE + lcV = 'len=' + TRANSFORM(LEN(tcSql)) + ' [' + STRTRAN(LEFT(tcSql, 320), CHR(13) + CHR(10), ' ') + ']' + ENDCASE + DO S63bLog WITH ' [sql #' + PADL(TRANSFORM(This.nOrdine), 3) + ' type=' + lcT + '] cursor=[' + ; + TRANSFORM(NVL(tcCursor, '')) + '] ' + lcV + ENDPROC +ENDDEFINE + +*================================================================================== +* Identic cu driverS63 din test_s6_3_aviz_retur.prg: apasa pe formele modale care nu trec prin +* functia amessagebox si elibereaza FRM_DATE_AVIZ_RETUR, care nu e drivabil headless. +DEFINE CLASS driverS63b AS Custom + nUltimAlteDate = 0 + lBusy = .F. + + PROCEDURE Executa + IF This.lBusy + RETURN + ENDIF + This.lBusy = .T. + IF TYPE('_SCREEN.tmrS63b') = 'O' + _SCREEN.tmrS63b.Enabled = .F. + ENDIF + TRY + LOCAL lnI, loMsgForm, loAlteDate, lcClasa, loAvizRetur + loMsgForm = NULL + loAlteDate = NULL + loAvizRetur = NULL + FOR lnI = 1 TO _SCREEN.FormCount + lcClasa = UPPER(_SCREEN.Forms(lnI).Class) + IF 'MESSAGEBOX_FORM' $ lcClasa + loMsgForm = _SCREEN.Forms(lnI) + ENDIF + IF lcClasa == 'FRM_ALTE_DATE' + loAlteDate = _SCREEN.Forms(lnI) + ENDIF + IF 'DATE_AVIZ_RETUR' $ lcClasa + loAvizRetur = _SCREEN.Forms(lnI) + ENDIF + IF !(lcClasa $ gcClaseVazute) + gcClaseVazute = gcClaseVazute + lcClasa + ';' + DO S63bLog WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' + ENDIF + ENDFOR + IF !ISNULL(loAvizRetur) + gnAvizReturDeschis = gnAvizReturDeschis + 1 + DO S63bLog WITH ' [driver] FRM_DATE_AVIZ_RETUR deschis - eliberat fortat (caz neconcludent)' + TRY + loAvizRetur.Release() + CATCH + ENDTRY + ENDIF + IF !ISNULL(loMsgForm) + TRY + LOCAL lcTextMsg + lcTextMsg = '' + TRY + lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value)) + CATCH + ENDTRY + DO S63bLog WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']' + IF 'avizul de retur' $ LOWER(lcTextMsg) + gnIntrebariRetur = gnIntrebariRetur + 1 + ENDIF + DO CASE + CASE ('avizul de retur' $ LOWER(lcTextMsg) OR 'totalul 0' $ LOWER(lcTextMsg)) ; + AND gcRaspunsMsgForm == 'NU' AND PEMSTATUS(loMsgForm.cmgBotones, 'cmdNo', 5) + DO S63bLog WITH ' [driver msg] apas cmgBotones.cmdNo' + loMsgForm.cmgBotones.cmdNo.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) + DO S63bLog WITH ' [driver msg] apas cmgBotones.cmdYes' + loMsgForm.cmgBotones.cmdYes.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) + DO S63bLog WITH ' [driver msg] apas cmgBotones.cmdOk' + loMsgForm.cmgBotones.cmdOk.Click() + ENDCASE + CATCH TO loExcMsg + DO S63bLog WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message + ENDTRY + ELSE + IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1) + This.nUltimAlteDate = SECONDS() + TRY + DO S63bLog WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE' + loAlteDate.do_termin() + CATCH TO loExcAD + DO S63bLog WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message + ENDTRY + ENDIF + ENDIF + CATCH TO loExcTop + DO S63bLog WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message + FINALLY + IF TYPE('_SCREEN.tmrS63b') = 'O' + _SCREEN.tmrS63b.Enabled = .T. + ENDIF + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_unificat/test_s6_3b_v2_primul.ps1 b/utile/Teste/facturare_unificat/test_s6_3b_v2_primul.ps1 new file mode 100644 index 0000000..f109514 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_3b_v2_primul.ps1 @@ -0,0 +1,28 @@ +$ErrorActionPreference = 'Stop' +$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat' +$prg = Join-Path $dir 'test_s6_3b_v2_primul.prg' +$log = Join-Path $dir 'out\test_s6_3b_v2_primul.log' +$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' + +$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_3b_v2_primul*' } +if ($viu) { + "Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua." + exit 1 +} + +Set-Location $dir +Remove-Item (Join-Path $dir 'test_s6_3b_v2_primul.FXP') -ErrorAction SilentlyContinue +Remove-Item $log -ErrorAction SilentlyContinue + +$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru +"lansat PID " + $p.Id +$null = $p.WaitForExit(300000) +if (-not $p.HasExited) { + "ATARNAT dupa 300s - omor instanta (filtrat pe CommandLine)" + Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s6_3b_v2_primul*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force } +} +if (Test-Path $log) { + Get-Content $log +} else { + "Log inexistent: $log" +} diff --git a/utile/Teste/facturare_unificat/test_s6_3d_abd_pretd.prg b/utile/Teste/facturare_unificat/test_s6_3d_abd_pretd.prg new file mode 100644 index 0000000..9d19b27 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_3d_abd_pretd.prg @@ -0,0 +1,1008 @@ +* test_s6_3d_abd_pretd.prg +* Proba celor patru modificari comise in COMUN fara nicio rulare (ba4776b, b798450, 97fd884, 18637e5): +* A taxcode trimis de v2 la adauga_articol_factura / adauga_rata_factura + Gather-ul ratei +* B lot trimis de v2 pe caile incarcate in masa +* D regresia de moment pe ramura aviz: Min(exista_ramas_avize_lista, Sum(crsarticole.cantitate)) +* pretd Iif(Isnull(poArt.pretd),[NULL],...) in do_scrie_articole, in AMBELE clase +* +* Doua emiteri reale, in ordinea asta, ca esecul sa fie informativ: +* 1) aviz 667 pe v1 - sursa cu pretd NULL (pusa de date_test_aviz_667.sql.txt). Avizul 131, care +* are pretd NULL nativ, arata ca garda functioneaza (sirul se construieste, 1472 dispare) dar +* Oracle cade mai jos, in scrie_factura_avize ("Nu au fost gasite articolele! FACT-015"), +* deci nu poate arata ca v1 SCRIE. Inainte de 18637e5 rularea cadea cu 1472 in do_scrie_articole. +* 2) aviz 683 pe v2 - sursa pregatita cu LOT si cu PRETD NULL (date_test_aviz_683.sql.txt). +* Acopera A (taxcode in VANZARI_DETALII), B (lot), D (intrebarea nu apare) si pretd pe v2. +* +* D se probeaza pe doua cai independente: +* - la nivel de cursor, asertiunea proiectata in docs\propunere_taxcode_lot_si_regresie_aviz.md +* sec. 2.4 (trei pasi, fara emitere, fara formular); +* - pe emiterea reala, prin jurnalul driverului: intrebarea "avizul de retur" NU trece prin +* functia amessagebox (mock-ul ramane gol - vezi logul S6-3b), ci deschide un MESSAGEBOX_FORM +* pe care il numara gnIntrebariRetur. Pe SSS 671, inainte de fix, valoarea a fost 1. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_3d_abd_pretd.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3d_abd_pretd.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167; +* gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat +PUBLIC gcUltimaSerie, gnUltimulNract, goDriverS63d, gcClaseVazute, gcRaspunsMsgForm +PUBLIC gnIntrebariRetur, gnAvizReturDeschis, glInEmitere, gnFatal, gnStivaTiparita + +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_3d_abd_pretd.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) +gnPass = 0 +gnFail = 0 +gnErr = 0 +gcCaz = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +gcUltimaSerie = "" +gnUltimulNract = 0 +gcClaseVazute = ";" +gcRaspunsMsgForm = "NU" +gnIntrebariRetur = 0 +gnAvizReturDeschis = 0 +glInEmitere = .F. +gnFatal = 0 +gnStivaTiparita = 0 +gcNumere = "" +gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg" + +*-- Sursele se aleg LA RULARE (AlegeSurseAvizS63d), nu prin id fix: se consuma la prima emitere, +*-- iar un id fix face testul verde o singura data. V1 cere un aviz cu pretd NULL, V2 unul cu LOT +*-- si pretd NULL - forma pe care o marcheaza pe doua felii din rezervorul AVZ13 scriptul +*-- docs\wip13_2026_09_05_04_COMUN_FIXTURI_TEST.sql.txt (sectiunea D). +*-- Daca sursa V2 nu mai e disponibila, verificarile A/B se fac pe documentul deja scris +*-- (gnDocV2Gata), ca rularea sa ramana repetabila. +PUBLIC gnSursaAviz, gnSursaV1, gnSursaV2, gnDocV2Gata, gcSerV2Gata, gnNrV2Gata, gn1472 +gnSursaV1 = 0 +gnSursaV2 = 0 +gnSursaAviz = 0 +gnDocV2Gata = 1125 +gcSerV2Gata = 'SSS' +gnNrV2Gata = 674 +gn1472 = 0 + +PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil +poDate = NULL +poGeneratorNumere = NULL +poDateGestiuneDest = NULL +pnTotalDiscountAvize = 0 +plVizibil = .F. + +ON ERROR DO S63dErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + +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 S63dLog WITH 'EROARE: conectare Oracle esuata' + DO S63dFinal +ENDIF +SQLSETPROP(gnHandle, "QueryTimeOut", 45) +DO S63dLog WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE +SET PROCEDURE TO (gcMock) ADDITIVE + +IF !actualizeaza_optiuni_program() + DO S63dLog WITH 'EROARE: actualizeaza_optiuni_program()' + DO S63dFinal +ENDIF +gnScadereStoc = 0 +gnFactSeturi = 0 +gnIdSucursala = 167 +goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]) +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO S63dLog WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ; + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ; + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + ; + ' gl406=' + TRANSFORM(TYPE('gl406') = 'L' AND gl406) + +update_jtva_coloane([JV], [jtva_coloane_temp]) +update_saft_taxtable() + +IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod +ENDIF + +PUBLIC goSpionSql, glSpionActiv +glSpionActiv = .F. +goSpionSql = CREATEOBJECT('spionSql') +BINDEVENT(goExecutor, 'oExecute', goSpionSql, 'Vede', 1) +BINDEVENT(goExecutor, 'oExecuta', goSpionSql, 'Vede', 1) + +goDriverS63d = CREATEOBJECT('driverS63d') +_SCREEN.AddObject('tmrS63d', 'Timer') +_SCREEN.tmrS63d.Interval = 200 +BINDEVENT(_SCREEN.tmrS63d, 'Timer', goDriverS63d, 'Executa') +_SCREEN.tmrS63d.Enabled = .T. + +PUBLIC glAvizOk, gnLiniiAviz, gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz +PUBLIC gnIdDocV1, gcSerV1, gnNrV1, gnIdDocV2, gcSerV2, gnNrV2 +STORE 0 TO gnIdDocV1, gnNrV1, gnIdDocV2, gnNrV2 +STORE '' TO gcSerV1, gcSerV2 + +DO AlegeSurseAvizS63d + +*================================================================================== +* D, calea 1: asertiunea proiectata in propunere sec. 2.4. Fara emitere, fara formular - se +* simuleaza "Adauga tot" pe cursor exact ca linia ofacturare.vc2:18799 (Replace cantitate With +* cantitate - cantitatea adaugata). Se face INAINTE de orice emitere, cat avizul 683 e intact. +DO S63dLog WITH CHR(13) + CHR(10) + '===== D (calea 1): garda pe cursor, aviz ' + TRANSFORM(gnSursaV1) + ' =====' +DO ProbaDCursor WITH gnSursaV1 + +*================================================================================== +DO S63dLog WITH CHR(13) + CHR(10) + '===== EMITERE 1: aviz ' + TRANSFORM(gnSursaV1) + ' pe V1 (pretd NULL nativ) =====' +gnSursaAviz = gnSursaV1 +DO VerificaSursaAviz +IF glAvizOk + gnIdDocV1 = EmiteUnu(4, ALLTRIM(TRANSFORM(gnSursaV1)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, 'aviz-v1-pretd', .F.) + gcSerV1 = gcUltimaSerie + gnNrV1 = gnUltimulNract + IF gnFatal <> 0 + DO DupaAbort WITH 'aviz-v1-pretd' + ENDIF +ELSE + DO Assert WITH .F., 'aviz-v1-pretd: sursa ' + TRANSFORM(gnSursaV1) + ' inca disponibila' +ENDIF + +*================================================================================== +DO S63dLog WITH CHR(13) + CHR(10) + '===== EMITERE 2: aviz ' + TRANSFORM(gnSursaV2) + ' pe V2 (lot + pretd NULL) =====' +gnSursaAviz = gnSursaV2 +DO VerificaSursaAviz +IF glAvizOk + gnIdDocV2 = EmiteUnu(4, ALLTRIM(TRANSFORM(gnSursaV2)), gnIdPartAviz, gcNumeAviz, gcDescrAviz, gnIdComAviz, 'aviz-v2-abd', .T.) + gcSerV2 = gcUltimaSerie + gnNrV2 = gnUltimulNract + IF gnFatal <> 0 + DO DupaAbort WITH 'aviz-v2-abd' + ENDIF +ELSE + gnIdDocV2 = gnDocV2Gata + gcSerV2 = gcSerV2Gata + gnNrV2 = gnNrV2Gata + DO S63dLog WITH ' sursa ' + TRANSFORM(gnSursaV2) + ' consumata de o rulare anterioara - verificarile A/B ' + ; + 'se fac pe documentul deja scris de v2, id_vanzare=' + TRANSFORM(gnIdDocV2) +ENDIF + +*================================================================================== +DO S63dLog WITH CHR(13) + CHR(10) + '===== VERIFICARI IN VANZARI_DETALII =====' +IF gnIdDocV1 > 0 + DO VerificaPretd WITH gnIdDocV1, 'pretd-v1' + DO VerificaTaxcode WITH gnIdDocV1, 'taxcode-v1(referinta)' +ELSE + DO Assert WITH .F., 'pretd-v1: v1 a scris documentul din avizul ' + TRANSFORM(gnSursaV1) + ' (pretd NULL)' +ENDIF +IF gnIdDocV2 > 0 + DO VerificaPretd WITH gnIdDocV2, 'pretd-v2' + DO VerificaTaxcode WITH gnIdDocV2, 'taxcode-v2 (livrabil A)' + DO VerificaLot WITH gnIdDocV2, gnSursaV2, 'lot-v2 (livrabil B)' +ELSE + DO Assert WITH .F., 'aviz-v2-abd: v2 a scris documentul din avizul ' + TRANSFORM(gnSursaV2) +ENDIF + +*================================================================================== +DO S63dLog WITH CHR(13) + CHR(10) + '===== CompDoc aviz: v1(' + gcSerV1 + ' ' + TRANSFORM(gnNrV1) + ; + ') vs v2(' + gcSerV2 + ' ' + TRANSFORM(gnNrV2) + ') =====' +IF gnIdDocV1 > 0 AND gnIdDocV2 > 0 + DO Compara WITH gcSerV1, gnNrV1, gcSerV2, gnNrV2, 'aviz' +ELSE + DO S63dLog WITH ' CompDoc sarit: lipseste una din jumatatile perechii' +ENDIF + +DO S63dFinal + +*================================================================================== +* D, calea 1 - trei pasi, exact ca in propunere sec. 2.4. +PROCEDURE ProbaDCursor + LPARAMETERS tnSursa + LOCAL lnO, lnSuma, lnMin + gcCaz = '[D-cursor] ' + lnO = RamasOracle(tnSursa) + DO S63dLog WITH ' exista_ramas_avize_lista(' + TRANSFORM(tnSursa) + ') = ' + TRANSFORM(lnO) + IF lnO <= 0 + DO Assert WITH .F., 'D-cursor: avizul ' + TRANSFORM(tnSursa) + ' e neconsumat (exista_ramas > 0), e=' + TRANSFORM(lnO) + RETURN + ENDIF + + DO Inchide WITH 'crsarticole' + poDate = CREATEOBJECT('empty') + ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(tnSursa))) + pnTotalDiscountAvize = 0 + IF goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}], 'crsarticole') < 0 + poDate = NULL + DO Assert WITH .F., 'D-cursor: cursor_avize a intors linii' + RETURN + ENDIF + poDate = NULL + + *-- pasul 1: preconditia L_initial = O_initial (ancora, acoperita si de S4-4) + lnSuma = SumaCantitate() + DO S63dLog WITH ' pas 1 (nimic adaugat): Sum(crsarticole.cantitate)=' + TRANSFORM(lnSuma) + ' O=' + TRANSFORM(lnO) + DO Assert WITH ROUND(lnSuma, 2) == ROUND(lnO, 2), ; + 'D pas 1: Sum(crsarticole.cantitate) = exista_ramas_avize_lista, ' + TRANSFORM(lnSuma) + ' vs ' + TRANSFORM(lnO) + + *-- pasul 3: adaugare partiala (jumatate din fiecare linie) - garda TREBUIE sa intrebe, + *-- si sa intrebe pe cantitatea corecta. Tine onesta reparatia: o "reparatie" care nu mai + *-- intreaba niciodata cade aici. + SELECT crsarticole + REPLACE ALL cantitate WITH cantitate - ROUND(cantitate / 2, 4) + lnSuma = SumaCantitate() + lnMin = MIN(lnO, lnSuma) + DO S63dLog WITH ' pas 3 (adaugat pe jumatate): Sum=' + TRANSFORM(lnSuma) + ' Min(O,Sum)=' + TRANSFORM(lnMin) + DO Assert WITH lnMin > 0 AND ROUND(lnMin, 2) == ROUND(lnSuma, 2), ; + 'D pas 3: Min(O,Sum) > 0 si = Sum (garda intreaba, pe cantitatea ramasa), Min=' + TRANSFORM(lnMin) + ' Sum=' + TRANSFORM(lnSuma) + + *-- pasul 2: "Adauga tot" ia toata cantitatea. AICI cadea inainte de 97fd884: garda ramanea + *-- doar cu O (= 9), deci intreba. Acum Min(O, 0) = 0. + SELECT crsarticole + REPLACE ALL cantitate WITH 0 + lnSuma = SumaCantitate() + lnMin = MIN(lnO, lnSuma) + DO S63dLog WITH ' pas 2 (Adauga tot): Sum=' + TRANSFORM(lnSuma) + ' O=' + TRANSFORM(lnO) + ' Min(O,Sum)=' + TRANSFORM(lnMin) + DO Assert WITH ROUND(lnMin, 2) == 0, ; + 'D pas 2: dupa Adauga tot Min(O,Sum) = 0, deci garda NU pune intrebarea (inainte de fix era O=' + ; + TRANSFORM(lnO) + '), Min=' + TRANSFORM(lnMin) + + DO Inchide WITH 'crsarticole' +ENDPROC + +*-- Calculate muta Recno() la EOF si schimba zona curenta - se salveaza si se restaureaza amandoua. +FUNCTION SumaCantitate + LOCAL lnS, lcAliasVechi + lnS = 0 + lcAliasVechi = ALIAS() + SELECT crsarticole + CALCULATE SUM(cantitate) TO lnS + GO TOP IN crsarticole + IF !EMPTY(lcAliasVechi) AND USED(lcAliasVechi) + SELECT (lcAliasVechi) + ENDIF + RETURN NVL(lnS, 0) +ENDFUNC + +FUNCTION RamasOracle + LPARAMETERS tnSursa + LOCAL lnR + lnR = -1 + DO Inchide WITH 'crsRamasD' + IF goExecutor.oExecute([SELECT pack_facturare.exista_ramas_avize_lista('] + ALLTRIM(TRANSFORM(tnSursa)) + ; + [') AS ramas FROM dual], 'crsRamasD') >= 0 AND USED('crsRamasD') AND RECCOUNT('crsRamasD') > 0 + lnR = NVL(crsRamasD.ramas, -1) + ENDIF + DO Inchide WITH 'crsRamasD' + RETURN lnR +ENDFUNC + +*================================================================================== +* pretd. Ce dovedeste garda: sirul SQL se construieste si pleaca (inainte, un singur camp NULL +* facea tot lcSql .NULL., Empty(.NULL.) e .T. in oExecute si SQLExec arunca 1472). Ce NU poate +* dovedi: ca NULL supravietuieste in tabela - adauga_articol_factura scrie in ACT_TEMP +* NVL(V_PRETD, 0) (PACK_FACTURARE body:4085), deci Oracle normalizeaza NULL la 0 prin proiect. +* Deci se aserteaza: documentul are linii, si nicio eroare 1472 in toata rularea. +PROCEDURE VerificaPretd + LPARAMETERS tnIdVz, tcEticheta + LOCAL lnTot, lnNule, lnZero + gcCaz = '[' + tcEticheta + '] ' + DO Inchide WITH 'crsPd' + IF goExecutor.oExecute([select count(*) as tot, sum(case when pretd is null then 1 else 0 end) as nule, ] + ; + [sum(case when pretd = 0 then 1 else 0 end) as zero ] + ; + [from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsPd') < 0 OR !USED('crsPd') + DO Assert WITH .F., tcEticheta + ': citire PRETD din VANZARI_DETALII' + RETURN + ENDIF + lnTot = NVL(crsPd.tot, 0) + lnNule = NVL(crsPd.nule, 0) + lnZero = NVL(crsPd.zero, 0) + DO Inchide WITH 'crsPd' + DO S63dLog WITH ' id_vanzare=' + TRANSFORM(tnIdVz) + ' linii=' + TRANSFORM(lnTot) + ; + ' PRETD NULL=' + TRANSFORM(lnNule) + ' PRETD 0=' + TRANSFORM(lnZero) + ; + ' (Oracle scrie NVL(V_PRETD,0), PACK_FACTURARE body:4085)' + DO Assert WITH lnTot > 0, tcEticheta + ': documentul are linii in VANZARI_DETALII, e=' + TRANSFORM(lnTot) + DO Assert WITH gn1472 = 0, ; + tcEticheta + ': nicio eroare 1472 in rulare (sirul SQL nu mai devine .NULL. pe pretd), e=' + TRANSFORM(gn1472) +ENDPROC + +*================================================================================== +* taxcode: asteptarea se calculeaza cu aceeasi functie ca in A11 (test_s8_cablare_incarcare), +* ramura cu ramura. GetTaxCode intoarce NULL cand gl406 e stins, iar Oracle scrie +* decode(V_TAXCODE,0,NULL,V_TAXCODE) - deci 0 devine NULL in tabela. Nu se aserteaza "nenul". +PROCEDURE VerificaTaxcode + LPARAMETERS tnIdVz, tcEticheta + LOCAL llSaft, lnRau, lnNenul, lnTot, lnAstept, lnGasit, ldData + gcCaz = '[' + tcEticheta + '] ' + llSaft = (TYPE('gl406') = 'L' AND gl406) + DO Inchide WITH 'crsTc' + IF goExecutor.oExecute([select v.data_act, nvl(d.id_jtva_coloana,0) as id_jtva_coloana, d.taxcode ] + ; + [from vanzari v, vanzari_detalii d where d.id_vanzare = v.id_vanzare and v.id_vanzare = ] + ; + TRANSFORM(tnIdVz) + [ order by d.id_vanzare_det], 'crsTc') < 0 OR !USED('crsTc') + DO Assert WITH .F., tcEticheta + ': citire TAXCODE din VANZARI_DETALII' + RETURN + ENDIF + lnRau = 0 + lnNenul = 0 + lnTot = RECCOUNT('crsTc') + SELECT crsTc + SCAN + ldData = crsTc.data_act + lnAstept = IIF(m.llSaft, NVL(GetTaxCode(gnAn, gnLuna, ldData, NVL(crsTc.id_jtva_coloana, 0), .F.), 0), 0) + lnGasit = NVL(crsTc.taxcode, 0) + IF lnGasit <> lnAstept + lnRau = lnRau + 1 + DO S63dLog WITH ' nepotrivire: id_jtva_coloana=' + TRANSFORM(crsTc.id_jtva_coloana) + ; + ' TAXCODE=' + TRANSFORM(crsTc.taxcode) + ' asteptat=' + TRANSFORM(lnAstept) + ELSE + DO S63dLog WITH ' ok: id_jtva_coloana=' + TRANSFORM(crsTc.id_jtva_coloana) + ; + ' TAXCODE=' + TRANSFORM(crsTc.taxcode) + ' asteptat=' + TRANSFORM(lnAstept) + ENDIF + IF lnGasit <> 0 + lnNenul = lnNenul + 1 + ENDIF + ENDSCAN + DO Inchide WITH 'crsTc' + DO S63dLog WITH ' gl406=' + TRANSFORM(m.llSaft) + ' linii cu TAXCODE nenul in VANZARI_DETALII=' + ; + TRANSFORM(lnNenul) + '/' + TRANSFORM(lnTot) + DO Assert WITH lnTot > 0 AND lnRau = 0, ; + tcEticheta + ': TAXCODE din VANZARI_DETALII = valoarea derivata de cod, nepotriviri=' + TRANSFORM(lnRau) + IF lnNenul = 0 + DO S63dLog WITH ' ATENTIE: toate liniile au TAXCODE gol - asertiunea e conforma cu codul, dar ' + ; + 'NU dovedeste ca s-a inchis golul din CompDoc (gl406 stins sau coloane jtva fara cod SAFT)' + ENDIF + DO Assert WITH lnNenul > 0, ; + tcEticheta + ': cel putin o linie are TAXCODE nenul (golul din CompDoc sec. 5.1 s-a inchis), nenule=' + TRANSFORM(lnNenul) +ENDPROC + +*================================================================================== +* lot: jonctiunea pe id_articol cu liniile sursei (avizul are articole distincte). +PROCEDURE VerificaLot + LPARAMETERS tnIdVz, tnSursa, tcEticheta + LOCAL lnTot, lnGresit, lnCuLot + gcCaz = '[' + tcEticheta + '] ' + DO Inchide WITH 'crsLot' + IF goExecutor.oExecute([select d.id_vanzare_det, d.id_articol, nvl(d.lot,'@fara@') as lot_nou, ] + ; + [nvl(s.lot,'@fara@') as lot_sursa ] + ; + [from vanzari_detalii d, vanzari_detalii s ] + ; + [where d.id_vanzare = ] + TRANSFORM(tnIdVz) + [ and s.id_vanzare = ] + TRANSFORM(tnSursa) + ; + [ and s.id_articol = d.id_articol order by d.id_vanzare_det], 'crsLot') < 0 OR !USED('crsLot') + DO Assert WITH .F., tcEticheta + ': citire LOT din VANZARI_DETALII' + RETURN + ENDIF + lnTot = 0 + lnGresit = 0 + lnCuLot = 0 + SELECT crsLot + SCAN + lnTot = lnTot + 1 + IF ALLTRIM(NVL(crsLot.lot_nou, '')) == ALLTRIM(NVL(crsLot.lot_sursa, '')) + lnCuLot = lnCuLot + IIF(ALLTRIM(NVL(crsLot.lot_sursa, '')) == '@fara@', 0, 1) + ELSE + lnGresit = lnGresit + 1 + ENDIF + DO S63dLog WITH ' id_articol=' + TRANSFORM(crsLot.id_articol) + ' LOT nou=[' + ALLTRIM(TRANSFORM(crsLot.lot_nou)) + ; + '] LOT sursa=[' + ALLTRIM(TRANSFORM(crsLot.lot_sursa)) + ']' + ENDSCAN + DO Inchide WITH 'crsLot' + DO Assert WITH lnTot > 0, tcEticheta + ': jonctiunea pe id_articol cu sursa da linii, e=' + TRANSFORM(lnTot) + DO Assert WITH lnTot > 0 AND lnGresit = 0, ; + tcEticheta + ': LOT din VANZARI_DETALII = LOT din sursa pe toate liniile, gresite=' + TRANSFORM(lnGresit) + DO Assert WITH lnCuLot > 0, ; + tcEticheta + ': cel putin o linie poarta un LOT nevid din sursa (proba nu e vida), e=' + TRANSFORM(lnCuLot) +ENDPROC + +*================================================================================== +* Sursa avizului: exact filtrul din caut_avize (oproceduri_facturare.prg:2038) plus id-ul fixat. +*================================================================================== +* Alege la rulare cele doua surse de aviz, din capatul de jos al rezervorului AVZ13 (AlegeSursaAviz +* din test_s6_3_aviz_retur / test_s6_3b_v2_primul consuma de la capatul de sus, deci nu se calca). +* Feliile se recunosc dupa forma liniilor, nu dupa o coloana de marcaj: +* V1 - pretd NULL si lot NULL; V2 - pretd NULL si lot completat. +* Conditia de cantitate ramasa e cea din pack_facturare.cursor_avize. +PROCEDURE AlegeSurseAvizS63d + gnSursaV1 = SursaAvizDinFelie(.F.) + gnSursaV2 = SursaAvizDinFelie(.T.) + DO S63dLog WITH 'surse alese la rulare: V1=' + TRANSFORM(gnSursaV1) + ' V2=' + TRANSFORM(gnSursaV2) + DO Assert WITH gnSursaV1 > 0, 'exista un aviz-sursa cu pretd NULL (felia V1 din AVZ13)' + DO Assert WITH gnSursaV2 > 0, 'exista un aviz-sursa cu lot + pretd NULL (felia V2 din AVZ13)' +ENDPROC + +FUNCTION SursaAvizDinFelie + LPARAMETERS tlCuLot + + LOCAL lnQ, lnId + lnId = 0 + DO Inchide WITH 'crsFelieAv' + lnQ = goExecutor.oExecute([select min(a.id_vanzare) as id_vanzare from vanzari a ] + ; + [where a.serie_act = 'AVZ13' and a.sters = 0 and a.facturat = 0 and a.tip in (21,22,26,42) ] + ; + [and exists (select 1 from vanzari_detalii d where d.id_vanzare = a.id_vanzare and d.sters = 0 ] + ; + [and d.pretd is null and d.lot is ] + IIF(m.tlCuLot, [not null ], [null ]) + ; + [and d.cantitate <> nvl((select sum(c.cantitate) from vanzari_cantitati c ] + ; + [where c.id_vanzare_det_aviz = d.id_vanzare_det and c.sters = 0), 0))], 'crsFelieAv') + IF lnQ >= 0 AND USED('crsFelieAv') AND RECCOUNT('crsFelieAv') > 0 + lnId = NVL(crsFelieAv.id_vanzare, 0) + ENDIF + DO Inchide WITH 'crsFelieAv' + RETURN m.lnId +ENDFUNC + +PROCEDURE VerificaSursaAviz + LOCAL lnQ, lnLinii + glAvizOk = .F. + gnLiniiAviz = 0 + gnIdPartAviz = 0 + gcNumeAviz = '' + gcDescrAviz = '' + gnIdComAviz = 0 + gcCaz = '[sursa ' + TRANSFORM(gnSursaAviz) + '] ' + lnQ = goExecutor.oExecute([select a.id_vanzare, a.id_part, p.nume, a.serie_act, a.numar_act, a.tip, a.facturat, ] + ; + [(case when a.tip in (21,42) then nvl(a.id_comanda,0) else 0 end) as id_comanda ] + ; + [from vanzari a, nom_parteneri p ] + ; + [where a.id_part = p.id_part and a.sters = 0 and a.id_vanzare = ] + TRANSFORM(gnSursaAviz), 'crsAvOne') + IF lnQ < 0 OR !USED('crsAvOne') OR RECCOUNT('crsAvOne') = 0 + DO S63dLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': INEXISTENT in vanzari' + RETURN + ENDIF + SELECT crsAvOne + GO TOP + DO S63dLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': tip=' + TRANSFORM(tip) + ' facturat=' + TRANSFORM(facturat) + ; + ' client=' + TRANSFORM(id_part) + ' [' + ALLTRIM(NVL(nume, '')) + '] doc=' + NumarDoc(serie_act, numar_act) + IF !INLIST(NVL(tip, 0), 21, 22, 26, 42) OR NVL(facturat, 1) <> 0 + DO S63dLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': NU mai trece filtrul caut_avize' + DO Inchide WITH 'crsAvOne' + RETURN + ENDIF + gnIdPartAviz = crsAvOne.id_part + gcNumeAviz = ALLTRIM(NVL(crsAvOne.nume, '')) + gcDescrAviz = NumarDoc(crsAvOne.serie_act, crsAvOne.numar_act) + gnIdComAviz = NVL(crsAvOne.id_comanda, 0) + DO Inchide WITH 'crsAvOne' + + poDate = CREATEOBJECT('empty') + ADDPROPERTY(poDate, 'listaid', ALLTRIM(TRANSFORM(gnSursaAviz))) + pnTotalDiscountAvize = 0 + DO Inchide WITH 'crsSonda' + lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_avize(?poDate.listaid,?gnIdUtil,?@pnTotalDiscountAvize)}], 'crsSonda') + lnLinii = IIF(lnQ >= 0 AND USED('crsSonda'), RECCOUNT('crsSonda'), 0) + DO S63dLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': cursor_avize -> linii=' + TRANSFORM(lnLinii) + IF lnLinii > 0 AND TYPE('crsSonda.lot') <> 'U' + SELECT crsSonda + GO TOP + DO S63dLog WITH ' aviz ' + TRANSFORM(gnSursaAviz) + ': crsarticole.lot pe primul rand=[' + ; + ALLTRIM(TRANSFORM(NVL(crsSonda.lot, ''))) + ']' + ENDIF + DO Inchide WITH 'crsSonda' + poDate = NULL + gnLiniiAviz = lnLinii + glAvizOk = (lnLinii > 0) + DO Assert WITH glAvizOk, 'sursa ' + TRANSFORM(gnSursaAviz) + ' da articole, linii=' + TRANSFORM(lnLinii) + DO S63dLog WITH ' [D diag] exista_ramas_avize_lista(' + TRANSFORM(gnSursaAviz) + ') INAINTE de emitere = ' + ; + TRANSFORM(RamasOracle(gnSursaAviz)) +ENDPROC + +*================================================================================== +* Emiterea pe traseul real (butonul, nu metoda). Fara TRY: o eroare cade pe ON ERROR. +FUNCTION EmiteUnu + LPARAMETERS tnTip, tcLista, tnIdPart, tcNume, tcDescr, tnIdCom, tcEticheta, tlFormNou + LOCAL lnIdVz, lcSerie, lnNract, oform, lnArt, lnFact, loRez, llOk, lnIntrInainte, lnAvRetInainte + lnIdVz = 0 + lcSerie = '' + lnNract = 0 + gcUltimaSerie = '' + gnUltimulNract = 0 + gcCaz = '[' + tcEticheta + '] ' + + DO S63dLog WITH '--- ' + tcEticheta + ' (tip=' + TRANSFORM(tnTip) + ' listaid=[' + tcLista + '] client=' + ; + TRANSFORM(tnIdPart) + ' [' + tcNume + '], forma=' + IIF(tlFormNou, 'NOUA (v2)', 'VECHE (v1)') + ') ---' + + DO CuratieCrs + poDate = CREATEOBJECT("oDateFactura", 25000 + tnTip - 1, tnTip) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + + poDate.id_client = tnIdPart + poDate.nume_client = tcNume + poDate.listaid = tcLista + poDate.descriere = tcDescr + ADDPROPERTY(poDate, 'id_comanda_aviz', tnIdCom) + poDate.id_delegat = 39 + IF EMPTY(NVL(poDate.id_fdoc, 0)) + poDate.id_fdoc = 1 + ENDIF + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + IF poDate.rezultat_serii <> 3 + DO Assert WITH .F., tcEticheta + ': rezultat_serii = 3, e=' + TRANSFORM(poDate.rezultat_serii) + DO Goleste + RETURN 0 + ENDIF + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act)) + lnNract = poDate.nract + gcUltimaSerie = lcSerie + gnUltimulNract = lnNract + gcNumere = gcNumere + 'ALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ');' + DO S63dLog WITH ' nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + lcSerie + ; + ' nract=' + TRANSFORM(lnNract) + ' in_valuta=' + TRANSFORM(poDate.in_valuta) + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + IF tlFormNou + DO PregatesteFacturaCrs + oform = CREATEOBJECT('frm_facturare_articole2') + ELSE + pnTotalDiscountAvize = 0 + loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere) + llOk = (loRez.nSucces >= 0) AND loRez.lArticole + DO S63dLog WITH ' incarca_cursor_articole -> nSucces=' + TRANSFORM(loRez.nSucces) + ; + ' lArticole=' + TRANSFORM(loRez.lArticole) + ' crsarticole=' + ; + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)') + DO Assert WITH llOk, tcEticheta + ': incarca_cursor_articole a adus articole' + IF !llOk + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', fara linii);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Goleste + gcUltimaSerie = '' + gnUltimulNract = 0 + RETURN 0 + ENDIF + oform = CREATEOBJECT('frm_facturare_articole') + ENDIF + IF VARTYPE(oform) <> 'O' + DO Assert WITH .F., tcEticheta + ': Createobject formular' + DO Goleste + RETURN 0 + ENDIF + oform.WindowType = 0 + oform.Show() + DOEVENTS FORCE + + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + glInEmitere = .T. + IF tlFormNou + oform.but_incarca_articole.Click() + ELSE + oform.but_urmator_tot1.Click() + ENDIF + glInEmitere = .F. + DOEVENTS FORCE + + lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0) + lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) + DO S63dLog WITH ' dupa Click: crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact) + ; + ' Sum(crsarticole.cantitate)=' + TRANSFORM(IIF(lnArt > 0, SumaCantitate(), 0)) + DO S63dLog WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + DO Assert WITH lnFact > 0, tcEticheta + ': crsfactura populat dupa apasarea butonului, e=' + TRANSFORM(lnFact) + + IF lnFact = 0 + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', fara linii);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Elibereaza WITH oform + DO Goleste + gcUltimaSerie = '' + gnUltimulNract = 0 + RETURN 0 + ENDIF + + DO DumpNuluri WITH 'crsfactura', tcEticheta + DO S63dLog WITH ' crsfactura.lot pe primul rand=[' + ; + IIF(TYPE('crsfactura.lot') = 'U', '(coloana lipseste)', ALLTRIM(TRANSFORM(NVL(crsfactura.lot, '')))) + ']' + + oform.do_calculeaza_totaluri() + DOEVENTS FORCE + DO S63dLog WITH ' do_calculeaza_totaluri OK, ntotalron=' + TRANSFORM(oform.ntotalron) + + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + lnIntrInainte = gnIntrebariRetur + lnAvRetInainte = gnAvizReturDeschis + DO S63dLog WITH ' [pas] but_termin1.Click' + glInEmitere = .T. + glSpionActiv = .T. + oform.but_termin1.Click() + glSpionActiv = .F. + glInEmitere = .F. + DOEVENTS FORCE + DO S63dLog WITH ' intrebarea "avizul de retur" pe acest caz: ' + TRANSFORM(gnIntrebariRetur - lnIntrInainte) + ; + '; FRM_DATE_AVIZ_RETUR deschis: ' + TRANSFORM(gnAvizReturDeschis - lnAvRetInainte) + DO S63dLog WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + + *-- D, calea 2: dupa un "Adauga tot" care ia toata cantitatea, garda da 0 si intrebarea + *-- nu mai apare. Pe SSS 671 (aceeasi cale, inainte de 97fd884) valoarea a fost 1. + DO Assert WITH (gnIntrebariRetur - lnIntrInainte) = 0, ; + tcEticheta + ': intrebarea "avizul de retur" NU apare dupa Adauga tot (livrabil D), aparitii=' + ; + TRANSFORM(gnIntrebariRetur - lnIntrInainte) + DO Assert WITH !('avizul de retur' $ LOWER(gcMockApeluri)), ; + tcEticheta + ': jurnalul de amessagebox nu contine intrebarea de aviz de retur' + + lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract) + IF lnIdVz < 0 + lnIdVz = 0 + ENDIF + DO S63dLog WITH ' verificare in VANZARI pe ' + lcSerie + ' ' + TRANSFORM(lnNract) + ' -> id_vanzare=' + TRANSFORM(lnIdVz) + DO Assert WITH lnIdVz > 0, tcEticheta + ': documentul exista in VANZARI (jonctiune serie_act+numar_act), e=' + TRANSFORM(lnIdVz) + + IF lnIdVz > 0 + gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (' + tcEticheta + ');' + ELSE + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (' + tcEticheta + ', nescris);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + gcUltimaSerie = '' + gnUltimulNract = 0 + ENDIF + + DO Elibereaza WITH oform + DO Goleste + RETURN lnIdVz +ENDFUNC + +*================================================================================== +PROCEDURE DupaAbort + LPARAMETERS tcEticheta + LOCAL lnI, lnIdVz, lcSerie, lnNr + glInEmitere = .F. + glSpionActiv = .F. + gnFatal = 0 + DO S63dLog WITH ' [abort] revenit in programul principal dupa eroare fatala in ' + tcEticheta + lcSerie = gcUltimaSerie + lnNr = gnUltimulNract + TRY + goExecutor.oExecute("ROLLBACK") + CATCH + ENDTRY + lnIdVz = 0 + IF !EMPTY(lcSerie) AND lnNr > 0 + lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNr) + IF lnIdVz < 0 + lnIdVz = 0 + ENDIF + ENDIF + DO S63dLog WITH ' [abort] verificare in VANZARI pe ' + lcSerie + ' ' + TRANSFORM(lnNr) + ' -> id_vanzare=' + TRANSFORM(lnIdVz) + DO Assert WITH .F., tcEticheta + ': emiterea a mers pana la capat fara eroare' + IF lnIdVz > 0 + gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNr) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (' + tcEticheta + ');' + ELSE + TRY + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNr) + ' (' + tcEticheta + ', dupa eroare);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + CATCH + ENDTRY + gcUltimaSerie = '' + gnUltimulNract = 0 + ENDIF + FOR lnI = _SCREEN.FormCount TO 1 STEP -1 + TRY + _SCREEN.Forms(lnI).Release() + CATCH + ENDTRY + ENDFOR + DO CuratieCrs + DO Goleste +ENDPROC + +*================================================================================== +PROCEDURE Compara + LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2, tcTip + LOCAL nFail + gcCaz = '[CompDoc ' + tcTip + '] ' + nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-3d ' + tcTip + ' v1(' + TRANSFORM(tnNr1) + ') vs v2(' + TRANSFORM(tnNr2) + ')') + DO Assert WITH nFail >= 0, tcTip + ': CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail) + DO S63dLog WITH ' CompDoc ' + tcTip + ' esecuri totale=' + TRANSFORM(nFail) + ' (surse diferite - fiecare divergenta se argumenteaza in raport)' +ENDPROC + +*================================================================================== +PROCEDURE PregatesteFacturaCrs + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp +ENDPROC + +PROCEDURE Elibereaza + LPARAMETERS toForm + IF TYPE('toForm') = 'O' AND !ISNULL(toForm) + TRY + toForm.Release() + CATCH + ENDTRY + ENDIF + DO CuratieCrs +ENDPROC + +PROCEDURE Goleste + poDate = NULL + poGeneratorNumere = NULL + poDateGestiuneDest = NULL +ENDPROC + +PROCEDURE CuratieCrs + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'crsComTemp' + DO Inchide WITH 'crsartselectate' + DO Inchide WITH 'jtva_coloane' +ENDPROC + +PROCEDURE DumpNuluri + LPARAMETERS tcAlias, tcEticheta + LOCAL lnI, lnC, lcNule, lcNume + IF !USED(tcAlias) + RETURN + ENDIF + SELECT (tcAlias) + lnC = FCOUNT(tcAlias) + SCAN + lcNule = '' + FOR lnI = 1 TO lnC + lcNume = FIELD(lnI, tcAlias) + IF ISNULL(EVALUATE(tcAlias + '.' + lcNume)) + lcNule = lcNule + IIF(EMPTY(lcNule), '', ', ') + LOWER(lcNume) + ENDIF + ENDFOR + DO S63dLog WITH ' [nuluri ' + tcAlias + ' rand ' + TRANSFORM(RECNO()) + '/' + TRANSFORM(RECCOUNT(tcAlias)) + ; + '] ' + IIF(EMPTY(lcNule), '(niciun camp NULL)', lcNule) + ENDSCAN + GO TOP IN (tcAlias) +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +FUNCTION NumarDoc + LPARAMETERS tcSerie, tnNumar + LOCAL lcS + lcS = ALLTRIM(NVL(tcSerie, '')) + RETURN ALLTRIM(IIF(EMPTY(lcS), '', lcS + ' ') + ALLTRIM(STR(NVL(tnNumar, 0), 20, 0))) +ENDFUNC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO S63dLog WITH 'PASS: ' + gcCaz + tcMsg + ELSE + gnFail = gnFail + 1 + DO S63dLog WITH 'FAIL: ' + gcCaz + tcMsg + ENDIF +ENDPROC + +PROCEDURE S63dLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE S63dErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnErr = gnErr + 1 + IF tnErr = 1472 + gn1472 = gn1472 + 1 + ENDIF + DO S63dLog WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + TRANSFORM(tcProg) + ':' + TRANSFORM(tnLine) + '] ' + TRANSFORM(tcMsg) + DO S63dLog WITH ' MESSAGE(1)=[' + TRANSFORM(MESSAGE(1)) + '] SYS(2018)=[' + TRANSFORM(SYS(2018)) + ']' + DO LogStiva + IF glInEmitere + gnFatal = tnErr + DO S63dLog WITH ' -> eroare in timpul emiterii: RETURN TO MASTER' + RETURN TO MASTER + ENDIF +ENDPROC + +PROCEDURE LogStiva + LOCAL lnN, lnI, lcLin + LOCAL ARRAY laS[1, 1] + gnStivaTiparita = gnStivaTiparita + 1 + lnN = 0 + TRY + lnN = ASTACKINFO(laS) + CATCH + ENDTRY + IF lnN <= 0 + DO S63dLog WITH ' ASTACKINFO indisponibil' + RETURN + ENDIF + DO S63dLog WITH ' --- ASTACKINFO, ' + TRANSFORM(lnN) + ' niveluri (de sus in jos) ---' + FOR lnI = lnN TO 1 STEP -1 + lcLin = '' + IF ALEN(laS, 2) >= 5 + lcLin = ALLTRIM(STRTRAN(TRANSFORM(laS[lnI, 5]), CHR(9), ' ')) + ENDIF + DO S63dLog WITH ' #' + PADL(TRANSFORM(laS[lnI, 1]), 3) + ' ' + ; + PADR(ALLTRIM(TRANSFORM(laS[lnI, 3])), 46) + ' linia ' + PADL(TRANSFORM(laS[lnI, 4]), 6) + ; + ' [' + lcLin + '] <' + ALLTRIM(TRANSFORM(laS[lnI, 2])) + '>' + ENDFOR + DO S63dLog WITH ' --- sfarsit ASTACKINFO ---' +ENDPROC + +PROCEDURE S63dFinal + LOCAL lnI + IF TYPE('_SCREEN.tmrS63d') = 'O' + _SCREEN.tmrS63d.Enabled = .F. + TRY + _SCREEN.RemoveObject('tmrS63d') + CATCH + ENDTRY + ENDIF + FOR lnI = _SCREEN.FormCount TO 1 STEP -1 + TRY + _SCREEN.Forms(lnI).Release() + CATCH + ENDTRY + ENDFOR + TRY + IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ; + [where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 720 order by numar_act], 'crsNrSSS') >= 0 + DO S63dLog WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-720):' + SELECT crsNrSSS + SCAN + DO S63dLog WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ENDSCAN + USE IN crsNrSSS + ENDIF + CATCH + ENDTRY + DO S63dLog WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere + DO S63dLog WITH 'STIVE TIPARITE: ' + TRANSFORM(gnStivaTiparita) + DO S63dLog WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr) + DO S63dLog WITH 'END ' + TTOC(DATETIME()) + QUIT +ENDPROC + +*================================================================================== +DEFINE CLASS spionSql AS Custom + nOrdine = 0 + + PROCEDURE Vede + LPARAMETERS tcSql, tcCursor, tlProgress, tcTitluProgress, tnHandle, tlShowError, tlQuitOnError, tlReconnect + IF !glSpionActiv + RETURN + ENDIF + This.nOrdine = This.nOrdine + 1 + LOCAL lcT, lcV + lcT = VARTYPE(tcSql, .T.) + DO CASE + CASE lcT == 'X' + lcV = '<<< .NULL. >>>' + CASE VARTYPE(tcSql) <> 'C' + lcV = '<<< netip-caracter: ' + lcT + ' >>>' + CASE EMPTY(tcSql) + lcV = '<<< SIR GOL, len=' + TRANSFORM(LEN(tcSql)) + ' >>>' + OTHERWISE + lcV = 'len=' + TRANSFORM(LEN(tcSql)) + ' [' + STRTRAN(LEFT(tcSql, 400), CHR(13) + CHR(10), ' ') + ']' + ENDCASE + DO S63dLog WITH ' [sql #' + PADL(TRANSFORM(This.nOrdine), 3) + ' type=' + lcT + '] cursor=[' + ; + TRANSFORM(NVL(tcCursor, '')) + '] ' + lcV + ENDPROC +ENDDEFINE + +*================================================================================== +DEFINE CLASS driverS63d AS Custom + nUltimAlteDate = 0 + lBusy = .F. + + PROCEDURE Executa + IF This.lBusy + RETURN + ENDIF + This.lBusy = .T. + IF TYPE('_SCREEN.tmrS63d') = 'O' + _SCREEN.tmrS63d.Enabled = .F. + ENDIF + TRY + LOCAL lnI, loMsgForm, loAlteDate, lcClasa, loAvizRetur + loMsgForm = NULL + loAlteDate = NULL + loAvizRetur = NULL + FOR lnI = 1 TO _SCREEN.FormCount + lcClasa = UPPER(_SCREEN.Forms(lnI).Class) + IF 'MESSAGEBOX_FORM' $ lcClasa + loMsgForm = _SCREEN.Forms(lnI) + ENDIF + IF lcClasa == 'FRM_ALTE_DATE' + loAlteDate = _SCREEN.Forms(lnI) + ENDIF + IF 'DATE_AVIZ_RETUR' $ lcClasa + loAvizRetur = _SCREEN.Forms(lnI) + ENDIF + IF !(lcClasa $ gcClaseVazute) + gcClaseVazute = gcClaseVazute + lcClasa + ';' + DO S63dLog WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' + ENDIF + ENDFOR + IF !ISNULL(loAvizRetur) + gnAvizReturDeschis = gnAvizReturDeschis + 1 + DO S63dLog WITH ' [driver] FRM_DATE_AVIZ_RETUR deschis - eliberat fortat (caz neconcludent)' + TRY + loAvizRetur.Release() + CATCH + ENDTRY + ENDIF + IF !ISNULL(loMsgForm) + TRY + LOCAL lcTextMsg + lcTextMsg = '' + TRY + lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value)) + CATCH + ENDTRY + DO S63dLog WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']' + IF 'avizul de retur' $ LOWER(lcTextMsg) + gnIntrebariRetur = gnIntrebariRetur + 1 + ENDIF + DO CASE + CASE ('avizul de retur' $ LOWER(lcTextMsg) OR 'totalul 0' $ LOWER(lcTextMsg)) ; + AND gcRaspunsMsgForm == 'NU' AND PEMSTATUS(loMsgForm.cmgBotones, 'cmdNo', 5) + DO S63dLog WITH ' [driver msg] apas cmgBotones.cmdNo' + loMsgForm.cmgBotones.cmdNo.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) + DO S63dLog WITH ' [driver msg] apas cmgBotones.cmdYes' + loMsgForm.cmgBotones.cmdYes.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) + DO S63dLog WITH ' [driver msg] apas cmgBotones.cmdOk' + loMsgForm.cmgBotones.cmdOk.Click() + ENDCASE + CATCH TO loExcMsg + DO S63dLog WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message + ENDTRY + ELSE + IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1) + This.nUltimAlteDate = SECONDS() + TRY + DO S63dLog WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE' + loAlteDate.do_termin() + CATCH TO loExcAD + DO S63dLog WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message + ENDTRY + ENDIF + ENDIF + CATCH TO loExcTop + DO S63dLog WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message + FINALLY + IF TYPE('_SCREEN.tmrS63d') = 'O' + _SCREEN.tmrS63d.Enabled = .T. + ENDIF + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_unificat/test_s6_4_transfer.prg b/utile/Teste/facturare_unificat/test_s6_4_transfer.prg new file mode 100644 index 0000000..a6c0a83 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_4_transfer.prg @@ -0,0 +1,852 @@ +* test_s6_4_transfer.prg +* Headless: S6-4, transfer (tip 23) si retur transfer (tip 41). +* Bloc A (structural, mereu ruleaza, 0 numere): dovedeste ca v2 nu are traseu catre crsfactura +* nevid pentru 23/41 - cablare, zeroire, absenta grid/buton pe rand. +* Bloc B (structural, mereu ruleaza, 0 numere): dovedeste traseul real pe v1 - But_urmator1, +* ramura modala din do_adauga_articol cu gnScadereStoc=0, clasa frm_articol_factura. +* Bloc D (structural, mereu ruleaza, 0 numere): asertiuni pe cele doua divergente v1/v2 cunoscute +* si inca vii azi in Do Case-ul din do_initializeaza_articol - nu sunt defecte azi (tip 24 nu +* apare in intervalul clasei v2, iar copierea ruteaza azi pe v1), dar sunt capcane latente +* pentru ziua in care v2 ramane singurul formular. Pica daca cineva "unifica" gresit garda. +* Bloc C (emitere REALA, doar pe v1, 1-2 numere tipdoc 6): condtionat de sursa de stoc gasita +* in date (articolul 315554536 / gestiunea 6) sau de scriptul wip13_..._STOC_TRANSFER aplicat. +* Fara sursa: se dezaloca numarul, blocul se marcheaza NEEXERCITAT, nu FAIL. +* NU exista Bloc de comparatie CompDoc: nu exista niciodata document v2 pentru tip 23/41 (§5.d +* din propunere) - a incerca sa emiti pe v2 ar testa cod mort, nu traseul (lectia platita de 3 +* ori in acest plan). +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_4_transfer.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_4_transfer.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167; +* gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +SET TABLEPROMPT OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat +PUBLIC gcClaseVazute, goDriverS64, gnModaleArticolInchise + +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_4_transfer.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) +gnPass = 0 +gnFail = 0 +gnErr = 0 +gcCaz = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +gcClaseVazute = ";" +gnModaleArticolInchise = 0 +gcNumere = "" +gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg" + +*-- poDate & co. declarate SI initializate la nivel de program (capcana platita: PRIVATE declarat +*-- intr-o procedura si asignat in alta ramane invizibil formei) +PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil +poDate = NULL +poGeneratorNumere = NULL +poDateGestiuneDest = NULL +pnTotalDiscountAvize = 0 +plVizibil = .F. + +ON ERROR DO S64Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + + 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 S64Log WITH 'EROARE: conectare Oracle esuata' + DO S64Final + ENDIF + SQLSETPROP(gnHandle, "QueryTimeOut", 45) + DO S64Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE + SET PROCEDURE TO (gcMock) ADDITIVE + + IF !actualizeaza_optiuni_program() + DO S64Log WITH 'EROARE: actualizeaza_optiuni_program()' + DO S64Final + ENDIF + gnScadereStoc = 0 + gnFactSeturi = 0 + gnIdSucursala = 167 + goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]) + gnIdUtil = 8 + goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) + DO S64Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + *-- driver + timer: frm_articol_factura (modalul din §3.2) nu trece prin amessagebox, deci + *-- mock-ul nu il acopera. Acelasi tipar de timer/driver validat la S6-2/S6-3/S8. + goDriverS64 = CREATEOBJECT('driverS64') + _SCREEN.AddObject('tmrS64', 'Timer') + _SCREEN.tmrS64.Interval = 200 + BINDEVENT(_SCREEN.tmrS64, 'Timer', goDriverS64, 'Executa') + _SCREEN.tmrS64.Enabled = .T. + + DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC A: v2 nu are traseu (structural, 0 numere) =====' + DO BlocA_V2FaraTraseu + + DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC B: v1 are traseu per-articol cu modal (structural, 0 numere) =====' + DO BlocB_V1Traseu + + DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC D: divergentele v1/v2 cunoscute, latente azi (structural, 0 numere) =====' + DO BlocD_DivergenteV1V2 + + DO S64Log WITH CHR(13) + CHR(10) + '===== ALEGEREA SURSEI REALE (STOC) =====' + DO AlegeSursaStoc + + DO S64Log WITH CHR(13) + CHR(10) + '===== BLOC C: emitere REALA pe v1 (conditionata de sursa) =====' + DO BlocC_EmitereV1 + + DO S64Final + +CATCH TO loExc + DO S64Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ; + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO S64Final +ENDTRY + +QUIT + +*================================================================================== +* BLOC A: cele trei goluri de pe v2, verificate pe cod, fara sa incarce nimic. +PROCEDURE BlocA_V2FaraTraseu + LOCAL lcTxt, lcV2 + gcCaz = '[A] ' + lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2") + IF EMPTY(lcTxt) + DO Assert WITH .F., 'FILETOSTR ofacturare.vc2 a esuat/gol' + RETURN + ENDIF + + *-- A1: cablarea do_incarca_articole (v2) nu include 23/41 in Inlist-ul catre do_adauga_tot + DO Assert WITH "If Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47, 8, 9)" $ lcTxt AND ; + !("Inlist(poDate.tip, 3, 4, 21, 23, 25, 28, 41, 42, 47, 8, 9)" $ lcTxt), ; + 'A1: cablarea do_adauga_tot (v2) NU contine 23 sau 41 - crsfactura ramane gol dupa Incarca articole' + + *-- A2: do_initializeaza_articol zeroeste cantitatea pt 23/41 pe AMBELE clase + DO Assert WITH OCCURS("If Inlist(poDate.tip,1,2,5,6,22,23,29,41,7,10) AND !INLIST(toArticol.opt_facturare,1,2)", lcTxt) >= 1, ; + 'A2: do_initializeaza_articol (v2) zeroeste cantitatea pt grupul care include 23 si 41' + + *-- A3: v2 nu are But_urmator1 (buton per-rand). NU e unic in tot fisierul (frm_articole_compuse, + *-- clasa nelegata, il are si el la ofacturare.vc2:4489) - scopat pe intervalul claselor v1/v2. + LOCAL lnA3v1, lnA3v2, lnA3Next, lcA3v1, lcA3v2 + lnA3v1 = AT('DEFINE CLASS frm_facturare_articole AS _frmbase OF "_frm_base.vcx"', lcTxt) + lnA3v2 = AT('DEFINE CLASS frm_facturare_articole2 AS _frmbase OF "_frm_base.vcx"', lcTxt) + lnA3Next = AT('DEFINE CLASS frm_nomrute AS frm_termin OF "_frm_child.vcx"', lcTxt) + IF lnA3v1 = 0 OR lnA3v2 = 0 OR lnA3Next = 0 OR lnA3v2 <= lnA3v1 OR lnA3Next <= lnA3v2 + DO Assert WITH .F., 'A3: pre-conditie - ancorele DEFINE CLASS frm_facturare_articole/2/frm_nomrute gasite si in ordine' + ELSE + lcA3v1 = SUBSTR(lcTxt, lnA3v1, lnA3v2 - lnA3v1) + lcA3v2 = SUBSTR(lcTxt, lnA3v2, lnA3Next - lnA3v2) + DO Assert WITH OCCURS("ADD OBJECT 'But_urmator1'", lcA3v1) = 1, ; + 'A3a: v1 (frm_facturare_articole) are But_urmator1 (buton per-rand)' + DO Assert WITH OCCURS("ADD OBJECT 'But_urmator1'", lcA3v2) = 0, ; + 'A3b: v2 (frm_facturare_articole2) NU are But_urmator1 - fara echivalent per-rand' + ENDIF + + *-- A4: linia libera (do_adauga_articol_cautat) nu verifica 23/41 (Inlist-ul de gardare) + DO Assert WITH "If Inlist(poDate.tip, 3, 4, 21, 25, 28, 42, 47) And !Thisform.do_verifica_articol" $ lcTxt, ; + 'A4: garda de stoc a liniei libere (v2) nu acopera 23/41 - nici pe acolo nu exista traseu utilizabil' + + *-- A5: instantiere directa a v2 + Incarca articole pe un antet de transfer -> crsfactura ramane gol + *-- (proba comportamentala, nu doar text - dar NU e "traseul real", e control ca A1-A4 nu mint) + DO ControlComportamentalV2 +ENDPROC + +*-- Control comportamental: cheama Incarca articole pe v2 cu poDate.tip=23, verifica ca +*-- crsfactura ramane gol chiar daca crsarticole s-a umplut. Nu emite, nu consuma numar. +PROCEDURE ControlComportamentalV2 + LOCAL loForm, lnArt, lnFact + gcCaz = '[A5] ' + DO CuratieCrs + poDate = CREATEOBJECT("oDateFactura", 25022, 23) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + poDate.id_client = 6 + poDate.nume_client = 'DEPOZIT' + IF TYPE('poDate.id_gestiune_init') = 'N' OR ISNULL(poDate.id_gestiune_init) + poDate.id_gestiune_init = 6 + ENDIF + poDate.id_delegat = 39 + IF EMPTY(NVL(poDate.id_fdoc, 0)) + poDate.id_fdoc = 1 + ENDIF + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + IF poDate.rezultat_serii <> 3 + DO Assert WITH .F., 'A5: rezultat_serii = 3 pe antet de control (transfer), e=' + TRANSFORM(poDate.rezultat_serii) + DO Goleste + RETURN + ENDIF + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + DO S64Log WITH ' A5 control: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + DO PregatesteFacturaCrsV2 + loForm = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loForm) <> 'O' + DO Assert WITH .F., 'A5: Createobject frm_facturare_articole2 (control)' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Goleste + RETURN + ENDIF + loForm.WindowType = 0 + loForm.Show() + DOEVENTS FORCE + + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + loForm.but_incarca_articole.Click() + DOEVENTS FORCE + + lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0) + lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) + DO S64Log WITH ' A5 control: dupa Click crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact) + DO Assert WITH lnFact = 0, ; + 'A5: pe v2, transfer (tip 23), crsfactura ramane GOL dupa Incarca articole - confirma A1-A2 pe comportament' + + TRY + loForm.Release() + CATCH + ENDTRY + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (A5, control, niciodata scris);' + DO CuratieCrs + DO Goleste +ENDPROC + +PROCEDURE PregatesteFacturaCrsV2 + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp +ENDPROC + +*================================================================================== +* BLOC B: traseul real pe v1 - buton, ramura modala, clasa frm_articol_factura. Doar text/PEMSTATUS, +* nu instantiaza formularul (evita orice dialog inutil). +PROCEDURE BlocB_V1Traseu + LOCAL lcTxt + gcCaz = '[B] ' + lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2") + + DO Assert WITH "caction = do_urmator," $ lcTxt, ; + 'B1: But_urmator1 (v1) are cAction = do_urmator - butonul viu pentru adaugare per-articol' + + DO Assert WITH "Case (poArticol.gestionabil = 0 Or gnScadereStoc = 0 Or poDate.tip = 45)" $ lcTxt, ; + 'B2: do_adauga_articol (v1) ia ramura modala necoditionat cand gnScadereStoc = 0' + + DO Assert WITH 'Createobject("frm_articol_factura", lnCantitate, tlImplicit)' $ lcTxt, ; + 'B3: ramura modala instantiaza frm_articol_factura (nu do_alege_stoc)' + + DO Assert WITH "If !tlImplicit" $ lcTxt AND "ofrmadarticol.Show(1)" $ lcTxt, ; + 'B4: modalul se arata (Show(1)) cand tlImplicit = .F. - cazul But_urmator1, nu Adauga tot' + + *-- B5: pe v1, but_urmator_tot1 NU e vizibil pentru 23/41 (spre deosebire de 3,4,8,9,21,24,25,28,42,47) + DO VerificaButUrmatorTotAscunsPentruTransfer WITH lcTxt +ENDPROC + +* Cauta blocul "Case poDate.tip = 23 ... Endcase/Case urmator" si verifica ca nu contine +* "but_urmator_tot1.Visible = .T." intre el si urmatorul Case. Cautare pe text, robusta la +* reformatari minore (nu presupune numar de linie). +PROCEDURE VerificaButUrmatorTotAscunsPentruTransfer + LPARAMETERS tcTxt + LOCAL lnStart23, lnStart41, lnNextAfter23, lnNextAfter41, lcBloc23, lcBloc41 + lnStart23 = AT("Case poDate.tip = 23" + CHR(13) + CHR(10), tcTxt) + IF lnStart23 = 0 + lnStart23 = AT("Case poDate.tip = 23", tcTxt) + ENDIF + lnStart41 = AT("Case poDate.tip = 41", tcTxt, 2) && a doua aparitie (dupa cea din alt context, daca exista) + IF lnStart41 = 0 OR lnStart41 < lnStart23 + lnStart41 = AT("Case poDate.tip = 41", tcTxt) + ENDIF + IF lnStart23 = 0 OR lnStart41 = 0 + DO Assert WITH .F., 'B5: blocurile Case poDate.tip = 23 / 41 gasite in text (pre-conditie cautare)' + RETURN + ENDIF + lnNextAfter23 = AT("Case poDate.tip = 41", tcTxt, 1) + lcBloc23 = SUBSTR(tcTxt, lnStart23, MAX(lnNextAfter23 - lnStart23, 1)) + lnNextAfter41 = AT("Case poDate.tip = 25", tcTxt, 1) + lcBloc41 = SUBSTR(tcTxt, lnStart41, MAX(lnNextAfter41 - lnStart41, 1)) + + DO Assert WITH !("but_urmator_tot1.Visible = .T." $ LOWER(lcBloc23)), ; + 'B5a: blocul Case poDate.tip=23 (v1, Init) NU seteaza but_urmator_tot1.Visible - butonul de masa ramane ascuns' + DO Assert WITH !("but_urmator_tot1.Visible = .T." $ LOWER(lcBloc41)), ; + 'B5b: blocul Case poDate.tip=41 (v1, Init) NU seteaza but_urmator_tot1.Visible - butonul de masa ramane ascuns' +ENDPROC + +*================================================================================== +* BLOC D: cele doua divergente v1/v2 in do_initializeaza_articol, gasite dincolo de propunere. +* Verificat pe cod (ofacturare.vc2): v1 :13878/13890, v2 :19700/19712. NU sunt defecte azi - +* tipul 24 (aviz retur) nu apare deloc in intervalul clasei v2 (15894-21780), iar copierea +* (poDate.lCopiere) ruteaza azi pe v1 (S5c) - dar sunt capcane latente pentru ziua in care v2 +* ramane singurul formular (tinta planului #13). Asertiunile pica daca cineva "unifica" garda +* gresit (adica sterge divergenta fara sa decida explicit ce se intampla cu lCopiere/tip 24 pe v2). +* D3 (a treia asertiune ceruta): masinaria modalului per-rand (do_adauga_articol cu tip hint +* frm_articol_factura) exista SI pe v2 - lipseste doar punctul de intrare din UI (A3/B1), nu +* motorul. Distinctia schimba forma reparatiei din propunere §7. +PROCEDURE BlocD_DivergenteV1V2 + LOCAL lcTxt + gcCaz = '[D] ' + lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2") + + *-- D1: v1 (:13890) zeroeste cu exceptia suplimentara "OR poDate.lCopiere" - v2 nu o are + DO Assert WITH "Inlist(poDate.tip,1,2,5,6,22,23,29,41,7,10) AND !(INLIST(toArticol.opt_facturare,1,2) OR poDate.lCopiere)" $ lcTxt, ; + 'D1: v1 (ofacturare.vc2:13890) are exceptia OR poDate.lCopiere in garda de zeroire - v2 (:19712) nu o are' + + *-- D2: varianta cu lCopiere apare o singura data (doar v1) - daca ar aparea si pe v2, divergenta ar fi disparuta silentios + DO Assert WITH OCCURS("Inlist(poDate.tip,1,2,5,6,22,23,29,41,7,10) AND !(INLIST(toArticol.opt_facturare,1,2) OR poDate.lCopiere)", lcTxt) = 1, ; + 'D2: garda cu OR poDate.lCopiere exista o singura data in fisier (doar pe v1, :13890) - divergenta e inca vie azi' + + *-- D3: v1 (:13878) negeaza cantitatea si pentru tip 24 (aviz retur) - v2 (:19700) doar 8,9. + *-- Substringul scurt "Inlist(poDate.tip,8,9,24)" apare de 8 ori in fisier (Iif/Case aiurea, + *-- alte metode) - asertiunea foloseste sirul complet cu comentariul, unic garantat. + *-- capcana platita aici: VFP trateaza "&&" ca inceput de comentariu chiar si in interiorul unui + *-- string literal (verificat - eroarea 36 aparea si fara linie continuata) - construit din + *-- CHR(38) ca sa nu apara deloc literalul "&&" in sursa .prg + LOCAL lcD3Cauta + lcD3Cauta = "If Inlist(poDate.tip,8,9,24) " + CHR(38) + CHR(38) + " retur lei, retur valuta, aviz retur" + DO Assert WITH OCCURS(lcD3Cauta, lcTxt) = 1, 'D3: garda cu Inlist(poDate.tip,8,9,24) si comentariul aferent exista o singura data (doar pe v1, :13878) - v2 (:19700) are doar 8,9, fara 24' + + *-- D4: masinaria modalului per-rand (do_adauga_articol) exista pe AMBELE clase - motorul nu lipseste, doar intrarea din UI + DO Assert WITH OCCURS('Local ofrmadarticol As "frm_articol_factura"', lcTxt) = 2, ; + 'D4: type hint ofrmadarticol As frm_articol_factura apare de doua ori (v1 SI v2) - masinaria modalului exista si pe v2, lipseste doar But_urmator1/grd_articole (A3/B1)' +ENDPROC + +*================================================================================== +* Alege sursa reala de stoc: intai articolul/gestiunea gasite in propunere (315554536 / gestiunea 6), +* verificat inca valabil; altfel scaneaza gestiunile 1,4,6,19 dupa orice articol cu stoc > 0. +PROCEDURE AlegeSursaStoc + PUBLIC gnArtSursa, gnGestSursa, gnGestDest, gnCantSursa + gnArtSursa = 0 + gnGestSursa = 0 + gnGestDest = 0 + gnCantSursa = 0 + + LOCAL lnQ + lnQ = goExecutor.oExecute([select cant from stoc where id_articol=315554536 and id_gestiune=6 ] + ; + [and an=] + TRANSFORM(gnAn) + [ and luna=] + TRANSFORM(gnLuna) + [ and cant>0], 'crsSondaStoc') + IF lnQ >= 0 AND USED('crsSondaStoc') AND RECCOUNT('crsSondaStoc') > 0 + gnArtSursa = 315554536 + gnGestSursa = 6 + gnGestDest = 4 + gnCantSursa = crsSondaStoc.cant + DO S64Log WITH ' sursa cunoscuta inca valabila: articol=' + TRANSFORM(gnArtSursa) + ' gestiune=' + TRANSFORM(gnGestSursa) + ' cant=' + TRANSFORM(gnCantSursa) + ENDIF + DO Inchide WITH 'crsSondaStoc' + + IF gnArtSursa = 0 + lnQ = goExecutor.oExecute([select id_gestiune, id_articol, cant from stoc ] + ; + [where id_gestiune in (1,4,6,19) and an=] + TRANSFORM(gnAn) + [ and luna=] + TRANSFORM(gnLuna) + ; + [ and cant>0 order by cant desc], 'crsStocCand') + IF lnQ >= 0 AND USED('crsStocCand') AND RECCOUNT('crsStocCand') > 0 + SELECT crsStocCand + GO TOP + gnArtSursa = id_articol + gnGestSursa = id_gestiune + gnCantSursa = cant + gnGestDest = IIF(gnGestSursa = 4, 1, 4) + DO S64Log WITH ' sursa gasita prin scanare: articol=' + TRANSFORM(gnArtSursa) + ' gestiune=' + TRANSFORM(gnGestSursa) + ' cant=' + TRANSFORM(gnCantSursa) + ENDIF + DO Inchide WITH 'crsStocCand' + ENDIF + + IF gnArtSursa = 0 + DO S64Log WITH ' NICIO sursa de stoc gasita in gestiunile 1,4,6,19, perioada ' + TRANSFORM(gnAn) + '/' + TRANSFORM(gnLuna) + ; + ' - Blocul C ramane NEEXERCITAT. Vezi propunerea sectiunea 4.1 (script wip13 neaplicat).' + ENDIF +ENDPROC + +*================================================================================== +* BLOC C: emitere REALA pe v1, doar daca AlegeSursaStoc a gasit o sursa. NU exista echivalent v2, +* deci NU exista Compara/CompDoc aici - vezi verdictul din propunere, punctul d. +PROCEDURE BlocC_EmitereV1 + LOCAL oform, lcSerie, lnNract, lnIdVz + gcCaz = '[C] ' + IF gnArtSursa = 0 + DO S64Log WITH ' C NEEXERCITAT: nicio sursa de stoc (vezi ALEGEREA SURSEI REALE de mai sus)' + RETURN + ENDIF + + DO CuratieCrs + poDate = CREATEOBJECT("oDateFactura", 25022, 23) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + poDate.id_client = gnGestSursa + poDate.nume_client = 'GESTIUNE SURSA ' + TRANSFORM(gnGestSursa) + IF TYPE('poDate.id_gestiune_init') = 'N' OR ISNULL(poDate.id_gestiune_init) + poDate.id_gestiune_init = gnGestSursa + ENDIF + poDate.id_delegat = 39 + IF EMPTY(NVL(poDate.id_fdoc, 0)) + poDate.id_fdoc = 1 + ENDIF + + *-- necunoscuta #1 (propunere §6.2): mapare id_client/id_gestiune_init = ambele sursa e confirmata + *-- EMPIRIC mai jos (incarca_cursor_articole a adus stocul din gestiunea 6 cu id_gestiune_init=6). + *-- Blocajul real gasit la prima rulare a fost altul: poDateGestiuneDest si poDate.listaid raman + *-- goale in acest test (nu trecem prin frm_date_aviz.do_cauta_gestiune_dest, calea UI normala) - + *-- do_scrie_articole (ofacturare.vc2:14152/19863) foloseste poDateGestiuneDest.id_gestiune=0 in + *-- pack_facturare.initializeaza_date_gestiune(), care Oracle a respins cu "Eroare la selectarea + *-- gestiunii! (FACT-019)". Reparat aici cu acelasi SELECT folosit de caut_gestiune_dest() + *-- (ocautare.prg:3298-3305), filtrat direct pe gnGestDest - fara picker modal, deci fara risc de + *-- atarnare. + LOCAL lcSqlGD, lnQGD + lcSqlGD = [select distinct c.nume_gestiune,c.cgest,b.id_gestiune,d.id_tipgest,] + ; + [NVL(c.cont, d.cont) as cont,NVL(c.acont, p.acont) as acont ] + ; + [from gest_coresp_util_grupe a ] + ; + [left join gest_coresp_grupe_gestiuni b on a.id_grupe=b.id_grupe ] + ; + [left join nom_gestiuni c on b.id_gestiune=c.id_gestiune ] + ; + [left join coresp_cont_tipgest d on c.nr_pag=d.id_tipgest ] + ; + [left join vplcont_analitic p on NVL(c.cont, d.cont) = p.cont and p.an = ] + TRANSFORM(gnAn) + [ and p.inactiv = 0 ] + ; + [where a.id_util=] + TRANSFORM(gnIdUtil) + [ and a.sters=0 and b.sters=0 and c.sters=0 and c.nr_pag in (2,4,5,6,7) and b.id_gestiune = ] + TRANSFORM(gnGestDest) + lnQGD = goExecutor.oExecute(lcSqlGD, 'crsGestDest') + IF lnQGD >= 0 AND USED('crsGestDest') AND RECCOUNT('crsGestDest') > 0 + poDateGestiuneDest.id_gestiune = crsGestDest.id_gestiune + poDateGestiuneDest.id_tipgest = NVL(crsGestDest.id_tipgest, 0) + poDateGestiuneDest.Cont = NVL(crsGestDest.cont, 'XXXX') + poDateGestiuneDest.acont = NVL(crsGestDest.acont, 'XXXX') + poDate.listaid = TRANSFORM(crsGestDest.id_gestiune) + poDate.descriere = ALLTRIM(NVL(crsGestDest.nume_gestiune, '')) + DO S64Log WITH ' C: gestiune destinatie rezolvata din gest_coresp_util_grupe - id_gestiune=' + TRANSFORM(poDateGestiuneDest.id_gestiune) + ; + ' id_tipgest=' + TRANSFORM(poDateGestiuneDest.id_tipgest) + ' Cont=' + poDateGestiuneDest.Cont + ' listaid=' + poDate.listaid + ELSE + DO S64Log WITH ' C: NICIO corespondenta gest_coresp_util_grupe pentru gnIdUtil=' + TRANSFORM(gnIdUtil) + ' si gestiunea destinatie=' + TRANSFORM(gnGestDest) + ; + ' - poDateGestiuneDest ramane 0, emiterea va pica probabil la but_termin1 (FACT-019)' + ENDIF + DO Inchide WITH 'crsGestDest' + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + IF poDate.rezultat_serii <> 3 + DO Assert WITH .F., 'C: rezultat_serii = 3 (transfer), e=' + TRANSFORM(poDate.rezultat_serii) + DO Goleste + RETURN + ENDIF + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + DO S64Log WITH ' C: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ; + ' gestiune sursa=' + TRANSFORM(gnGestSursa) + ' articol=' + TRANSFORM(gnArtSursa) + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + *-- v1: incarca_cursor_articole INAINTE de formular (ca in factureaza(), ramura veche) + LOCAL loRez + loRez = incarca_cursor_articole(poDate.tip, .F., poGeneratorNumere) + DO S64Log WITH ' C: incarca_cursor_articole -> nSucces=' + TRANSFORM(loRez.nSucces) + ' lArticole=' + TRANSFORM(loRez.lArticole) + ; + ' crsarticole=' + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)') + DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'C: incarca_cursor_articole a adus articole (sursa reala)' + IF !((loRez.nSucces >= 0) AND loRez.lArticole) + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (C, fara articole);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Goleste + RETURN + ENDIF + + *-- pastreaza doar articolul-sursa ales, ca sa nu deschida un modal per fiecare rand din gestiune + IF USED('crsarticole') + SELECT * FROM crsarticole WHERE id_articol = gnArtSursa INTO CURSOR crsarticole_filtrat READWRITE + IF USED('crsarticole_filtrat') AND RECCOUNT('crsarticole_filtrat') > 0 + USE IN crsarticole + SELECT * FROM crsarticole_filtrat INTO CURSOR crsarticole READWRITE + USE IN crsarticole_filtrat + ENDIF + ENDIF + DO S64Log WITH ' C: crsarticole filtrat la articolul sursa, randuri=' + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)) + + *-- SIMULARE (optiunea 2 din sarcina): traseul real (grd_gestiuni/AfterRowColChange, ofacturare.vc2:4219-4232) + *-- ruleaza doar pe ramura gnScadereStoc=1 (do_alege_stoc -> frm_articol_gest_factura), interzisa explicit + *-- (interdictia #5). Cu gnScadereStoc=0, do_adauga_articol instantiaza frm_articol_factura de baza + *-- (fara grd_gestiuni), care nu atinge deloc poArticol.id_gestiune - ramane pe sentinela -1000 din + *-- do_initializeaza_articol (ofacturare.vc2:13771-13773), pe care Oracle o trateaza explicit ca "nesetat" + *-- (ADAUGA_ARTICOL_FACTURA: IF V_ID_GESTIUNE <> -1000 ...), deci V_ID_GESTIUNE2 ramane NULL -> FACT-019. + *-- Reparat aici imbogatind crsarticole cu exact campurile pe care AfterRowColChange le-ar seta pe poArticol, + *-- citite din acelasi cursor real (pack_facturare.cursor_gestiuni_articol, apelat de do_alege_stoc:13389 - + *-- verificat pe USER_SOURCE:3174-3268, doar SELECT/OPEN CURSOR, nicio scriere), nu valori inventate. + LOCAL lcSqlGA, lnQGA, lnGA_idgest, lnGA_pretach, lcGA_lot, lcGA_serie, lcGA_cont, lnGA_idlucrez, lnGA_idpartrez, lnGA_pretv, lnGA_idval, lnGA_pretd + lnGA_idgest = 0 + lcSqlGA = [{call pack_facturare.cursor_gestiuni_articol(] + TRANSFORM(gnArtSursa) + [,] + TRANSFORM(poDate.tip) + [,] + ; + TRANSFORM(gnGestSursa) + [,] + TRANSFORM(gnLuna) + [,] + TRANSFORM(gnAn) + [,] + TRANSFORM(gnIdUtil) + [,] + ; + IIF(ISNULL(gnIdSucursala), [NULL], TRANSFORM(gnIdSucursala)) + [)}] + lnQGA = goExecutor.oExecute(lcSqlGA, 'crsgestarticol') + DO S64Log WITH ' C: crsgestarticol (cursor real de loturi, cursor_gestiuni_articol) -> nSucces=' + TRANSFORM(lnQGA) + ; + ' randuri=' + IIF(USED('crsgestarticol'), TRANSFORM(RECCOUNT('crsgestarticol')), '(nedeschis)') + IF lnQGA >= 0 AND USED('crsgestarticol') AND RECCOUNT('crsgestarticol') > 0 + SELECT crsgestarticol + LOCATE FOR id_gestiune = gnGestSursa + IF !FOUND() + GO TOP + ENDIF + lnGA_idgest = id_gestiune + lnGA_pretach = Pret + lcGA_lot = NVL(lot, '') + lcGA_serie = NVL(serie, '') + lcGA_cont = ALLTRIM(NVL(Cont, 'XXXX')) + lnGA_idlucrez = NVL(id_lucrare_rez, 0) + lnGA_idpartrez = NVL(id_part_rez, 0) + lnGA_pretv = NVL(pretv, 0) + lnGA_idval = NVL(id_valuta, 0) + lnGA_pretd = NVL(pretd, 0) + DO S64Log WITH ' C: crsgestarticol rand ales - id_gestiune=' + TRANSFORM(lnGA_idgest) + ' Pret=' + TRANSFORM(lnGA_pretach) + ; + ' lot=[' + lcGA_lot + '] serie=[' + lcGA_serie + '] Cont=' + lcGA_cont + ELSE + DO S64Log WITH ' C: crsgestarticol GOL pentru articol=' + TRANSFORM(gnArtSursa) + ' gestiune=' + TRANSFORM(gnGestSursa) + ; + ' - sursa de stoc nu suporta transferul pe acest traseu (alt verdict, nu artefact de test)' + ENDIF + DO Inchide WITH 'crsgestarticol' + + IF lnGA_idgest > 0 AND USED('crsarticole') + *-- ALTER TABLE ADD COLUMN a picat cu eroare 1712 "duplicate or invalid" pe nume de camp > 10 + *-- caractere (id_gestiune, pret_achizitie, ...) desi TYPE() confirma ca lipsesc - capcana VFP: + *-- ALTER TABLE nu accepta nume lungi pe cursor, desi SELECT...INTO CURSOR le accepta (vezi + *-- tiparul deja folosit in acest fisier, PregatesteFacturaCrsV2). Reconstruit cu SELECT+CAST. + SELECT *, ; + CAST(m.lnGA_idgest AS N(20)) AS id_gestiune, ; + CAST(m.lnGA_pretach AS N(18,6)) AS pret_achizitie, ; + CAST(m.lcGA_cont AS C(20)) AS Cont, ; + CAST(m.lnGA_idlucrez AS N(20)) AS id_lucrare_rez, ; + CAST(m.lnGA_idpartrez AS N(20)) AS id_part_rez, ; + CAST(m.lnGA_pretv AS N(18,6)) AS pretv_orig, ; + CAST(m.lnGA_idval AS N(10)) AS id_valuta_d, ; + CAST(m.lnGA_pretd AS N(18,6)) AS pretd ; + FROM crsarticole INTO CURSOR crsarticole_ge READWRITE + IF USED('crsarticole_ge') AND RECCOUNT('crsarticole_ge') > 0 + REPLACE ALL lot WITH lcGA_lot, serie WITH lcGA_serie IN crsarticole_ge + USE IN crsarticole + SELECT * FROM crsarticole_ge INTO CURSOR crsarticole READWRITE + USE IN crsarticole_ge + DO S64Log WITH ' C: crsarticole imbogatit (SELECT+CAST) cu id_gestiune/pret_achizitie/lot/serie/Cont din crsgestarticol (simulare AfterRowColChange)' + ELSE + DO Assert WITH .F., 'C: reconstructia crsarticole cu campurile din crsgestarticol a esuat' + ENDIF + ENDIF + + oform = CREATEOBJECT('frm_facturare_articole') + IF VARTYPE(oform) <> 'O' + DO Assert WITH .F., 'C: Createobject frm_facturare_articole' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Goleste + RETURN + ENDIF + oform.WindowType = 0 + oform.Show() + DOEVENTS FORCE + + DO Assert WITH LOWER(ALLTRIM(oform.but_urmator1.cAction)) == 'do_urmator', ; + 'C: butonul But_urmator1 duce la do_urmator (traseul real pentru transfer)' + DO Assert WITH !oform.but_urmator_tot1.Visible, ; + 'C: but_urmator_tot1 NU e vizibil pe transfer (confirma B5a pe instanta reala)' + + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + gnModaleArticolInchise = 0 + oform.but_urmator1.Click() + DOEVENTS FORCE + + DO S64Log WITH ' C: dupa but_urmator1.Click, modale frm_articol_factura inchise de driver=' + TRANSFORM(gnModaleArticolInchise) + ; + ' crsfactura=' + IIF(USED('crsfactura'), TRANSFORM(RECCOUNT('crsfactura')), '(nedeschis)') + DO Assert WITH USED('crsfactura') AND RECCOUNT('crsfactura') > 0, ; + 'C: crsfactura are cel putin o linie dupa parcurgerea modalului per-articol' + + *-- inchide neverificatul #1 din diagnostic (§5): valoarea reala pe care a scris-o poArticol, citita direct + *-- din crsfactura (poArticol e PRIVATE, iesit din scop dupa ce do_adauga_articol s-a intors) + IF USED('crsfactura') AND RECCOUNT('crsfactura') > 0 + SELECT crsfactura + GO TOP + DO S64Log WITH ' C: crsfactura.id_gestiune dupa modal=' + TRANSFORM(NVL(id_gestiune, -99999)) + ; + ' (sursa aleasa gnGestSursa=' + TRANSFORM(gnGestSursa) + ')' + ENDIF + + IF !(USED('crsfactura') AND RECCOUNT('crsfactura') > 0) + TRY + oform.Release() + CATCH + ENDTRY + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (C, crsfactura gol);' + DO CuratieCrs + DO Goleste + RETURN + ENDIF + + oform.do_calculeaza_totaluri() + DOEVENTS FORCE + + lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act)) + lnNract = poDate.nract + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + oform.but_termin1.Click() + DOEVENTS FORCE + DO S64Log WITH ' C: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + ; + ' apeluri amessagebox=[' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + + lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract) + IF lnIdVz < 0 + lnIdVz = 0 + ENDIF + DO Assert WITH lnIdVz > 0, 'C: documentul de transfer exista in VANZARI (jonctiune serie_act+numar_act), id=' + TRANSFORM(lnIdVz) + + IF lnIdVz > 0 + gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (C, transfer real);' + DO Assert WITH goExecutor.oExecute([select tip from vanzari where id_vanzare=] + TRANSFORM(lnIdVz), 'crsVzC') >= 0 ; + AND USED('crsVzC') AND RECCOUNT('crsVzC') = 1 AND crsVzC.tip = 23, ; + 'C: VANZARI.TIP = 23 pe documentul emis' + DO Inchide WITH 'crsVzC' + DO Assert WITH goExecutor.oExecute([select id_gestiune from vanzari_detalii where id_vanzare=] + TRANSFORM(lnIdVz), 'crsVdC') >= 0 ; + AND USED('crsVdC') AND RECCOUNT('crsVdC') = 1 AND NVL(crsVdC.id_gestiune, -99999) = gnGestSursa, ; + 'C: VANZARI_DETALII.ID_GESTIUNE = gestiunea sursa aleasa (' + TRANSFORM(gnGestSursa) + '), nu NULL si nu alta' + DO Inchide WITH 'crsVdC' + ELSE + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (C, nescris);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + ENDIF + + TRY + oform.Release() + CATCH + ENDTRY + DO CuratieCrs + DO Goleste +ENDPROC + +*================================================================================== +PROCEDURE Elibereaza + LPARAMETERS toForm + IF TYPE('toForm') = 'O' AND !ISNULL(toForm) + TRY + toForm.Release() + CATCH + ENDTRY + ENDIF + DO CuratieCrs +ENDPROC + +PROCEDURE Goleste + poDate = NULL + poGeneratorNumere = NULL + poDateGestiuneDest = NULL +ENDPROC + +PROCEDURE CuratieCrs + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsarticole_filtrat' + DO Inchide WITH 'crsarticole_ge' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsgestarticol' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'crsComTemp' + DO Inchide WITH 'crsartselectate' + DO Inchide WITH 'jtva_coloane' +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO S64Log WITH 'PASS: ' + gcCaz + tcMsg + ELSE + gnFail = gnFail + 1 + DO S64Log WITH 'FAIL: ' + gcCaz + tcMsg + ENDIF +ENDPROC + +PROCEDURE S64Log + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE S64Err + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnErr = gnErr + 1 + DO S64Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE S64Final + LOCAL lnI + IF TYPE('_SCREEN.tmrS64') = 'O' + _SCREEN.tmrS64.Enabled = .F. + TRY + _SCREEN.RemoveObject('tmrS64') + CATCH + ENDTRY + ENDIF + FOR lnI = _SCREEN.FormCount TO 1 STEP -1 + TRY + _SCREEN.Forms(lnI).Release() + CATCH + ENDTRY + ENDFOR + TRY + IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ; + [where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 720 order by numar_act], 'crsNrSSS') >= 0 + DO S64Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-720):' + SELECT crsNrSSS + SCAN + DO S64Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ENDSCAN + USE IN crsNrSSS + ENDIF + CATCH + ENDTRY + DO S64Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere + DO S64Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr) + DO S64Log WITH 'END ' + TTOC(DATETIME()) + QUIT +ENDPROC + +*================================================================================== +* driverS64: inchide automat modalul frm_articol_factura (§3.2), setand cantitatea pe controlul +* clb_cantitate.Text_simplu1 si apeland do_termin() direct (acelasi tipar validat la S6-3 pentru +* FRM_ALTE_DATE - apel direct pe metoda de baza, nu Release, ca sa nu sara peste procesarea din +* do_termin). Trateaza si MESSAGEBOX_FORM (cmdYes/cmdOk) - nu trece prin amessagebox, deci mock-ul +* nu il acopera; tipar identic cu driverMsgS8/driverS63 (capcana platita, gasita la prima rulare +* aici: A5/Incarca articole pe v2 a deschis un MESSAGEBOX_FORM neprevazut in propunere si a atarnat +* fara acest bloc). Nu atinge FRM_FACTURARE_ARTICOLE / FRM_FACTURARE_ARTICOLE2 in niciun fel. +DEFINE CLASS driverS64 AS Custom + lBusy = .F. + nUltimAlteDate = 0 + + PROCEDURE Executa + IF This.lBusy + RETURN + ENDIF + This.lBusy = .T. + IF TYPE('_SCREEN.tmrS64') = 'O' + _SCREEN.tmrS64.Enabled = .F. + ENDIF + TRY + LOCAL lnI, loArtForm, loMsgForm, loAlteDate, lcClasa + loArtForm = NULL + loMsgForm = NULL + loAlteDate = NULL + FOR lnI = 1 TO _SCREEN.FormCount + lcClasa = UPPER(_SCREEN.Forms(lnI).Class) + IF lcClasa == 'FRM_ARTICOL_FACTURA' + loArtForm = _SCREEN.Forms(lnI) + ENDIF + IF 'MESSAGEBOX_FORM' $ lcClasa + loMsgForm = _SCREEN.Forms(lnI) + ENDIF + IF lcClasa == 'FRM_ALTE_DATE' + loAlteDate = _SCREEN.Forms(lnI) + ENDIF + IF !(lcClasa $ gcClaseVazute) + gcClaseVazute = gcClaseVazute + lcClasa + ';' + DO S64Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' + ENDIF + ENDFOR + IF !ISNULL(loArtForm) + TRY + LOCAL lnCantSetata + lnCantSetata = MAX(gnCantSursa, 1) + loArtForm.clb_cantitate.Text_simplu1.Value = lnCantSetata + DO S64Log WITH ' [driver articol] cantitate setata=' + TRANSFORM(lnCantSetata) + loArtForm.do_termin() + gnModaleArticolInchise = gnModaleArticolInchise + 1 + CATCH TO loExcArt + DO S64Log WITH ' [driver articol] CATCH ' + TRANSFORM(loExcArt.ErrorNo) + ' ' + loExcArt.Message + TRY + loArtForm.Release() + CATCH + ENDTRY + ENDTRY + ELSE + IF !ISNULL(loMsgForm) + TRY + LOCAL lcTextMsg + lcTextMsg = '' + TRY + lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value)) + CATCH + ENDTRY + DO S64Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']' + DO CASE + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) + DO S64Log WITH ' [driver msg] apas cmgBotones.cmdYes' + loMsgForm.cmgBotones.cmdYes.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) + DO S64Log WITH ' [driver msg] apas cmgBotones.cmdOk' + loMsgForm.cmgBotones.cmdOk.Click() + ENDCASE + CATCH TO loExcMsg + DO S64Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message + ENDTRY + ELSE + *-- FRM_ALTE_DATE nu apare pe traseul transferului conform propunerii §8, dar + *-- confirmarea "totalul 0" de la BLOC C l-a deschis totusi (id_delegat cerut la + *-- antet) - tratat identic cu driverS63 (do_termin() direct, garda 1s reintrare). + IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1) + This.nUltimAlteDate = SECONDS() + TRY + DO S64Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ; + TRANSFORM(NVL(poDate.id_delegat, 0)) + ')' + loAlteDate.do_termin() + CATCH TO loExcAD + DO S64Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message + ENDTRY + ENDIF + ENDIF + ENDIF + CATCH TO loExcTop + DO S64Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message + FINALLY + IF TYPE('_SCREEN.tmrS64') = 'O' + _SCREEN.tmrS64.Enabled = .T. + ENDIF + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_unificat/test_s6_5_valuta.prg b/utile/Teste/facturare_unificat/test_s6_5_valuta.prg new file mode 100644 index 0000000..689662a --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_5_valuta.prg @@ -0,0 +1,991 @@ +* test_s6_5_valuta.prg +* VIZIBIL (grid): proba de paritate v1 vs v2 pe VALUTA (tip 5 = Invoice lista de preturi, +* in_valuta = 1, id_valuta = 2 EURO, tipdoc 5, seria SSS). Emite 2 documente REALE in +* MARIUSM_AUTO@ROA_CENTRAL, cu ACELEASI doua articole EURO (id_articol, pret, proc_tvav) si +* aceeasi cantitate pe ambele forme. In plus fata de S6-1 (sablonul acestui test): CURS, +* MULTIPLICATOR, VALVAL, TVAVAL, TOTVAL (pe VANZARI) si VANZARI_CURSURI. +* +* Verificat pe MARIUSM_AUTO, azi (SELECT, fara scriere) - decizia zi_curs: +* VCURS EURO: curs=5.2554 multiplicator=1 valabil doar la 10/08/2026 (spec). +* Calendarul deschis (tabela CALENDAR, max an*12+luna) e 2026/8 - ACELASI cu zi_curs, deci +* gnAn/gnLuna (folosite de cursor_preturi ptr. valabilitatea politicii de pret) nu intra in +* conflict cu zi_curs (folosit ptr. cursul valutar). Nu s-a schimbat zi_curs fata de spec. +* +* Traseul probat - IDENTIC cu S6-1 (tip 5 e in ACELASI Case din incarca_cursor_articole ca tip 1, +* ofacturare.prg:479-482, si in ACELASI llCautareInLinie ca tip 1, ofacturare.vc2:19563/:21198) - +* singura diferenta reala e ca poDate.in_valuta = 1 (setat automat la Init pentru tnTip=5, +* ofacturare_comun.prg:255-257) si poDate.id_valuta trebuie dat manual (vezi OCOLIRE mai jos): +* v1: incarca_cursor_articole(5, .F., poGeneratorNumere) INAINTE de formular -> crsarticole +* (candidati EURO, cu tip_valuta=1, Curs/multiplicator populate de SQL). Butonul viu ramane +* But_urmator1 (caction = do_urmator) - Init nu aprinde But_urmator_tot1 pentru +* Inlist(poDate.tip,1,5,7,10) (ofacturare.vc2:15275) - tip 5 e in ACEEASI lista ca tip 1. +* OCOLIRE DECLARATA (identica cu S6-1): do_adauga_articol(.T.) direct. +* v2: tipul 5 e in llCautareInLinie (Inlist(poDate.tip,1,22,5,29,7,10,45), :19563) - liniile +* intra prin cautarea in grid: APPEND BLANK + do_adauga_articol_cautat(loArticol,cantitate), +* tehnica validata la S5c/S6-1. +* +* OCOLIRE DECLARATA suplimentara fata de S6-1: alegerea valutei (do_cauta_valuta, dialog modal pe +* antet, ofacturare.vc2:9494-9503) nu trece prin formular - poDate.id_valuta = 2 / nume_valuta = +* 'EURO' se seteaza direct in test, imediat dupa CREATEOBJECT("oDateFactura",...), inainte de orice +* incarca_cursor_articole (cursor_preturi primeste ?poDate.id_valuta ca parametru, ofacturare.prg: +* 481). Selectorul insusi ramane neexercitat - aceeasi datorie generala ca §3.4/§6 din propunere. +* +* Defect CUNOSCUT, nu al acestui test (gasit la S6-1, acelasi cod, netastins aici): v2 +* (do_adauga_articol_cautat, ofacturare.vc2:18857-18862) nu trimite lot/taxcode in Gather, spre +* deosebire de v1 (:13095-13100) - se asteapta FAIL pe TAXCODE in CompDoc, marcat separat in raport. +* +* Mod VIZIBIL, prin vfp_ui_harness.ps1 (ca la S5c/S6-1): fereastra reala, off-screen, fara input +* real injectat. FRM_ALTE_DATE se inchide cu do_termin(), NU Release(). +* +* Rulare: powershell -ExecutionPolicy Bypass -File test_s6_5_valuta.ps1 (timeout >= 600s) +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_5_valuta.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); gnIdSucursala = 167; +* gnScadereStoc = 0; gnFactSeturi = 0; SET PATH catre gridextras si stub_verificare. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat +PUBLIC gcUltimaSerie, gnUltimulNract, goDriverS65, gcClaseVazute +PUBLIC gcSyncDir, gcUILog, gnCantitateAleasa + +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_5_valuta.log" +IF !DIRECTORY("D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out") + MD "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out" +ENDIF +gcUILog = gcLog +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_s65\" +IF !DIRECTORY(gcSyncDir) + MD (gcSyncDir) +ENDIF +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcLog) +gnPass = 0 +gnFail = 0 +gnErr = 0 +gcCaz = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +gcUltimaSerie = "" +gnUltimulNract = 0 +gcClaseVazute = ";" +gcNumere = "" +gnCantitateAleasa = 2 +gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg" + +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE +DO HarnessInit + +*-- poDate & co. se declara SI se initializeaza la nivelul programului principal - vezi capcana +*-- platita la S8 (metodele din .vcx nu vad variabila daca nu exista deja pe stiva de sub ele). +PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest +poDate = NULL +poGeneratorNumere = NULL +poDateGestiuneDest = NULL + +ON ERROR DO S65Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + *-- stub_verificare PRIMUL: "Do Form verificare" (ofacturare.vc2:14404 / :20126) rezolva la stub + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + + 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 S65Log WITH 'EROARE: conectare Oracle esuata' + DO S65Final + ENDIF + SQLSETPROP(gnHandle, "QueryTimeOut", 45) + DO S65Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\lib_comparatie_documente.prg" ADDITIVE + SET PROCEDURE TO (gcMock) ADDITIVE + + IF !actualizeaza_optiuni_program() + DO S65Log WITH 'EROARE: actualizeaza_optiuni_program()' + DO S65Final + ENDIF + gnScadereStoc = 0 + gnFactSeturi = 0 + gnIdSucursala = 167 + goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]) + gnIdUtil = 8 + goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) + DO S65Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ; + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ; + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + + *-- cboTipFactura cere RowSource pe saft_tip_facturi la constructia formularului v2 + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + PUBLIC gdZiCurs + *-- zi_curs FIX, cerut de spec (§7 S6-5) - verificat pe MARIUSM_AUTO azi (VCURS EURO curs=5.2554 + *-- multiplicator=1 doar la aceasta data) si compatibil cu calendarul deschis (2026/8) - vezi + *-- antetul fisierului. NU se foloseste DataCursValid() dinamic (spre deosebire de S6-1). + gdZiCurs = CTOD('10/08/2026') + DO S65Log WITH ' zi_curs folosita pentru toate documentele (FIX, din spec): ' + DTOC(gdZiCurs) + IF !VerificaCursEuro() + DO Assert WITH .F., 'curs EURO valabil la zi_curs=' + DTOC(gdZiCurs) + ' - vezi log' + DO S65Final + ENDIF + + *-- driver + timer: FRM_ALTE_DATE (v1, .Show(1) neconditionat la inainte_de_do_termin) si + *-- formele modale MESSAGEBOX_FORM nu trec prin functia amessagebox - mock-ul nu le acopera. + *-- Tehnica validata la S5c/S6-1. + goDriverS65 = CREATEOBJECT('driverS65') + _SCREEN.AddObject('tmrS65', 'Timer') + _SCREEN.tmrS65.Interval = 200 + BINDEVENT(_SCREEN.tmrS65, 'Timer', goDriverS65, 'Executa') + _SCREEN.tmrS65.Enabled = .T. + DO S65Log WITH 'DIAG SET_PATH stub inca in fata: ' + FULLPATH('verificare.scx') + + DO HarnessStep WITH 0, 'env gata', 8 + + DO S65Log WITH CHR(13) + CHR(10) + '===== RUTARE (structural, inainte de orice emitere) =====' + DO AsertiuniRutare + + DO S65Log WITH CHR(13) + CHR(10) + '===== ALEGEREA A DOUA ARTICOLE EURO (comune v1 si v2) =====' + IF !AlegeArticole() + DO Assert WITH .F., 'alegerea celor doua articole EURO a esuat - vezi log' + DO S65Final + ENDIF + + LOCAL lnIdV1, lnIdV2, lcSer1, lnNr1, lcSer2, lnNr2 + STORE 0 TO lnIdV1, lnIdV2, lnNr1, lnNr2 + STORE '' TO lcSer1, lcSer2 + + DO S65Log WITH CHR(13) + CHR(10) + '===== EMITERE v1 (frm_facturare_articole) =====' + lnIdV1 = EmiteProtejat('v1') + lcSer1 = gcUltimaSerie + lnNr1 = gnUltimulNract + DO HarnessStep WITH 1, 'v1 emis', 8 + + DO S65Log WITH CHR(13) + CHR(10) + '===== EMITERE v2 (frm_facturare_articole2) =====' + lnIdV2 = EmiteProtejat('v2') + lcSer2 = gcUltimaSerie + lnNr2 = gnUltimulNract + DO HarnessStep WITH 2, 'v2 emis', 8 + + IF lnIdV1 > 0 AND lnIdV2 > 0 + DO S65Log WITH CHR(13) + CHR(10) + '===== CompDoc valuta v1(' + lcSer1 + ' ' + TRANSFORM(lnNr1) + ; + ') vs v2(' + lcSer2 + ' ' + TRANSFORM(lnNr2) + ') =====' + DO Compara WITH lcSer1, lnNr1, lcSer2, lnNr2 + ELSE + DO Assert WITH .F., 'ambele documente s-au scris (v1 id_vanzare=' + TRANSFORM(lnIdV1) + ; + ' v2 id_vanzare=' + TRANSFORM(lnIdV2) + ')' + ENDIF + DO HarnessStep WITH 3, 'compdoc gata', 8 + + DO S65Log WITH CHR(13) + CHR(10) + '===== 8b: but_cursuri.Enabled pe tip in lei, fara emitere =====' + DO VerificaButCursuriLei + DO HarnessStep WITH 4, '8b gata', 8 + + DO S65Final + +CATCH TO loExc + DO S65Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ; + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO S65Final +ENDTRY + +QUIT + +*================================================================================== +* Confirma pe MARIUSM_AUTO (SELECT, fara scriere) ca exista curs EURO la gdZiCurs - inainte de +* orice emitere, ca sa nu se produca dialogul modal frm_curs (eroarea Oracle 20005). +FUNCTION VerificaCursEuro + LOCAL lcSql, llOk + llOk = .F. + lcSql = [select curs, multiplicator from vcurs where upper(nume_val) = 'EURO' and ] + ; + [to_date('] + DTOC(gdZiCurs) + [','DD/MM/YYYY') between data and data2] + IF goExecutor.oExecute(lcSql, 'crsCursChk') >= 0 AND USED('crsCursChk') AND RECCOUNT('crsCursChk') > 0 + GO TOP IN crsCursChk + DO S65Log WITH ' VerificaCursEuro: curs=' + TRANSFORM(crsCursChk.curs) + ' multiplicator=' + TRANSFORM(crsCursChk.multiplicator) + llOk = .T. + ELSE + DO S65Log WITH ' VerificaCursEuro ESEC: ' + goExecutor.oPrelucrareEroare() + ENDIF + IF USED('crsCursChk') + USE IN crsCursChk + ENDIF + RETURN llOk +ENDFUNC + +*================================================================================== +* Alegerea celor doua articole EURO comune v1/v2: sonda cu incarca_cursor_articole(5,...) (traseul +* real de pe v1 pentru tip 5 - ACELASI Case din ofacturare.prg:479-482 ca tip 1), apoi TOP 2 +* negestionabile cu pret>0 si cota prezenta in jtva_coloane. Rezultat: crsAleseS65 (2 randuri, RW). +FUNCTION AlegeArticole + LOCAL loRez, lcStrategie + poDate = CREATEOBJECT("oDateFactura", 25000, 5) + poDate.id_client = 463 + poDate.id_delegat = 256 + poDate.zi_curs = gdZiCurs + *-- OCOLIRE DECLARATA: alegerea valutei prin do_cauta_valuta (dialog modal) e ocolita, vezi + *-- antetul fisierului. cursor_preturi primeste ?poDate.id_valuta ca parametru direct. + poDate.id_valuta = 2 + poDate.nume_valuta = 'EURO' + DO Assert WITH poDate.in_valuta = 1, 'sonda: poDate.in_valuta=1 dupa Init(25000,5) - automat din tnTip, e=' + TRANSFORM(poDate.in_valuta) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + + loRez = incarca_cursor_articole(5, .F., poGeneratorNumere) + DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'sonda: incarca_cursor_articole(5) a adus articole' + DO S65Log WITH ' sonda: crsarticole=' + IIF(USED('crsarticole'), TRANSFORM(RECCOUNT('crsarticole')), '(nedeschis)') + IF !USED('crsarticole') OR RECCOUNT('crsarticole') = 0 + DO Goleste + RETURN .F. + ENDIF + DO Assert WITH poDate.Curs > 0, 'sonda: poDate.Curs populat de incarca_cursor_articole din crsarticole (tip_valuta=1), e=' + TRANSFORM(poDate.Curs) + DO S65Log WITH ' sonda: poDate.Curs=' + TRANSFORM(poDate.Curs) + ' poDate.multiplicator=' + TRANSFORM(poDate.multiplicator) + + *-- jtva_coloane trebuie construit din jtva_coloane_temp INAINTE de orice JOIN pe el - altfel + *-- SELECT-ul de mai jos referentiaza un alias inexistent si VFP arata dialogul nativ "Look In" + *-- (fara eroare prinsa de ON ERROR, rulare atarnata - capcana gasita la S6-1) + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + *-- TOP 30 candidati, apoi se aleg in VFP primele doua cu id_articol DISTINCT (acelasi articol + *-- poate aparea de mai multe ori in crsarticole, o data per politica de pret) + DO Inchide WITH 'crsCandS65' + SELECT TOP 30 a.* FROM crsarticole a INNER JOIN jtva_coloane j ; + ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(NVL(a.proc_tvav,0), 2) ; + WHERE NVL(a.gestionabil,0) = 0 AND NVL(a.pret,0) > 0 ; + ORDER BY a.id_articol INTO CURSOR crsCandS65 READWRITE + lcStrategie = 'negestionabile EURO cu cota in jtva_coloane' + IF RECCOUNT('crsCandS65') < 2 + DO Inchide WITH 'crsCandS65' + SELECT TOP 30 a.* FROM crsarticole a INNER JOIN jtva_coloane j ; + ON ROUND((j.cota_tva + 100) / 100, 2) = ROUND(NVL(a.proc_tvav,0), 2) ; + WHERE NVL(a.pret,0) > 0 ; + ORDER BY a.id_articol INTO CURSOR crsCandS65 READWRITE + lcStrategie = 'orice EURO cu cota in jtva_coloane (gestionabile incluse)' + ENDIF + IF RECCOUNT('crsCandS65') < 2 + DO Inchide WITH 'crsCandS65' + SELECT TOP 30 * FROM crsarticole ORDER BY id_articol INTO CURSOR crsCandS65 READWRITE + lcStrategie = 'primele EURO din lista (nicio potrivire de cota)' + ENDIF + + DO Inchide WITH 'crsAleseS65' + SELECT * FROM crsCandS65 WHERE .F. INTO CURSOR crsAleseS65 READWRITE + LOCAL lnUltimulId, loRowS65 + lnUltimulId = -1 + SELECT crsCandS65 + SCAN + IF id_articol <> lnUltimulId + SCATTER MEMO NAME loRowS65 + INSERT INTO crsAleseS65 FROM NAME loRowS65 + lnUltimulId = id_articol + ENDIF + IF RECCOUNT('crsAleseS65') >= 2 + EXIT + ENDIF + ENDSCAN + DO Inchide WITH 'crsCandS65' + DO Assert WITH RECCOUNT('crsAleseS65') = 2, 'doua articole EURO DISTINCTE alese pentru S6-5, e=' + TRANSFORM(RECCOUNT('crsAleseS65')) + DO S65Log WITH ' strategie: ' + lcStrategie + SELECT crsAleseS65 + SCAN + DO S65Log WITH ' ales: id_articol=' + TRANSFORM(id_articol) + ' [' + ALLTRIM(TRANSFORM(denumire)) + ; + '] pret=' + TRANSFORM(pret) + ' proc_tvav=' + TRANSFORM(proc_tvav) + ' gestionabil=' + TRANSFORM(NVL(gestionabil,0)) + ; + ' tip_valuta=' + TRANSFORM(NVL(tip_valuta,0)) + ' id_valuta=' + TRANSFORM(NVL(id_valuta,0)) + ' Curs=' + TRANSFORM(NVL(Curs,0)) + ENDSCAN + + DO Inchide WITH 'crsarticole' + DO Goleste + RETURN (RECCOUNT('crsAleseS65') = 2) +ENDFUNC + +*================================================================================== +* Rutarea, structural: acelasi Case de incarcare candidati si acelasi llCautareInLinie ca la S6-1 +* (tip 5 face parte din amandoua listele), plus butonul de vizibilitate a cursului valutar. +PROCEDURE AsertiuniRutare + LOCAL lcTxt + gcCaz = '[RUTARE] ' + lcTxt = FILETOSTR("D:\ROA\ROAFACTURARE\COMUN\clase\ofacturare.vc2") + IF EMPTY(lcTxt) + DO Assert WITH .F., 'FILETOSTR ofacturare.vc2 a esuat/gol' + RETURN + ENDIF + DO Assert WITH OCCURS("caction = do_urmator,", lcTxt) = 1, ; + 'un singur caction = do_urmator (butonul Adauga, viu pe v1 pentru tip 5 - acelasi buton ca tip 1)' + DO Assert WITH "Inlist(poDate.tip,1,5,7,10)" $ lcTxt, ; + 'tip 5 e in lista care ascunde But_urmator_tot1 pe v1 (acelasi tratament ca tip 1)' + DO Assert WITH "Inlist(poDate.tip, 1, 22, 5, 29, 7, 10, 45)" $ lcTxt, ; + 'llCautareInLinie contine tipul 5 (v2 sare incarcarea in masa pentru valuta lista-de-preturi)' + DO Assert WITH OCCURS("PROCEDURE grd_factura.cDenumire.cCboDenumire.LostFocus", lcTxt) = 1, ; + 'un singur handler cDenumire.cCboDenumire.LostFocus' + DO Assert WITH OCCURS("PROCEDURE grd_factura.cCodMat.cboCodmat.LostFocus", lcTxt) = 1, ; + 'un singur handler cCodMat.cboCodmat.LostFocus' + DO Assert WITH OCCURS("Thisform.do_adauga_articol_cautat(loArticol, loArticol.cantitate)", lcTxt) = 2, ; + 'ambele handlere de cautare in grid cheama do_adauga_articol_cautat(loArticol, loArticol.cantitate)' + DO Assert WITH OCCURS("PROCEDURE do_actualizeaza_vizibilitate_curs", lcTxt) = 1, ; + 'un singur do_actualizeaza_vizibilitate_curs (v2)' + DO Assert WITH "Thisform.do_actualizeaza_vizibilitate_curs()" $ lcTxt AND "Thisform.do_actualizeaza_vizibilitate_curs(.T.)" $ lcTxt, ; + 'do_actualizeaza_vizibilitate_curs e chemat atat fara parametru cat si cu .T. (Init/do_calculeaza_totaluri si do_incarca_articole)' + DO Assert WITH "poDate.in_valuta = 1" $ lcTxt, ; + 'do_actualizeaza_vizibilitate_curs testeaza poDate.in_valuta=1 (relevant pentru tip 5)' + DO Assert WITH "Inlist(m.tnTip, 5,6,7,9,10,52)" $ lcTxt OR "INLIST(m.tnTip, 5,6,7,9,10,52)" $ lcTxt, ; + 'tip 5 seteaza automat in_valuta=1 la Init (ofacturare_comun.prg)' +ENDPROC + +*================================================================================== +* EmiteV1: traseul real de pe v1 pentru tip 5 - incarca_cursor_articole(5,...) inainte de formular, +* candidatii restransi la cele doua articole alese, apoi do_adauga_articol(.T.) - vezi ocolirea +* declarata in antetul fisierului (identica cu S6-1, plus id_valuta setat manual). +FUNCTION EmiteV1 + LOCAL lnIdVz, lcSerie, lnNract, oform, loRez, lnI, lnFact + lnIdVz = 0 + lcSerie = '' + lnNract = 0 + gcUltimaSerie = '' + gnUltimulNract = 0 + gcCaz = '[valuta-v1] ' + + DO CuratieCrs + poDate = CREATEOBJECT("oDateFactura", 25000, 5) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + poDate.nIdTipDoc = 5 + poDate.id_client = 463 + poDate.id_delegat = 256 + poDate.zi_curs = gdZiCurs + poDate.id_valuta = 2 + poDate.nume_valuta = 'EURO' + DO Assert WITH poDate.in_valuta = 1, 'v1: poDate.in_valuta=1, e=' + TRANSFORM(poDate.in_valuta) + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + DO Assert WITH poDate.rezultat_serii = 3, 'v1: rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii) + IF poDate.rezultat_serii <> 3 + DO Goleste + RETURN 0 + ENDIF + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + DO S65Log WITH ' v1: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ; + ' nract=' + TRANSFORM(poDate.nract) + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + *-- traseul real: incarca_cursor_articole(5,...) - ACELASI Case ca tip 1 (ofacturare.prg:479-482) + loRez = incarca_cursor_articole(5, .F., poGeneratorNumere) + DO Assert WITH (loRez.nSucces >= 0) AND loRez.lArticole, 'v1: incarca_cursor_articole(5) a adus articole' + IF !((loRez.nSucces >= 0) AND loRez.lArticole) + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v1, fara articole);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Goleste + RETURN 0 + ENDIF + DO Assert WITH poDate.Curs > 0, 'v1: poDate.Curs populat dupa incarca_cursor_articole, e=' + TRANSFORM(poDate.Curs) + + *-- inlocuiesc candidatii proaspat incarcati cu EXACT cele doua randuri alese in AlegeArticole + *-- (acelasi id_pol/pret/proc_tvav ca pe v2) - filtrarea pe DOAR id_articol nu ajunge (capcana + *-- gasita la S6-1: acelasi articol poate aparea de mai multe ori, o data per politica de pret) + USE IN crsarticole + SELECT * FROM crsAleseS65 INTO CURSOR crsarticole READWRITE + DO Assert WITH RECCOUNT('crsarticole') = 2, 'v1: cele doua articole alese gasite in crsarticole, e=' + TRANSFORM(RECCOUNT('crsarticole')) + + oform = CREATEOBJECT('frm_facturare_articole') + IF VARTYPE(oform) <> 'O' + DO Assert WITH .F., 'v1: Createobject frm_facturare_articole' + DO Goleste + RETURN 0 + ENDIF + oform.WindowType = 0 + oform.Show() + DOEVENTS FORCE + + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + DO Assert WITH LOWER(ALLTRIM(oform.but_urmator1.cAction)) == 'do_urmator', 'v1: butonul Adauga duce la do_urmator' + DO Assert WITH oform.but_urmator1.Visible, 'v1: butonul Adauga e VIZIBIL pentru tip 5' + + *-- ocolire declarata (vezi antetul fisierului): do_adauga_articol(.T.) direct + FOR lnI = 1 TO RECCOUNT('crsarticole') + SELECT crsarticole + GO lnI + oform.do_adauga_articol(.T.) + ENDFOR + DOEVENTS FORCE + + lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) + DO S65Log WITH ' v1: dupa adaugare crsfactura=' + TRANSFORM(lnFact) + DO Assert WITH lnFact = 2, 'v1: crsfactura are exact 2 linii dupa adaugare, e=' + TRANSFORM(lnFact) + IF lnFact = 0 + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v1, fara linii);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Elibereaza WITH oform + DO Goleste + RETURN 0 + ENDIF + + DO SeteazaCantitati WITH 'crsfactura' + + oform.do_calculeaza_totaluri() + DOEVENTS FORCE + DO S65Log WITH ' v1: dupa do_calculeaza_totaluri poDate.Curs=' + TRANSFORM(poDate.Curs) + ; + ' poDate.multiplicator=' + TRANSFORM(poDate.multiplicator) + ' poDate.nvalval=' + TRANSFORM(NVL(poDate.nvalval,0)) + ; + ' poDate.ntvaval=' + TRANSFORM(NVL(poDate.ntvaval,0)) + ' poDate.ntotval=' + TRANSFORM(NVL(poDate.ntotval,0)) + + lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act)) + lnNract = poDate.nract + + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + DO S65Log WITH ' v1: [pas] but_termin1.Click' + oform.but_termin1.Click() + DOEVENTS FORCE + DO S65Log WITH ' v1: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + DO S65Log WITH ' v1: apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + + lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract) + IF lnIdVz < 0 + lnIdVz = 0 + ENDIF + DO Assert WITH lnIdVz > 0, 'v1: documentul exista in VANZARI (serie_act+numar_act), e=' + TRANSFORM(lnIdVz) + + IF lnIdVz > 0 + gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (v1);' + ELSE + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (v1, nescris);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + lcSerie = '' + lnNract = 0 + ENDIF + + DO Elibereaza WITH oform + DO Goleste + gcUltimaSerie = lcSerie + gnUltimulNract = lnNract + RETURN lnIdVz +ENDFUNC + +*================================================================================== +* EmiteV2: traseul real de pe v2 pentru tip 5 - crsfactura gol inainte de formular, apoi +* APPEND BLANK + do_adauga_articol_cautat per articol (reproduce exact handler-ul grid-ului, +* vezi antetul fisierului si AsertiuniRutare). +FUNCTION EmiteV2 + LOCAL lnIdVz, lcSerie, lnNract, oform, loArticol, lnAdaugate, llOk, lnFact + lnIdVz = 0 + lcSerie = '' + lnNract = 0 + gcUltimaSerie = '' + gnUltimulNract = 0 + gcCaz = '[valuta-v2] ' + + DO CuratieCrs + poDate = CREATEOBJECT("oDateFactura", 25000, 5) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + poDate.nIdTipDoc = 5 + poDate.id_client = 463 + poDate.id_delegat = 256 + poDate.zi_curs = gdZiCurs + poDate.id_valuta = 2 + poDate.nume_valuta = 'EURO' + DO Assert WITH poDate.in_valuta = 1, 'v2: poDate.in_valuta=1, e=' + TRANSFORM(poDate.in_valuta) + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + DO Assert WITH poDate.rezultat_serii = 3, 'v2: rezultat_serii=3 (o singura plaja, fara dialog), e=' + TRANSFORM(poDate.rezultat_serii) + IF poDate.rezultat_serii <> 3 + DO Goleste + RETURN 0 + ENDIF + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + poGeneratorNumere.verifica_numar(poDate.nIdTipDoc, poDate.nract) + DO S65Log WITH ' v2: nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ; + ' nract=' + TRANSFORM(poDate.nract) + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + *-- v2: crsfactura gol INAINTE de formular (ca in factureaza(), ramura llFacturareNoua) + DO PregatesteFacturaCrs + + oform = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(oform) <> 'O' + DO Assert WITH .F., 'v2: Createobject frm_facturare_articole2' + DO Goleste + RETURN 0 + ENDIF + oform.WindowType = 0 + oform.Show() + DOEVENTS FORCE + DO Assert WITH oform.do_exista_obiect('clb_zi_curs'), 'v2: clb_zi_curs (Curs valutar) exista pe frm_facturare_articole2' + + lnAdaugate = 0 + llOk = .F. + SELECT crsAleseS65 + GO TOP + SCAN + SCATTER NAME loArticol MEMO + SELECT crsfactura + APPEND BLANK + llOk = .F. + TRY + llOk = oform.do_adauga_articol_cautat(loArticol, NVL(loArticol.cantitate, 1)) + CATCH TO loExcAd + DO S65Log WITH ' v2: do_adauga_articol_cautat CATCH ' + TRANSFORM(loExcAd.ErrorNo) + ' ' + loExcAd.Message + ENDTRY + IF llOk + lnAdaugate = lnAdaugate + 1 + ELSE + SELECT crsfactura + IF !EOF() AND !BOF() + DELETE + ENDIF + ENDIF + SELECT crsAleseS65 + ENDSCAN + DOEVENTS FORCE + DO S65Log WITH ' v2: linii adaugate prin do_adauga_articol_cautat=' + TRANSFORM(lnAdaugate) + DO Assert WITH lnAdaugate = 2, 'v2: cele doua articole adaugate prin do_adauga_articol_cautat, e=' + TRANSFORM(lnAdaugate) + + lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) + DO Assert WITH lnFact = 2, 'v2: crsfactura are exact 2 linii, e=' + TRANSFORM(lnFact) + IF lnFact = 0 + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ' (v2, fara linii);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Elibereaza WITH oform + DO Goleste + RETURN 0 + ENDIF + + DO SeteazaCantitati WITH 'crsfactura' + + oform.do_calculeaza_totaluri() + DOEVENTS FORCE + DO S65Log WITH ' v2: dupa do_calculeaza_totaluri poDate.Curs=' + TRANSFORM(poDate.Curs) + ; + ' poDate.multiplicator=' + TRANSFORM(poDate.multiplicator) + ' poDate.nvalval=' + TRANSFORM(NVL(poDate.nvalval,0)) + ; + ' poDate.ntvaval=' + TRANSFORM(NVL(poDate.ntvaval,0)) + ' poDate.ntotval=' + TRANSFORM(NVL(poDate.ntotval,0)) + + lcSerie = ALLTRIM(TRANSFORM(poDate.serie_act)) + lnNract = poDate.nract + + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + DO S65Log WITH ' v2: [pas] but_termin1.Click' + oform.but_termin1.Click() + DOEVENTS FORCE + DO S65Log WITH ' v2: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(NVL(poDate.nid_vanzare, 0)) + DO S65Log WITH ' v2: apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + + lnIdVz = CdocGasesteIdVanzare(lcSerie, lnNract) + IF lnIdVz < 0 + lnIdVz = 0 + ENDIF + DO Assert WITH lnIdVz > 0, 'v2: documentul exista in VANZARI (serie_act+numar_act), e=' + TRANSFORM(lnIdVz) + + IF lnIdVz > 0 + gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ' (v2);' + ELSE + gcNumere = gcNumere + 'DEZALOCAT serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (v2, nescris);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + lcSerie = '' + lnNract = 0 + ENDIF + + DO Elibereaza WITH oform + DO Goleste + gcUltimaSerie = lcSerie + gnUltimulNract = lnNract + RETURN lnIdVz +ENDFUNC + +*================================================================================== +* Seteaza cantitatea pe toate liniile din crsfactura si recalculeaza linia, ca la S5c/S6-1. +PROCEDURE SeteazaCantitati + LPARAMETERS tcAlias + LOCAL loArt + SELECT (tcAlias) + SCAN + REPLACE cantitate WITH gnCantitateAleasa + SCATTER NAME loArt MEMO + loArt = calculeaza_totaluri(loArt) + GATHER NAME loArt MEMO + ENDSCAN +ENDPROC + +*================================================================================== +* Izolarea unei emiteri: o exceptie intr-un caz nu trebuie sa opreasca restul suitei. +FUNCTION EmiteProtejat + LPARAMETERS tcForma + LOCAL lnRez, lnI + lnRez = 0 + TRY + IF tcForma == 'v1' + lnRez = EmiteV1() + ELSE + lnRez = EmiteV2() + ENDIF + CATCH TO loExcEm + DO S65Log WITH ' EXCEPTIE in ' + tcForma + ': ErrorNo=' + TRANSFORM(loExcEm.ErrorNo) + ; + ' Message=' + loExcEm.Message + ' Proc=' + loExcEm.Procedure + ':' + TRANSFORM(loExcEm.LineNo) + ; + ' [' + TRANSFORM(loExcEm.LineContents) + ']' + DO Assert WITH .F., tcForma + ': emiterea a mers pana la capat fara exceptie (ErrorNo=' + ; + TRANSFORM(loExcEm.ErrorNo) + ')' + lnRez = 0 + gcUltimaSerie = '' + gnUltimulNract = 0 + TRY + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + ; + TRANSFORM(poDate.nract) + ' (' + tcForma + ', dupa exceptie);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + CATCH + ENDTRY + TRY + goExecutor.oExecute("ROLLBACK") + CATCH + ENDTRY + FOR lnI = _SCREEN.FormCount TO 1 STEP -1 + TRY + _SCREEN.Forms(lnI).Release() + CATCH + ENDTRY + ENDFOR + DO CuratieCrs + DO Goleste + ENDTRY + RETURN lnRez +ENDFUNC + +*================================================================================== +* verifica 8b: but_cursuri.Enabled = .T. dupa Init, pe un tip in lei (fara in_valuta), fara +* sa emita niciun document - zero numere consumate. +FUNCTION VerificaButCursuriLei + LOCAL oform, llOk + DO CuratieCrs + poDate = CREATEOBJECT("oDateFactura", 25000, 1) + poDate.id_client = 463 + poDate.zi_curs = gdZiCurs + DO Assert WITH poDate.in_valuta = 0, 'lei: poDate.in_valuta=0 pentru tip 1, e=' + TRANSFORM(poDate.in_valuta) + DO PregatesteFacturaCrs + oform = CREATEOBJECT('frm_facturare_articole2') + llOk = (VARTYPE(oform) = 'O') + DO Assert WITH llOk, 'lei: Createobject frm_facturare_articole2 (tip 1)' + IF llOk + DO Assert WITH oform.but_cursuri.Enabled, 'lei: but_cursuri.Enabled=.T. dupa Init (tip 1), e=' + TRANSFORM(oform.but_cursuri.Enabled) + DO Elibereaza WITH oform + ENDIF + DO Goleste +ENDFUNC + +*================================================================================== +PROCEDURE Compara + LPARAMETERS tcSerie1, tnNr1, tcSerie2, tnNr2 + LOCAL nFail, nId1, nId2 + gcCaz = '[CompDoc valuta] ' + nFail = CompDoc(tcSerie1, tnNr1, tcSerie2, tnNr2, 'S6-5 valuta v1(' + TRANSFORM(tnNr1) + ') vs v2(' + TRANSFORM(tnNr2) + ')') + DO Assert WITH nFail >= 0, 'CompDoc a rulat fara eroare Oracle, esecuri raportate=' + TRANSFORM(nFail) + DO S65Log WITH ' CompDoc esecuri totale=' + TRANSFORM(nFail) + + nId1 = CdocGasesteIdVanzare(tcSerie1, tnNr1) + nId2 = CdocGasesteIdVanzare(tcSerie2, tnNr2) + DO LogCampuriValutare WITH nId1, nId2 + DO ComparaVanzariCursuri WITH nId1, nId2 +ENDPROC + +*================================================================================== +* Logheaza EXPLICIT valorile masurate pe CURS/MULTIPLICATOR/VALVAL/TVAVAL/TOTVAL pentru ambele +* documente (indiferent daca CompVanzari le-a raportat FAIL sau PASS) - cerut de raportul S6-5. +PROCEDURE LogCampuriValutare + LPARAMETERS tnId1, tnId2 + LOCAL lcSql + IF tnId1 <= 0 OR tnId2 <= 0 + DO S65Log WITH ' CAMPURI VALUTARE: id_vanzare invalid (id1=' + TRANSFORM(tnId1) + ' id2=' + TRANSFORM(tnId2) + ')' + RETURN + ENDIF + lcSql = [select id_vanzare, in_valuta, id_valuta, curs, multiplicator, valval, tvaval, totval, ] + ; + [total_fara_tva, total_tva, total_cu_tva from vanzari where id_vanzare in (] + ; + TRANSFORM(tnId1) + [,] + TRANSFORM(tnId2) + [) order by decode(id_vanzare,] + TRANSFORM(tnId1) + [,1,2)] + IF goExecutor.oExecute(lcSql, 'crsValS65') >= 0 AND USED('crsValS65') + SELECT crsValS65 + SCAN + DO S65Log WITH ' CAMPURI VALUTARE id_vanzare=' + TRANSFORM(id_vanzare) + ; + ' in_valuta=' + TRANSFORM(NVL(in_valuta,0)) + ' id_valuta=' + TRANSFORM(NVL(id_valuta,0)) + ; + ' CURS=' + TRANSFORM(NVL(curs,0)) + ' MULTIPLICATOR=' + TRANSFORM(NVL(multiplicator,0)) + ; + ' VALVAL=' + TRANSFORM(NVL(valval,0)) + ' TVAVAL=' + TRANSFORM(NVL(tvaval,0)) + ' TOTVAL=' + TRANSFORM(NVL(totval,0)) + ; + ' TOTAL_FARA_TVA=' + TRANSFORM(NVL(total_fara_tva,0)) + ' TOTAL_TVA=' + TRANSFORM(NVL(total_tva,0)) + ; + ' TOTAL_CU_TVA=' + TRANSFORM(NVL(total_cu_tva,0)) + ENDSCAN + USE IN crsValS65 + ELSE + DO S65Log WITH ' CAMPURI VALUTARE SELECT ESUAT: ' + goExecutor.oPrelucrareEroare() + ENDIF +ENDPROC + +*================================================================================== +* VANZARI_CURSURI - suplimentar fata de schela S6-0 (nu e in lib_comparatie_documente.prg, cerut +* explicit de sarcina S6-5). Multime de randuri (id_valuta, curs, multiplicator), sortata. +PROCEDURE ComparaVanzariCursuri + LPARAMETERS tnId1, tnId2 + LOCAL lcSql, nCnt1, nCnt2, nFail, i + gcCaz = '[VANZARI_CURSURI] ' + nFail = 0 + IF tnId1 <= 0 OR tnId2 <= 0 + DO Assert WITH .F., 'VANZARI_CURSURI: id_vanzare invalid, id1=' + TRANSFORM(tnId1) + ' id2=' + TRANSFORM(tnId2) + RETURN + ENDIF + + lcSql = [select id_valuta, curs, multiplicator from vanzari_cursuri where id_vanzare = ] + ; + TRANSFORM(tnId1) + [ order by id_valuta] + goExecutor.oExecute(lcSql, 'crsCur1') + lcSql = [select id_valuta, curs, multiplicator from vanzari_cursuri where id_vanzare = ] + ; + TRANSFORM(tnId2) + [ order by id_valuta] + goExecutor.oExecute(lcSql, 'crsCur2') + + nCnt1 = IIF(USED('crsCur1'), RECCOUNT('crsCur1'), 0) + nCnt2 = IIF(USED('crsCur2'), RECCOUNT('crsCur2'), 0) + DO S65Log WITH ' VANZARI_CURSURI id1=' + TRANSFORM(tnId1) + ' randuri=' + TRANSFORM(nCnt1) + ; + ' | id2=' + TRANSFORM(tnId2) + ' randuri=' + TRANSFORM(nCnt2) + IF USED('crsCur1') + SELECT crsCur1 + SCAN + DO S65Log WITH ' v1: id_valuta=' + TRANSFORM(id_valuta) + ' curs=' + TRANSFORM(curs) + ' multiplicator=' + TRANSFORM(multiplicator) + ENDSCAN + ENDIF + IF USED('crsCur2') + SELECT crsCur2 + SCAN + DO S65Log WITH ' v2: id_valuta=' + TRANSFORM(id_valuta) + ' curs=' + TRANSFORM(curs) + ' multiplicator=' + TRANSFORM(multiplicator) + ENDSCAN + ENDIF + + IF nCnt1 <> nCnt2 + nFail = nFail + 1 + DO S65Log WITH ' FAIL VANZARI_CURSURI numar de randuri diferit: v1=' + TRANSFORM(nCnt1) + ' v2=' + TRANSFORM(nCnt2) + ELSE + FOR i = 1 TO nCnt1 + GO i IN crsCur1 + GO i IN crsCur2 + IF NVL(crsCur1.id_valuta,0) <> NVL(crsCur2.id_valuta,0) OR ; + NVL(crsCur1.curs,0) <> NVL(crsCur2.curs,0) OR ; + NVL(crsCur1.multiplicator,0) <> NVL(crsCur2.multiplicator,0) + nFail = nFail + 1 + DO S65Log WITH ' FAIL VANZARI_CURSURI rand ' + TRANSFORM(i) + ' diferit: v1(id_valuta=' + ; + TRANSFORM(NVL(crsCur1.id_valuta,0)) + ' curs=' + TRANSFORM(NVL(crsCur1.curs,0)) + ' mult=' + TRANSFORM(NVL(crsCur1.multiplicator,0)) + ; + ') v2(id_valuta=' + TRANSFORM(NVL(crsCur2.id_valuta,0)) + ' curs=' + TRANSFORM(NVL(crsCur2.curs,0)) + ' mult=' + TRANSFORM(NVL(crsCur2.multiplicator,0)) + ')' + ENDIF + ENDFOR + ENDIF + IF USED('crsCur1') + USE IN crsCur1 + ENDIF + IF USED('crsCur2') + USE IN crsCur2 + ENDIF + DO Assert WITH nFail = 0, 'VANZARI_CURSURI: paritate v1/v2 (randuri+valori), esecuri=' + TRANSFORM(nFail) +ENDPROC + +*================================================================================== +* crsfactura + coloana "gestiune" ceruta de coloana combo a grilei pe v2 +PROCEDURE PregatesteFacturaCrs + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp +ENDPROC + +PROCEDURE Elibereaza + LPARAMETERS toForm + IF TYPE('toForm') = 'O' AND !ISNULL(toForm) + TRY + toForm.Release() + CATCH + ENDTRY + ENDIF + DO CuratieCrs +ENDPROC + +PROCEDURE Goleste + poDate = NULL + poGeneratorNumere = NULL + poDateGestiuneDest = NULL +ENDPROC + +PROCEDURE CuratieCrs + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticoleSel' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'jtva_coloane' +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO S65Log WITH 'PASS: ' + gcCaz + tcMsg + ELSE + gnFail = gnFail + 1 + DO S65Log WITH 'FAIL: ' + gcCaz + tcMsg + ENDIF +ENDPROC + +PROCEDURE S65Log + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE S65Err + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnErr = gnErr + 1 + DO S65Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE S65Final + LOCAL lnI + IF TYPE('_SCREEN.tmrS65') = 'O' + _SCREEN.tmrS65.Enabled = .F. + TRY + _SCREEN.RemoveObject('tmrS65') + CATCH + ENDTRY + ENDIF + *-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (rulare atarnata), + *-- deci se inchid explicit inainte + FOR lnI = _SCREEN.FormCount TO 1 STEP -1 + TRY + _SCREEN.Forms(lnI).Release() + CATCH + ENDTRY + ENDFOR + *-- registrul numerelor SSS direct din baza: singura sursa care spune care numar e SCRIS si + *-- care e ARS (alocat si nescris). Plaja larga - alte teste S6 consuma din aceeasi secventa. + TRY + IF TYPE('goExecutor') = 'O' AND goExecutor.oExecute([select numar_act, id_vanzare, tip from vanzari ] + ; + [where sters = 0 and serie_act = 'SSS' and numar_act between 640 and 900 order by numar_act], 'crsNrSSS') >= 0 + DO S65Log WITH CHR(13) + CHR(10) + 'REGISTRU SSS in VANZARI (640-900):' + SELECT crsNrSSS + SCAN + DO S65Log WITH ' SSS ' + TRANSFORM(numar_act) + ' -> id_vanzare=' + TRANSFORM(id_vanzare) + ' tip=' + TRANSFORM(tip) + ENDSCAN + USE IN crsNrSSS + ENDIF + CATCH + ENDTRY + DO S65Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere + DO S65Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr) + DO S65Log WITH 'END ' + TTOC(DATETIME()) + DO HarnessDone WITH 'done' + QUIT +ENDPROC + +*================================================================================== +* driverS65: apasa automat pe formele modale care nu trec prin functia amessagebox - +* MESSAGEBOX_FORM (cmdYes/cmdOk), FRM_ALTE_DATE de pe v1 (do_termin, NU Release) si FRM_CURS +* (recuperare eroare 20005) - vezi VerificaCursEuro, care ar trebui sa previna acest caz. +DEFINE CLASS driverS65 AS Custom + nUltimAlteDate = 0 + lBusy = .F. + + PROCEDURE Executa + IF This.lBusy + RETURN + ENDIF + This.lBusy = .T. + IF TYPE('_SCREEN.tmrS65') = 'O' + _SCREEN.tmrS65.Enabled = .F. + ENDIF + TRY + LOCAL lnI, loMsgForm, loAlteDate, lcClasa + loMsgForm = NULL + loAlteDate = NULL + FOR lnI = 1 TO _SCREEN.FormCount + lcClasa = UPPER(_SCREEN.Forms(lnI).Class) + IF 'MESSAGEBOX_FORM' $ lcClasa + loMsgForm = _SCREEN.Forms(lnI) + ENDIF + IF lcClasa == 'FRM_ALTE_DATE' + loAlteDate = _SCREEN.Forms(lnI) + ENDIF + IF !(lcClasa $ gcClaseVazute) + gcClaseVazute = gcClaseVazute + lcClasa + ';' + DO S65Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' + ENDIF + ENDFOR + IF !ISNULL(loMsgForm) + TRY + LOCAL lcTextMsg + lcTextMsg = '' + TRY + lcTextMsg = ALLTRIM(TRANSFORM(loMsgForm.edtMensaje.Value)) + CATCH + ENDTRY + DO S65Log WITH ' [driver msg] mesaj=[' + STRTRAN(lcTextMsg, CHR(13) + CHR(10), ' ') + ']' + DO CASE + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) + DO S65Log WITH ' [driver msg] apas cmgBotones.cmdYes' + loMsgForm.cmgBotones.cmdYes.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) + DO S65Log WITH ' [driver msg] apas cmgBotones.cmdOk' + loMsgForm.cmgBotones.cmdOk.Click() + ENDCASE + CATCH TO loExcMsg + DO S65Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message + ENDTRY + ELSE + IF !ISNULL(loAlteDate) AND (SECONDS() - This.nUltimAlteDate > 1) + This.nUltimAlteDate = SECONDS() + TRY + DO S65Log WITH ' [driver alte_date] apas do_termin() pe FRM_ALTE_DATE (id_delegat=' + ; + TRANSFORM(NVL(poDate.id_delegat, 0)) + ')' + loAlteDate.do_termin() + CATCH TO loExcAD + DO S65Log WITH ' [driver alte_date] CATCH ' + TRANSFORM(loExcAD.ErrorNo) + ' ' + loExcAD.Message + ENDTRY + ENDIF + ENDIF + CATCH TO loExcTop + DO S65Log WITH ' [driver] CATCH TOP-LEVEL ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message + FINALLY + IF TYPE('_SCREEN.tmrS65') = 'O' + _SCREEN.tmrS65.Enabled = .T. + ENDIF + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_unificat/test_s6_5_valuta.ps1 b/utile/Teste/facturare_unificat/test_s6_5_valuta.ps1 new file mode 100644 index 0000000..9109a94 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_5_valuta.ps1 @@ -0,0 +1,16 @@ +# test_s6_5_valuta.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru +# test_s6_5_valuta.prg (S6-5, paritate v1 vs v2 pe valuta, tip 5 EURO). +# Rulare VIZIBILA (vfp9 -A, fereastra impinsa off-screen de harness), NU -A -T: sub -A -T +# coloanele de grid nu se materializeaza. +# Rulare: powershell -ExecutionPolicy Bypass -File test_s6_5_valuta.ps1 (timeout >= 600s) +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +Get-ChildItem -Path $Teste -Filter '*.FXP' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue +Get-ChildItem -Path $Teste -Filter '*.fxp' -ErrorAction SilentlyContinue | Remove-Item -Force -ErrorAction SilentlyContinue +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_s6_5_valuta.prg') ` + -Steps @('env_gata','v1_emis','v2_emis','compdoc_gata') ` + -StepTimeoutSec 120 ` + -ReadyTimeoutSec 180 ` + -SyncDir (Join-Path $Teste 'uisync_s65') ` + -ShotsDir (Join-Path $Teste 'screenshots_s65') diff --git a/utile/Teste/facturare_unificat/test_s6_6_listare_intrare.prg b/utile/Teste/facturare_unificat/test_s6_6_listare_intrare.prg new file mode 100644 index 0000000..4b0af2e --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s6_6_listare_intrare.prg @@ -0,0 +1,457 @@ +*!* 02.09.2026 +*!* agent s6-6-listare-intrare +*!* Headless: paritatea intrarii listarii (S6-6, propunere_s6_test_flux_real.md §5.6). Reutilizeaza +*!* patru documente deja emise de S6-1 si de proba_abd_pretd (S6-3d) - NU emite nimic, NU consuma +*!* numere. +*!* +*!* CUM S-A OBTINUT poDate/crsfactura/crsDetalii, spus raspicat: PROCEDURE ConstruiesteIntrarePOF +*!* de mai jos e o REPLICA a portiunii NEINTERACTIVE a functiei de productie REALA +*!* listeaza_formular (oproceduri_facturare.prg:1076-1394 - aceeasi functie chemata din +*!* anaf_efactura.prg:3248 pentru relistarea unui document existent, deci traseul e real, nu +*!* inventat). Replica se opreste EXACT inainte de linia 1396 (`listeaza_ofacturare()`), pentru ca +*!* acea functie cheama necontrolat, la ofacturare.prg:1211, `alege_optiuni_listare_facturare()` -> +*!* `frm_alege_optlistfact.Show(1)` - dialog MODAL, fara nicio garda pe `nListareSilentioasa`, care +*!* ar bloca vfp9.exe pe masina partajata (confirmat: prima incercare a acestui test a AGATAT +*!* exact acolo, pe documentul tip 4 - proces omorat inainte sa ceara input). Restul campurilor din +*!* §5.6 sunt fie deja scrise de listeaza_formular INAINTE de acel punct (nract, serie_act, dataact, +*!* datascad, nume_client, text_aditional, listare_detaliata, cTextTVA, sold_lei, sold_valuta), fie +*!* triviale si calculate aici cu ACEEASI formula ca in productie (proc_tva, formula la +*!* ofacturare.prg:1217-1218). SINGURUL camp din lista propunerii care NU se poate obtine fara sa +*!* treci prin punctul periculos e `cod_fiscal` (vine din `poDate.oClient.cod_fiscal`, construit de +*!* interogarea de antet DIN INTERIORUL lui listeaza_ofacturare) - NEVERIFICAT aici, motivat. +*!* creeaza_facturacrs / prelucreaza_facturacrs / creeaza_cursor_seturi SUNT chemate neschimbate +*!* (ofacturare_comun.prg:1792/1823, oproceduri_facturare.prg:1569) - sunt transformari pure de +*!* cursor, fara UI. +*!* +*!* Perechea 1 (tip 1, lista de preturi): v1 SSS 682 (id_vanzare 1128), v2 SSS 683 (id_vanzare 1129) - +*!* ACELASI client (id_part 463), ACELEASI doua articole - comparatie de VALOARE. +*!* Perechea 2 (tip 4, aviz): v1 SSS 675 (id_vanzare 1126), v2 SSS 674 (id_vanzare 1125) - ACELASI +*!* client (id_part 614), dar surse (avize) diferite -> linii diferite; comparatie STRUCTURALA. +*!* +*!* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s6_6_listare_intrare.prg" +*!* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_6_listare_intrare.log +*!* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcLog, gnFail, gnPass, gnSarit, gcCaz +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s6_6_listare_intrare.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) +gnFail = 0 +gnPass = 0 +gnSarit = 0 +gcCaz = "" +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 +SQLSETPROP(gnHandle, "QueryTimeOut", 45) +IF TYPE('goExecutor.nHandle') = 'N' AND goExecutor.nHandle > 0 AND goExecutor.nHandle <> gnHandle + SQLSETPROP(goExecutor.nHandle, "QueryTimeOut", 45) +ENDIF +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) +DO AfLog WITH "ENV OK gnHandle=" + TRANSFORM(gnHandle) + +DO VerificaDocumenteSursa +DO TestPereche1 +DO TestPereche2 + +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE VerificaDocumenteSursa + * Confirma pe Oracle (nu din raport) cele patru documente reutilizate, inainte de a le folosi. + * Filtrul sters=0 se pune in SQL (Oracle face comparatia), nu in VFP dupa - evita orice + * nepotrivire de tip pe coloana intoarsa de goExecutor. + LOCAL llSucces + gcCaz = "[verificare documente sursa] " + llSucces = goExecutor.oExecuta( ; + [select id_vanzare, tip, serie_act, numar_act, id_part from vanzari ] + ; + [where id_vanzare in (1125,1126,1128,1129) and sters = 0 order by id_vanzare], [crsverifsurse]) + DO Assert WITH llSucces, "SELECT de verificare a rulat fara eroare Oracle" + DO Assert WITH USED('crsverifsurse') AND RECCOUNT('crsverifsurse') = 4, ; + "patru documente nesterse gasite, e=" + TRANSFORM(IIF(USED('crsverifsurse'), RECCOUNT('crsverifsurse'), -1)) + IF USED('crsverifsurse') + USE IN crsverifsurse + ENDIF +ENDPROC + +*---------------------------------------------------------------------------------------- +* Replica portiunii NEINTERACTIVE a lui listeaza_formular (oproceduri_facturare.prg:1076-1394), +* redusa la ramurile atinse de tip 1 si tip 4 (comentariile de mai jos citeaza linia originala). +* Se opreste inainte de listeaza_ofacturare() - vezi antetul fisierului. +*---------------------------------------------------------------------------------------- +FUNCTION ConstruiesteIntrarePOF + LPARAMETERS tnIdVanzare, tcSlot + LOCAL loDate, lcSqlFactura, lcSqlDetalii, llSucces, lnDiscount, lnDiscountVal, lnProcTvav + LOCAL lnIdPart, lnPnCod, lcSql, lnIdComandaAviz, lcCursorTemp + + IF USED(tcSlot + '_fact') + USE IN (tcSlot + '_fact') + ENDIF + IF USED(tcSlot + '_det') + USE IN (tcSlot + '_det') + ENDIF + + * oproceduri_facturare.prg:1098-1117 - aceeasi structura de cursor ca in productie + CREATE CURSOR (tcSlot + '_fact') (id_vanzare N(20) NULL, tip N(5) NULL, serie_act C(10) NULL, numar_act N(14) NULL, ; + id_part N(10) NULL, data_act D(8) NULL, dataora T(8) NULL, discount N(17,4) NULL, disc_fara_tva N(17,4) NULL, discount_evidentiat N(1) NULL, text_aditional M(4) NULL, ; + nrinmat C(10) NULL, delegat C(70) NULL, bidelegat C(30) NULL, cnpdelegat C(15) NULL, dataora_exp T(8) NULL, ; + id_comanda N(20) NULL, tip_incasare N(10) NULL, nr_incasare N(10) NULL, serie_chit C(20) NULL, incasat N(17,4) NULL, ; + in_valuta N(1) NULL, afisare_scadenta N(1) NULL, altele C(200) NULL, id_ordl N(10) NULL, tva_incasare N(1) NULL, ; + id_facturare N(10) NULL, listare_detaliata N(1) NULL, id_beneficiar N(20) NULL, tip_factura N(5) NULL, id_util I(4) NULL, ; + eproforma N(1) NULL, id_ctr N(10) NULL, contract C(100) NULL, curs N(20,4) NULL, multiplicator N(10) NULL, nume_val C(50) NULL, ; + valval N(20,4) NULL, tvaval N(20,4) NULL, totval N(20,4) NULL, tip_saft N(3) NULL, institutie_publica N(1) NULL, cod N(20) NULL, ; + client C(100) NULL) + CREATE CURSOR (tcSlot + '_det') (id_vanzare N(20) NULL, id_vanzare_det N(10) NULL, id_articol N(10) NULL, ; + lot C(100) NULL, serie C(100) NULL, taxcode N(6) NULL, proc_tvav N(10,4) NULL, cantitate N(10,4) NULL, id_jtva_coloana N(10) NULL, ; + id_jtva_coloana_ex N(10) NULL, pret N(20,6) NULL, pret_val N(20,6) NULL, pret_cu_tva N(1) NULL, discount_unitar N(20,6) NULL, ; + discount_unitar_val N(20,6) NULL, cont C(4) NULL, id_valuta N(10) NULL, tip_valuta N(1) NULL, id_gestiune N(20) NULL, ; + pret_achizitie N(20,6) NULL, denumire C(250) NULL, explicatie M(4) NULL, ; + um C(10) NULL, cod_um_iso C(5) NULL, codmatf C(50) NULL, codmat C(50) NULL, codmatc C(50) NULL, codbare C(50) NULL, ; + curs N(20,4) NULL, multiplicator N(10) NULL, nume_val C(10) NULL, id_vanzare_set N(10) NULL, id_ctr N(10) NULL, numar_contract C(50) NULL) + + TEXT TO lcSqlFactura TEXTMERGE NOSHOW +select id_vanzare,tip,serie_act,numar_act,id_part,data_act,dataora,discount,disc_fara_tva,discount_evidentiat,text_aditional, + nrinmat,delegat,bidelegat,cnpdelegat,dataora_exp,id_comanda,tip_incasare,nr_incasare,serie_chit,incasat, + in_valuta,afisare_scadenta,altele,id_ordl,tva_incasare,id_facturare,listare_detaliata,id_beneficiar, + tip_factura,id_util,eproforma,id_ctr,contract,curs,multiplicator,nume_val,valval,tvaval,totval,tip_saft, + institutie_publica,cod,client + from fact_vfacturi2 + where id_vanzare = <> + ENDTEXT + + TEXT TO lcSqlDetalii TEXTMERGE NOSHOW +select id_vanzare, id_vanzare_det, id_articol, lot, serie, taxcode, proc_tvav, cantitate, id_jtva_coloana, + id_jtva_coloana_ex, pret, pret_val, pret_cu_tva, discount_unitar, discount_unitar_val, cont, id_valuta, + tip_valuta, id_gestiune, pret_achizitie, denumire, explicatie, um, cod_um_iso, codmatf, codmat, codmatc, + codbare, curs, multiplicator, nume_val, id_vanzare_set, id_ctr, numar_contract + from fact_vfacturi_detalii + where id_vanzare = <> + order by id_vanzare_det + ENDTEXT + + llSucces = goExecutor.oExecuta(lcSqlFactura, 'cS66FactTemp') + IF !llSucces + DO AfLog WITH "FAIL: " + gcCaz + "SQL fact_vfacturi2 esuat pt id_vanzare=" + TRANSFORM(tnIdVanzare) + ": " + goExecutor.oPrelucrareEroare() + RETURN NULL + ENDIF + SELECT (tcSlot + '_fact') + APPEND FROM DBF('cS66FactTemp') + USE IN (SELECT('cS66FactTemp')) + + llSucces = goExecutor.oExecuta(lcSqlDetalii, 'cS66DetTemp') + IF !llSucces + DO AfLog WITH "FAIL: " + gcCaz + "SQL fact_vfacturi_detalii esuat pt id_vanzare=" + TRANSFORM(tnIdVanzare) + ": " + goExecutor.oPrelucrareEroare() + RETURN NULL + ENDIF + SELECT (tcSlot + '_det') + APPEND FROM DBF('cS66DetTemp') + USE IN (SELECT('cS66DetTemp')) + + IF RECCOUNT(tcSlot + '_fact') = 0 + DO AfLog WITH "FAIL: " + gcCaz + "id_vanzare=" + TRANSFORM(tnIdVanzare) + " nu are rand in fact_vfacturi2" + RETURN NULL + ENDIF + + * oproceduri_facturare.prg:1163-1229 - poDate, campurile scrise INAINTE de listeaza_ofacturare() + SELECT (tcSlot + '_fact') + loDate = CREATEOBJECT("oDateFactura", 0, 0) + lnIdPart = id_part + lnPnCod = cod + loDate.nid_vanzare = id_vanzare + loDate.nRelistare = 1 + loDate.tip = tip + loDate.nract = numar_act + loDate.serie_act = ALLTRIM(serie_act) + loDate.dataact = IIF(TYPE('data_act') = 'T', TTOD(data_act), data_act) + loDate.discount_evidentiat = discount_evidentiat + loDate.text_aditional = NVL(text_aditional, []) + loDate.nrinmat = nrinmat + loDate.nume_delegat = delegat + loDate.bidelegat = bidelegat + loDate.cnpdelegat = cnpdelegat + loDate.dataora_exp = dataora_exp + loDate.listaid = IIF(INLIST(loDate.tip, 3, 21, 28, 42, 47), ALLTRIM(STR(id_comanda)), []) + loDate.ntip_incasare = tip_incasare + loDate.nr_incasare = nr_incasare + loDate.serie_chit = NVL(serie_chit, []) + loDate.incasat = incasat + loDate.in_valuta = in_valuta + loDate.afisare_scadenta = afisare_scadenta + loDate.descriere = altele + loDate.id_ordl = id_ordl + loDate.tva_incasare = tva_incasare + loDate.id_facturare = id_facturare + loDate.nListareDetaliata = listare_detaliata + loDate.nListareSilentioasa = 1 + loDate.nListareJustPDF = 1 + loDate.nIdBeneficiar = id_beneficiar + loDate.nTipFactura = tip_factura + loDate.id_util = id_util + loDate.eProforma = eproforma + loDate.id_ctr = id_ctr + loDate.contract = ALLTRIM(NVL(contract, '')) + IF loDate.in_valuta = 1 + loDate.nume_valuta = nume_val + loDate.multiplicator = multiplicator + lnDiscountVal = NVL(discount, 0) + lnDiscount = ROUND(NVL(discount, 0) * NVL(curs, 1) / NVL(multiplicator, 1), 2) + ELSE + lnDiscount = NVL(discount, 0) + lnDiscountVal = 0 + ENDIF + loDate.nValVal = valval + loDate.nTvaVal = tvaval + loDate.nTotVal = totval + loDate.cValuta = ALLTRIM(NVL(nume_val, '')) + loDate.Curs = curs + loDate.multiplicator = multiplicator + loDate.tip_saft = NVL(tip_saft, 380) + loDate.institutie_publica = NVL(institutie_publica, 0) + + * oproceduri_facturare.prg:1233-1235 - id_comanda_aviz nu e proprietate nativa, se adauga o data + IF !PEMSTATUS(loDate, "id_comanda_aviz", 5) + ADDPROPERTY(loDate, "id_comanda_aviz", 0) + ENDIF + + * oproceduri_facturare.prg:1236-1268 - id_comanda_aviz + descriere, doar ramurile care se ating + * pe tip 1 si tip 4 (celelalte tipuri raman fara aceasta imbogatire, in afara perimetrului S6-6) + SELECT (tcSlot + '_fact') + IF INLIST(loDate.tip, 3, 21, 28, 42, 47) + loDate.id_comanda_aviz = id_comanda + ELSE + IF loDate.tip = 4 + lcSql = [select max(v.id_comanda) as id_comanda from vanzari_coresp vc ] + ; + [join vanzari v on vc.id_vanzare_aviz = v.id_vanzare where vc.sters = 0 and v.sters = 0 and vc.id_vanzare_fact = ] + ALLTRIM(STR(loDate.nid_vanzare)) + lnIdComandaAviz = 0 + llSucces = goExecutor.oSelect2Value(lcSql, @lnIdComandaAviz) + IF llSucces >= 0 + loDate.id_comanda_aviz = NVL(lnIdComandaAviz, 0) + ENDIF + SELECT (tcSlot + '_fact') + loDate.descriere = ALLTRIM(altele) + ENDIF + ENDIF + + * oproceduri_facturare.prg:1271-1329 - id_client/nume_client; tip 1 si tip 4 (fara comanda_aviz) + * cad pe ramura ELSE simpla (nu sunt in Inlist 23,25,27,30,41,-6 - avize subunitati) + SELECT (tcSlot + '_fact') + loDate.id_client = id_part + loDate.nume_client = client + + * oproceduri_facturare.prg:1354-1365 - datascad, ramura generica (fara id_ordl -12) + IF !ISNULL(lnPnCod) + lcSql = [select MAX(a.datascad) as datascad from act a where cod = ] + ALLTRIM(STR(lnPnCod)) + IF USED('cS66Datascad') + USE IN cS66Datascad + ENDIF + llSucces = goExecutor.oExecuta(lcSql, 'cS66Datascad') + IF llSucces AND USED('cS66Datascad') AND RECCOUNT('cS66Datascad') > 0 + SELECT cS66Datascad + loDate.datascad = datascad + ENDIF + IF USED('cS66Datascad') + USE IN cS66Datascad + ENDIF + ENDIF + + * oproceduri_facturare.prg:1371-1379 - cTextTVA (calculat AICI, in listeaza_formular, inainte de + * listeaza_ofacturare - NU e nevoie sa se treaca de punctul periculos pentru acest camp) + ADDPROPERTY(loDate, 'cTextTVA', '') + SELECT DISTINCT id_jtva_coloana_ex, id_jtva_coloana FROM (tcSlot + '_det') INTO CURSOR cS66TextTVA + IF RECCOUNT('cS66TextTVA') = 1 + SELECT cS66TextTVA + GO TOP + loDate.cTextTVA = TRANSFORM(NVL(id_jtva_coloana_ex, id_jtva_coloana)) + ENDIF + USE IN cS66TextTVA + + * oproceduri_facturare.prg:1382-1385 - soldul clientului (functie pura de interogare) + loDate.sold_lei = 0 + loDate.sold_valuta = 0 + TRY + LOCAL loSold + loSold = GetSoldClient(lnIdPart, IdVanzare2IdFact(loDate.nid_vanzare)) + IF VARTYPE(loSold) = 'O' + loDate.sold_lei = loSold.sold_lei + loDate.sold_valuta = loSold.sold_valuta + ENDIF + CATCH + DO AfLog WITH "INFO: GetSoldClient a esuat pt slot " + tcSlot + " (nefatal, sold ramane 0)" + ENDTRY + + * oproceduri_facturare.prg:1387-1394 - crsfactura + set (transformari pure de cursor, fara UI) + SELECT (tcSlot + '_det') + CALCULATE MAX(proc_tvav) TO lnProcTvav + + IF USED(tcSlot + '_crsfact') + USE IN (tcSlot + '_crsfact') + ENDIF + creeaza_facturacrs(tcSlot + '_crsfact') + prelucreaza_facturacrs(tcSlot + '_det', tcSlot + '_crsfact', lnProcTvav, lnDiscount, lnDiscountVal) + + * ofacturare.prg:1217-1218 - proc_tva, ACEEASI formula, aplicata local (fara listeaza_ofacturare) + SELECT (tcSlot + '_crsfact') + CALCULATE MAX(ROUND(NVL(proc_Tvav, 1), 2)) TO loDate.proc_tva + loDate.proc_tva = loDate.proc_tva * 100 - 100 + + RETURN loDate +ENDFUNC + +*---------------------------------------------------------------------------------------- +* Perechea 1 - tip 1, lista de preturi, ACELASI client, ACELEASI articole -> comparatie de valoare +*---------------------------------------------------------------------------------------- +PROCEDURE TestPereche1 + LOCAL loV1, loV2 + gcCaz = "[S6-6 pereche 1: tip1, SSS682/1128 vs SSS683/1129] " + + loV1 = ConstruiesteIntrarePOF(1128, "p1v1") + loV2 = ConstruiesteIntrarePOF(1129, "p1v2") + + IF VARTYPE(loV1) <> 'O' OR VARTYPE(loV2) <> 'O' + DO AfLog WITH "FAIL: " + gcCaz + "ConstruiesteIntrarePOF nu a intors poDate pe una din forme, sar comparatia" + gnFail = gnFail + 1 + RETURN + ENDIF + + DO Assert WITH loV1.nid_vanzare = 1128, "poDate.nid_vanzare v1 = 1128, e=" + TRANSFORM(loV1.nid_vanzare) + DO Assert WITH loV2.nid_vanzare = 1129, "poDate.nid_vanzare v2 = 1129, e=" + TRANSFORM(loV2.nid_vanzare) + DO Assert WITH loV1.tip = 1 AND loV2.tip = 1, "poDate.tip = 1 pe ambele" + + * campuri care TREBUIE sa fie egale (acelasi client, aceleasi articole, acelasi tva) + DO Assert WITH loV1.id_client = loV2.id_client, "id_client egal (463), v1=" + TRANSFORM(loV1.id_client) + " v2=" + TRANSFORM(loV2.id_client) + DO Assert WITH loV1.nume_client = loV2.nume_client, "nume_client egal, v1=[" + TRANSFORM(loV1.nume_client) + "] v2=[" + TRANSFORM(loV2.nume_client) + "]" + DO Assert WITH NVL(loV1.text_aditional, '') = NVL(loV2.text_aditional, ''), "text_aditional egal" + DO Assert WITH loV1.nListareDetaliata = loV2.nListareDetaliata, "nListareDetaliata egal, v1=" + TRANSFORM(loV1.nListareDetaliata) + " v2=" + TRANSFORM(loV2.nListareDetaliata) + DO Assert WITH loV1.proc_tva = loV2.proc_tva, "proc_tva egal, v1=" + TRANSFORM(loV1.proc_tva) + " v2=" + TRANSFORM(loV2.proc_tva) + DO Assert WITH NVL(loV1.cTextTVA, '') = NVL(loV2.cTextTVA, ''), "cTextTVA egal, v1=[" + TRANSFORM(loV1.cTextTVA) + "] v2=[" + TRANSFORM(loV2.cTextTVA) + "]" + + * campuri care difera LEGITIM - doar populate, NU se compara pentru egalitate + DO Assert WITH !EMPTY(NVL(loV1.nract, 0)) AND !EMPTY(NVL(loV2.nract, 0)), "nract populat (diferit legitim: v1=" + TRANSFORM(loV1.nract) + " v2=" + TRANSFORM(loV2.nract) + ")" + DO Assert WITH !EMPTY(loV1.serie_act) AND !EMPTY(loV2.serie_act), "serie_act populat, v1=" + loV1.serie_act + " v2=" + loV2.serie_act + DO Assert WITH !EMPTY(loV1.dataact) AND !EMPTY(loV2.dataact), "dataact populat pe ambele" + DO Assert WITH !ISNULL(loV1.sold_lei) AND !ISNULL(loV2.sold_lei), "sold_lei populat (cumulativ, difera legitim: v1=" + TRANSFORM(loV1.sold_lei) + " v2=" + TRANSFORM(loV2.sold_lei) + ")" + DO AfLog WITH "INFO pereche 1: cod_fiscal NEVERIFICAT (necesita listeaza_ofacturare, evitat - vezi antetul fisierului)" + + * crsDetalii - aceleasi doua articole, aceeasi cantitate totala + LOCAL n1, n2, s1, s2, nTax1, nTax2 + n1 = 0 + n2 = 0 + s1 = 0 + s2 = 0 + nTax1 = 0 + nTax2 = 0 + IF USED('p1v1_det') + SELECT COUNT(*) AS n, SUM(cantitate) AS s, SUM(IIF(!EMPTY(NVL(taxcode, 0)), 1, 0)) AS ntax FROM p1v1_det INTO CURSOR crsp1v1agg + n1 = crsp1v1agg.n + s1 = crsp1v1agg.s + nTax1 = crsp1v1agg.ntax + USE IN crsp1v1agg + ENDIF + IF USED('p1v2_det') + SELECT COUNT(*) AS n, SUM(cantitate) AS s, SUM(IIF(!EMPTY(NVL(taxcode, 0)), 1, 0)) AS ntax FROM p1v2_det INTO CURSOR crsp1v2agg + n2 = crsp1v2agg.n + s2 = crsp1v2agg.s + nTax2 = crsp1v2agg.ntax + USE IN crsp1v2agg + ENDIF + DO Assert WITH n1 = 2 AND n2 = 2, "crsDetalii: 2 linii pe fiecare, v1=" + TRANSFORM(n1) + " v2=" + TRANSFORM(n2) + DO Assert WITH s1 = 4 AND s2 = 4, "crsDetalii: suma cantitate = 4 pe fiecare, v1=" + TRANSFORM(s1) + " v2=" + TRANSFORM(s2) + + * TAXCODE - defect D-S61, deja INCHIS in cod (COMUN fdd3241); documentele reutilizate au fost + * scrise INAINTE de reparatie, deci v2 inca poarta golul istoric - se masoara, nu se re-raporteaza + DO Assert WITH nTax1 = 2, "crsDetalii.taxcode populat pe v1, ambele linii, e=" + TRANSFORM(nTax1) + DO Assert WITH nTax2 = 0, "crsDetalii.taxcode gol pe v2 (D-S61 istoric, INCHIS in cod, document scris inainte de fix), e=" + TRANSFORM(nTax2) +ENDPROC + +*---------------------------------------------------------------------------------------- +* Perechea 2 - tip 4, aviz, ACELASI client, surse (avize) DIFERITE -> comparatie STRUCTURALA +*---------------------------------------------------------------------------------------- +PROCEDURE TestPereche2 + LOCAL loV1, loV2 + gcCaz = "[S6-6 pereche 2: tip4, SSS675/1126 vs SSS674/1125] " + + loV1 = ConstruiesteIntrarePOF(1126, "p2v1") + loV2 = ConstruiesteIntrarePOF(1125, "p2v2") + + IF VARTYPE(loV1) <> 'O' OR VARTYPE(loV2) <> 'O' + DO AfLog WITH "FAIL: " + gcCaz + "ConstruiesteIntrarePOF nu a intors poDate pe una din forme, sar comparatia" + gnFail = gnFail + 1 + RETURN + ENDIF + + DO Assert WITH loV1.nid_vanzare = 1126, "poDate.nid_vanzare v1 = 1126, e=" + TRANSFORM(loV1.nid_vanzare) + DO Assert WITH loV2.nid_vanzare = 1125, "poDate.nid_vanzare v2 = 1125, e=" + TRANSFORM(loV2.nid_vanzare) + DO Assert WITH loV1.tip = 4 AND loV2.tip = 4, "poDate.tip = 4 pe ambele" + + * acelasi client (id_part 614 pe ambele) - TREBUIE sa fie egale + DO Assert WITH loV1.id_client = loV2.id_client, "id_client egal (614), v1=" + TRANSFORM(loV1.id_client) + " v2=" + TRANSFORM(loV2.id_client) + DO Assert WITH loV1.nume_client = loV2.nume_client, "nume_client egal, v1=[" + TRANSFORM(loV1.nume_client) + "] v2=[" + TRANSFORM(loV2.nume_client) + "]" + DO Assert WITH loV1.nListareDetaliata = loV2.nListareDetaliata, "nListareDetaliata egal, v1=" + TRANSFORM(loV1.nListareDetaliata) + " v2=" + TRANSFORM(loV2.nListareDetaliata) + + * surse (avize) diferite -> linii/sume diferite legitim; doar se verifica populate + DO Assert WITH !EMPTY(NVL(loV1.nract, 0)) AND !EMPTY(NVL(loV2.nract, 0)), "nract populat (documente diferite: v1=" + TRANSFORM(loV1.nract) + " v2=" + TRANSFORM(loV2.nract) + ")" + DO Assert WITH !ISNULL(loV1.proc_tva) AND !ISNULL(loV2.proc_tva), "proc_tva populat pe ambele (surse diferite, nu se compara pentru egalitate)" + + * crsDetalii - surse diferite -> NU se compara numarul de linii intre v1/v2; cifrele au fost + * verificate independent pe Oracle inainte de scriere test (vezi raport) + LOCAL n1, n2, nTax1, nTax2 + n1 = 0 + n2 = 0 + nTax1 = 0 + nTax2 = 0 + IF USED('p2v1_det') + SELECT COUNT(*) AS n, SUM(IIF(!EMPTY(NVL(taxcode, 0)), 1, 0)) AS ntax FROM p2v1_det INTO CURSOR crsp2v1agg + n1 = crsp2v1agg.n + nTax1 = crsp2v1agg.ntax + USE IN crsp2v1agg + ENDIF + IF USED('p2v2_det') + SELECT COUNT(*) AS n, SUM(IIF(!EMPTY(NVL(taxcode, 0)), 1, 0)) AS ntax FROM p2v2_det INTO CURSOR crsp2v2agg + n2 = crsp2v2agg.n + nTax2 = crsp2v2agg.ntax + USE IN crsp2v2agg + ENDIF + DO Assert WITH n1 = 1, "crsDetalii v1 (SSS675, sursa proprie): 1 linie, e=" + TRANSFORM(n1) + DO Assert WITH n2 = 4, "crsDetalii v2 (SSS674, sursa proprie): 4 linii, e=" + TRANSFORM(n2) + DO Assert WITH nTax1 = 1, "crsDetalii v1: taxcode populat pe linia sa, e=" + TRANSFORM(nTax1) + "/1" + DO Assert WITH nTax2 = 2, "crsDetalii v2: taxcode populat pe 2 din 4 linii (celelalte au id_jtva_coloana=0, gol legitim - gol de jurnal TVA deja inregistrat, nu al S6-6), e=" + TRANSFORM(nTax2) + "/4" + DO AfLog WITH "INFO pereche 2: taxcode PREZENT pe traseul de incarcare in masa (aviz) pe AMBELE forme - fix A/W4 acopera acest traseu, spre deosebire de pereche 1 (cautare in linie)" +ENDPROC + +*---------------------------------------------------------------------------------------- +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + 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 + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + gcCaz + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + " sarit=" + TRANSFORM(gnSarit) + DO AfLog WITH "END " + TTOC(DATETIME()) + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s8_cablare_incarcare.prg b/utile/Teste/facturare_unificat/test_s8_cablare_incarcare.prg new file mode 100644 index 0000000..e4bbebc --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s8_cablare_incarcare.prg @@ -0,0 +1,782 @@ +* test_s8_cablare_incarcare.prg +* Headless: proba cablarii incarcarii in masa pe frm_facturare_articole2 (S8, propunerea +* docs\propunere_s8_cablare_incarcare_v2.md sectiunea 7). Testul apasa BUTONUL +* (but_incarca_articole.Click(), care trece prin _cmd_base.Click si macro-expandeaza cAction), +* niciodata metoda do_incarca_articole direct - veriga de rutare era exact ce lipsea in probele +* anterioare. +* +* Asertiuni (A1-A10 din sectiunea 7.2, plus cele doua structurale de rutare din 7.1): +* A1 but_incarca_articole.cAction = 'do_incarca_articole' (+ PEMSTATUS do_adauga_tot pe instanta) +* A2 dupa Click: Reccount('crsarticole') > 0 +* A3 dupa Click: Reccount('crsfactura') > 0 <- trece datorita cablarii (W1) +* A4 Reccount('crsfactura') = Reccount('crsarticole') (comanda fara linii sarite) +* A5 zero linii cu id_jtva_coloana = 0 in crsfactura <- trece datorita W3 +* A6 SUM(valctva) din crsfactura > 0 +* A7 comanda cu linie de discount (cantitate negativa): zero apeluri amessagebox <- W2 +* A8 neregresie tip 1 (lista de preturi, llCautareInLinie): crsfactura ramane gol +* A9 garda de tipuri, contract (tip 2): crsfactura ramane gol SI zero amessagebox +* A11 taxcode din crsfactura = valoarea derivata de cod <- trece datorita W4 +* A10 emitere reala prin but_termin1.Click(): rand in VANZARI cu TIP = 3 si +* VANZARI_DETALII.ID_JTVA_COLOANA > 0 pe toate liniile (numai daca A1-A9 sunt verzi) +* +* Sursele se aleg din date la rulare (SELECT peste COMENZI + apel pack_facturare.cursor_comanda, +* exact interogarea folosita de incarca_cursor_articole) - id-urile fixe nu tin: o comanda emisa +* de o rulare anterioara intoarce 0 linii la urmatoarea (2478/2479, consumate la S6-2). +* sursa A (A2-A6, A10): comanda fara linii cu cantitate negativa si cu id_c distincte +* sursa B (A7): comanda cu cel putin o linie negativa, toate negativele negestionabile +* Clientii cu 'CLIENT' in nume sunt exclusi: valideaza_antet (ofacturare_antet.prg:881) deschide +* pentru ei dialogul "in loc de BON FISCAL", care ar polua asertiunile de zero-amessagebox. +* +* Mock: mock_validare_antet.prg (amessagebox + facturi_duplicate -> gcMockApeluri). amessagebox e +* apelat din interiorul unei metode .vcx, deci se reincarca cu SET PROCEDURE ... ADDITIVE imediat +* inainte de fiecare Click; nu se probeaza precedenta mock-ului chemand amessagebox direct. +* +* Rulare: vfp9.exe -A -T "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s8_cablare_incarcare.prg" +* Log: D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s8_cablare_incarcare.log +* Mediu: ROA_CENTRAL / MARIUSM_AUTO; gnIdUtil = 8 (inainte de creeaza_cursor_serii); +* gnIdSucursala = 167; gnScadereStoc = 0; gnFactSeturi = 0. + +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +SET DELETED ON +SET EXACT ON +SET CENTURY ON +SET DATE DMY +SET DECIMALS TO 4 +SET NULLDISPLAY TO '' +CLOSE DATABASES + +PUBLIC gcLog, gnPass, gnFail, gnErr, gcCaz, gcMock, gcNumere +PUBLIC gcMockApeluri, gnMockRaspuns, gcMockDuplicat +PUBLIC gnComandaA, gnComandaB, goDriverMsg, gcClaseVazute + +gcLog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\out\test_s8_cablare_incarcare.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) +gnPass = 0 +gnFail = 0 +gnErr = 0 +gcCaz = "" +gcMockApeluri = "" +gnMockRaspuns = 6 +gcMockDuplicat = "" +gnComandaA = 0 +gnComandaB = 0 +gcClaseVazute = ";" +gcNumere = "" +gcMock = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\mock_validare_antet.prg" + +*-- poDate & co. se declara SI se initializeaza la nivelul programului principal: metodele din +*-- .vcx le vad numai daca variabila exista deja pe stiva de sub ele. Un PRIVATE declarat intr-o +*-- procedura si asignat in alta ramane invizibil in forma (eroarea "Alias 'PODATE' is not found"). +PRIVATE poDate, poGeneratorNumere, poDateGestiuneDest, pnTotalDiscountAvize, plVizibil +poDate = NULL +poGeneratorNumere = NULL +poDateGestiuneDest = NULL +pnTotalDiscountAvize = 0 +plVizibil = .F. + +ON ERROR DO S8Err WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +TRY + *-- stub_verificare PRIMUL: "Do Form verificare" (ofacturare.vc2:20126) rezolva la stub, nu la + *-- formularul real. test_init_env_auto_roafacturare.prg:78 adauga ADDITIV, deci nu-l pierde. + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\achizitie_import\stub_verificare" + + 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 S8Log WITH 'EROARE: conectare Oracle esuata' + DO S8Final + ENDIF + SQLSETPROP(gnHandle, "QueryTimeOut", 45) + DO S8Log WITH 'ENV OK gnHandle=' + TRANSFORM(gnHandle) + ' gcS=' + gcS + DO S8Log WITH 'DIAG SET_PATH stub inca in fata: ' + FULLPATH('verificare.scx') + + SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE + SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + SET PROCEDURE TO (gcMock) ADDITIVE + + IF !actualizeaza_optiuni_program() + DO S8Log WITH 'EROARE: actualizeaza_optiuni_program()' + DO S8Final + ENDIF + gnScadereStoc = 0 + gnFactSeturi = 0 + gnIdSucursala = 167 + goExecutor.oExecuta([begin pack_contafin.set_id_sucursala(?gnIdSucursala); end;]) + gnIdUtil = 8 + goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) + DO S8Log WITH 'optiuni OK gnScadereStoc=' + TRANSFORM(gnScadereStoc) + ' gnFactSeturi=' + TRANSFORM(gnFactSeturi) + ; + ' gnIdSucursala=' + TRANSFORM(gnIdSucursala) + ' gnIdUtil=' + TRANSFORM(gnIdUtil) + ; + ' gnAn=' + TRANSFORM(gnAn) + ' gnLuna=' + TRANSFORM(gnLuna) + + update_jtva_coloane([JV], [jtva_coloane_temp]) + update_saft_taxtable() + + *-- cboTipFactura cere RowSource pe saft_tip_facturi la constructia formularului + IF !USED('saft_tip_facturi') + CREATE CURSOR saft_tip_facturi (cod N(3) NULL, tip_saftname C(200) NULL) + INSERT INTO saft_tip_facturi (cod, tip_saftname) VALUES (NULL, '') + INDEX ON cod TAG cod + ENDIF + + *-- confirmarile pe forma modala MESSAGEBOX_FORM (ex. "Doriti sa se inchida comanda?" la tip 3) + *-- nu trec prin functia amessagebox, deci mock-ul nu le acopera - timer + driver, ca la S6-2 + goDriverMsg = CREATEOBJECT('driverMsgS8') + _SCREEN.AddObject('tmrS8', 'Timer') + _SCREEN.tmrS8.Interval = 200 + BINDEVENT(_SCREEN.tmrS8, 'Timer', goDriverMsg, 'Executa') + _SCREEN.tmrS8.Enabled = .T. + + DO S8Log WITH CHR(13) + CHR(10) + '===== ALEGEREA SURSELOR DIN DATE =====' + DO AlegeSurse + + DO S8Log WITH CHR(13) + CHR(10) + '===== A1 + rutare (structural, fara rulare de sursa) =====' + DO CazRutare + + DO S8Log WITH CHR(13) + CHR(10) + '===== A7 - comanda cu linie de discount (cantitate negativa) =====' + DO CazDiscount + + DO S8Log WITH CHR(13) + CHR(10) + '===== A8 - neregresie tip 1 (lista de preturi) =====' + DO CazListaPreturi + + DO S8Log WITH CHR(13) + CHR(10) + '===== A9 - garda de tipuri, contract (tip 2) =====' + DO CazContract + + DO S8Log WITH CHR(13) + CHR(10) + '===== A2-A6 (+ A10) - comanda curata =====' + DO CazComanda + + DO S8Final + +CATCH TO loExc + DO S8Log WITH 'CATCH TOP-LEVEL ErrorNo=' + TRANSFORM(loExc.ErrorNo) + ' Message=' + loExc.Message + ; + ' Proc=' + loExc.Procedure + ' Line=' + TRANSFORM(loExc.LineNo) + ' [' + loExc.LineContents + ']' + DO S8Final +ENDTRY + +QUIT + +*================================================================================== +* AlegeSurse: scaneaza comenzile descrescator si cheama pack_facturare.cursor_comanda (aceeasi +* interogare pe care o face incarca_cursor_articole) pana gaseste ambele surse. +PROCEDURE AlegeSurse + LOCAL lnQ, lnCnt, lnNeg, lnNegGest, lnDistinctIdC, lnIncercari + + poDate = CREATEOBJECT('empty') + ADDPROPERTY(poDate, 'zi_curs', DATE(gnAn, gnLuna, 1)) + ADDPROPERTY(poDate, 'tip', 3) + ADDPROPERTY(poDate, 'listaid', '') + + lnQ = goExecutor.oExecute([select c.id_comanda, p.nume from comenzi c, nom_parteneri p ] + ; + [where c.id_part = p.id_part and upper(p.nume) not like '%CLIENT%' order by c.id_comanda desc], 'crsComLista') + IF lnQ < 0 OR !USED('crsComLista') + DO Assert WITH .F., 'lista de comenzi citita din Oracle: ' + TRANSFORM(goExecutor.oPrelucrareEroare()) + RETURN + ENDIF + + lnIncercari = 0 + SELECT crsComLista + SCAN WHILE lnIncercari < 80 AND (gnComandaA = 0 OR gnComandaB = 0) + lnIncercari = lnIncercari + 1 + poDate.listaid = ALLTRIM(TRANSFORM(crsComLista.id_comanda)) + DO Inchide WITH 'crsAlegere' + lnQ = goExecutor.oExecute([{call ] + gcS + [.pack_facturare.cursor_comanda(?poDate.zi_curs,?poDate.tip,?poDate.listaid,?gnIdUtil)}], 'crsAlegere') + IF lnQ >= 0 AND USED('crsAlegere') AND RECCOUNT('crsAlegere') > 0 + SELECT crsAlegere + lnCnt = RECCOUNT('crsAlegere') + COUNT FOR cantitate < 0 TO lnNeg + COUNT FOR cantitate < 0 AND NVL(gestionabil, 0) = 1 TO lnNegGest + SELECT DISTINCT id_c FROM crsAlegere INTO CURSOR crsIdC + lnDistinctIdC = RECCOUNT('crsIdC') + USE IN crsIdC + DO CASE + CASE gnComandaA = 0 AND lnNeg = 0 AND lnDistinctIdC = lnCnt + gnComandaA = crsComLista.id_comanda + DO S8Log WITH ' sursa A = comanda ' + TRANSFORM(gnComandaA) + ' (linii=' + TRANSFORM(lnCnt) + ', fara negative, id_c distincte)' + CASE gnComandaB = 0 AND lnNeg > 0 AND lnNegGest = 0 + gnComandaB = crsComLista.id_comanda + DO S8Log WITH ' sursa B = comanda ' + TRANSFORM(gnComandaB) + ' (linii=' + TRANSFORM(lnCnt) + ', negative=' + ; + TRANSFORM(lnNeg) + ', toate negestionabile)' + ENDCASE + ENDIF + SELECT crsComLista + ENDSCAN + DO Inchide WITH 'crsAlegere' + DO Inchide WITH 'crsComLista' + DO S8Log WITH ' comenzi inspectate=' + TRANSFORM(lnIncercari) + DO Assert WITH gnComandaA > 0, 'sursa A (comanda tip 3 fara linii negative) gasita in date' + IF gnComandaB = 0 + DO S8Log WITH ' ATENTIE: nicio comanda cu linie de discount negestionabila in primele ' + ; + TRANSFORM(lnIncercari) + ' comenzi - A7 ramane NEEXERCITATA pe date' + ENDIF +ENDPROC + +*================================================================================== +* A1 + asertiunile structurale de rutare (sectiunea 7.1): butonul duce la metoda, iar metoda +* care muta liniile exista pe instanta v2. +PROCEDURE CazRutare + LOCAL loForm + gcCaz = '[A1] ' + DO CuratieCrs + DO creeaza_facturacrs WITH 'crsfactura' + poDate = CREATEOBJECT("oDateFactura", 25002, 3) + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + loForm = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loForm) <> 'O' + DO Assert WITH .F., 'Createobject frm_facturare_articole2' + RETURN + ENDIF + DO Assert WITH LOWER(ALLTRIM(loForm.but_incarca_articole.cAction)) == 'do_incarca_articole', ; + '[RUTARE] butonul Incarca articole duce la do_incarca_articole (cAction=[' + ; + ALLTRIM(TRANSFORM(loForm.but_incarca_articole.cAction)) + '])' + DO Assert WITH PEMSTATUS(loForm, 'do_adauga_tot', 5), ; + '[RUTARE] metoda do_adauga_tot exista pe instanta v2' + loForm.Release() + RELEASE loForm + DO CuratieCrs +ENDPROC + +*================================================================================== +* A2-A6 pe sursa A, apoi A10 (emitere reala) daca tot ce s-a rulat pana aici e verde. +PROCEDURE CazComanda + LOCAL loSursa, loForm, lnArt, lnFact, lnZero, lnSuma, lnFailInainte, lnIdVz, lcSerie, lnNract + LOCAL lnRau, lnNenul, lnAstept, llSaft + + gcCaz = '[A2-A6] ' + IF gnComandaA = 0 + DO Assert WITH .F., 'A2-A6: nu exista sursa A aleasa - cazul nu s-a rulat' + RETURN + ENDIF + lnFailInainte = gnFail + + loSursa = CreeazaSursaComanda(gnComandaA) + IF ISNULL(loSursa) + DO Assert WITH .F., 'sursa A citita din Oracle (id_comanda=' + TRANSFORM(gnComandaA) + ')' + RETURN + ENDIF + + loForm = PregatesteFormular(3, loSursa) + IF ISNULL(loForm) + RETURN + ENDIF + + DO ApasaIncarca WITH loForm + + lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0) + lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) + DO S8Log WITH ' dupa Click: crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact) + + DO Assert WITH lnArt > 0, 'A2: Reccount(crsarticole) > 0 dupa Click, e=' + TRANSFORM(lnArt) + DO Assert WITH lnFact > 0, 'A3: Reccount(crsfactura) > 0 dupa Click (cablarea W1), e=' + TRANSFORM(lnFact) + DO Assert WITH lnFact = lnArt, 'A4: Reccount(crsfactura) = Reccount(crsarticole), ' + ; + TRANSFORM(lnFact) + ' vs ' + TRANSFORM(lnArt) + + lnZero = -1 + lnSuma = 0 + IF lnFact > 0 + SELECT crsfactura + COUNT FOR NVL(id_jtva_coloana, 0) = 0 TO lnZero + SUM valctva TO lnSuma + ENDIF + DO Assert WITH lnZero = 0, 'A5: zero linii cu id_jtva_coloana = 0 in crsfactura (W3), e=' + TRANSFORM(lnZero) + DO Assert WITH lnSuma > 0, 'A6: SUM(valctva) din crsfactura > 0, e=' + TRANSFORM(lnSuma) + + *-- A11 (W4): taxcode ajunge in crsfactura cu exact valoarea pe care o deriva codul, nu "nenul". + *-- frm_articol_factura.Init cheama UpdateExplicatieSAFT doar sub If m.gl406 (ofacturare.vc2:2523), + *-- iar GetTaxCode intoarce NULL daca gl406 e stins - deci fara SAFT valoarea legitima e 0 (din + *-- AddProperty), nu un cod. Asteptarea se calculeaza cu aceeasi functie, ramura cu ramura. + *-- Fara W4 taxcode nu e in listele Gather, deci ramane NULL pe fiecare rand: -999 <> asteptat. + llSaft = (TYPE('gl406') = 'L' AND gl406) + lnRau = 0 + lnNenul = 0 + IF lnFact > 0 + SELECT crsfactura + SCAN + lnAstept = IIF(m.llSaft, NVL(GetTaxCode(gnAn, gnLuna, poDate.dataact, NVL(crsfactura.id_jtva_coloana, 0), .F.), -999), 0) + IF NVL(crsfactura.taxcode, -999) <> m.lnAstept + lnRau = lnRau + 1 + DO S8Log WITH ' A11 nepotrivire: id_jtva_coloana=' + TRANSFORM(NVL(crsfactura.id_jtva_coloana, 0)) + ; + ' taxcode=' + TRANSFORM(crsfactura.taxcode) + ' asteptat=' + TRANSFORM(m.lnAstept) + ENDIF + IF NVL(crsfactura.taxcode, 0) <> 0 + lnNenul = lnNenul + 1 + ENDIF + ENDSCAN + ENDIF + DO S8Log WITH ' A11: gl406=' + TRANSFORM(m.llSaft) + ' linii cu taxcode nenul=' + TRANSFORM(lnNenul) + '/' + TRANSFORM(lnFact) + DO Assert WITH lnFact > 0 AND lnRau = 0, ; + 'A11: taxcode din crsfactura = valoarea derivata de cod (W4), linii nepotrivite=' + TRANSFORM(lnRau) + IF lnNenul = 0 + DO S8Log WITH ' A11 ATENTIE: toate liniile au taxcode 0 - asertiunea e conforma cu codul, dar ' + ; + 'NU exercita culegerea unei valori reale (gl406 stins sau explicatii SAFT neconfigurate)' + ENDIF + + *-- A10: numai daca tot lantul A1-A9 e verde (sectiunea 7.2) + IF gnFail = 0 AND lnFailInainte = 0 + gcCaz = '[A10] ' + lcSerie = ALLTRIM(NVL(poDate.serie_act, '')) + lnNract = poDate.nract + DO S8Log WITH ' A10: emit cu serie_act=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + loForm.do_calculeaza_totaluri() + DOEVENTS FORCE + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + loForm.but_termin1.Click() + DOEVENTS FORCE + lnIdVz = NVL(poDate.nid_vanzare, 0) + DO S8Log WITH ' A10: but_termin1.Click() -> poDate.nid_vanzare=' + TRANSFORM(lnIdVz) + DO S8Log WITH ' A10: apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + IF lnIdVz > 0 + gcNumere = gcNumere + 'SCRIS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' id_vanzare=' + TRANSFORM(lnIdVz) + ';' + DO VerificaVanzare WITH lnIdVz + ELSE + gcNumere = gcNumere + 'ARS serie=' + lcSerie + ' nract=' + TRANSFORM(lnNract) + ' (alocat, nescris);' + DO Assert WITH .F., 'A10: documentul s-a scris (poDate.nid_vanzare > 0), e=' + TRANSFORM(lnIdVz) + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + ENDIF + ELSE + DO S8Log WITH ' A10 NERULAT: exista esecuri anterioare (fail=' + TRANSFORM(gnFail) + ')' + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ';' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + ENDIF + + DO Elibereaza WITH loForm + DO Goleste +ENDPROC + +*================================================================================== +* A7: comanda cu linie de discount. Fara garda de gestionabilitate (W2), bucla din do_adauga_tot +* ajunge la dialogul "Nu ati selectat toata cantitatea"; cu garda, nu se cheama deloc amessagebox. +PROCEDURE CazDiscount + LOCAL loSursa, loForm, lnNeg + + gcCaz = '[A7] ' + IF gnComandaB = 0 + DO S8Log WITH ' A7 NEEXERCITATA: nicio comanda cu linie de discount negestionabila in date' + RETURN + ENDIF + + loSursa = CreeazaSursaComanda(gnComandaB) + IF ISNULL(loSursa) + DO Assert WITH .F., 'sursa B citita din Oracle (id_comanda=' + TRANSFORM(gnComandaB) + ')' + RETURN + ENDIF + + loForm = PregatesteFormular(3, loSursa) + IF ISNULL(loForm) + RETURN + ENDIF + + DO ApasaIncarca WITH loForm + + lnNeg = 0 + IF USED('crsfactura') AND RECCOUNT('crsfactura') > 0 + SELECT crsfactura + COUNT FOR cantitate < 0 TO lnNeg + ENDIF + DO S8Log WITH ' dupa Click: crsarticole=' + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)) + ; + ' crsfactura=' + TRANSFORM(IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0)) + ' din care negative=' + TRANSFORM(lnNeg) + DO S8Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + + DO Assert WITH !('amessagebox' $ LOWER(gcMockApeluri)), ; + 'A7: zero apeluri amessagebox pe comanda cu linie de discount (W2), jurnal=[' + ; + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + DO Assert WITH lnNeg > 0, 'A7 (diagnostic): linia de discount a ajuns in crsfactura, negative=' + TRANSFORM(lnNeg) + + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ' (A7);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Elibereaza WITH loForm + DO Goleste +ENDPROC + +*================================================================================== +* A8: tip 1 (lista de preturi) - llCautareInLinie sare peste incarcarea in masa, deci nici +* do_adauga_tot nu se cheama; crsfactura ramane gol. +PROCEDURE CazListaPreturi + LOCAL loForm, lnFact + + gcCaz = '[A8] ' + loForm = PregatesteFormular(1, NULL) + IF ISNULL(loForm) + RETURN + ENDIF + + DO ApasaIncarca WITH loForm + + lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) + DO S8Log WITH ' dupa Click: crsarticole=' + TRANSFORM(IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0)) + ; + ' crsfactura=' + TRANSFORM(lnFact) + DO S8Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + DO Assert WITH lnFact = 0, 'A8: pe tip 1 (cautare in linie) crsfactura ramane gol dupa Click, e=' + TRANSFORM(lnFact) + DO Assert WITH !('nu ati ales' $ LOWER(gcMockApeluri)), ; + 'A8: antetul a trecut validarea (Click-ul a ajuns la ramura llCautareInLinie, nu s-a oprit in valideaza_antet)' + + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ' (A8);' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Elibereaza WITH loForm + DO Goleste +ENDPROC + +*================================================================================== +* A9: contract (tip 2) - incarcarea in masa RULEAZA (crsarticole se umple), dar garda de tipuri +* din do_incarca_articole nu cheama do_adauga_tot; crsfactura ramane gol si nu apare niciun dialog. +* Contractul se alege incercand candidatii pe rand: unul fara linii ar declansa "Nu exista +* articole pentru optiunile alese!" din incarca_cursor_articole si ar strica asertiunea. +PROCEDURE CazContract + LOCAL lnI, llGasit + gcCaz = '[A9] ' + + IF goExecutor.oExecute([select ct.id_ctr from fact_vcontracte ct, nom_parteneri p ] + ; + [where ct.id_part = p.id_part and upper(p.denumire) not like '%CLIENT%' order by ct.id_ctr desc], 'crsCtrLista') < 0 + DO Assert WITH .F., 'A9: lista de contracte citita din Oracle' + RETURN + ENDIF + + llGasit = .F. + lnI = 0 + SELECT crsCtrLista + SCAN WHILE lnI < 6 AND !llGasit + lnI = lnI + 1 + llGasit = IncearcaContract(crsCtrLista.id_ctr) + SELECT crsCtrLista + ENDSCAN + DO Inchide WITH 'crsCtrLista' + IF !llGasit + DO Assert WITH .F., 'A9: niciun contract cu articole in primii ' + TRANSFORM(lnI) + ' candidati - cazul nu s-a exercitat' + ENDIF +ENDPROC + +FUNCTION IncearcaContract + LPARAMETERS tnIdCtr + LOCAL loSursa, loForm, lnArt, lnFact + + loSursa = CreeazaSursaContract(tnIdCtr) + IF ISNULL(loSursa) + RETURN .F. + ENDIF + loForm = PregatesteFormular(2, loSursa) + IF ISNULL(loForm) + RETURN .F. + ENDIF + + DO ApasaIncarca WITH loForm + + lnArt = IIF(USED('crsarticole'), RECCOUNT('crsarticole'), 0) + lnFact = IIF(USED('crsfactura'), RECCOUNT('crsfactura'), 0) + DO S8Log WITH ' contract ' + TRANSFORM(tnIdCtr) + ': crsarticole=' + TRANSFORM(lnArt) + ' crsfactura=' + TRANSFORM(lnFact) + + IF lnArt > 0 + DO S8Log WITH ' apeluri amessagebox = [' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + DO Assert WITH lnFact = 0, 'A9: pe tip 2 (contract) crsfactura ramane gol dupa Click - garda de tipuri, e=' + TRANSFORM(lnFact) + DO Assert WITH !('amessagebox' $ LOWER(gcMockApeluri)), ; + 'A9: zero apeluri amessagebox pe contract, jurnal=[' + STRTRAN(ALLTRIM(gcMockApeluri), CHR(13) + CHR(10), ' | ') + ']' + ENDIF + + gcNumere = gcNumere + 'DEZALOCAT serie=' + ALLTRIM(NVL(poDate.serie_act, '')) + ' nract=' + TRANSFORM(poDate.nract) + ' (A9 ctr ' + TRANSFORM(tnIdCtr) + ');' + poGeneratorNumere.dezaloca_numar(poDate.nIdTipDoc) + DO Elibereaza WITH loForm + DO Goleste + RETURN (lnArt > 0) +ENDFUNC + +*================================================================================== +* PregatesteFormular: poDate + generator + crsfactura gol + formular v2, gata de Click. +* Scrie direct in poDate / poGeneratorNumere / poDateGestiuneDest - PRIVATE-urile declarate de +* apelant sunt vizibile aici (nu se transmit prin referinta: @ pe PRIVATE e capcana platita deja). +* Intoarce NULL daca ceva din pregatire a esuat (a asertat deja). +FUNCTION PregatesteFormular + LPARAMETERS tnTip, toSursa + LOCAL loForm, lnIdSet + + DO CuratieCrs + SELECT 0 + + lnIdSet = 25000 + tnTip - 1 + IF ISNULL(toSursa) + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip) + ELSE + poDate = CREATEOBJECT("oDateFactura", lnIdSet, tnTip, toSursa) + ENDIF + poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") + poDateGestiuneDest = CREATEOBJECT("oDateGestiune") + + *-- tip 1 nu are sursa: antetul se completeaza cu un client real, altfel valideaza_antet + *-- respinge inainte sa se ajunga la ramura llCautareInLinie (si A8 ar trece degeaba) + IF ISNULL(toSursa) + IF goExecutor.oExecute([select id_part, nume from nom_parteneri where upper(nume) not like '%CLIENT%' and rownum = 1], 'crsPart') >= 0 ; + AND USED('crsPart') AND RECCOUNT('crsPart') > 0 + SELECT crsPart + poDate.id_client = id_part + poDate.nume_client = ALLTRIM(NVL(nume, '')) + USE IN crsPart + ENDIF + ENDIF + IF EMPTY(NVL(poDate.id_fdoc, 0)) + poDate.id_fdoc = 1 + ENDIF + poDate.id_delegat = 39 + + poGeneratorNumere.ResetNumere() + poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + IF poDate.rezultat_serii <> 3 + DO Assert WITH .F., 'rezultat_serii = 3 (o singura plaja, fara dialog) pe tip ' + TRANSFORM(tnTip) + ', e=' + TRANSFORM(poDate.rezultat_serii) + RETURN NULL + ENDIF + poDate.serie_act = poGeneratorNumere.getSerieCursor(poDate.nIdTipDoc) + poDate.nract = poGeneratorNumere.aloca_numar(poDate.nIdTipDoc, NULL) + DO S8Log WITH ' tip=' + TRANSFORM(tnTip) + ' nIdTipDoc=' + TRANSFORM(poDate.nIdTipDoc) + ; + ' serie_act=' + ALLTRIM(TRANSFORM(poDate.serie_act)) + ' nract=' + TRANSFORM(poDate.nract) + ; + ' listaid=[' + TRANSFORM(poDate.listaid) + '] id_client=' + TRANSFORM(poDate.id_client) + + IF poDate.tva_incasare = 0 + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_ex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ELSE + SELECT * FROM jtva_coloane_temp WHERE ISNULL(id_jtva_neex) AND !'RORTC' $ UPPER(coloana_jv) INTO CURSOR jtva_coloane + ENDIF + + *-- crsfactura gol INAINTE de formular, ca in factureaza() pe ramura llFacturareNoua; coloana + *-- gestiune e ceruta de coloana combo a grilei (tehnica din test_s4_3_neregresie_masa.prg) + DO creeaza_facturacrs WITH 'crsfactura' + SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE + USE IN crsfactura + SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE + USE IN crsfact_tmp + + loForm = CREATEOBJECT('frm_facturare_articole2') + IF VARTYPE(loForm) <> 'O' + DO Assert WITH .F., 'Createobject frm_facturare_articole2 pe tip ' + TRANSFORM(tnTip) + RETURN NULL + ENDIF + loForm.WindowType = 0 + loForm.Show() + DOEVENTS FORCE + RETURN loForm +ENDFUNC + +*================================================================================== +* ApasaIncarca: singura cale prin care testul declanseaza incarcarea. Mock-ul se reincarca imediat +* inainte, ca sa castige rezolutia de nume pentru amessagebox-ul apelat din interiorul .vcx. +PROCEDURE ApasaIncarca + LPARAMETERS toForm + SET PROCEDURE TO (gcMock) ADDITIVE + gcMockApeluri = '' + toForm.but_incarca_articole.Click() + DOEVENTS FORCE +ENDPROC + +*================================================================================== +* A10: documentul scris in Oracle - tip si id_jtva_coloana pe toate liniile. +PROCEDURE VerificaVanzare + LPARAMETERS tnIdVz + LOCAL lnTip, lnLinii, lnZero + IF goExecutor.oExecute([select tip from vanzari where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVz') < 0 OR RECCOUNT('crsVz') <> 1 + DO Assert WITH .F., 'A10: VANZARI contine documentul id_vanzare=' + TRANSFORM(tnIdVz) + DO Inchide WITH 'crsVz' + RETURN + ENDIF + SELECT crsVz + lnTip = tip + USE IN crsVz + DO Assert WITH lnTip = 3, 'A10: VANZARI.TIP = 3 pe documentul emis, e=' + TRANSFORM(lnTip) + + IF goExecutor.oExecute([select nvl(id_jtva_coloana,0) as id_jtva_coloana from vanzari_detalii where id_vanzare = ] + TRANSFORM(tnIdVz), 'crsVzD') < 0 + DO Assert WITH .F., 'A10: VANZARI_DETALII citit pentru id_vanzare=' + TRANSFORM(tnIdVz) + RETURN + ENDIF + SELECT crsVzD + lnLinii = RECCOUNT('crsVzD') + COUNT FOR id_jtva_coloana <= 0 TO lnZero + USE IN crsVzD + DO Assert WITH lnLinii > 0, 'A10: VANZARI_DETALII are linii, e=' + TRANSFORM(lnLinii) + DO Assert WITH lnZero = 0, 'A10: ID_JTVA_COLOANA > 0 pe toate liniile, linii cu 0/null=' + TRANSFORM(lnZero) +ENDPROC + +*================================================================================== +* Sursa reala pentru comanda (tip 3) - campurile citite de oDateFactura.Init pe ramura tnTip=3 +* (ofacturare_comun.prg:315). listaid trebuie caracter (do_scrie_factura face Val(poDate.listaid)). +FUNCTION CreeazaSursaComanda + LPARAMETERS tnIdComanda + LOCAL lnQ, loSursa + loSursa = NULL + lnQ = goExecutor.oExecute([select c.id_part, p.nume, p.cod_fiscal, c.id_comanda, c.nr_comanda, c.id_sectie ] + ; + [from comenzi c, nom_parteneri p where c.id_part = p.id_part and c.id_comanda = ] + TRANSFORM(tnIdComanda), 'crsSursaCom') + IF lnQ < 0 OR !USED('crsSursaCom') OR RECCOUNT('crsSursaCom') <> 1 + DO S8Log WITH ' EROARE sursa comanda ' + TRANSFORM(tnIdComanda) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare()) + DO Inchide WITH 'crsSursaCom' + RETURN loSursa + ENDIF + SELECT crsSursaCom + SCATTER NAME loSursa MEMO + USE IN crsSursaCom + loSursa.id_comanda = ALLTRIM(TRANSFORM(loSursa.id_comanda)) + loSursa.nr_comanda = ALLTRIM(TRANSFORM(loSursa.nr_comanda)) + RETURN loSursa +ENDFUNC + +* Sursa reala pentru contract (tip 2). FACT_VCONTRACTE nu are id_sectie/sectie/responsabil/valuta - +* se completeaza cu valori neutre, ca la S6-2. +FUNCTION CreeazaSursaContract + LPARAMETERS tnIdCtr + LOCAL lnQ, loSursa + loSursa = NULL + lnQ = goExecutor.oExecute([select ct.id_part, p.denumire, p.cod_fiscal, ct.id_ctr, ct.contract ] + ; + [from fact_vcontracte ct, nom_parteneri p where ct.id_part = p.id_part and ct.id_ctr = ] + TRANSFORM(tnIdCtr), 'crsSursaCtr') + IF lnQ < 0 OR !USED('crsSursaCtr') OR RECCOUNT('crsSursaCtr') <> 1 + DO S8Log WITH ' EROARE sursa contract ' + TRANSFORM(tnIdCtr) + ': ' + TRANSFORM(goExecutor.oPrelucrareEroare()) + DO Inchide WITH 'crsSursaCtr' + RETURN loSursa + ENDIF + SELECT crsSursaCtr + SCATTER NAME loSursa MEMO + USE IN crsSursaCtr + ADDPROPERTY(loSursa, 'id_sectie', 0) + ADDPROPERTY(loSursa, 'sectie', '') + ADDPROPERTY(loSursa, 'id_responsabil', 0) + ADDPROPERTY(loSursa, 'responsabil', '') + ADDPROPERTY(loSursa, 'id_valuta', 1) + ADDPROPERTY(loSursa, 'nume_val', 'RON') + RETURN loSursa +ENDFUNC + +*================================================================================== +PROCEDURE Elibereaza + LPARAMETERS toForm + IF TYPE('toForm') = 'O' AND !ISNULL(toForm) + TRY + toForm.Release() + CATCH + ENDTRY + ENDIF + DO CuratieCrs +ENDPROC + +PROCEDURE CuratieCrs + DO Inchide WITH 'crsarticole' + DO Inchide WITH 'crsarticole1' + DO Inchide WITH 'crsfactura' + DO Inchide WITH 'crscursuri' + DO Inchide WITH 'crspolitici' + DO Inchide WITH 'crscontracte' + DO Inchide WITH 'crsgestiunidest' + DO Inchide WITH 'crsCtrTemp' + DO Inchide WITH 'crsComTemp' + DO Inchide WITH 'crsartselectate' + DO Inchide WITH 'jtva_coloane' +ENDPROC + +PROCEDURE Inchide + LPARAMETERS tcAlias + IF USED(tcAlias) + USE IN (tcAlias) + ENDIF +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO S8Log WITH 'PASS: ' + gcCaz + tcMsg + ELSE + gnFail = gnFail + 1 + DO S8Log WITH 'FAIL: ' + gcCaz + tcMsg + ENDIF +ENDPROC + +PROCEDURE S8Log + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcLog, 1) +ENDPROC + +PROCEDURE S8Err + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnErr = gnErr + 1 + DO S8Log WITH 'ERROR ' + TRANSFORM(tnErr) + ' [' + tcProg + ':' + TRANSFORM(tnLine) + '] ' + tcMsg +ENDPROC + +PROCEDURE S8Final + LOCAL lnI + IF TYPE('_SCREEN.tmrS8') = 'O' + _SCREEN.tmrS8.Enabled = .F. + TRY + _SCREEN.RemoveObject('tmrS8') + CATCH + ENDTRY + ENDIF + *-- formele ramase deschise arunca "Unhandled Structured Exception" la QUIT (caseta modala = + *-- rulare atarnata), asa ca se inchid explicit inainte + FOR lnI = _SCREEN.FormCount TO 1 STEP -1 + TRY + _SCREEN.Forms(lnI).Release() + CATCH + ENDTRY + ENDFOR + DO S8Log WITH CHR(13) + CHR(10) + 'NUMERE: ' + gcNumere + DO S8Log WITH 'TOTAL pass=' + TRANSFORM(gnPass) + ' fail=' + TRANSFORM(gnFail) + ' err=' + TRANSFORM(gnErr) + DO S8Log WITH 'END ' + TTOC(DATETIME()) + QUIT +ENDPROC + +PROCEDURE Goleste + poDate = NULL + poGeneratorNumere = NULL + poDateGestiuneDest = NULL +ENDPROC + +*================================================================================== +* driverMsgS8: apasa automat cmdYes/cmdOk pe forma modala MESSAGEBOX_FORM (ex. "Doriti sa se +* inchida comanda?" la emiterea pe tip 3) - acele dialoguri nu trec prin functia amessagebox, deci +* mock-ul nu le acopera. Garda de reintrare lBusy: do_termin cedeaza controlul buclei de mesaje. +* Nu atinge in niciun fel FRM_FACTURARE_ARTICOLE2. +DEFINE CLASS driverMsgS8 AS Custom + lBusy = .F. + + PROCEDURE Executa + IF This.lBusy + RETURN + ENDIF + This.lBusy = .T. + IF TYPE('_SCREEN.tmrS8') = 'O' + _SCREEN.tmrS8.Enabled = .F. + ENDIF + TRY + LOCAL lnI, loMsgForm, lcClasa + loMsgForm = NULL + FOR lnI = 1 TO _SCREEN.FormCount + lcClasa = UPPER(_SCREEN.Forms(lnI).Class) + IF 'MESSAGEBOX_FORM' $ lcClasa + loMsgForm = _SCREEN.Forms(lnI) + ENDIF + IF !(lcClasa $ gcClaseVazute) + gcClaseVazute = gcClaseVazute + lcClasa + ';' + DO S8Log WITH ' [diag timer] forma noua: ' + lcClasa + ' Caption=[' + TRANSFORM(_SCREEN.Forms(lnI).Caption) + ']' + ENDIF + ENDFOR + IF !ISNULL(loMsgForm) + TRY + DO CASE + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdYes', 5) + DO S8Log WITH ' [driver msg] apas cmgBotones.cmdYes' + loMsgForm.cmgBotones.cmdYes.Click() + CASE PEMSTATUS(loMsgForm.cmgBotones, 'cmdOk', 5) + DO S8Log WITH ' [driver msg] apas cmgBotones.cmdOk' + loMsgForm.cmgBotones.cmdOk.Click() + ENDCASE + CATCH TO loExcMsg + DO S8Log WITH ' [driver msg] CATCH ' + TRANSFORM(loExcMsg.ErrorNo) + ' ' + loExcMsg.Message + ENDTRY + ENDIF + CATCH TO loExcTop + DO S8Log WITH ' [driver] CATCH ' + TRANSFORM(loExcTop.ErrorNo) + ' ' + loExcTop.Message + FINALLY + IF TYPE('_SCREEN.tmrS8') = 'O' + _SCREEN.tmrS8.Enabled = .T. + ENDIF + This.lBusy = .F. + ENDTRY + ENDPROC +ENDDEFINE diff --git a/utile/Teste/facturare_unificat/test_s8_cablare_incarcare.ps1 b/utile/Teste/facturare_unificat/test_s8_cablare_incarcare.ps1 new file mode 100644 index 0000000..42eba36 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s8_cablare_incarcare.ps1 @@ -0,0 +1,28 @@ +$ErrorActionPreference = 'Stop' +$dir = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat' +$prg = Join-Path $dir 'test_s8_cablare_incarcare.prg' +$log = Join-Path $dir 'out\test_s8_cablare_incarcare.log' +$vfp = 'C:\Program Files (x86)\Microsoft Visual FoxPro 9\vfp9.exe' + +$viu = Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s8_cablare_incarcare*' } +if ($viu) { + "Ruleaza deja o instanta a suitei (PID " + ($viu.ProcessId -join ',') + "). Nu lansez a doua." + exit 1 +} + +Set-Location $dir +Remove-Item (Join-Path $dir 'test_s8_cablare_incarcare.FXP') -ErrorAction SilentlyContinue +Remove-Item $log -ErrorAction SilentlyContinue + +$p = Start-Process -FilePath $vfp -ArgumentList '-A', '-T', $prg -PassThru +"lansat PID " + $p.Id +$null = $p.WaitForExit(300000) +if (-not $p.HasExited) { + "ATARNAT dupa 300s - omor instanta (filtrat pe CommandLine)" + Get-WmiObject Win32_Process -Filter "Name='vfp9.exe'" | Where-Object { $_.CommandLine -like '*test_s8_cablare_incarcare*' } | ForEach-Object { Stop-Process -Id $_.ProcessId -Force } +} +if (Test-Path $log) { + Get-Content $log +} else { + "Log inexistent: $log" +} diff --git a/utile/Teste/facturare_unificat/test_s8_geometrie_ui.prg b/utile/Teste/facturare_unificat/test_s8_geometrie_ui.prg new file mode 100644 index 0000000..a6c12ed --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s8_geometrie_ui.prg @@ -0,0 +1,315 @@ +* test_s8_geometrie_ui.prg - verifica geometria formularului frm_facturare_articole2 +* (COMUN\clase\ofacturare.vc2) dupa reparatia S8h-S8m: banda de sub grila (chk_alte_date, +* chk_incasare, lb_antet_alte_date, lb_antet_incasare, ct_document, ct_contabilitate, +* ct_livrare, ct_incasare, but_cursuri) si banda de totaluri. +* Opt pasi: (0) ambele acordeoane inchise; (1-2) redimensionare cu acordeoanele inchise +* (micsorare, apoi marire peste maximizat initial); (3) doar Alte date deschis; (4) doar +* Incasare deschis; (5) ambele deschise; (6-7) redimensionare cu acordeoanele deschise +* (micsorare, apoi marire). +* Doua serii de asertiuni pe fiecare pas, pentru cele 10 controale de mai sus (mai putin +* lb_total_baza): control.Top >= grd_factura.Top+grd_factura.Height (banda de sub grila) si, +* pentru containerele vizibile, control.Top+control.Height <= lb_total_baza.Top (banda de +* totaluri). Log-ul mai contine si o verificare a latimii calculate din cod pentru +* lb_antet_alte_date. +* Rulare: powershell -ExecutionPolicy Bypass -File test_s8_geometrie_ui.ps1 (timeout >= 400s) +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcUILog, gcSyncDir, gnFail, gnPass, gnAssertFail, gnAssertPass, gnAssertPass2, gnAssertFail2, ; + gnAssertPassR, gnAssertFailR, gnAssertPass2R, gnAssertFail2R +gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s8_geometrie_ui_log.txt" +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_s8_geometrie\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) +gnFail = 0 +gnPass = 0 +gnAssertFail = 0 +gnAssertPass = 0 +gnAssertPass2 = 0 +gnAssertFail2 = 0 +gnAssertPassR = 0 +gnAssertFailR = 0 +gnAssertPass2R = 0 +gnAssertFail2R = 0 +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnScadereStoc = 0 + +* seriile de facturi (tipdoc 5) sunt pe utilizator in MARIUSM_AUTO +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) + +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +IF !USED('saft_tip_facturi') + update_saft_tip_facturi() +ENDIF + +PRIVATE poDate, poGeneratorNumere, loForm +poDate = CREATEOBJECT("oDateFactura", 25000, 1) +poDate.nIdTipDoc = 5 +poDate.totalctva = 1000 +DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") +poGeneratorNumere.ResetNumere() +poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + +loForm = CREATEOBJECT('frm_facturare_articole2') +DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" +IF VARTYPE(loForm) <> 'O' + DO Final +ENDIF + +loForm.WindowType = 0 +loForm.Show() +loForm.WindowState = 2 +DOEVENTS FORCE +DO AfLog WITH "formular afisat si maximizat" + +* --- pas 0: (a) ambele acordeoane inchise --- +DO AfLog WITH "=== PAS 0: ambele inchise ===" +DO VerificaGeometrie WITH loForm, "pas0_ambele_inchise" +DO HarnessStep WITH 0, 'ambele_inchise', 25 + +* --- pasii 1-2: redimensionare CU ACORDEOANELE INCHISE --- +DO AfLog WITH "=== PAS 1-2: redimensionare CU ACORDEOANELE INCHISE ===" +loForm.WindowState = 0 +DOEVENTS FORCE +loForm.Height = loForm.Height - 80 +DOEVENTS FORCE +DO AfLog WITH "dupa WindowState=0 + Height-=80 (MICSORARE, acordeoane inchise): This.Height=" + TRANSFORM(loForm.Height) + " This.Width=" + TRANSFORM(loForm.Width) +DO VerificaGeometrie WITH loForm, "pas1_resize_inchis_micsorare", .T. +DO HarnessStep WITH 1, 'resize_inchis_micsorare', 25 + +loForm.Height = loForm.Height + 380 +DOEVENTS FORCE +DO AfLog WITH "dupa Height+=380 (MARIRE peste maximizat initial, acordeoane inchise): This.Height=" + TRANSFORM(loForm.Height) + " This.Width=" + TRANSFORM(loForm.Width) +DO VerificaGeometrie WITH loForm, "pas2_resize_inchis_marire", .T. +DO HarnessStep WITH 2, 'resize_inchis_marire', 25 + +* revin la maximizat pentru restul secventei (starea "normala" de lucru) +loForm.WindowState = 2 +DOEVENTS FORCE +DOEVENTS FORCE + +* --- pas 3: (b) doar Alte date deschis --- +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +DO AfLog WITH "=== PAS 3: doar Alte date deschis ===" +DO VerificaGeometrie WITH loForm, "pas3_alte_date_deschis" +DO HarnessStep WITH 3, 'alte_date_deschis', 25 + +* inchid Alte date la loc, ca pasul 4 sa fie curat "doar incasare" +loForm.chk_alte_date.Value = 0 +loForm.do_comuta_alte_date() +DOEVENTS FORCE + +* --- pas 4: (c) doar Incasare deschis (aloca o chitanta reala - dezalocata la final) --- +loForm.chk_incasare.Value = 1 +loForm.do_comuta_incasare() +DOEVENTS FORCE +DO AfLog WITH "=== PAS 4: doar Incasare deschis ===" +DO VerificaGeometrie WITH loForm, "pas4_incasare_deschis" +DO HarnessStep WITH 4, 'incasare_deschis', 25 + +* --- pas 5: (d) AMBELE deschise simultan (incasare ramane deschisa, deschid si alte date) --- +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +DO AfLog WITH "=== PAS 5: AMBELE deschise ===" +DO VerificaGeometrie WITH loForm, "pas5_ambele_deschise" +DO HarnessStep WITH 5, 'ambele_deschise', 25 + +* --- pasii 6-7: redimensionare CU ACORDEOANELE DESCHISE --- +DO AfLog WITH "=== PAS 6-7: redimensionare CU ACORDEOANELE DESCHISE ===" +loForm.WindowState = 0 +DOEVENTS FORCE +loForm.Height = loForm.Height - 80 +DOEVENTS FORCE +DO AfLog WITH "dupa WindowState=0 + Height-=80 (MICSORARE, acordeoane deschise): This.Height=" + TRANSFORM(loForm.Height) + " This.Width=" + TRANSFORM(loForm.Width) +DO VerificaGeometrie WITH loForm, "pas6_resize_deschis_micsorare", .T. +DO HarnessStep WITH 6, 'dupa_micsorare', 25 + +loForm.Height = loForm.Height + 380 +DOEVENTS FORCE +DO AfLog WITH "dupa Height+=380 (MARIRE peste maximizat initial, acordeoane deschise): This.Height=" + TRANSFORM(loForm.Height) + " This.Width=" + TRANSFORM(loForm.Width) +DO VerificaGeometrie WITH loForm, "pas7_resize_deschis_marire", .T. +DO HarnessStep WITH 7, 'dupa_marire', 25 + +* revin la maximizat pentru consistenta la Release() +loForm.WindowState = 2 +DOEVENTS FORCE + +* curatenie obligatorie: inchid ambele, dezaloc chitanta alocata la pasul 4, inainte de Release() +loForm.chk_alte_date.Value = 0 +loForm.do_comuta_alte_date() +loForm.chk_incasare.Value = 0 +loForm.do_comuta_incasare() + +loForm.Release() +RELEASE loForm + +DO AfLog WITH "TOTAL asertiuni grid (pas0+3-5): pass=" + TRANSFORM(gnAssertPass) + " fail=" + TRANSFORM(gnAssertFail) +DO AfLog WITH "TOTAL asertiuni totaluri (pas0+3-5): pass=" + TRANSFORM(gnAssertPass2) + " fail=" + TRANSFORM(gnAssertFail2) +DO AfLog WITH "TOTAL asertiuni grid (resize, toate): pass=" + TRANSFORM(gnAssertPassR) + " fail=" + TRANSFORM(gnAssertFailR) +DO AfLog WITH "TOTAL asertiuni totaluri (resize, toate): pass=" + TRANSFORM(gnAssertPass2R) + " fail=" + TRANSFORM(gnAssertFail2R) +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE VerificaGeometrie + * Logheaza Top/Height/Bottom pentru grid + cele 10 controale cerute si verifica + * control.Top >= grd_factura.Top + grd_factura.Height pentru fiecare (control.Height logat, + * dar asertiunea NU cere Bottom-ul controlului, doar Top-ul lui, ca in cerinta primita). + LPARAMETERS toForm, tcEticheta, tlResize + LOCAL lnGTop, lnGHeight, lnGBottom + IF PCOUNT() < 3 + tlResize = .F. + ENDIF + lnGTop = toForm.grd_factura.Top + lnGHeight = toForm.grd_factura.Height + lnGBottom = lnGTop + lnGHeight + DO AfLog WITH "GRID [" + tcEticheta + "] Top=" + TRANSFORM(lnGTop) + " Height=" + TRANSFORM(lnGHeight) + " Bottom=" + TRANSFORM(lnGBottom) + " Width=" + TRANSFORM(toForm.grd_factura.Width) + " This.Width=" + TRANSFORM(toForm.Width) + + DO VerificaControl WITH toForm.chk_incasare, "chk_incasare", tcEticheta, lnGBottom, tlResize + DO VerificaControl WITH toForm.chk_alte_date, "chk_alte_date", tcEticheta, lnGBottom, tlResize + DO VerificaControl WITH toForm.lb_antet_incasare, "lb_antet_incasare", tcEticheta, lnGBottom, tlResize + DO VerificaControl WITH toForm.lb_antet_alte_date, "lb_antet_alte_date", tcEticheta, lnGBottom, tlResize + DO VerificaControl WITH toForm.ct_document, "ct_document", tcEticheta, lnGBottom, tlResize + DO VerificaControl WITH toForm.ct_contabilitate, "ct_contabilitate", tcEticheta, lnGBottom, tlResize + DO VerificaControl WITH toForm.ct_livrare, "ct_livrare", tcEticheta, lnGBottom, tlResize + DO VerificaControl WITH toForm.ct_incasare, "ct_incasare", tcEticheta, lnGBottom, tlResize + DO VerificaControl WITH toForm.but_cursuri, "but_cursuri", tcEticheta, lnGBottom, tlResize + + DO AfLog WITH "RISC3 [" + tcEticheta + "] ct_document.Objects.Count=" + TRANSFORM(toForm.ct_document.Objects.Count) + " ct_document.Visible=" + TRANSFORM(toForm.ct_document.Visible) + " ct_contabilitate.Top=" + TRANSFORM(toForm.ct_contabilitate.Top) + " ct_livrare.Top=" + TRANSFORM(toForm.ct_livrare.Top) + + * lb_antet_alte_date.Width e calculat in cod din This.Width (aseaza_alte_date: + * This.lb_antet_alte_date.Width = This.Width - 24 - This.lb_antet_alte_date.Left) - verific ca + * latirea orizontala nu s-a pierdut. + LOCAL lnLatAsteptata, lnLatReala + lnLatReala = toForm.lb_antet_alte_date.Width + lnLatAsteptata = toForm.Width - 24 - toForm.lb_antet_alte_date.Left + DO AfLog WITH "LATIME [" + tcEticheta + "] lb_antet_alte_date.Left=" + TRANSFORM(toForm.lb_antet_alte_date.Left) + " Width=" + TRANSFORM(lnLatReala) + " asteptata(This.Width-24-Left)=" + TRANSFORM(lnLatAsteptata) + " " + IIF(lnLatReala = lnLatAsteptata, "OK", "MISMATCH") + + LOCAL lnFormHeight, lnBanda, lnTotalTop + lnFormHeight = toForm.Height + lnBanda = lnFormHeight - 103 + lnTotalTop = toForm.lb_total_baza.Top + DO AfLog WITH "S8I [" + tcEticheta + "] This.Height=" + TRANSFORM(lnFormHeight) + " lnBanda(Height-103)=" + TRANSFORM(lnBanda) + " lb_total_baza.Top=" + TRANSFORM(lnTotalTop) + + DO VerificaTotaluri WITH toForm.ct_document, "ct_document", tcEticheta, lnTotalTop, tlResize + DO VerificaTotaluri WITH toForm.ct_contabilitate, "ct_contabilitate", tcEticheta, lnTotalTop, tlResize + DO VerificaTotaluri WITH toForm.ct_livrare, "ct_livrare", tcEticheta, lnTotalTop, tlResize + DO VerificaTotaluri WITH toForm.ct_incasare, "ct_incasare", tcEticheta, lnTotalTop, tlResize +ENDPROC + +PROCEDURE VerificaTotaluri + * Asertiune control.Top+control.Height <= lb_total_baza.Top, DOAR pentru controale vizibile + * (un container inchis/invizibil nu conteaza pentru suprapunerea cu banda de totaluri). + * tlResize=.T. -> contorizeaza separat (pasii de resize), ca sa nu se amestece cu totalul. + LPARAMETERS toCtrl, tcNume, tcEticheta, tnTotalTop, tlResize + LOCAL lnTop, lnHeight, lnBottom, llVis, llOk + lnTop = toCtrl.Top + lnHeight = toCtrl.Height + lnBottom = lnTop + lnHeight + llVis = IIF(TYPE('toCtrl.Visible') = 'L', toCtrl.Visible, .T.) + IF !llVis + DO AfLog WITH "TOTALURI-SKIP [" + tcEticheta + "] " + tcNume + " invizibil, Bottom=" + TRANSFORM(lnBottom) + " (neasertat)" + RETURN + ENDIF + llOk = (lnBottom <= tnTotalTop) + IF tlResize + IF llOk + gnAssertPass2R = gnAssertPass2R + 1 + ELSE + gnAssertFail2R = gnAssertFail2R + 1 + ENDIF + ELSE + IF llOk + gnAssertPass2 = gnAssertPass2 + 1 + ELSE + gnAssertFail2 = gnAssertFail2 + 1 + ENDIF + ENDIF + DO AfLog WITH IIF(llOk, "TOTALURI-PASS", "TOTALURI-FAIL") + " [" + tcEticheta + "] " + tcNume + ".Bottom=" + TRANSFORM(lnBottom) + " (Top=" + TRANSFORM(lnTop) + " Height=" + TRANSFORM(lnHeight) + ") lb_total_baza.Top=" + TRANSFORM(tnTotalTop) + " marja=" + TRANSFORM(tnTotalTop - lnBottom) +ENDPROC + +PROCEDURE VerificaControl + * tlResize=.T. -> contorizeaza separat (pasii de resize), ca sa nu se amestece cu totalul. + LPARAMETERS toCtrl, tcNume, tcEticheta, tnGBottom, tlResize + LOCAL lnTop, lnHeight, llVis, llOk + lnTop = toCtrl.Top + lnHeight = toCtrl.Height + llVis = IIF(TYPE('toCtrl.Visible') = 'L', toCtrl.Visible, .T.) + llOk = (lnTop >= tnGBottom) + IF tlResize + IF llOk + gnAssertPassR = gnAssertPassR + 1 + ELSE + gnAssertFailR = gnAssertFailR + 1 + ENDIF + ELSE + IF llOk + gnAssertPass = gnAssertPass + 1 + ELSE + gnAssertFail = gnAssertFail + 1 + ENDIF + ENDIF + DO AfLog WITH IIF(llOk, "ASSERT-PASS", "ASSERT-FAIL") + " [" + tcEticheta + "] " + tcNume + ".Top=" + TRANSFORM(lnTop) + " Height=" + TRANSFORM(lnHeight) + " Visible=" + TRANSFORM(llVis) + " (grid.Bottom=" + TRANSFORM(tnGBottom) + ", delta=" + TRANSFORM(lnTop - tnGBottom) + ")" +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO AfLog WITH "PASS: " + tcMsg + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL: " + tcMsg + ENDIF +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + DO HarnessDone WITH 'done' + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s8_geometrie_ui.ps1 b/utile/Teste/facturare_unificat/test_s8_geometrie_ui.ps1 new file mode 100644 index 0000000..9020a9c --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s8_geometrie_ui.ps1 @@ -0,0 +1,11 @@ +# test_s8_geometrie_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru +# test_s8_geometrie_ui.prg. Opt pasi: ambele acordeoane inchise, resize cu acordeoanele +# inchise (micsorare+marire), cele 3 stari ramase de acordeon, resize cu acordeoanele +# deschise (micsorare+marire). +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_s8_geometrie_ui.prg') ` + -Steps @('ambele_inchise','resize_inchis_micsorare','resize_inchis_marire','alte_date_deschis','incasare_deschis','ambele_deschise','dupa_micsorare','dupa_marire') ` + -SyncDir (Join-Path $Teste 'uisync_s8_geometrie') ` + -ShotsDir (Join-Path $Teste 'screenshots_s8_geometrie') diff --git a/utile/Teste/facturare_unificat/test_s8o_1366_ui.prg b/utile/Teste/facturare_unificat/test_s8o_1366_ui.prg new file mode 100644 index 0000000..055807b --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s8o_1366_ui.prg @@ -0,0 +1,315 @@ +* test_s8o_1366_ui.prg - proba empirica S8o: incape stiva "alte date" + banda de totaluri +* in frm_facturare_articole2 (COMUN\clase\ofacturare.vc2) la rezolutia minima suportata, +* 1366x768, maximizat? Prin analogie cu test_s8_geometrie_ui.prg (nemodificat), dar cu +* This.Height calculat pentru un desktop de 768px inaltime, nu masurat pe ecranul real al +* masinii de test. +* +* Inaltimea utila 1366x768 maximizat: nu presupun taskbar=40px si nu insumez SYSMETRIC() +* individuale (title bar / border - risc de interpretare gresita a codurilor). Masor direct +* pe masina de test overhead-ul real (WindowState=2, This.Height fata de SYSMETRIC(2) - inaltimea +* ecranului fizic), presupunand ca overhead-ul (bara de titlu + eventual meniu/toolbar VFP + +* taskbar) e in pixeli ficsi, independent de rezolutie, la acelasi DPI: +* lnOverhead = SYSMETRIC(2) - This.Height(maximizat real) +* This.Height(1366x768) = 768 - lnOverhead +* SYSMETRIC(1/2/4/9) sunt logate brut, ca diagnostic, dar NU intra in formula de mai sus. +* +* Sase pasi (cele 4 stari de casete + decizia 4: acordeoane mutual exclusive sub 1366x768): +* (0) ambele inchise; (1) doar Alte date; (2) doar Incasare; (3) deschid Alte date peste +* Incasare deschisa - exclusivitatea trebuie sa inchida Incasare (cazul raportat de Marius, +* acum reparat); (4) deschid Incasare peste Alte date deschisa - exclusivitate in sens invers; +* (5) ca (4), dar cu poDate.lEditare=.T. (editare document existent) - verifica explicit ca +* reasezarea (Visible=.F. pe ct_document/ct_contabilitate/ct_livrare) chiar se produce si pe +* calea do_comuta_incasare -> actualizeaza_tipincasare(), care iese devreme (Return) cat timp +* poDate.lEditare e .T., inainte de a ajunge la Thisform.aseaza_alte_date(). +* La fiecare pas 0-4, pe langa cele doua asertiuni din test_s8_geometrie_ui.prg (control.Top >= +* grd_factura.Top+Height si, pentru containere vizibile, control.Top+Height <= lb_total_baza.Top), +* se adauga o a treia: grd_factura.Height > 60 (gridul nu s-a clampat la minimul tehnic). Pasii +* 3-5 mai verifica explicit ca checkbox-ul opus s-a inchis automat (do_comuta_alte_date / +* do_comuta_incasare, ofacturare.vc2) SI ca pozitia/vizibilitatea reala s-a actualizat (nu doar +* .Value). +* Rulare: powershell -ExecutionPolicy Bypass -File test_s8o_1366_ui.ps1 (timeout >= 400s) +SET SAFETY OFF +SET TALK OFF +SET NOTIFY OFF +PUBLIC gcUILog, gcSyncDir, gnFail, gnPass, gnAssertFail, gnAssertPass, gnAssertPass2, gnAssertFail2, ; + gnAssertPassG, gnAssertFailG +gcUILog = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_s8o_1366_ui_log.txt" +gcSyncDir = "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\uisync_s8o_1366\" +STRTOFILE("START " + TTOC(DATETIME()) + CHR(13) + CHR(10), gcUILog) +gnFail = 0 +gnPass = 0 +gnAssertFail = 0 +gnAssertPass = 0 +gnAssertPass2 = 0 +gnAssertFail2 = 0 +gnAssertPassG = 0 +gnAssertFailG = 0 +ON ERROR DO AfErr WITH ERROR(), MESSAGE(), PROGRAM(), LINENO() +ON SHUTDOWN QUIT + +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 +SET PROCEDURE TO "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\mock_amessagebox.prg", "D:\ROA\ROAFACTURARE\COMUN\utile\Teste\ui_harness.prg" ADDITIVE +PUBLIC gcMockUltimMesaj, gnMockUltimTip +gcMockUltimMesaj = "" +gnMockUltimTip = 0 +DO AfLog WITH "ENV OK, gnAn=" + TRANSFORM(gnAn) + " gnLuna=" + TRANSFORM(gnLuna) +IF !actualizeaza_optiuni_program() + DO AfLog WITH "FAIL: actualizeaza_optiuni_program()" + DO Final +ENDIF +gnScadereStoc = 0 + +* seriile de facturi (tipdoc 5) sunt pe utilizator in MARIUSM_AUTO +gnIdUtil = 8 +goExecutor.oExecuta([begin pack_sesiune.set_Id_Util(?gnIdUtil); end;]) + +* gridextras.vcx e referit din ofacturare.vcx cu cale relativa +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras\gridextras.vcx" ADDITIVE +SET PATH TO "D:\ROA\ROAFACTURARE\COMUN\utile\gridextras" ADDITIVE +SET CLASSLIB TO "D:\ROA\ROAFACTURARE\COMUN\clase\_cb_base.vcx" ADDITIVE + +IF USED('crscursuri') + USE IN crscursuri +ENDIF +CREATE CURSOR crscursuri (curs N(12,4), nume_val C(10), multiplicator N(6)) +DO creeaza_facturacrs WITH 'crsfactura' +SELECT *, CAST(NULL AS C(100)) AS gestiune FROM crsfactura INTO CURSOR crsfact_tmp READWRITE +USE IN crsfactura +SELECT * FROM crsfact_tmp INTO CURSOR crsfactura READWRITE +USE IN crsfact_tmp + +IF !USED('saft_tip_facturi') + update_saft_tip_facturi() +ENDIF + +PRIVATE poDate, poGeneratorNumere, loForm +poDate = CREATEOBJECT("oDateFactura", 25000, 1) +poDate.nIdTipDoc = 5 +poDate.totalctva = 1000 +DO AfLog WITH "poDate.tip=" + TRANSFORM(poDate.tip) + " poDate.eProforma=" + TRANSFORM(poDate.eProforma) +poGeneratorNumere = CREATEOBJECT("oGeneratorNumere") +poGeneratorNumere.ResetNumere() +poDate.rezultat_serii = poGeneratorNumere.creeaza_cursor_serii(poDate.nIdTipDoc) + +loForm = CREATEOBJECT('frm_facturare_articole2') +DO Assert WITH VARTYPE(loForm) = 'O', "Createobject frm_facturare_articole2" +IF VARTYPE(loForm) <> 'O' + DO Final +ENDIF + +loForm.WindowType = 0 +loForm.Show() + +* --- masurare inaltime utila reala (maximizare normala pe ecranul masinii de test) --- +DO AfLog WITH "=== MASURARE ECRAN REAL ===" +DO AfLog WITH "SYSMETRIC(1) latime ecran=" + TRANSFORM(SYSMETRIC(1)) +DO AfLog WITH "SYSMETRIC(2) inaltime ecran=" + TRANSFORM(SYSMETRIC(2)) +DO AfLog WITH "SYSMETRIC(4) inaltime bara titlu=" + TRANSFORM(SYSMETRIC(4)) +DO AfLog WITH "SYSMETRIC(9)=" + TRANSFORM(SYSMETRIC(9)) +loForm.WindowState = 2 +DOEVENTS FORCE +LOCAL lnHMaxReal, lnScreenH, lnOverhead, lnHeight768 +lnHMaxReal = loForm.Height +lnScreenH = SYSMETRIC(2) +lnOverhead = lnScreenH - lnHMaxReal +lnHeight768 = 768 - lnOverhead +DO AfLog WITH "maximizat real: This.Width=" + TRANSFORM(loForm.Width) + " This.Height=" + TRANSFORM(lnHMaxReal) + " SYSMETRIC(2)=" + TRANSFORM(lnScreenH) +DO AfLog WITH "lnOverhead(SYSMETRIC(2)-This.Height maximizat)=" + TRANSFORM(lnOverhead) +DO AfLog WITH "lnHeight768(768-lnOverhead)=" + TRANSFORM(lnHeight768) + +* --- fortez geometria unui formular maximizat pe un desktop de 1366x768 --- +loForm.WindowState = 0 +DOEVENTS FORCE +loForm.Width = 1366 +loForm.Height = lnHeight768 +DOEVENTS FORCE +DO AfLog WITH "dupa setare 1366x768: This.Width=" + TRANSFORM(loForm.Width) + " This.Height=" + TRANSFORM(loForm.Height) + +* --- pas 0: ambele acordeoane inchise --- +DO AfLog WITH "=== PAS 0: ambele inchise (1366x768) ===" +DO VerificaGeometrie1366 WITH loForm, "pas0_ambele_inchise_1366" +DO HarnessStep WITH 0, 'ambele_inchise', 25 + +* --- pas 1: doar Alte date deschis --- +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +DO AfLog WITH "=== PAS 1: doar Alte date deschis (1366x768) ===" +DO VerificaGeometrie1366 WITH loForm, "pas1_alte_date_deschis_1366" +DO HarnessStep WITH 1, 'alte_date_deschis', 25 + +* inchid Alte date la loc, ca pasul 2 sa fie curat "doar incasare" +loForm.chk_alte_date.Value = 0 +loForm.do_comuta_alte_date() +DOEVENTS FORCE + +* --- pas 2: doar Incasare deschis (aloca o chitanta reala - dezalocata la final) --- +loForm.chk_incasare.Value = 1 +loForm.do_comuta_incasare() +DOEVENTS FORCE +DO AfLog WITH "=== PAS 2: doar Incasare deschis (1366x768) ===" +DO VerificaGeometrie1366 WITH loForm, "pas2_incasare_deschis_1366" +DO HarnessStep WITH 2, 'incasare_deschis', 25 + +* --- pas 3: deschid Alte date peste Incasare deschisa (cazul raportat de Marius) - decizia 4: +* sub pragul de 1366x768, exclusivitatea acordeoanelor trebuie sa inchida Incasare --- +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +DO AfLog WITH "=== PAS 3: Alte date peste Incasare - exclusivitate acordeon (1366x768) ===" +DO Assert WITH loForm.chk_incasare.Value = 0, "PAS3: chk_incasare s-a inchis automat (exclusivitate acordeon)" +DO Assert WITH loForm.chk_alte_date.Value = 1, "PAS3: chk_alte_date a ramas deschis" +DO VerificaGeometrie1366 WITH loForm, "pas3_exclusivitate_alte_peste_incasare_1366" +DO HarnessStep WITH 3, 'exclusivitate_alte_peste_incasare', 25 + +* --- pas 4: deschid Incasare peste Alte date deschisa - exclusivitate in sens invers --- +loForm.chk_incasare.Value = 1 +loForm.do_comuta_incasare() +DOEVENTS FORCE +DO AfLog WITH "=== PAS 4: Incasare peste Alte date - exclusivitate acordeon, sens invers (1366x768) ===" +DO Assert WITH loForm.chk_alte_date.Value = 0, "PAS4: chk_alte_date s-a inchis automat (exclusivitate acordeon)" +DO Assert WITH loForm.chk_incasare.Value = 1, "PAS4: chk_incasare a ramas deschis" +DO VerificaGeometrie1366 WITH loForm, "pas4_exclusivitate_incasare_peste_alte_1366" +DO HarnessStep WITH 4, 'exclusivitate_incasare_peste_alte', 25 + +* --- pas 5: exclusivitate cu poDate.lEditare = .T. (editare document existent) - verifica ca +* reasezarea chiar se face si pe calea do_comuta_incasare -> actualizeaza_tipincasare(), care +* iese devreme (Return) cat timp poDate.lEditare e .T., inainte de a ajunge la aseaza_alte_date() --- +loForm.chk_incasare.Value = 0 +loForm.do_comuta_incasare() +loForm.chk_alte_date.Value = 1 +loForm.do_comuta_alte_date() +DOEVENTS FORCE +poDate.lEditare = .T. +loForm.chk_incasare.Value = 1 +loForm.do_comuta_incasare() +DOEVENTS FORCE +DO AfLog WITH "=== PAS 5: Incasare peste Alte date, poDate.lEditare=.T. (1366x768) ===" +DO Assert WITH loForm.chk_alte_date.Value = 0, "PAS5: chk_alte_date s-a inchis automat (exclusivitate acordeon, lEditare)" +DO Assert WITH loForm.chk_incasare.Value = 1, "PAS5: chk_incasare a ramas deschis" +DO Assert WITH !loForm.ct_document.Visible, "PAS5: ct_document s-a reasezat (invizibil) desi actualizeaza_tipincasare() a iesit devreme" +DO Assert WITH !loForm.ct_contabilitate.Visible, "PAS5: ct_contabilitate s-a reasezat (invizibil)" +DO Assert WITH !loForm.ct_livrare.Visible, "PAS5: ct_livrare s-a reasezat (invizibil)" +poDate.lEditare = .F. +DO HarnessStep WITH 5, 'exclusivitate_lEditare', 25 + +* curatenie obligatorie: inchid ambele, dezaloc chitanta alocata la pasul 2, inainte de Release() +loForm.chk_alte_date.Value = 0 +loForm.do_comuta_alte_date() +loForm.chk_incasare.Value = 0 +loForm.do_comuta_incasare() + +loForm.Release() +RELEASE loForm + +DO AfLog WITH "TOTAL asertiuni grid (control.Top>=grid.Bottom): pass=" + TRANSFORM(gnAssertPass) + " fail=" + TRANSFORM(gnAssertFail) +DO AfLog WITH "TOTAL asertiuni totaluri (container.Bottom<=lb_total_baza.Top): pass=" + TRANSFORM(gnAssertPass2) + " fail=" + TRANSFORM(gnAssertFail2) +DO AfLog WITH "TOTAL asertiuni grid.Height>60 (neclampat): pass=" + TRANSFORM(gnAssertPassG) + " fail=" + TRANSFORM(gnAssertFailG) +DO Final + +*---------------------------------------------------------------------------------------- +PROCEDURE VerificaGeometrie1366 + * Logheaza si verifica geometria la 1366x768 maximizat: grid, banda de sub grila, banda + * de totaluri, plus asertiunea noua grd_factura.Height > 60 (gridul nu s-a clampat). + LPARAMETERS toForm, tcEticheta + LOCAL lnGTop, lnGHeight, lnGBottom, llClampat + lnGTop = toForm.grd_factura.Top + lnGHeight = toForm.grd_factura.Height + lnGBottom = lnGTop + lnGHeight + llClampat = (lnGHeight <= 60) + DO AfLog WITH "GRID [" + tcEticheta + "] Top=" + TRANSFORM(lnGTop) + " Height=" + TRANSFORM(lnGHeight) + " Bottom=" + TRANSFORM(lnGBottom) + " " + IIF(llClampat, "CLAMPAT(<=60)", "neclampat") + + DO VerificaControl WITH toForm.chk_incasare, "chk_incasare", tcEticheta, lnGBottom + DO VerificaControl WITH toForm.chk_alte_date, "chk_alte_date", tcEticheta, lnGBottom + DO VerificaControl WITH toForm.ct_document, "ct_document", tcEticheta, lnGBottom + DO VerificaControl WITH toForm.ct_contabilitate, "ct_contabilitate", tcEticheta, lnGBottom + DO VerificaControl WITH toForm.ct_livrare, "ct_livrare", tcEticheta, lnGBottom + DO VerificaControl WITH toForm.ct_incasare, "ct_incasare", tcEticheta, lnGBottom + + LOCAL lnFormHeight, lnBanda, lnTotalTop + lnFormHeight = toForm.Height + lnBanda = lnFormHeight - 103 + lnTotalTop = toForm.lb_total_baza.Top + DO AfLog WITH "S8O [" + tcEticheta + "] This.Height=" + TRANSFORM(lnFormHeight) + " lnBanda(Height-103)=" + TRANSFORM(lnBanda) + " lb_total_baza.Top=" + TRANSFORM(lnTotalTop) + " chk_incasare.Top=" + TRANSFORM(toForm.chk_incasare.Top) + " chk_alte_date.Top=" + TRANSFORM(toForm.chk_alte_date.Top) + + DO VerificaTotaluri WITH toForm.ct_document, "ct_document", tcEticheta, lnTotalTop + DO VerificaTotaluri WITH toForm.ct_contabilitate, "ct_contabilitate", tcEticheta, lnTotalTop + DO VerificaTotaluri WITH toForm.ct_livrare, "ct_livrare", tcEticheta, lnTotalTop + DO VerificaTotaluri WITH toForm.ct_incasare, "ct_incasare", tcEticheta, lnTotalTop + + IF !llClampat + gnAssertPassG = gnAssertPassG + 1 + ELSE + gnAssertFailG = gnAssertFailG + 1 + ENDIF + DO AfLog WITH IIF(!llClampat, "GRIDMIN-PASS", "GRIDMIN-FAIL") + " [" + tcEticheta + "] grd_factura.Height=" + TRANSFORM(lnGHeight) + " (asteptat > 60)" +ENDPROC + +PROCEDURE VerificaTotaluri + * Asertiune control.Top+control.Height <= lb_total_baza.Top, DOAR pentru controale vizibile. + LPARAMETERS toCtrl, tcNume, tcEticheta, tnTotalTop + LOCAL lnTop, lnHeight, lnBottom, llVis, llOk + lnTop = toCtrl.Top + lnHeight = toCtrl.Height + lnBottom = lnTop + lnHeight + llVis = IIF(TYPE('toCtrl.Visible') = 'L', toCtrl.Visible, .T.) + IF !llVis + DO AfLog WITH "TOTALURI-SKIP [" + tcEticheta + "] " + tcNume + " invizibil, Bottom=" + TRANSFORM(lnBottom) + " (neasertat)" + RETURN + ENDIF + llOk = (lnBottom <= tnTotalTop) + IF llOk + gnAssertPass2 = gnAssertPass2 + 1 + ELSE + gnAssertFail2 = gnAssertFail2 + 1 + ENDIF + DO AfLog WITH IIF(llOk, "TOTALURI-PASS", "TOTALURI-FAIL") + " [" + tcEticheta + "] " + tcNume + ".Top=" + TRANSFORM(lnTop) + " Height=" + TRANSFORM(lnHeight) + " Visible=" + TRANSFORM(llVis) + " Bottom=" + TRANSFORM(lnBottom) + " lb_total_baza.Top=" + TRANSFORM(tnTotalTop) + " marja=" + TRANSFORM(tnTotalTop - lnBottom) +ENDPROC + +PROCEDURE VerificaControl + LPARAMETERS toCtrl, tcNume, tcEticheta, tnGBottom + LOCAL lnTop, lnHeight, llVis, llOk + lnTop = toCtrl.Top + lnHeight = toCtrl.Height + llVis = IIF(TYPE('toCtrl.Visible') = 'L', toCtrl.Visible, .T.) + llOk = (lnTop >= tnGBottom) + IF llOk + gnAssertPass = gnAssertPass + 1 + ELSE + gnAssertFail = gnAssertFail + 1 + ENDIF + DO AfLog WITH IIF(llOk, "ASSERT-PASS", "ASSERT-FAIL") + " [" + tcEticheta + "] " + tcNume + ".Top=" + TRANSFORM(lnTop) + " Height=" + TRANSFORM(lnHeight) + " Visible=" + TRANSFORM(llVis) + " (grid.Bottom=" + TRANSFORM(tnGBottom) + ", delta=" + TRANSFORM(lnTop - tnGBottom) + ")" +ENDPROC + +PROCEDURE Assert + LPARAMETERS tlCond, tcMsg + IF tlCond + gnPass = gnPass + 1 + DO AfLog WITH "PASS: " + tcMsg + ELSE + gnFail = gnFail + 1 + DO AfLog WITH "FAIL: " + tcMsg + ENDIF +ENDPROC + +PROCEDURE AfLog + LPARAMETERS tcMsg + STRTOFILE(tcMsg + CHR(13) + CHR(10), gcUILog, 1) +ENDPROC + +PROCEDURE AfErr + LPARAMETERS tnErr, tcMsg, tcProg, tnLine + gnFail = gnFail + 1 + DO AfLog WITH "ERROR " + TRANSFORM(tnErr) + " [" + tcProg + ":" + TRANSFORM(tnLine) + "] " + tcMsg +ENDPROC + +PROCEDURE Final + DO AfLog WITH "TOTAL pass=" + TRANSFORM(gnPass) + " fail=" + TRANSFORM(gnFail) + DO AfLog WITH "END " + TTOC(DATETIME()) + DO HarnessDone WITH 'done' + QUIT +ENDPROC diff --git a/utile/Teste/facturare_unificat/test_s8o_1366_ui.ps1 b/utile/Teste/facturare_unificat/test_s8o_1366_ui.ps1 new file mode 100644 index 0000000..e6a31c7 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_s8o_1366_ui.ps1 @@ -0,0 +1,10 @@ +# test_s8o_1366_ui.ps1 - wrapper peste harness-ul generic (vfp_ui_harness.ps1) pentru +# test_s8o_1366_ui.prg. Sase pasi: cele 4 stari de casete + exclusivitatea acordeoanelor +# (decizia 4, ambele sensuri + varianta poDate.lEditare=.T.) la 1366x768 maximizat. +$ErrorActionPreference = 'Stop' +$Teste = $PSScriptRoot +& (Join-Path (Split-Path $Teste -Parent) 'vfp_ui_harness.ps1') ` + -TestPrg (Join-Path $Teste 'test_s8o_1366_ui.prg') ` + -Steps @('ambele_inchise','alte_date_deschis','incasare_deschis','exclusivitate_alte_peste_incasare','exclusivitate_incasare_peste_alte','exclusivitate_lEditare') ` + -SyncDir (Join-Path $Teste 'uisync_s8o_1366') ` + -ShotsDir (Join-Path $Teste 'screenshots_s8o_1366') diff --git a/utile/Teste/facturare_unificat/test_vfp_args_in_plus.prg b/utile/Teste/facturare_unificat/test_vfp_args_in_plus.prg new file mode 100644 index 0000000..71fdb56 --- /dev/null +++ b/utile/Teste/facturare_unificat/test_vfp_args_in_plus.prg @@ -0,0 +1,127 @@ +*!* 31.08.2026 +*!* subagent masuratoare argumente +*!* masoara empiric comportamentul VFP9 la argumente in plus fata de LPARAMETERS declarat, +*!* atat pentru rutine locale cat si pentru rutine dintr-un fisier de proceduri separat (IN) + +SET SAFETY OFF +SET TALK OFF +CLOSE ALL + +lcLog = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\test_vfp_args_in_plus_log.txt' +lcExt = 'D:\ROA\ROAFACTURARE\COMUN\utile\Teste\facturare_unificat\proceduri_test_args.prg' + +IF FILE(lcLog) + DELETE FILE (lcLog) +ENDIF + +loglin('SAFETY=' + SET('SAFETY') + ' RESOURCE=' + SET('RESOURCE')) +loglin('=== START masuratoare argumente in plus VFP9 ===') + +*-- CAZ 1 LOCAL: DO rutina WITH a catre PROCEDURE fara niciun LPARAMETERS +loglin('') +loglin('--- CAZ1 LOCAL: DO rutina_noparam WITH "valA" (fara LPARAMETERS) ---') +TRY + DO rutina_noparam WITH 'valA' + loglin('CAZ1 LOCAL: fara eroare') +CATCH TO loErr + loglin('CAZ1 LOCAL: EROARE ' + TRANSFORM(loErr.ErrorNo) + ' : ' + loErr.Message) +ENDTRY + +*-- CAZ 2 LOCAL: DO rutina WITH a,b catre PROCEDURE cu LPARAMETERS p1 (un singur parametru) +loglin('') +loglin('--- CAZ2 LOCAL: DO rutina_1p WITH "valA","valB" (LPARAMETERS p1) ---') +TRY + DO rutina_1p WITH 'valA', 'valB' + loglin('CAZ2 LOCAL: fara eroare') +CATCH TO loErr + loglin('CAZ2 LOCAL: EROARE ' + TRANSFORM(loErr.ErrorNo) + ' : ' + loErr.Message) +ENDTRY + +*-- CAZ 3 LOCAL: rutina(a,b,c) sintaxa de functie catre LPARAMETERS p1,p2 +loglin('') +loglin('--- CAZ3 LOCAL: rutina_2p("valA","valB","valC") (LPARAMETERS p1,p2) ---') +TRY + lcRes = rutina_2p('valA', 'valB', 'valC') + loglin('CAZ3 LOCAL: fara eroare, rezultat=' + lcRes) +CATCH TO loErr + loglin('CAZ3 LOCAL: EROARE ' + TRANSFORM(loErr.ErrorNo) + ' : ' + loErr.Message) +ENDTRY + +*-- CAZ 4 LOCAL control: rutina(a) catre LPARAMETERS p1,p2 -- argument in MINUS +loglin('') +loglin('--- CAZ4 LOCAL (control, argument in minus): rutina_2p("valA") ---') +TRY + lcRes = rutina_2p('valA') + loglin('CAZ4 LOCAL: fara eroare, rezultat=' + lcRes) +CATCH TO loErr + loglin('CAZ4 LOCAL: EROARE ' + TRANSFORM(loErr.ErrorNo) + ' : ' + loErr.Message) +ENDTRY + +*-- CAZ 1 IN FISIER SEPARAT: DO rutina IN altfisier.prg +loglin('') +loglin('--- CAZ1 IN: DO rutina_noparam_ext WITH "valA" IN (lcExt) ---') +TRY + DO rutina_noparam_ext WITH 'valA' IN (lcExt) + loglin('CAZ1 IN: fara eroare') +CATCH TO loErr + loglin('CAZ1 IN: EROARE ' + TRANSFORM(loErr.ErrorNo) + ' : ' + loErr.Message) +ENDTRY + +*-- CAZ 2 IN FISIER SEPARAT +loglin('') +loglin('--- CAZ2 IN: DO rutina_1p_ext WITH "valA","valB" IN (lcExt) ---') +TRY + DO rutina_1p_ext WITH 'valA', 'valB' IN (lcExt) + loglin('CAZ2 IN: fara eroare') +CATCH TO loErr + loglin('CAZ2 IN: EROARE ' + TRANSFORM(loErr.ErrorNo) + ' : ' + loErr.Message) +ENDTRY + +*-- CAZ 3 si 4 IN FISIER SEPARAT: sintaxa de functie nu suporta clauza IN, +*-- mecanismul echivalent folosit real in cod e SET PROCEDURE TO ADDITIVE +loglin('') +loglin('--- CAZ3/4 IN: SET PROCEDURE TO (lcExt) ADDITIVE, apoi rutina_2p_ext(...) ---') +TRY + SET PROCEDURE TO (lcExt) ADDITIVE + loglin('SET PROCEDURE TO reusit') +CATCH TO loErr + loglin('SET PROCEDURE TO: EROARE ' + TRANSFORM(loErr.ErrorNo) + ' : ' + loErr.Message) +ENDTRY + +loglin('--- CAZ3 IN: rutina_2p_ext("valA","valB","valC") ---') +TRY + lcRes = rutina_2p_ext('valA', 'valB', 'valC') + loglin('CAZ3 IN: fara eroare, rezultat=' + lcRes) +CATCH TO loErr + loglin('CAZ3 IN: EROARE ' + TRANSFORM(loErr.ErrorNo) + ' : ' + loErr.Message) +ENDTRY + +loglin('--- CAZ4 IN (control, argument in minus): rutina_2p_ext("valA") ---') +TRY + lcRes = rutina_2p_ext('valA') + loglin('CAZ4 IN: fara eroare, rezultat=' + lcRes) +CATCH TO loErr + loglin('CAZ4 IN: EROARE ' + TRANSFORM(loErr.ErrorNo) + ' : ' + loErr.Message) +ENDTRY + +loglin('') +loglin('=== SFARSIT masuratoare ===') + +QUIT + +PROCEDURE loglin(tcTxt) + STRTOFILE(tcTxt + CHR(13) + CHR(10), lcLog, 1) +ENDPROC + +PROCEDURE rutina_noparam + lcDummy = 'fara LPARAMETERS deloc' +RETURN + +PROCEDURE rutina_1p + LPARAMETERS p1 +RETURN + +FUNCTION rutina_2p + LPARAMETERS p1, p2 + lcP2 = IIF(VARTYPE(p2) = 'L' AND ISNULL(p2), 'NULL', IIF(VARTYPE(p2) = 'L', TRANSFORM(p2) + '(bool.F=lipsa)', TRANSFORM(p2))) +RETURN '2p LOCAL OK, p1=' + TRANSFORM(p1) + ', p2=' + lcP2 + ', VARTYPE(p2)=' + VARTYPE(p2) + ', PARAMETERS()=' + TRANSFORM(PARAMETERS()) diff --git a/utile/Teste/facturare_unificat/verifica_grila.ps1 b/utile/Teste/facturare_unificat/verifica_grila.ps1 new file mode 100644 index 0000000..2f939e7 --- /dev/null +++ b/utile/Teste/facturare_unificat/verifica_grila.ps1 @@ -0,0 +1,256 @@ +# verifica_grila.ps1 - citeste hartile de geometrie recursiva geom_grila_.tsv (scrise de +# DumpGrilaRecursiv/ColectGrila din test_s3b_dupa_ui.prg) si raporteaza incalcarile din +# docs\nota_s3b_reasezare_grila.md sectiunea 6 + addendumul A1.5. Nu ruleaza VFP, doar text. +# +# Rulare: powershell -ExecutionPolicy Bypass -File verifica_grila.ps1 [-Dir ] [-OutFile ] +# implicit -Dir = .\out , -OutFile = .\out\raport_grila.txt +param( + [string]$Dir = (Join-Path $PSScriptRoot 'out'), + [string]$OutFile = (Join-Path (Join-Path $PSScriptRoot 'out') 'raport_grila.txt') +) +$ErrorActionPreference = 'Stop' + +# controale admise in banda de titlu (Top 0..29), pe Name complet +$TitleBandAllow = @('_shape1', '_shape2', 'Lb_titlu_alb_b121', 'BUT_TERMIN1', 'But_renunt1') + +function Read-GeomTsv { + param([string]$Path) + $lines = Get-Content -Path $Path -Encoding Default + if ($lines.Count -lt 2) { return @() } + $header = $lines[0] -split "`t" + $rows = @() + for ($i = 1; $i -lt $lines.Count; $i++) { + if ([string]::IsNullOrEmpty($lines[$i])) { continue } + $f = $lines[$i] -split "`t" + # linia poate avea Caption gol la coada -> -split scurteaza array-ul; completeaza + while ($f.Count -lt $header.Count) { $f += '' } + $rows += [pscustomobject]@{ + Name = $f[0] + Class = $f[1] + Left = [double]$f[2] + Top = [double]$f[3] + Width = [double]$f[4] + Height = [double]$f[5] + Visible = ($f[6] -eq '.T.') + AbsLeft = [double]$f[7] + AbsTop = [double]$f[8] + Caption = $f[9] + } + } + return $rows +} + +function Is-ShapeOrGrid { + param($row) + if ($row.Class -match '^_shape') { return $true } + if ($row.Class -eq '_grdrow') { return $true } + if ($row.Name -match '(^|\.)[Gg]rd_') { return $true } + return $false +} + +function Is-AncestorOf { + param([string]$a, [string]$b) + return $b.StartsWith($a + '.') +} + +# --- verificarile pe o singura stare ------------------------------------------------- +function Check-TitleBand { + param($rows) + $hits = @() + foreach ($r in $rows) { + if (-not $r.Visible) { continue } + if ($TitleBandAllow -icontains $r.Name) { continue } + if ($r.AbsTop -lt 29 -and ($r.AbsTop + $r.Height) -gt 0) { + $hits += $r + } + } + return $hits +} + +function Check-Overlaps { + param($rows) + $cand = @($rows | Where-Object { $_.Visible -and -not (Is-ShapeOrGrid $_) }) + $hits = @() + for ($i = 0; $i -lt $cand.Count; $i++) { + for ($j = $i + 1; $j -lt $cand.Count; $j++) { + $a = $cand[$i]; $b = $cand[$j] + if ((Is-AncestorOf $a.Name $b.Name) -or (Is-AncestorOf $b.Name $a.Name)) { continue } + $aR = $a.AbsLeft + $a.Width; $aB = $a.AbsTop + $a.Height + $bR = $b.AbsLeft + $b.Width; $bB = $b.AbsTop + $b.Height + $ovX = [Math]::Min($aR, $bR) - [Math]::Max($a.AbsLeft, $b.AbsLeft) + $ovY = [Math]::Min($aB, $bB) - [Math]::Max($a.AbsTop, $b.AbsTop) + if ($ovX -gt 2 -and $ovY -gt 2) { + $hits += [pscustomobject]@{ + A = $a; B = $b; OvX = $ovX; OvY = $ovY + RectLeft = [Math]::Max($a.AbsLeft, $b.AbsLeft) + RectTop = [Math]::Max($a.AbsTop, $b.AbsTop) + } + } + } + } + return $hits +} + +# Zonele nu sunt etichetate in harta - se reconstituie geometric: randurile (AbsTop grupat +/-3px) +# se ordoneaza pe verticala, iar un gol de peste 40px intre bottom-ul unui rand si top-ul +# urmatorului marcheaza granita intre doua zone (antet / grid / acordeoane / totaluri). +$ZoneGapPx = 40 +$RowTolerancePx = 3 + +function Group-Rows { + param($rows) + $cand = @($rows | Where-Object { $_.Visible -and -not (Is-ShapeOrGrid $_) } | Sort-Object AbsTop) + $rowGroups = @() + foreach ($r in $cand) { + $g = $rowGroups | Where-Object { [Math]::Abs($_.Top - $r.AbsTop) -le $RowTolerancePx } | Select-Object -First 1 + if ($null -eq $g) { + $rowGroups += [pscustomobject]@{ Top = $r.AbsTop; Items = @($r); Bottom = ($r.AbsTop + $r.Height) } + } else { + $g.Items += $r + if (($r.AbsTop + $r.Height) -gt $g.Bottom) { $g.Bottom = $r.AbsTop + $r.Height } + } + } + return @($rowGroups | Sort-Object Top) +} + +function Group-Zones { + param($rowGroups) + $zones = @() + $cur = @() + $prevBottom = $null + foreach ($rg in $rowGroups) { + if ($null -ne $prevBottom -and ($rg.Top - $prevBottom) -gt $ZoneGapPx) { + $zones += , $cur + $cur = @() + } + $cur += $rg + if ($null -eq $prevBottom -or $rg.Bottom -gt $prevBottom) { $prevBottom = $rg.Bottom } + } + if ($cur.Count -gt 0) { $zones += , $cur } + return $zones +} + +function Check-Alignment { + param($rows) + $rowGroups = Group-Rows $rows + $zones = Group-Zones $rowGroups + $report = @() + $zoneIdx = 0 + foreach ($zone in $zones) { + $zoneIdx++ + if ($zone.Count -lt 2) { continue } + $leftCounts = @{} + foreach ($rg in $zone) { + foreach ($it in $rg.Items) { + $key = [string][int]$it.AbsLeft + if ($leftCounts.ContainsKey($key)) { $leftCounts[$key] += 1 } else { $leftCounts[$key] = 1 } + } + } + $distinct = $leftCounts.Keys | Sort-Object { [int]$_ } + $suspects = $leftCounts.GetEnumerator() | Where-Object { $_.Value -eq 1 } | ForEach-Object { $_.Key } + $report += [pscustomobject]@{ + ZoneIdx = $zoneIdx + TopRange = "$([int]$zone[0].Top)..$([int]($zone[$zone.Count-1].Top))" + NumRows = $zone.Count + Distinct = ($distinct -join ', ') + Suspects = @($suspects | Sort-Object { [int]$_ }) + } + } + return $report +} + +function Get-MaxRight { + param($rows) + $cand = @($rows | Where-Object { $_.Visible }) + if ($cand.Count -eq 0) { return 0 } + return ([Math]::Round(($cand | ForEach-Object { $_.AbsLeft + $_.Width } | Measure-Object -Maximum).Maximum)) +} + +# --- rulare pe toate starile ----------------------------------------------------------- +if (-not (Test-Path $Dir)) { + "Directorul $Dir nu exista." | Set-Content -Path $OutFile -Encoding UTF8 + Write-Host "Director inexistent: $Dir" + exit 1 +} +$files = Get-ChildItem -Path $Dir -Filter 'geom_grila_*.tsv' | Sort-Object Name +if ($files.Count -eq 0) { + "Niciun fisier geom_grila_*.tsv gasit in $Dir." | Set-Content -Path $OutFile -Encoding UTF8 + Write-Host "Niciun fisier geom_grila_*.tsv in $Dir" + exit 1 +} + +$allTitleHits = @{} +$allOverlapHits = @{} +$allAlignHits = @{} +$allMaxRight = @{} +$allVisCount = @{} +$detailLines = @() + +foreach ($f in $files) { + $stare = $f.BaseName -replace '^geom_grila_', '' + $rows = Read-GeomTsv -Path $f.FullName + $visCount = @($rows | Where-Object { $_.Visible }).Count + + $titleHits = Check-TitleBand $rows + $overlapHits = Check-Overlaps $rows + $alignReport = Check-Alignment $rows + $alignSuspectZones = @($alignReport | Where-Object { $_.Suspects.Count -gt 0 }) + $maxRight = Get-MaxRight $rows + + $allTitleHits[$stare] = $titleHits.Count + $allOverlapHits[$stare] = $overlapHits.Count + $allAlignHits[$stare] = ($alignSuspectZones | ForEach-Object { $_.Suspects.Count } | Measure-Object -Sum).Sum + if ($null -eq $allAlignHits[$stare]) { $allAlignHits[$stare] = 0 } + $allMaxRight[$stare] = $maxRight + $allVisCount[$stare] = $visCount + + $detailLines += "" + $detailLines += "=== STARE: $stare ($($rows.Count) randuri in harta, $visCount vizibile) ===" + + $detailLines += "--- Banda de titlu (0..29): $($titleHits.Count) incalcari ---" + foreach ($h in $titleHits) { + $detailLines += (" {0} ({1}) AbsLeft={2} AbsTop={3} W={4} H={5}" -f $h.Name, $h.Class, [int]$h.AbsLeft, [int]$h.AbsTop, [int]$h.Width, [int]$h.Height) + } + + $detailLines += "--- Suprapuneri eticheta/caseta: $($overlapHits.Count) ---" + foreach ($h in $overlapHits) { + $detailLines += (" {0} ({1}) x {2} ({3}) suprapunere {4}x{5}px la ({6},{7}) captionA='{8}' captionB='{9}'" -f ` + $h.A.Name, $h.A.Class, $h.B.Name, $h.B.Class, [int]$h.OvX, [int]$h.OvY, [int]$h.RectLeft, [int]$h.RectTop, $h.A.Caption, $h.B.Caption) + } + + $detailLines += "--- Aliniere pe coloane (zone reconstituite din goluri >$($ZoneGapPx)px, randuri grupate +/-$($RowTolerancePx)px) ---" + foreach ($z in $alignReport) { + $flag = if ($z.Suspects.Count -gt 0) { " <-- POSIBILA DEZALINIERE: AbsLeft=$($z.Suspects -join ', ')" } else { "" } + $detailLines += (" zona {0} (Top {1}, {2} randuri): AbsLeft distincte = {3}{4}" -f $z.ZoneIdx, $z.TopRange, $z.NumRows, $z.Distinct, $flag) + } + + $detailLines += "--- Latime folosita: max(AbsLeft+Width) peste vizibile = $maxRight px ---" + $detailLines += "--- Numar total controale vizibile: $visCount ---" +} + +$sumTitle = ($allTitleHits.Values | Measure-Object -Sum).Sum +$sumOverlap = ($allOverlapHits.Values | Measure-Object -Sum).Sum +$sumAlign = ($allAlignHits.Values | Measure-Object -Sum).Sum +$widthSummary = ($allMaxRight.GetEnumerator() | ForEach-Object { "$($_.Key)=$($_.Value)" }) -join '; ' +$widthWarn = @($allMaxRight.GetEnumerator() | Where-Object { $_.Value -lt 1400 } | ForEach-Object { $_.Key }) +$widthFlag = if ($widthWarn.Count -gt 0) { " -- SUB 1400px (criteriul 9): $($widthWarn -join ', ')" } else { " -- OK (>=1400px peste tot)" } +$countSummary = ($allVisCount.GetEnumerator() | ForEach-Object { "$($_.Key)=$($_.Value)" }) -join '; ' + +$summary = @( + "REZUMAT (5 linii, citeste doar astea pentru verdict rapid):" + "1. Incalcari banda de titlu (0..29px): $sumTitle" + "2. Suprapuneri eticheta/caseta: $sumOverlap" + "3. Posibile dezalinieri de coloana: $sumAlign" + "4. Latime folosita per stare: $widthSummary$widthFlag" + "5. Controale vizibile per stare: $countSummary" +) + +$out = @() +$out += $summary +$out += "" +$out += "=" * 90 +$out += $detailLines + +$out -join "`r`n" | Set-Content -Path $OutFile -Encoding UTF8 +Write-Host "Raport scris in $OutFile" +Write-Host ($summary -join "`n") diff --git a/utile/Teste/mock_amessagebox.prg b/utile/Teste/mock_amessagebox.prg index 83b3f66..5192c0d 100644 --- a/utile/Teste/mock_amessagebox.prg +++ b/utile/Teste/mock_amessagebox.prg @@ -1,13 +1,20 @@ * mock_amessagebox.prg - inlocuieste FUNCTION amessagebox (din oproceduri_comune.prg) in teste, * ca dialogurile modale de confirmare sa NU blocheze testul headless. Returneaza 6 (Da/OK) implicit. -* Se incarca cu SET PROCEDURE ... ADDITIVE **PRIMA**, INAINTEA fisierelor aplicatiei: la nume -* duplicat de procedura VFP foloseste fisierul cautat PRIMUL (verificat empiric - vezi -* COMUN\docs\testare-ui-vfp.md capcana g si antetul lui partener_anaf\mock_anaf_verificare.prg). -* 23.08.2026: antetul spunea pana acum "ULTIMA", ceea ce e invers si a costat o rulare blocata -* pe un dialog modal (test_e2e_anaf_firma). Logheaza apelul (dovada rezolutiei). -* LIMITA: nu acopera sigur apelurile INTRA-FISIER. `verifica_partener_show_info` si `amessagebox` -* sunt amandoua in oproceduri_comune.prg, deci dialogul acelei functii ramane modal chiar cu -* mock-ul incarcat; pentru el exista partener_anaf\mock_verifica_partener_show_info.prg. +* Se incarca **PRIMA** in lista SET PROCEDURE, INAINTEA fisierelor aplicatiei: la nume duplicat +* de procedura, VFP foloseste fisierul cautat PRIMUL, nu cel deschis cel mai recent (verificat +* empiric - vezi COMUN\docs\testare-ui-vfp.md capcana g si antetul lui +* partener_anaf\mock_anaf_verificare.prg). 23.08.2026: antetul spunea pana acum "ULTIMA", ceea ce +* e invers si a costat o rulare blocata pe un dialog modal (test_e2e_anaf_firma). +* Deci nu e de ajuns un SET PROCEDURE ... ADDITIVE la final; lista se reconstruieste cu mock-ul +* in fata: +* lcProcExistent = SET("PROCEDURE") +* SET PROCEDURE TO "\mock_amessagebox.prg", &lcProcExistent +* Logheaza apelul (dovada rezolutiei). +* LIMITA 1: nu acopera sigur apelurile INTRA-FISIER. `verifica_partener_show_info` si +* `amessagebox` sunt amandoua in oproceduri_comune.prg, deci dialogul acelei functii ramane +* modal chiar cu mock-ul incarcat; pentru el exista partener_anaf\mock_verifica_partener_show_info.prg. +* LIMITA 2: nu acopera dialogurile de eroare ale lui goExecutor: o interogare gresita tot agata +* rularea headless, fara nicio linie in log. * Configurabil per apel: daca testul declara PUBLIC gnMockRaspuns (implicit 6 daca nedeclarata), * mock-ul returneaza acea valoare - necesar pt. meniuri cu raspunsuri diferite (6/7/2) pe acelasi * dialog (ex. do_sterge/do_copiaza_nota, flag 3+32 Yes/No/Cancel). diff --git a/utile/Teste/mock_muta_borderou.prg b/utile/Teste/mock_muta_borderou.prg new file mode 100644 index 0000000..d19db64 --- /dev/null +++ b/utile/Teste/mock_muta_borderou.prg @@ -0,0 +1,20 @@ +* mock_muta_borderou.prg - controlul negativ al probei S11: inlocuieste FUNCTION +* MutaBorderouReemitere (din ofacturare_rutare_scriere.prg) cu un no-op care intoarce .T., +* adica exact starea codului DINAINTE de reparatia S11. Nu se atinge fisierul comis. +* Se incarca PRIMA in lista SET PROCEDURE - in VFP, la nume duplicat de procedura castiga primul +* fisier din lista, nu cel deschis cel mai recent: +* lcProcExistent = SET("PROCEDURE") +* SET PROCEDURE TO "\mock_muta_borderou.prg", &lcProcExistent +* Dovada ca mock-ul a preluat NU se ia chemand functia din test (ar demonstra doar rezolutia din +* test), ci din gnMockMutaApeluri, incrementat aici si citit dupa apelul facut de .vc2. +FUNCTION MutaBorderouReemitere + LPARAMETERS tnIdVanzareVechi, tnIdVanzareNou + IF TYPE('gnMockMutaApeluri') = 'N' + gnMockMutaApeluri = gnMockMutaApeluri + 1 + ENDIF + IF TYPE('gcErrLog') = 'C' + STRTOFILE('MOCK MutaBorderouReemitere(' + TRANSFORM(tnIdVanzareVechi) + ', ' + ; + TRANSFORM(tnIdVanzareNou) + ') -> .T. fara nicio scriere' + CHR(13) + CHR(10), gcErrLog, 1) + ENDIF + RETURN .T. +ENDFUNC diff --git a/utile/Teste/partener_anaf/test_verif_partener_anaf_v2_ui.prg b/utile/Teste/partener_anaf/test_verif_partener_anaf_v2_ui.prg index 7247b41..262a66e 100644 --- a/utile/Teste/partener_anaf/test_verif_partener_anaf_v2_ui.prg +++ b/utile/Teste/partener_anaf/test_verif_partener_anaf_v2_ui.prg @@ -84,7 +84,7 @@ SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\mock_ainputbox.prg" ADDITIVE SET PROCEDURE TO "D:\ROA\ROACONT\COMUN\utile\Teste\partener_anaf\mock_anaf_verificare.prg" ADDITIVE DO VpaLog WITH 'mock-uri incarcate' -DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT' +DO D:\ROA\ROACONT\COMUN\utile\Teste\test_init_env_auto.prg WITH 'CENTRAL', 'MARIUSM_AUTO', 'ROMFASTSOFT', 2026, 8 IF gnHandle <= 0 DO VpaLog WITH 'EROARE: conectare Oracle esuata - GATA' DO HarnessDone WITH 'done-error' diff --git a/utile/Teste/test_init_env_auto_roafacturare.prg b/utile/Teste/test_init_env_auto_roafacturare.prg index 52d64c0..57f84b3 100644 --- a/utile/Teste/test_init_env_auto_roafacturare.prg +++ b/utile/Teste/test_init_env_auto_roafacturare.prg @@ -11,7 +11,7 @@ * Utilizare: DO test_init_env_auto_roafacturare WITH 'CENTRAL', 'MARIUSM_AUTO', 'parola' * ATENTIE: mentine sincronizat cu test_init_env_auto.prg pentru partea comuna. -LPARAMETERS tcHost, tcSchema, tcPassword, tnAn, tnLuna +LPARAMETERS tcHost, tcSchema, tcPassword, tnAn, tnLuna, tnIdFirma tcHost = IIF(EMPTY(tcHost), 'CENTRAL', tcHost) tcSchema = IIF(EMPTY(tcSchema), 'MARIUSM_AUTO', tcSchema) @@ -32,8 +32,9 @@ PUBLIC CT_SUCCES, CT_INSUCCES, crlf, gnAn, gnLuna, gnIdUtil, glEMama, gnIdFirma, CT_SUCCES = 1 CT_INSUCCES = -1 crlf = CHR(13) + CHR(10) -gnAn = IIF(EMPTY(tnAn), YEAR(DATE()), tnAn) -gnLuna = IIF(EMPTY(tnLuna), MONTH(DATE()), tnLuna) +* luna de lucru a suitei e fixa, independenta de Date() sau de randul curent din CALENDAR +gnAn = IIF(EMPTY(tnAn), 2026, tnAn) +gnLuna = IIF(EMPTY(tnLuna), 8, tnLuna) gnIdUtil = -3 gnIdFirma = 110 gcCondSucursala = [] @@ -78,7 +79,7 @@ lcPath = gcAppPath + 'Date;' + ; gcAppPath + 'COMUN\UTILE\NFJSON;' + ; gcAppPath + 'COMUN\UTILE\NFXML;' + ; ADDBS(SUBSTR(gcAppPath,1,RAT([\],gcAppPath,2)))+[COMUNROA\] -SET PATH TO &lcPath ADDITIVE +SET PATH TO (lcPath) ADDITIVE Set Classlib To (gcAppPath + "comun\clase\appwiz") Additive Set Classlib To registry Additive @@ -113,7 +114,10 @@ Set Classlib To locale Additive Set Classlib To overificari Additive Set Classlib To ocomenzi Additive Set Classlib To anaf_efactura Additive +Set Classlib To _cb_base.vcx Additive +* mock-ul de amessagebox se incarca primul: sub -A -T un dialog modal atarna rularea fara log +Set Procedure To (gcAppPath + "COMUN\utile\Teste\mock_amessagebox.prg") Additive Set Procedure To proceduri_comune Additive Set Procedure To quitapp Additive Set Procedure To init_program Additive @@ -148,6 +152,8 @@ Set Procedure To oexport.prg Additive Set Procedure To validare.prg Additive Set Procedure To ofacturare_comun.prg Additive Set Procedure To ofacturare_stoc.prg Additive +Set Procedure To ofacturare_editare.prg Additive +Set Procedure To ofacturare_rutare_scriere.prg Additive Set Procedure To pmenu.prg Additive Set Procedure To ointroduceri.prg Additive Set Procedure To ovariabile_globale.prg Additive @@ -166,6 +172,7 @@ Set Procedure To suma_in_vorbe.prg Additive Set Procedure To controllerecr Additive Set Procedure To regex.prg Additive SET PROCEDURE TO anaf_efactura.prg ADDITIVE +SET PROCEDURE TO ofacturare_antet.prg ADDITIVE Declare Integer GetPrivateProfileString In WIN32API ; string, String, String, String @, Integer, String @@ -211,8 +218,11 @@ goFirma = null llSucces = goExecutor.oExecuta("select * from syn_v_nom_firme where schema = ?gcS", "cFirma") IF m.llSucces SELECT cFirma + IF !EMPTY(m.tnIdFirma) + LOCATE FOR id_firma = m.tnIdFirma + ENDIF gnIdFirma = id_firma - gnIdSucursala = null + gnIdSucursala = IIF(NVL(id_mama, 0) <> 0, id_firma, NULL) gcFirma = ALLTRIM(firma) SCATTER NAME goFirma IF TYPE('goFirma.codfiscalfro') = 'U' @@ -228,14 +238,10 @@ ENDIF USE IN (SELECT('cFirma')) goCalendar = null -llSucces = goExecutor.oExecuta('SELECT anul, luna, tva_incasare FROM calendar WHERE an*12+luna = (select MAX(an*12+luna) FROM calendar)', 'cCalendar') +llSucces = goExecutor.oExecuta('SELECT anul, luna, tva_incasare FROM calendar WHERE an*12+luna = ' + TRANSFORM(m.gnAn*12+m.gnLuna), 'cCalendar') IF m.llSucces SELECT cCalendar GO TOP - IF EMPTY(m.tnAn) - gnAn = anul - gnLuna = luna - ENDIF SCATTER NAME goCalendar ENDIF USE IN (SELECT('cCalendar'))