*!* 27.09.2011 *!* marius.mutu *!* create cursor calculcompens in loc de create table *!* #3146 Steaua Nordului *!* 31.01.2013 *!* marius.mutu *!* calculcompens - tratare facturi cu tva_incasare: calculcompens.tva_incasare_a, id_fact (ex: plata 401 = 542) *!* 19.04.2013 *!* marius.mutu *!* calculcompens - tva incasare pentru ambele facturi din compensare. ex: 401 = 4111 *** proceduri introducere in actactan, nu merge pentru sume negative !!!! *!* 25.12.2025 *!* calculcompens - tratare compensare 5121 = 419 cu cote TVA diferite (proc_tva, id_jtvacol) *!* 07.01.206 *!* calculcompens_part - tratare compensare 419 lei 5121 = 419 cu cote TVA diferite (proc_tva, id_jtvacol) ******************************************* INCEPUT: calculcompens ******************************************* *** PROCEDURE calculcompens PARAMETERS tcFisD, tcFisC, tnTipOrdonare, tnTipOprire *!* modificare v 2.5.27 : tnTipOrdonare, tnTipOprire *!* tnTipOrdonare - 0/implicit = ordonare descrescator dupa suma *!* 1 = ordonare dupa data *!* tnTipOprire - 0/implicit = cand sum(sumaachi) pentru ambele tabele este 0 ( initial, sum(sumaachi) dintr-un tabel este egala cu sum(sumaachi) din celalalt ) *!* 1 = cand sum(sumaachi) pentru unul dintre tabele este 0 PRIVATE pcCont STORE '' TO pcCont LOCAL max1, max2, nract1, nract2, lcFis1, lcFis2, id_fact1, id_fact2, llDefalcTVA, lnMaxTvai, lcOrdine STORE 1 TO max1, max2 STORE 0 TO nract1, nract2, id_fact1, id_fact2 lnMaxTvai = 0 lcFisD = ALLTRIM(tcFisD) lcFisC = ALLTRIM(tcFisC) *!* modificare v 2.5.26 *!* modificare v 2.5.27 : am adaugat lcOrdine *!* SELECT * FROM &lcFisD INTO CURSOR tperecheD READWRITE *!* SELECT * FROM &lcFisC INTO CURSOR tperecheC READWRITE lcOrdine = IIF(EVL(tnTipOrdonare,0)=1,[dataact,nract],[sumaachi desc]) SELECT * FROM &lcFisD WHERE ales AND sumaachi <> 0 ORDER BY &lcOrdine INTO CURSOR tperecheD READWRITE SELECT * FROM &lcFisC WHERE ales AND sumaachi <> 0 ORDER BY &lcOrdine INTO CURSOR tperecheC READWRITE *!* modificare v 2.5.26 ^ *** Aflu daca exista bifa TVA_INCASARE_A intr-unul din fisiere (ex: 401 = 542) *** pentru a putea pune in cursorul rezultat id_fact din fisierul corespunzator *** in cazul compensarilor 401 = 4111, pot fi amandoua facturile cu TVA incasare llTvaIncasareD = .F. llTvaIncasareC = .F. select tPerecheD locate for nvl(tva_incasare_a,0) = 1 if found() llTvaIncasareD = .T. endif select tPerecheC locate for nvl(tva_incasare_a,0) = 1 if found() llTvaIncasareC = .T. endif llTVAIncasare = m.llTvaIncasareD or m.llTvaIncasareC CREATE cursor calculcompensare (nr_doc_d N(14), nr_doc_c N(14), id_factd N(14), id_factc N(14),; ascc c(4), ascd c(4), sumaachi N(20,4), ales l, proc_tva N(5,2), id_jtvacol N(10), proc_tvaD N(5,2), id_jtvacolD N(10), proc_tvaC N(5,2), id_jtvacolC N(10), ; tva_incasare_a N(1), tva_incasare_d N(1), tva_incasare_dtip C(1),tva_incasare_c N(1), tva_incasare_ctip C(1)) lnRecnoD = 1 lnReccountD = Reccount("tPerecheD") Select tperecheD Go Top lnSumaD = sumaachi pcCont = Alltrim(Cont) llDefalcTVAD = .F. lcSelect = [select count(*) as defalcTVA from config_cont_ireg t where cont = ?pcCont and cu_proc_tva = 1] If goExecutor.oExecuta(lcSelect, "crsDefalcTva") Select crsDefalcTVA llDefalcTVAD = defalcTVA >0 Use In crsDefalcTVA Endif lnRecnoC = 1 lnReccountC = Reccount("tPerecheC") Select tperecheC Go Top lnSumaC = sumaachi pcCont = Alltrim(Cont) llDefalcTVAC = .F. lcSelect = [select count(*) as defalcTVA from config_cont_ireg t where cont = ?pcCont and cu_proc_tva = 1] If goExecutor.oExecuta(lcSelect, "crsDefalcTva") Select crsDefalcTVA llDefalcTVAC = defalcTVA >0 Use In crsDefalcTVA Endif lnSumaCompensata = 0 lcTipMaxUrm = [] lnSemnSumaD = SIGN(tperecheD.sumaachi) *!* am ordonat documentele pereche de pe credit si de pe debit descrescator dupa sume *!* pana ajung la 0 pe ultima inregistrare de pe una dintre tabele, aleg MIN *!* cand am ajuns la 0 pe ultima inregistrare intr-una dintre tabele, iau doar valorile din tabelul celalalt *!* modificare v 2.5.27 *!* DO WHILE !(lnRecnoD = lnReccountD AND lnRecnoC = lnReccountC AND lnSumaC = 0 AND lnSumaD = 0) DO WHILE (EVL(tnTipOprire,0) = 0 AND !(lnRecnoD = lnReccountD AND lnRecnoC = lnReccountC AND lnSumaC = 0 AND lnSumaD = 0)) ; OR (EVL(tnTipOprire,0) = 1 AND EMPTY(lcTipMaxUrm)) *!* modificare v 2.5.27 ^ lcTipMax = lcTipMaxUrm lnSumaCompensata = IIF(lcTipMax=[C],lnSumaD,IIF(lcTipMax=[D],lnSumaC,IIF(EVL(tnTipOprire,0)=1,MIN(ABS(lnSumaC),ABS(lnSumaD)),MIN(lnSumaC,lnSumaD)))) lnProc_tva = 0.00 lnIdJtvaColoana = 0 lnProc_tvaD = 0.00 lnIdJtvaColoanaD = 0 lnProc_tvaC = 0.00 lnIdJtvaColoanaC = 0 ***------------------------- SELECT tperecheD STORE nract TO nract1 id_fact1 = id_fact lcascd = NVL(acont,'') IF cu_tva = 1 AND TYPE('tPerecheD.proc_tva') # 'U' AND llDefalcTVAD lnProc_tva = proc_tva lnIdJtvaColoana = NVL(id_jtva_coloana,0) lnProc_tvaD = proc_tva lnIdJtvaColoanaD = NVL(id_jtva_coloana,0) ENDIF *!* cand tnTipOprire = 1, atunci trebuie sa diminuez sumaachi cu lnSumaCompensata replace sumaachi WITH sumaachi - IIF(EVL(tnTipOprire,0)=1,lnSemnSumaD,1) * lnSumaCompensata lnSumaD = sumaachi Do Case Case lnSumaD = 0 And lnRecNoD <> lnReccountD Skip lnSumaD = sumaachi lnRecNoD = Recno() Case lnSumaD = 0 And lnRecNoD = lnReccountD And EMPTY(lcTipMax) *!* daca am ajuns la ultima inregistrare si am restul 0, atunci trebuie sa iau valorile doar din celalalt tabel *!* pentru urmatoarele note, nu mai fac exigibilizarea de TVA pentru Debit lcTipMaxUrm = [D] Endcase ***------------------------- SELECT tperecheC STORE nract TO nract2 id_fact2 = id_fact lcascc = NVL(acont,'') IF cu_tva = 1 AND TYPE('tPerecheC.proc_tva') # 'U' AND llDefalcTVAC lnProc_tva = proc_tva lnIdJtvaColoana = NVL(id_jtva_coloana,0) lnProc_tvaC = proc_tva lnIdJtvaColoanaC = NVL(id_jtva_coloana,0) ENDIF *!* cand tnTipOprire = 1, atunci trebuie sa diminuez sumaachi cu lnSumaCompensata replace sumaachi WITH sumaachi - IIF(EVL(tnTipOprire,0)=1,lnSemnSumaD*(-1),1) * lnSumaCompensata lnSumaC = sumaachi Do Case Case lnSumaC = 0 And lnRecNoC <> lnReccountC Skip lnSumaC = sumaachi lnRecNoC = Recno() Case lnSumaC = 0 And lnRecNoC = lnReccountC And EMPTY(lcTipMax) *!* daca am ajuns la ultima inregistrare si am restul 0, atunci trebuie sa iau valorile doar din celalalt tabel *!* pentru urmatoarele note, nu mai fac exigibilizarea de TVA pentru Credit lcTipMaxUrm = [C] Endcase SELECT calculcompensare IF lnSumaCompensata <> 0 APPEND BLANK REPLACE nr_doc_c WITH nract2, ascc WITH lcascc, id_factc WITH id_fact2 REPLACE nr_doc_d WITH nract1, ascd WITH lcascd, id_factd WITH id_fact1 REPLACE proc_tva WITH lnProc_tva,id_jtvacol WITH lnIdJtvaColoana REPLACE proc_tvaD WITH lnProc_tvaD,id_jtvacolD WITH lnIdJtvaColoanaD REPLACE proc_tvaC WITH lnProc_tvaC,id_jtvacolC WITH lnIdJtvaColoanaC REPLACE sumaachi WITH IIF(EVL(tnTipOprire,0)=1,lnSemnSumaD,1)*lnSumaCompensata REPLACE ales WITH .T. if m.llTvaIncasare replace tva_incasare_a with 1 endif if m.llTvaIncasareD && AND lcTipMax<>[D] : pusesem conditia ca sa nu mai genereze note de TVA la incasare cand ajungeam pe 0 la ultima inregistrare din cursor replace tva_incasare_d with 1, tva_incasare_dtip with 'D' endif if m.llTvaIncasareC && AND lcTipMax<>[C] : pusesem conditia ca sa nu mai genereze note de TVA la incasare cand ajungeam pe 0 la ultima inregistrare din cursor replace tva_incasare_c with 1, tva_incasare_ctip with 'C' endif ENDIF ENDDO *!* modificare v 2.5.26 ^ USE IN tperecheD USE IN tperecheC RETURN *** ******************************************* SFARSIT: calculcompens in lei ******************************************* ******************************************* INCEPUT: calculcompens in valuta - fara sume negative ******************************************* *** PROCEDURE calculcompens_valuta PARAMETERS tcFisD, tcFisC LOCAL max1, max2, nract1, nract2, lcFis1, lcFis2, id_fact1, id_fact2, llDefalcTVA STORE 1 TO max1,max2 STORE 0 TO nract1, nract2, id_fact1, id_fact2 PRIVATE pcCont pcCont = '' llDefalcTVA = .F. lcFisD = ALLTRIM(tcFisD) lcFisC = ALLTRIM(tcFisC) SELECT * FROM &lcFisD INTO CURSOR tperecheD READWRITE SELECT * FROM &lcFisC INTO CURSOR tperecheC READWRITE CREATE CURSOR calculcompensare (nr_doc_d N(14), nr_doc_c N(14),id_factd N(14), id_factc N(14),; ascc c(4), ascd c(4), sumaachi2 N(20,4), achilei N(20,4), id_jtvacol N(10), proc_tva N(5,2), ; sumaachid N(20,4), sumaachic N(20,4), cursd N(12,4), cursc N(12,4), difplus N(20,4), ; difminus N(20,4), cursval N(12,4), cursdif N(12,4), ales l) DO WHILE max1!=0 AND max2!=0 lnProc_tva = 0.00 lnIdJtvaColoana = 0 SELECT tperecheC CALCULATE MAX(sumaachi2) FOR ales TO max2 *WAIT WINDOW 'max2'+STR(max2) SELECT tperecheD CALCULATE MAX(sumaachi2) FOR ales TO max1 *WAIT WINDOW 'max1'+STR(max1) ***------------------------- SELECT tperecheD GO TOP pcCont = ALLTRIM(CONT) llDefalcTVA = .F. lcSelect = [select count(*) as defalcTVA from config_cont_ireg t where cont = ?pcCont and cu_proc_tva = 1] lnSucces = goExecutor.oExecute(lcSelect, "crsDefalcTva") IF lnSucces < 0 AMESSAGEBOX(goExecutor.cEroare,0+16,'Eroare') ELSE SELECT crsDefalcTVA llDefalcTVA = defalcTVA >0 IF USED('crsDefalcTVA') USE IN crsDefalcTVA ENDIF ENDIF ***------------------------- SELECT tperecheD LOCATE FOR sumaachi2 = max1 AND ales nract1 = nract id_fact1 = id_fact lcascd = NVL(acont,'') lnCursD = cursschimb IF TYPE('tPerecheD.proc_tva') # 'U' AND llDefalcTVA lnProc_tva = proc_tva lnIdJtvaColoana = NVL(id_jtva_coloana,0) ENDIF IF max1 <= max2 lnSumaleiD = sumaachi REPLACE sumaachi2 WITH 0 REPLACE ales WITH .F. ELSE lnSumaleiD = ROUND(cursschimb * max2, gnPC) IF lnSumaleiD > sumaachi lnSumaleiD = sumaachi ENDIF REPLACE sumaachi2 WITH max1 - max2 REPLACE sumaachi WITH sumaachi - lnSumaleiD ENDIF ***------------------------- SELECT tperecheC GO TOP pcCont = ALLTRIM(CONT) llDefalcTVA = .F. lcSelect = [select count(*) as defalcTVA from config_cont_ireg t where cont = ?pcCont and cu_proc_tva = 1] lnSucces = goExecutor.oExecute(lcSelect, "crsDefalcTva") IF lnSucces < 0 AMESSAGEBOX(goExecutor.cEroare,0+16,'Eroare') ELSE SELECT crsDefalcTVA llDefalcTVA = defalcTVA >0 IF USED('crsDefalcTVA') USE IN crsDefalcTVA ENDIF ENDIF ***------------------------- SELECT tperecheC LOCATE FOR sumaachi2 = max2 AND ales nract2 = nract id_fact2 = id_fact lcascc = NVL(acont,'') lnCursC = cursschimb IF TYPE('tPerecheC.proc_tva') # 'U' AND llDefalcTVA lnProc_tva = proc_tva lnIdJtvaColoana = NVL(id_jtva_coloana,0) ENDIF IF max2 <= max1 lnSumaleiC = sumaachi REPLACE sumaachi2 WITH 0 REPLACE ales WITH .F. ELSE lnSumaleiC = ROUND(cursschimb * max1, gnPC) IF lnSumaleiC > sumaachi lnSumaleiC = sumaachi ENDIF REPLACE sumaachi2 WITH max2 - max1 REPLACE sumaachi WITH sumaachi - lnSumaleiC ENDIF SELECT calculcompensare IF MIN(max1, max2) <> 0 APPEND BLANK REPLACE nr_doc_c WITH nract2, id_factc WITH id_fact2, ascc WITH lcascc, sumaachic WITH lnSumaleiC, cursc WITH lnCursC REPLACE nr_doc_d WITH nract1, id_factd WITH id_fact1,ascd WITH lcascd, sumaachid WITH lnSumaleiD, cursd WITH lnCursD REPLACE sumaachi2 WITH MIN(max1, max2),proc_tva WITH lnProc_tva,id_jtvacol WITH lnIdJtvaColoana REPLACE ales WITH .T. ENDIF ENDDO SELECT calculcompensare SCAN IF sumaachid > sumaachic REPLACE difplus WITH sumaachid - sumaachic, achilei WITH sumaachic, cursval WITH cursc, cursdif WITH cursd ELSE REPLACE difminus WITH sumaachic - sumaachid, achilei WITH sumaachid, cursval WITH cursd, cursdif WITH cursc ENDIF ENDSCAN USE IN tperecheD USE IN tperecheC RETURN ******************************************* SFARSIT: calculcompens - fara sume negative ******************************************* *** *!* PROCEDURE calculcompens_valuta *!* PARAMETERS tcFisD, tcFisC *!* LOCAL max1, max2, nract1, nract2, lcFis1, lcFis2 *!* STORE 1 TO max1,max2 *!* STORE 0 TO nract1,nract2 *!* lcFisD = ALLTRIM(tcFisD) *!* lcFisC = ALLTRIM(tcFisC) *!* SELECT * from &lcfisd INTO CURSOR tperecheD READWRITE *!* SELECT * from &lcfisc INTO CURSOR tperecheC READWRITE *!* CREATE TABLE &gcTempPath\calculcompensare.dbf (nr_doc_d n(14), nr_doc_c n(14), ascc c(4), ascd c(4), sumaachi2 n(16,2), achilei n(16,2), ; *!* sumaachid n(16,2), sumaachic n(16,2), cursd n(8,2), cursc n(8,2), difplus n(16,2), difminus n(16,2), cursval n(8,2), cursdif n(8,2), ales l) *!* *!* DO WHILE max1!=0 OR max2!=0 *!* SELECT tperecheC *!* CALCULATE MAX(sumaachi2) FOR ales AND sumaachi2 <> 0 TO max2 *!* *WAIT WINDOW 'max2'+STR(max2) *!* SELECT tperecheD *!* CALCULATE MAX(sumaachi2) FOR ales AND sumaachi2 <> 0 TO max1 *!* *WAIT WINDOW 'max1'+STR(max1) *!* SELECT tperecheD *!* LOCATE FOR sumaachi2 = max1 AND ales *!* nract1 = nract *!* lcascd = acont *!* lnCursD = cursschimb *!* if (max1 <= max2 OR max2 = 0) AND max1 <> 0 *!* lnSumaleiD = sumaachi *!* REPLACE sumaachi2 WITH 0 *!* * REPLACE ales WITH .f. *!* *!* ELSE *!* lnSumaLeiD = ROUND(cursschimb * max2, 0) *!* IF lnSumaLeiD > sumaachi *!* lnSumaLeiD = sumaachi *!* ENDIF *!* REPLACE sumaachi2 WITH max1 - max2 *!* REPLACE sumaachi WITH sumaachi - lnSumaLeiD *!* ENDIF *!* *!* SELECT tperecheC *!* LOCATE FOR sumaachi2 = max2 AND ales *!* nract2 = nract *!* lcascc = acont *!* lnCursC = cursschimb *!* *!* if (max2 <= max1 OR max1 = 0) AND max2 <> 0 *!* lnSumaleiC = sumaachi *!* REPLACE sumaachi2 WITH 0 *!* * REPLACE ales WITH .f. *!* *!* ELSE *!* lnSumaLeiC = ROUND(cursschimb * max1, 0) *!* IF lnSumaLeiC > sumaachi *!* lnSumaLeiC = sumaachi *!* ENDIF *!* REPLACE sumaachi2 WITH max2 - max1 *!* REPLACE sumaachi WITH sumaachi - lnSumaLeiC *!* ENDIF *!* *!* *!* SELECT calculcompensare *!* IF max1 <> 0 OR max2 <> 0 *!* APPEND BLANK *!* REPLACE nr_doc_c WITH nract2, ascc WITH lcAscc, sumaAchiC WITH lnSumaleiC, cursC WITH lnCursC *!* REPLACE nr_doc_d WITH nract1, ascd WITH lcAscd, sumaAchiD WITH lnSumaleiD, cursD WITH lnCursD *!* IF MIN(max1, max2) <> 0 *!* REPLACE sumaachi2 WITH MIN(max1, max2) *!* ELSE *!* REPLACE sumaachi2 WITH MAX(max1, max2) *!* ENDIF *!* REPLACE ales WITH .t. *!* ENDIF *!* ENDDO *!* SELECT calculcompensare *!* SCAN *!* IF sumaAchiD > sumaAchiC *!* REPLACE difplus WITH sumaAchiD - sumaAchiC, achilei WITH sumaAchiC, cursval WITH cursC, cursdif WITH cursD *!* ELSE *!* REPLACE difminus WITH sumaAchiC - sumaAchiD, achilei WITH sumaAchiD, cursval WITH cursD, cursdif WITH cursC *!* ENDIF *!* ENDSCAN *!* USE IN tperecheD *!* USE IN tperecheC *!* RETURN *********************************************** SFARSIT calculcompens in valuta ****************************************** Function calculcompens_part Lparameters tcCont, tnProcTva, tlValuta, tnIdValuta, tnIdValuta2, tcNumeVal2 && partea in valuta nu este testata Local llReturn, lnTip, lcCursorIregPart, lcCursorSumeNegative, lcCursorSumePozitive, lcCursorCalculCompensare, ; lcCursorCalculCompensareTemp, lcCont, lcCond, lnIdPart, ; lnFelCont, lnPozitie, lcSumaAchi, lcSelectie, lcSelectie1, lcSelectie2 lcCursorIregPart = Sys(2015) lcCursorSumeNegative = Sys(2015) lcCursorSumePozitive = Sys(2015) lcCursorCalculCompensare = [calculcompensare] lcCursorCalculCompensareTemp = SYS(2015) lcCont = Alltrim(tcCont) lcCond = [ an = ] + Alltrim(Str(gnAn)) + [ and luna = ] + Alltrim(Str(gnluna))+ Iif(glEMama,' and NVL(id_sucursala,0) = 0 ',gcCondSucursala) llReturn = .T. If tlValuta lcCond= lcCond + [ and ABS(i.precvaldeb + i.valdebit - i.precvalcred - i.valcredit)>0 and i.id_valuta ] + ; Iif(!EMPTY(tnIdValuta2), [in ( ] + Alltrim(Str(tnIdValuta)) + [,] + Alltrim(Str(Nvl(tnIdValuta2,0))) + [)], [ = ]+Alltrim(Str(tnIdValuta))) Else lcCond= lcCond + [ and (i.precvaldeb + i.valdebit - i.precvalcred - i.valcredit = 0) ] Endif Select xcont Locate For Val(contpart) = Val(lcCont) lnIdPart = idpart lnFelCont = fel_cont lnPozitie = pozitie pcselect = ['select i.* FROM vireg_parteneri i where 2=2 '] pcfiltru = [ i.id_part = ] + Alltrim(Str(lnIdPart)) + [ AND ABS(i.precdeb + i.debit - i.preccred - i.credit)<>0 AND i.cont = ']+ lcCont + [' and ] + lcCond Private podateintrod Store '' To podateintrod gencursor('podateintrod',lcCursorIregPart,pcselect,pcfiltru,[''],['']) Do Case Case m.lnFelCont = 0 Or (m.lnFelCont = 2 And m.lnPozitie = 1) lnTip = 1 lcSumaAchi = [ROUND(precdeb + debit,gnPc) - ROUND(preccred+credit,gnPc)] lcSelectie = [SELECT *, ACONT AS ASCC, nume_val as numeval, curs as cursschimb, precdeb + debit as totctva, preccred+credit as achitat, credit as achitatl, ] +; [precvaldeb + valdebit AS sumaval, precVALcred+VALcredit as achitatval, ] + Iif(tnProcTva = 1, [1], [0]) + [ as cu_tva, ] +; [.T. as ales, ] + lcSumaAchi + [ as sumaachi, 000000000000.0000 as sumaachi2, 00000000000000.0000 as achilei, 00000000000000.0000 as difplus, ]+; [ 00000000000000.0000 as difminus, 000000.0000 as cursval, 000000.0000 as cursdif, id_jtva_coloana as id_jtvacol, ] +; [CAST(0 as n(10)) as id_valuta2, CAST('' as c(30)) as nume_val2, CAST(0 as n(15,2)) as sumaachi22,tva_incasare ] + ; [FROM ] + lcCursorIregPart Otherwise lnTip = 2 lcSumaAchi = [ROUND(preccred + credit,gnPc) - ROUND(precdeb+debit,gnPc)] lcSelectie = [SELECT *, ACONT AS ASCD, nume_val as numeval, curs as cursschimb, preccred + credit as totctva, precdeb+debit as achitat, debit as achitatl,] + ; [precvalcred + valcredit as sumaval, precVALdeb+VALdebit as achitatval, ] + Iif(tnProcTva = 1, [1], [0]) + [ as cu_tva, ] +; [.T. as ales, ] + lcSumaAchi + [ as sumaachi, 00000000000000.0000 as sumaachi2, 00000000000000.0000 as achilei, 00000000000000.0000 as difplus, ]+; [ 00000000000000.0000 as difminus, 000000.0000 as cursval, 000000.0000 as cursdif, id_jtva_coloana as id_jtvacol, ] + ; [CAST(0 as n(10)) as id_valuta2, CAST('' as c(30)) as nume_val2, CAST(0 as n(15,2)) as sumaachi22,tva_incasare ] + ; [FROM ] + lcCursorIregPart Endcase lcSelectie1 = lcSelectie + [ WHERE ] + lcSumaAchi + [< 0 INTO CURSOR ] + lcCursorSumeNegative + [ READWRITE] lcSelectie2 = lcSelectie + [ WHERE ] + lcSumaAchi + [> 0 INTO CURSOR ] + lcCursorSumePozitive + [ READWRITE] &lcSelectie1 &lcSelectie2 If !Empty(tcNumeVal2) And !Empty(Nvl(tnIdValuta2,0)) Update (lcCursorSumeNegative) Set id_valuta2 = tnIdValuta2, nume_Val2 = tcNumeVal2 Update (lcCursorSumePozitive) Set id_valuta2 = tnIdValuta2, nume_Val2 = tcNumeVal2 ENDIF *!* ROUND(sumaval-achitatval,gnPval) *!* && sumaachi2 = valoarea in valuta facturii (euro) *!* && sumaachi22 = valoarea in valuta de incasare(usd) *!* && m.suma_32 = cursul usd *!* && m.suma_3 = cursul euro *!* Local lncurs *!* If ales *!* lncurs = Iif(id_valuta = id_valuta2, poact.suma_32, poact.suma_3) *!* * lncurs = Iif(id_valuta = poact.id_valuta2, poact.suma_32, poact.suma_3) *!* Repl sumaachi2 With Round(sumaval - achitatval,gnPval) *!* IF poAct.suma_32 > 0 *!* replace sumaachi22 WITH ROUND(sumaachi2 * m.lncurs / poact.suma_32,2) *!* ENDIF *!* If sumaachi2=0 *!* Do mesaj With "Bifati doar inregistrarile","care au sold in valuta!" *!* Replace ales With .F. *!* Endif *!* Else *!* Repl sumaachi2 With 0, sumaachi22 With 0 *!* Endif If Reccount(lcCursorSumeNegative)>0 And Reccount(lcCursorSumePozitive)>0 Do calculcompens With lcCursorSumeNegative, lcCursorSumePozitive, 1,1 *!* mut toate facturile pe coloana corecta si le cumulez dupa id_fact copiaza_structura_cursor(lcCursorCalculCompensare,lcCursorCalculCompensareTemp) INSERT INTO (lcCursorCalculCompensareTemp) SELECT * FROM (lcCursorCalculCompensare) DELETE from (lcCursorCalculCompensare) IF lnTip = 1 Insert Into (lcCursorCalculCompensare) (nr_doc_d,nr_doc_c,id_factd,id_factc,ascd,ascc,sumaachi,ales,proc_tva,; id_jtvacol,tva_incasare_a,tva_incasare_d,tva_incasare_dtip,tva_incasare_c,tva_incasare_ctip) ; SELECT 0 As nr_doc_d, nr_doc_d As nr_doc_c, 0 As id_factd, id_factd As id_factc, '' As ascd,ascd As ascc,; Sum(sumaachi) As sumaachi,ales,; proc_tvaD as proc_tva,id_jtvacol as id_jtvacolC,; tva_incasare_a,0 As tva_incasare_d,'' As tva_incasare_dtip,tva_incasare_d As tva_incasare_c,; IIF(tva_incasare_dtip='D','C','') As tva_incasare_ctip ; From (lcCursorCalculCompensareTemp) ; Group By 1,2,3,4,5,6,8,9,10,11,12,13,14,15 ; Union All ; SELECT 0 As nr_doc_d,nr_doc_c,0 As id_factd,id_factc,'' As ascd,ascc,; Sum(sumaachi)*(-1) As sumaachi,ales,; proc_tvaC as proc_tva, id_jtvacolC as id_jtvacol,; tva_incasare_a,0 As tva_incasare_d,'' As tva_incasare_dtip,tva_incasare_c,tva_incasare_ctip ; From (lcCursorCalculCompensareTemp) ; Group By 1,2,3,4,5,6,8,9,10,11,12,13,14,15 ELSE Insert Into (lcCursorCalculCompensare) (nr_doc_d,nr_doc_c,id_factd,id_factc,ascd,ascc,sumaachi,ales,proc_tva,; id_jtvacol,tva_incasare_a,tva_incasare_d,tva_incasare_dtip,tva_incasare_c,tva_incasare_ctip) ; SELECT nr_doc_c As nr_doc_d, 0 As nr_doc_c, id_factc As id_factd, 0 As id_factc, ascc As ascd, '' As ascc,; Sum(sumaachi)*(-1) As sumaachi,ales,; proc_tvaC as proc_tva, id_jtvacolC as id_jtvacol,; tva_incasare_a,tva_incasare_c As tva_incasare_d,; IIF(tva_incasare_ctip='C','D','') as tva_incasare_dtip,; 0 As tva_incasare_c,'' As tva_incasare_ctip ; From (lcCursorCalculCompensareTemp) ; Group By 1,2,3,4,5,6,8,9,10,11,12,13,14,15 ; Union All ; SELECT nr_doc_d,0 As nr_doc_c,id_factd,0 As id_factc,ascd,'' As ascc,; Sum(sumaachi) As sumaachi,ales,; proc_tvaD as proc_tva, id_jtvacolD as id_jtvacol, ; tva_incasare_a,tva_incasare_d,tva_incasare_dtip,0 As tva_incasare_c,'' As tva_incasare_ctip ; From (lcCursorCalculCompensareTemp) ; Group By 1,2,3,4,5,6,8,9,10,11,12,13,14,15 ENDIF USE IN (lcCursorCalculCompensareTemp) Else llReturn = .F. amessagebox("Nu se pot face compensari intrucat nu exista facturi cu semn diferit!",48,"Atentie") Endif Use In (lcCursorIregPart) Use In (lcCursorSumeNegative) Use In (lcCursorSumePozitive) Release lnTip, lcCursorIregPart, lcCursorSumeNegative, lcCursorSumePozitive, lcCursorCalculCompensare, ; lcCursorCalculCompensareTemp, lcCont, lcCond, lnIdPart, ; lnFelCont, lnPozitie, lcSumaAchi, lcSelectie, lcSelectie1, lcSelectie2 RETURN llReturn Endproc