Files
comun/utile/Teste/editare_factura/test_s8_editare_incarcare.prg
Marius Mutu 8e022d332e #13: formular de facturare unificat - etapa curenta
Squash al branch-ului de lucru plan13-s2.

Clase: ofacturare (nucleul formularului unificat), ofacturare_comun,
ferestre_cere_date, ocomenzi, caut_ora (lista de preturi in combo-urile de
cautare), omodificari.

Programe: ofacturare impartit - ofacturare_antet, ofacturare_rutare_scriere si
ogrid_latimi sunt fisiere noi; oproceduri_facturare primeste discountul pe linie
si cota standard de TVA cand articolul nu are cota pe politica.

Documentatie: capcana SQLExec no_data_found, conventia de encoding, depanarea
testelor VFP si regulile de lucru - conflictele cu modificarile venite din alte
proiecte sunt rezolvate pastrand ambele parti.

Loguri de rulare a testelor scoase din versionare; testele raman.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01PkyjGyrV2S7932om4kfSiK
2026-09-09 21:38:25 +03:00

923 lines
47 KiB
Plaintext

* 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