**********************************************************************
* Mise en Tableau des balances pour edition balance gnral ou 
* analytique
* Programme chaine a partir d'un projet VB
* Jrme                                                  21/12/99
* modif pb insertion                                      22/02/00
* modif pb insertion                                      24/03/00
* modif pb insertion par section analytique (SUB 150)     OCTOBRE 2000
**********************************************************************
* Ouvertures des fichiers
************************************************************** 
EXECUTE "SET-THOUS ."
EXECUTE "DATE.FORMAT"
OPEN "","BALANCEGENE" TO F.BALANCEGENE ELSE PRINT "BALANCEGENE"
OPEN "","BALANCEGENEARCHIVE" TO F.BALANCEGENEARCHIVE ELSE PRINT "BALANCEGENEARCHIVE"
OPEN "","BALANCEGENETEMPO" TO F.BALANCEGENETEMPO ELSE PRINT "BALANCEGENETEMPO"
OPEN "","BALANCEANAL" TO F.BALANCEANAL ELSE PRINT "BALANCEANAL"
OPEN "","BALANCEANALARCHIVE" TO F.BALANCEANALARCHIVE ELSE PRINT "BALANCEANALARCHIVE"
OPEN "","BALANCEANALTEMPO" TO F.BALANCEANALTEMPO ELSE PRINT "BALANCEANALTEMPO"
OPEN "","TEMPO" TO F.TEMPO ELSE STOP
OPEN "","LIENCOMPTA" TO F.LIENCOMPTA ELSE PRINT "LIENCOMPTA"
OPEN "","PLANCOMPTABLE" TO F.PLANCOMPTABLE ELSE PRINT "PLANCOMPTABLE"
OPEN "","SCLASSE" TO F.SCLASSE ELSE PRINT "SCLASSE"
OPEN "","SSCLASSE" TO F.SSCLASSE ELSE PRINT "SSCLASSE"
OPEN "","TABLES" TO F.TABLES ELSE PRINT "TABLES"

**************************************************************
* Recuperation des arguments
**************************************************************
PROCREAD ARGUMENTS ELSE PRINT "Procread"

W_MOISFINPER=FIELD(ARGUMENTS,"|",2)
W_MOISDEBPER=FIELD(ARGUMENTS,"|",3)
W_MOISDEBEX=FIELD(ARGUMENTS,"|",4)
W_MOISFINEX=FIELD(ARGUMENTS,"|",5)
W_TYPEEDITION=FIELD(ARGUMENTS,"|",6)
W_BROUILLARD=FIELD(ARGUMENTS,"|",7)
W_REQUETENORMAL=FIELD(ARGUMENTS,"|",8)
W_REQUETEBROUILLARD=FIELD(ARGUMENTS,"|",9)
W_REGROUPSECTANAL = FIELD(ARGUMENTS,"|",10)
W_FORME = FIELD(ARGUMENTS,"|",11)
W_ASSOC = FIELD(ARGUMENTS,"|",12)
W_EXERCICE = FIELD(ARGUMENTS,"|",13)
* christophe : regroupement centralisation mars 2007
W_CENTRALISATION = FIELD(ARGUMENTS,"|",14)

*********************************************************
*Initialisation des variables
*********************************************************
ENR_TEMPO=""
ENR_BALANCEGENE=""
ENR_BALANCEANAL=""
ENR_BALANCEGENETEMPO=""
ENR_BALANCEANALTEMPO=""
ENR_FICHIER=""
W_NB=""
i =""
j =""
W_VALEURDEBIT =""
W_VALEURCREDIT=""
W_QUANTITE =""
W_NBMOIS =""
W_MOISFIN =""
W_MOISDEB=""
W_MOISSEL=""
W_POSITION =""
W_COMPTE =""
MOISFIN=""
W_NUMEROCOMPTE=""
W_TABLEAU=""
W_VALEURTEST=""
W_FINI=""
W_EXER=""

W_NUMEROCOMPTE40=0
W_VALEURDEBIT40=0
W_VALEURCREDIT40=0
W_QUANTITE40=0

W_NUMEROCOMPTE41=0
W_VALEURDEBIT41=0
W_VALEURCREDIT41=0
W_QUANTITE41=0
PASSE = "F"

