frm_modific2024, pgfArticole.PAGE3 - editare in memorie, fara scriere in Oracle (aceea ramane S5). - sub-blocul A: cantitate/pret/pret_cu_tva editabile inline, marcaj lmodificat pe linie, coloana valoare pe linie - sub-blocul B: stergere logica de linii (sters/DynamicForeColor gri) si adaugare de linii prin frm_articol_factura, cu alegerea articolului prin caut_articol() - sub-blocul C: bara de totaluri sub grid (total linii convertit RON la cursul documentului, discount de antet editabil, total net), ascunsa pe transfer/custodie; verdict de corelatie ACT/RUL informativ, cu 3 stari - suma ACT: sold net debit-credit, cont pe tip de document (4111 / 418 / 461, iar pe rate/contract 4111, 411 sau 461) - suma RUL: doar ID_TIP_RULAJ = 0, adica miscarile reale; perechile ID_TIP_RULAJ = 3 sunt virtuale (tin locul procesului verbal de schimbare de pret) si nu intra in suma. Corectie cu liniile nestocate, marcata "ajustat" - adaugarea de linii pe document in valuta: dialogul primeste tip_valuta si cursul documentului de pe tvanz, deci pretul se introduce direct in valuta; ofacturare.vc2 ramane neatins - cei 5 apelanti frm_modific2024 (afisjurcom, anaf_efactura, cele doua .sc2 de import) pregatesc cursorul de articole inainte de Createobject, gardat pe SET PROCEDURE - registrul jurnal din ROACONT/ROAGEST ramane neschimbat Teste headless pe MARIUSM_AUTO, suite care isi descopera singure documentele: test_page3_articole 14/2 (cele 2 = artefact de grid nematerializat headless, acoperit pe ecran), test_incarca_vanzare_din_nota 5/0, test_adauga_linie_articol 20/0, test_adauga_linie_valuta 16/0, test_ui_sterge_linie 8/0, test_verdict_act_rul 26/0. docs/todos.txt: punctele 13 si 20, scrise de Marius. Co-Authored-By: Claude Opus 5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01SN8snvkk94KuhWwoXUUey3
160 lines
7.8 KiB
Plaintext
160 lines
7.8 KiB
Plaintext
* descopera_caz_test.prg
|
|
* Alege la rulare documentul de test pentru suitele de editare factura, dupa PROPRIETATEA ceruta de
|
|
* asertie, nu dupa identitatea lui. VANZARI.COD se realoca la fiecare salvare a notei
|
|
* (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.
|
|
*
|
|
* DescoperaCazTest(<nume caz>, <alias destinatie>) -> .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.
|
|
*
|
|
* Interogarile merg pe VACT_TOT / VRUL_TOT / VANZARI / VANZARI_DETALII, adica pe alt drum decat
|
|
* functiile verificate (IncarcaVanzareNota, IncarcaVanzareDinNota, IncarcaArticoleFactura): valorile
|
|
* asteptate raman independente de codul aflat sub test.
|
|
*
|
|
* Cazuri:
|
|
* FACTURA_ARTICOLE factura (tip=1) activa, cu linii active, a carei nota are PRIMUL rand
|
|
* (min id_act) pe acelasi (nract, serie_act, dataact) ca vanzarea
|
|
* NEFACTURA_ARTICOLE la fel, dar tip <> 1 (detectia merge pe orice tip de document)
|
|
* FARA_RULAJE document cu linii active si ZERO rulaje active pe (cod, an, luna)
|
|
* PRIM_RAND_ORB nota al carei PRIM rand NU duce la vanzare, dar un triplet ulterior da
|
|
* COLIZIUNE_COD la fel, plus cod cu 2+ randuri active in VANZARI si un nract din nota
|
|
* fara corespondent in VANZARI
|
|
* NOTA_FARA_VANZARI nota activa fara rand in VANZARI pe niciun triplet
|
|
|
|
|
|
FUNCTION DescoperaCazTest
|
|
LPARAMETERS tcCaz, tcAlias
|
|
|
|
LOCAL lcAlias, lcNlin, lcPrim, lcJoinP, lcTriplete, lcJoinT, lcOrb, lcNractFara, lcSql, lnSucces
|
|
|
|
lcAlias = IIF(Type('tcAlias') = 'C' AND !Empty(m.tcAlias), m.tcAlias, 'crscaz')
|
|
|
|
lcNlin = [(select count(*) from vanzari_detalii d where d.id_vanzare=v.id_vanzare and d.sters=0)]
|
|
|
|
*!* p = primul rand al fiecarei note (min id_act), adica exact randul pe care cade un Go Top In tact
|
|
lcPrim = [(select n.cod, n.an, n.luna, x.nract, x.serie_act, x.dataact from ] + ;
|
|
[(select cod, an, luna, min(id_act) idmin from vact_tot where sters=0 group by cod, an, luna) n ] + ;
|
|
[join vact_tot x on x.id_act = n.idmin) p]
|
|
|
|
*!* p = toate tripletele distincte ale notei, ca in IncarcaVanzareDinNota
|
|
lcTriplete = [(select distinct cod, an, luna, nract, serie_act, dataact from vact_tot where sters=0) p]
|
|
|
|
lcJoinP = [join vanzari v on v.cod=p.cod and nvl(v.numar_act,-1)=nvl(p.nract,-1) ] + ;
|
|
[and nvl(v.serie_act,' ')=nvl(p.serie_act,' ') and trunc(v.data_act)=trunc(p.dataact) and v.sters=0]
|
|
|
|
*!* nota la care primul rand nu se potriveste cu niciun rand din VANZARI
|
|
lcOrb = [not exists (select 1 from ] + ;
|
|
[(select cod, an, luna, min(id_act) idmin from vact_tot where sters=0 group by cod, an, luna) n ] + ;
|
|
[join vact_tot x on x.id_act=n.idmin ] + ;
|
|
[join vanzari w on w.cod=x.cod and nvl(w.numar_act,-1)=nvl(x.nract,-1) ] + ;
|
|
[and nvl(w.serie_act,' ')=nvl(x.serie_act,' ') and trunc(w.data_act)=trunc(x.dataact) and w.sters=0 ] + ;
|
|
[where n.cod=p.cod and n.an=p.an and n.luna=p.luna)]
|
|
|
|
*!* tripletul din nota care NU are corespondent in VANZARI - cazul negativ al filtrului compus;
|
|
*!* cele trei coloane trebuie luate de pe ACELASI rand, de aceea "keep (dense_rank first ...)"
|
|
lcNractFara = [(select min(y.<COL>) keep (dense_rank first order by y.nract) from ] + ;
|
|
[(select distinct cod, an, luna, nract, serie_act, dataact from vact_tot where sters=0) y ] + ;
|
|
[where y.cod=p.cod and y.an=p.an and y.luna=p.luna and not exists ] + ;
|
|
[(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))]
|
|
|
|
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 ] + ;
|
|
[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 ] + ;
|
|
[order by v.id_vanzare desc) where rownum = 1]
|
|
|
|
CASE Upper(Alltrim(m.tcCaz)) == 'FARA_RULAJE'
|
|
lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin from ] + ;
|
|
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) ] + ;
|
|
[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 + [ ] + ;
|
|
[order by v.id_vanzare desc) where rownum = 1]
|
|
|
|
CASE Upper(Alltrim(m.tcCaz)) == 'COLIZIUNE_COD'
|
|
lcSql = [select * from (select v.id_vanzare, p.cod, p.an, p.luna, v.tip, ] + m.lcNlin + [ nlin, ] + ;
|
|
[p.nract, p.serie_act, p.dataact, ] + ;
|
|
Strtran(m.lcNractFara, [<COL>], [nract]) + [ nract_fara, ] + ;
|
|
Strtran(m.lcNractFara, [<COL>], [serie_act]) + [ serie_fara, ] + ;
|
|
Strtran(m.lcNractFara, [<COL>], [dataact]) + [ data_fara from ] + ;
|
|
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, [<COL>], [nract]) + [ is not null ] + ;
|
|
[order by v.id_vanzare desc) where rownum = 1]
|
|
|
|
CASE Upper(Alltrim(m.tcCaz)) == 'NOTA_FARA_VANZARI'
|
|
lcSql = [select * from (select p.cod, p.an, p.luna, 0 id_vanzare, 0 tip, 0 nlin from ] + ;
|
|
[(select cod, an, luna from vact_tot where sters=0 and cod > 0 group by cod, an, luna) p ] + ;
|
|
[where not exists (select 1 from vact_tot x ] + ;
|
|
[join vanzari v on v.cod=x.cod and nvl(v.numar_act,-1)=nvl(x.nract,-1) ] + ;
|
|
[and nvl(v.serie_act,' ')=nvl(x.serie_act,' ') and trunc(v.data_act)=trunc(x.dataact) and v.sters=0 ] + ;
|
|
[where x.cod=p.cod and x.an=p.an and x.luna=p.luna and x.sters=0) ] + ;
|
|
[order by p.an desc, p.luna desc, p.cod desc) where rownum = 1]
|
|
|
|
OTHERWISE
|
|
CreeazaCursorCazGol(m.lcAlias)
|
|
RETURN .F.
|
|
ENDCASE
|
|
|
|
IF Used('v_caz')
|
|
Use In v_caz
|
|
ENDIF
|
|
|
|
lnSucces = goExecutor.oExecute(m.lcSql, [v_caz])
|
|
goExecutor.oReset()
|
|
|
|
IF m.lnSucces < 0
|
|
CreeazaCursorCazGol(m.lcAlias)
|
|
RETURN .F.
|
|
ENDIF
|
|
|
|
IF Used(m.lcAlias)
|
|
Use In (m.lcAlias)
|
|
ENDIF
|
|
SELECT * FROM v_caz INTO CURSOR (m.lcAlias) READWRITE
|
|
USE IN v_caz
|
|
|
|
RETURN (Reccount(m.lcAlias) = 1)
|
|
ENDFUNC && DescoperaCazTest
|
|
|
|
|
|
FUNCTION CreeazaCursorCazGol
|
|
LPARAMETERS tcAlias
|
|
|
|
LOCAL lcAlias
|
|
lcAlias = IIF(Type('tcAlias') = 'C' AND !Empty(m.tcAlias), m.tcAlias, 'crscaz')
|
|
|
|
IF Used(m.lcAlias)
|
|
Use In (m.lcAlias)
|
|
ENDIF
|
|
CREATE CURSOR (m.lcAlias) (id_vanzare I, cod I, an I, luna I, tip I, nlin I)
|
|
ENDFUNC && CreeazaCursorCazGol
|
|
|
|
|
|
*!* descrierea pe o linie a cazului descoperit, pentru log
|
|
FUNCTION DescrieCazTest
|
|
LPARAMETERS tcCaz, tcAlias, tlGasit
|
|
|
|
IF !m.tlGasit
|
|
RETURN ' ' + Padr(m.tcCaz, 20) + ' NEGASIT - niciun document nu satisface conditia'
|
|
ENDIF
|
|
|
|
RETURN ' ' + Padr(m.tcCaz, 20) + ' cod=' + Transform(Evaluate(m.tcAlias + '.cod')) + ;
|
|
' an=' + Transform(Evaluate(m.tcAlias + '.an')) + ;
|
|
' luna=' + Transform(Evaluate(m.tcAlias + '.luna')) + ;
|
|
' id_vanzare=' + Transform(Evaluate(m.tcAlias + '.id_vanzare')) + ;
|
|
' tip=' + Transform(Evaluate(m.tcAlias + '.tip')) + ;
|
|
' linii=' + Transform(Evaluate(m.tcAlias + '.nlin'))
|
|
ENDFUNC && DescrieCazTest
|