*****************************
* TRAITEMENT GLOBAL
*****************************
   
    IF W_MOISFINPER <> "" THEN
        MOISFIN = W_MOISFINPER
    END ELSE
        MOISFIN = W_MOISFINEX[4, 2]
    END

    * TRAITEMENT FICHIER NORMAL     
    GOSUB 400

    * TRAITEMENT FICHIER BROUILLARD
    GOSUB 500    

    ENR_TEMPO=W_TABLEAU	


    W_SauveCompte=""
    W_Count=DCOUNT(ENR_TEMPO,CHAR(254))
    FOR i = 1 TO W_Count
       IF W_SauveCompte # ENR_TEMPO<i,1>[1,10] THEN
          W_SauveCompte = ENR_TEMPO<i,1>[1,10]
       END ELSE
          ENR_TEMPO<i-1,2>=ENR_TEMPO<i-1,2>+ENR_TEMPO<i,2>
          ENR_TEMPO<i-1,3>=ENR_TEMPO<i-1,3>+ENR_TEMPO<i,3>
          ENR_TEMPO<i-1,4>=ENR_TEMPO<i-1,4>+ENR_TEMPO<i,4>
          ENR_TEMPO<i-1,5>=ENR_TEMPO<i-1,5>+ENR_TEMPO<i,5>
          ENR_TEMPO<i-1,6>=ENR_TEMPO<i-1,6>+ENR_TEMPO<i,6>

	  IF (ENR_TEMPO<i-1,5>#"" OR ENR_TEMPO<i-1,5>#"0") AND (ENR_TEMPO<i-1,6>#"" OR ENR_TEMPO<i-1,6>#"0") THEN
	     IF ENR_TEMPO<i-1,5> >= ENR_TEMPO<i-1,6> THEN
                ENR_TEMPO<i-1,5>=ENR_TEMPO<i-1,5>-ENR_TEMPO<i-1,6>
                ENR_TEMPO<i-1,6>=0
	     END ELSE
                ENR_TEMPO<i-1,6>=ENR_TEMPO<i-1,6>-ENR_TEMPO<i-1,5>
                ENR_TEMPO<i-1,5>=0
	     END
          END

          ENR_TEMPO=DELETE(ENR_TEMPO,i)
          W_Count=W_Count-1
          i=i-1
       END
    NEXT i

    IF W_FORME = "L" THEN
       WRITE ENR_TEMPO ON F.TEMPO,"BALANCECOMPTABLE"      
    END ELSE

       IF W_EXERCICE=0 THEN
          W_EXER="N-"
       END ELSE
       	  IF W_EXERCICE=1 THEN
             W_EXER="N0"
		  END ELSE
             W_EXER="N1"
		  END
      END
		
       EXECUTE "SET-DEC ,"
		
       READ ENR_TABLES FROM F.TABLES,"SECTANAL" ELSE ENR_TABLES=""
		
       W_Count=DCOUNT(ENR_TEMPO,CHAR(254))
       FOR i = 1 TO W_Count
          READ ENR_PLANCOMPTABLE FROM F.PLANCOMPTABLE,W_ASSOC:ENR_TEMPO<i,1>[1,10] ELSE ENR_PLANCOMPTABLE=""
  		  ENR_TEMPO=INSERT(ENR_TEMPO,i,2;ENR_PLANCOMPTABLE<1>)
			
          IF W_TYPEEDITION=2 THEN
             IF W_REGROUPSECTANAL=0 THEN
                j=1
                W_Sect=ENR_TEMPO<i,1>[11,3]
    	        LOOP
    	        UNTIL ENR_TABLES<2,j> = W_Sect OR ENR_TABLES<2,j> = "" DO
           	   j = j + 1
    	        REPEAT
                ENR_TEMPO<i,8>=ENR_TABLES<3,j>
             END 
				
          END
          ENR_TEMPO<i,1>=ENR_TEMPO<i,1>[1,10]
          ENR_TEMPO<i,3>=ENR_TEMPO<i,3>/100
          ENR_TEMPO<i,4>=ENR_TEMPO<i,4>/100
          ENR_TEMPO<i,5>=ENR_TEMPO<i,5>/100
          ENR_TEMPO<i,6>=ENR_TEMPO<i,6>/100
          ENR_TEMPO<i,7>=ENR_TEMPO<i,7>/100
			
       NEXT i
		
		*******************TRAITEMENT REGROUPEMENT / CENTRALISATION*******************
		
	IF W_CENTRALISATION  = 1 AND W_FORME <> "L" THEN
		
		**initialisation variables**
		W_TABLEAU2 = ""
		W_PASSEE = "FAUX"
		W_NUMEROCOMPTExxx = ""
		W_VALEURDEBITxxx = 0
		W_VALEURCREDITxxx = 0
		W_QUANTITExxx = 0
		W_TEMPOO = ""
		W_INDICEE = 0
		
		i = 1
		g = 1
		
		LOOP
		WHILE ENR_TEMPO<i,1>[1,2] < "42" DO
			
			IF ENR_TEMPO<i,1>[1,2] > "39" THEN
				
				IF W_PASSEE = "FAUX" THEN
					W_TEMP2 = ENR_TEMPO<i,1>[1,3]
					W_INDICEE = i
					W_PASSEE = "VRAI"
				END
				
				**traitement par SSCLASSE**
				IF ENR_TEMPO<i,1>[1,3] = W_TEMP2 THEN
					W_VALEURDEBITxxx = W_VALEURDEBITxxx + ENR_TEMPO<i, 3>
					W_VALEURCREDITxxx = W_VALEURCREDITxxx + ENR_TEMPO<i, 4>
					W_QUANTITExxx = W_QUANTITExxx + ENR_TEMPO<i, 5>
					
				END ELSE
					
					**ajout ligne SSCLASSE**
					READ ENR_SSCLASSE FROM F.SSCLASSE,W_TEMP2 ELSE ENR_SSCLASSE=""
					W_TEMPOO<g, 1> = W_TEMP2
					W_TEMPOO<g, 2> = ENR_SSCLASSE<1>
					W_TEMPOO<g, 3> = W_VALEURDEBITxxx
					W_TEMPOO<g, 4> = W_VALEURCREDITxxx
					W_TEMPOO<g, 5> = W_QUANTITExxx
					IF W_VALEURDEBITxxx > W_VALEURCREDITxxx THEN
						W_TEMPOO<g, 6> = W_VALEURDEBITxxx - W_VALEURCREDITxxx
						W_TEMPOO<g, 7> = 0
					END ELSE
						W_TEMPOO<g, 6> = 0
						W_TEMPOO<g, 7> = W_VALEURCREDITxxx - W_VALEURDEBITxxx
					END
					
					g = g + 1
					W_TEMP2 = ENR_TEMPO<i,1>[1,3]
					W_VALEURDEBITxxx = 0
					W_VALEURCREDITxxx = 0
					W_QUANTITExxx = 0
					
					W_VALEURDEBITxxx = W_VALEURDEBITxxx + ENR_TEMPO<i, 3>
					W_VALEURCREDITxxx = W_VALEURCREDITxxx + ENR_TEMPO<i, 4>
					W_QUANTITExxx = W_QUANTITExxx + ENR_TEMPO<i, 5>
					
				END
			END
			i = i + 1
		REPEAT
			
			**ajout ligne SSCLASSE**
			READ ENR_SSCLASSE FROM F.SSCLASSE,W_TEMP2 ELSE ENR_SSCLASSE=""
			W_TEMPOO<g, 1> = W_TEMP2
			W_TEMPOO<g, 2> = ENR_SSCLASSE<1>
			W_TEMPOO<g, 3> = W_VALEURDEBITxxx
			W_TEMPOO<g, 4> = W_VALEURCREDITxxx
			W_TEMPOO<g, 5> = W_QUANTITExxx
			IF W_VALEURDEBITxxx > W_VALEURCREDITxxx THEN
				W_TEMPOO<g, 6> = W_VALEURDEBITxxx - W_VALEURCREDITxxx
				W_TEMPOO<g, 7> = 0
			END ELSE
				W_TEMPOO<g, 6> = 0
				W_TEMPOO<g, 7> = W_VALEURCREDITxxx - W_VALEURDEBITxxx
			END
			
			W_VALEURDEBITxxx = 0
			W_VALEURCREDITxxx = 0
			W_QUANTITExxx = 0
			
			*****************
			
		IF W_PASSEE = "VRAI" THEN
			
			**AJOUT DANS FICHIER TEMPO**
			MAXX = i - W_INDICEE
			
			FOR j = 1 TO MAXX
				ENR_TEMPO = DELETE(ENR_TEMPO, W_INDICEE)
			NEXT j
			
			FOR i = 1 TO g
				ENR_TEMPO = INSERT(ENR_TEMPO,W_INDICEE;W_TEMPOO<i>)
				W_INDICEE = W_INDICEE + 1
			NEXT i
			****************************
		END
	END
	
	*****************FIN TRAITEMENT REGROUPEMENT / CENTRALISATION*****************
	
	
	   
       CONVERT "" TO ";" IN ENR_TEMPO

       W_Lib="N Compte;Libell Compte;Dbit;Crdit;Quantit;Solde dbit;Solde Crdit"

       IF W_TYPEEDITION=1 THEN
          W_Cle="BALGENE":W_ASSOC:W_EXER:".csv"
       END ELSE
          IF W_REGROUPSECTANAL=0 THEN
             W_Lib=W_Lib:";Section analytique"
          END
          W_Cle="BALANAL":W_ASSOC:W_EXER:".csv"
       END

       ENR_TEMPO=INSERT(ENR_TEMPO,1;W_Lib)
       WRITE ENR_TEMPO ON F.LIENCOMPTA,W_Cle
        
       ENR_TEMPO=""
       ENR_TEMPO<1>=W_Cle
       WRITE ENR_TEMPO ON F.TEMPO,"BALANCECOMPTABLE"

       EXECUTE "SET-DEC ."

    END
STOP

*****************************            
* REMPLISSAGE BALANCE GENERAL
*****************************
100

    GOSUB 200 
	
	W_TABLEAU<W_POSITION, 1> = W_NUMEROCOMPTE
	W_TABLEAU<W_POSITION, 2> = W_VALEURDEBIT
	W_TABLEAU<W_POSITION, 3> = W_VALEURCREDIT
	W_TABLEAU<W_POSITION, 4> = W_QUANTITE  
	
    GOSUB 300

RETURN    

*****************************            
* REMPLISSAGE BALANCE GENERAL
*****************************
150
    
    * calcul solde debit credit quantite                            

    GOSUB 200

    W_POSITION=1

    * RAJOUT TEST
    IF W_TYPEEDITION = 1 OR W_REGROUPSECTANAL = 1 THEN

    	LOOP
    	WHILE W_NUMEROCOMPTE > W_TABLEAU<W_POSITION,1> AND W_TABLEAU<W_POSITION, 1> <> "" DO
        	W_POSITION = W_POSITION + 1
    	REPEAT 

    END ELSE

    	LOOP
    	WHILE W_NUMEROCOMPTE[11,3] > W_TABLEAU<W_POSITION,1>[11,3] AND W_TABLEAU<W_POSITION, 1> <> "" DO
        	W_POSITION = W_POSITION + 1
    	REPEAT

    	LOOP
    	WHILE W_NUMEROCOMPTE[1,10] > W_TABLEAU<W_POSITION,1>[1,10] AND W_NUMEROCOMPTE[11,3]=W_TABLEAU<W_POSITION,1>[11,3] AND W_TABLEAU<W_POSITION, 1> <> "" DO
        	W_POSITION = W_POSITION + 1
    	REPEAT 

    END   


    W_VALEURTEST = W_TABLEAU<W_POSITION, 1>
    
    IF W_NUMEROCOMPTE = W_VALEURTEST THEN                                                                         
        
        W_TABLEAU<W_POSITION, 2> = W_TABLEAU<W_POSITION, 2> + W_VALEURDEBIT                                      
        W_TABLEAU<W_POSITION, 3> = W_TABLEAU<W_POSITION, 3> + W_VALEURCREDIT                                     
        W_TABLEAU<W_POSITION, 4> = W_TABLEAU<W_POSITION, 4> + W_QUANTITE                                         
        
        W_VALEURDEBIT=W_TABLEAU<W_POSITION, 2>
		W_VALEURCREDIT=W_TABLEAU<W_POSITION, 3>
		W_QUANTITE=W_TABLEAU<W_POSITION, 4>

        GOSUB 300

    END ELSE


    	* RAJOUT TEST
    	IF W_TYPEEDITION = 1 OR W_REGROUPSECTANAL = 1 THEN
        
        	IF W_NUMEROCOMPTE < W_VALEURTEST THEN  
					W_TABLEAU=INSERT(W_TABLEAU,W_POSITION;"")
					W_TABLEAU<W_POSITION,1>=W_NUMEROCOMPTE
            		W_TABLEAU<W_POSITION,2>=W_VALEURDEBIT
            		W_TABLEAU<W_POSITION,3>=W_VALEURCREDIT
            		W_TABLEAU<W_POSITION,4>=W_QUANTITE
            		GOSUB 300
        	END ELSE                                                              
            		W_TABLEAU<W_POSITION, 1> = W_NUMEROCOMPTE
            		W_TABLEAU<W_POSITION, 2> = W_VALEURDEBIT                                                                    
            		W_TABLEAU<W_POSITION, 3> = W_VALEURCREDIT                                                                   
            		W_TABLEAU<W_POSITION, 4> = W_QUANTITE                                                                       
            		GOSUB 300
            		W_POSITION = W_POSITION + 1
        	END

	END ELSE

        	IF W_NUMEROCOMPTE < W_VALEURTEST OR W_NUMEROCOMPTE[11,3] # W_VALEURTEST[11,3] THEN  
				W_TABLEAU=INSERT(W_TABLEAU,W_POSITION;"")
				W_TABLEAU<W_POSITION,1>=W_NUMEROCOMPTE
				W_TABLEAU<W_POSITION,2>=W_VALEURDEBIT
				W_TABLEAU<W_POSITION,3>=W_VALEURCREDIT
				W_TABLEAU<W_POSITION,4>=W_QUANTITE
				GOSUB 300
        	END ELSE
				W_TABLEAU<W_POSITION, 1> = W_NUMEROCOMPTE
				W_TABLEAU<W_POSITION, 2> = W_VALEURDEBIT                                                                    
				W_TABLEAU<W_POSITION, 3> = W_VALEURCREDIT                                                                   
				W_TABLEAU<W_POSITION, 4> = W_QUANTITE                                                                       
				GOSUB 300
				W_POSITION = W_POSITION + 1
        	END
	END
    
    END  


RETURN


*****************************
* SOLDE DEBIT CREDIT QUANTITE
*****************************
200



    IF W_MOISDEBPER = W_MOISDEBEX[4, 2] AND MOISFIN = W_MOISFINEX[4, 2] THEN
        * cas ou la periode selectionne correspond exactement a l'exercice        
        W_VALEURDEBIT = ENR_FICHIER<1>
        W_VALEURCREDIT = ENR_FICHIER<2>
        W_QUANTITE = ENR_FICHIER<3>
  
    END ELSE
        
        * cas inverse --> parcours MV avec cumul mois     
        W_VALEURDEBIT = 0
        W_VALEURCREDIT = 0
        W_QUANTITE = 0
        
        W_NBMOIS = DCOUNT(ENR_FICHIER<4>,CHAR(253))
        
        W_MOISDEB = W_MOISDEBPER
        W_MOISFIN = MOISFIN
           
        FOR j = 1 TO W_NBMOIS
              
            W_MOISSEL = ENR_FICHIER<4, j>
            
            IF W_MOISDEB <= W_MOISFIN THEN
                
                IF W_MOISSEL >= W_MOISDEB AND W_MOISSEL <= W_MOISFIN THEN
                    W_VALEURDEBIT = ENR_FICHIER<5, j> + W_VALEURDEBIT
                    W_VALEURCREDIT = ENR_FICHIER<6, j> + W_VALEURCREDIT
                    W_QUANTITE = ENR_FICHIER<7, j> + W_QUANTITE
                END
            
            END ELSE
                
                IF W_MOISSEL >= W_MOISDEB OR W_MOISSEL <= W_MOISFIN THEN
                    W_VALEURDEBIT = ENR_FICHIER<5, j> + W_VALEURDEBIT
                    W_VALEURCREDIT = ENR_FICHIER<6, j> + W_VALEURCREDIT
                    W_QUANTITE = ENR_FICHIER<7, j> + W_QUANTITE
                END
            
            END 
        
        NEXT j
  
    END


RETURN


*****************************
* CALCUL SOLDE
*****************************
300

    IF W_VALEURDEBIT > W_VALEURCREDIT THEN
        * solde debiteur        
        W_TABLEAU<W_POSITION, 5> = W_VALEURDEBIT - W_VALEURCREDIT
        W_TABLEAU<W_POSITION, 6> = ""
    
    END ELSE
        
        IF W_VALEURCREDIT > W_VALEURDEBIT THEN
            * solde credit
            W_TABLEAU<W_POSITION, 6> = W_VALEURCREDIT - W_VALEURDEBIT
            W_TABLEAU<W_POSITION, 5> = ""
        END ELSE
            * aucun solde
            W_TABLEAU<W_POSITION, 5> = 0
            W_TABLEAU<W_POSITION, 6> = ""
        END
    
    END

RETURN


*****************************
* TRAITEMENT DU FICHIER STANDARD HORS BROUILLARD
*****************************
400

IF W_REQUETENORMAL # "" THEN

    EXECUTE W_REQUETENORMAL
    
    W_FINI="FAUX"
    i=0
    
    LOOP
        READNEXT W_REQUETEBALANCE ELSE W_FINI="VRAI"
    WHILE W_FINI # "VRAI" DO

        i=i+1
        IF W_TYPEEDITION=1 THEN
            * BALANCE GENERALE
       	    IF W_EXERCICE=0 THEN
               READ ENR_BALANCEGENE FROM F.BALANCEGENEARCHIVE,W_REQUETEBALANCE ELSE PRINT "LECTURE BALANCEGENEARCHIVE"     
	    END ELSE
               READ ENR_BALANCEGENE FROM F.BALANCEGENE,W_REQUETEBALANCE ELSE PRINT "LECTURE BALANCEGENE" 
	    END
            ENR_FICHIER=ENR_BALANCEGENE
	    W_NUMEROCOMPTE=W_REQUETEBALANCE[6,10]
            W_POSITION=i
            GOSUB 100
            
        END ELSE
            * BALANCE ANALYTIQUE
       	    IF W_EXERCICE=0 THEN
               READ ENR_BALANCEANAL FROM F.BALANCEANALARCHIVE,W_REQUETEBALANCE ELSE PRINT "LECTURE BALANCEANALARCHIVE"
  	    END ELSE
               READ ENR_BALANCEANAL FROM F.BALANCEANAL,W_REQUETEBALANCE ELSE PRINT "LECTURE BALANCEANAL"
	    END
            ENR_FICHIER=ENR_BALANCEANAL
     		IF W_REGROUPSECTANAL # "1" THEN
	    		W_NUMEROCOMPTE=W_REQUETEBALANCE[6,13]
		END ELSE
			W_NUMEROCOMPTE=W_REQUETEBALANCE[6,10]
		END

	    W_POSITION=i
            GOSUB 100
      
        END

    REPEAT

END

RETURN


*****************************
* TRAITEMENT DU FICHIER BROUILLARD
*****************************
500

IF W_REQUETEBROUILLARD # "" THEN

    EXECUTE W_REQUETEBROUILLARD
    
    W_FINI="FAUX"
    i=0

    LOOP
        READNEXT W_REQUETETEMPO ELSE W_FINI="VRAI"
    WHILE W_FINI # "VRAI" DO
        
        i=i+1
        
        IF W_TYPEEDITION=1 THEN

            READ ENR_BALANCEGENETEMPO FROM F.BALANCEGENETEMPO,W_REQUETETEMPO THEN
		ENR_FICHIER=ENR_BALANCEGENETEMPO
		W_NUMEROCOMPTE=W_REQUETETEMPO[6,10]
                W_POSITION=i            
                GOSUB 150	
	    END ELSE 
		PRINT "LECTURE BALANCEGENETEMPO"  
	    END
                    
        END ELSE

	    READ ENR_BALANCEANALTEMPO FROM F.BALANCEANALTEMPO,W_REQUETETEMPO THEN
		ENR_FICHIER=ENR_BALANCEANALTEMPO
		IF W_REGROUPSECTANAL # "1" THEN
	    		W_NUMEROCOMPTE=W_REQUETETEMPO[6,13]
		END ELSE
			W_NUMEROCOMPTE=W_REQUETETEMPO[6,10]
		END
            W_POSITION=i
            GOSUB 150	
	    END ELSE 
		PRINT "LECTURE BALANCEANALTEMPO"  
	    END
            
        END
        
    REPEAT

END

RETURN
