Patch level :2.2 nopatch
Files correlati : Ricompilazione Demo : [ ] Commento :stampa pagato analitica in corso d'opera (un casino pauroso!) git-svn-id: svn://10.65.10.50/trunk@13585 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
		
							parent
							
								
									0bd4accb45
								
							
						
					
					
						commit
						3e93550834
					
				
							
								
								
									
										553
									
								
								ca/ca3600.cpp
									
									
									
									
									
								
							
							
						
						
									
										553
									
								
								ca/ca3600.cpp
									
									
									
									
									
								
							@ -13,7 +13,6 @@
 | 
			
		||||
#include "..\cg\cg2103.h"
 | 
			
		||||
#include "..\ve\velib.h"
 | 
			
		||||
 | 
			
		||||
#include "panapdc.h"
 | 
			
		||||
#include "pconana.h"
 | 
			
		||||
#include "movana.h"
 | 
			
		||||
#include "rmovana.h"
 | 
			
		||||
@ -105,7 +104,7 @@ bool TPag_per_cms_mask::on_field_event(TOperable_field& o, TField_event e, long
 | 
			
		||||
			if (e == fe_button)
 | 
			
		||||
			{
 | 
			
		||||
				config_setter(sfield(F_PDCC), "Pdcc");
 | 
			
		||||
				config_setter(sfield(F_PDCA), "Pdca");
 | 
			
		||||
//				config_setter(sfield(F_PDCA), "Pdca");	***per ora solo Pdcc***
 | 
			
		||||
			}
 | 
			
		||||
			break;
 | 
			
		||||
    default: 
 | 
			
		||||
@ -121,9 +120,9 @@ TPag_per_cms_mask::TPag_per_cms_mask()
 | 
			
		||||
	// creazione dei campi della pagina della maschera con lo sheet di cdc/cms/fasi
 | 
			
		||||
	create_sheet(F_RIGHE);
 | 
			
		||||
 | 
			
		||||
	//Seconda pagina (sheets dei conti)
 | 
			
		||||
	//Seconda pagina (sheets dei conti)	***per ora solo Pdcc***
 | 
			
		||||
	//Controllo sul tipo di piano dei conti da utilizzare (Analitico/Contabile)
 | 
			
		||||
	TConfig& cfg = ca_config();
 | 
			
		||||
/*	TConfig& cfg = ca_config();
 | 
			
		||||
	const bool use_pdcc = cfg.get_bool("UsePdcc");
 | 
			
		||||
 | 
			
		||||
  set(F_PIANO, use_pdcc ? "Contabile" : "Analitico");
 | 
			
		||||
@ -145,8 +144,9 @@ TPag_per_cms_mask::TPag_per_cms_mask()
 | 
			
		||||
		sfield(F_PDCA).sheet_mask().hide(-1);
 | 
			
		||||
		
 | 
			
		||||
		config_loader(sfield(F_PDCA), "Pdca");
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	}*/
 | 
			
		||||
	//carica i parametri dei conti per lo sheet dei conti contabili
 | 
			
		||||
	config_loader(sfield(F_PDCC), "Pdcc");
 | 
			
		||||
	// setta gli handlers a tutti i campi generati della maschera;senza questa chiamata la on_field_event
 | 
			
		||||
	// non puo' funzionare sui campi generati!!!
 | 
			
		||||
	set_handlers();
 | 
			
		||||
@ -200,6 +200,8 @@ protected:
 | 
			
		||||
	long _codfor;
 | 
			
		||||
	TString8 _campodata;
 | 
			
		||||
  TString _codcosto, _codcms, _codfas;
 | 
			
		||||
	TAssoc_array _costi,_pagamenti,_fiscali,_sociali; //array che contengono i conti letti dal .ini
 | 
			
		||||
 | 
			
		||||
	
 | 
			
		||||
protected:	//da libreria
 | 
			
		||||
//	virtual const TVariant& get(const char* column_name) const;
 | 
			
		||||
@ -210,6 +212,12 @@ protected:
 | 
			
		||||
  static bool mov_callback(const TRelation& rel, void* pJolly);
 | 
			
		||||
	long find_movimento(const TRectype& riga_pag) const;
 | 
			
		||||
	void find_commesse(const long nreg, const TRectype& riga_pag);
 | 
			
		||||
	bool check_cms_cdc_fsc(const TRectype& rec_analriga);
 | 
			
		||||
	void lettura_conti(TAssoc_array& assoc, const char tipoconto);
 | 
			
		||||
	int cerca_riga_fattura_origine(const TPartita& match, const TRectype& riga_pag);
 | 
			
		||||
	real totale_documento(const TRectype& mov) const;
 | 
			
		||||
	real calcola_pagato_prec(const TPartita& match, const int riga_fatt, const TRectype& riga_pag);
 | 
			
		||||
  bool test_swap(TCausale& caus, bool ritsoc) const;
 | 
			
		||||
 | 
			
		||||
public:
 | 
			
		||||
  virtual void set_filter(const TPag_per_cms_mask& msk, const int cms_row, const long codfor);
 | 
			
		||||
@ -278,6 +286,100 @@ void TPag_per_cms_recordset::crea_trr(const TFilename& trr) const
 | 
			
		||||
	of << "CONTO+NREG+DATAPAG" << endl;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
void TPag_per_cms_recordset::lettura_conti(TAssoc_array& assoc, const char tipoconto)
 | 
			
		||||
{
 | 
			
		||||
  TConfig conti("ca3600.ini","Pdcc"); //paragrafo da scandire nell'ini (solo conti contabili!!)
 | 
			
		||||
  TAssoc_array& vars = conti.list_variables();
 | 
			
		||||
 | 
			
		||||
  FOR_EACH_ASSOC_STRING(vars, h, k, val)  //riempie l'assoc con i soli valori del paragrafo dell'ini
 | 
			
		||||
	{
 | 
			
		||||
		if (*val == tipoconto)	//mette nell'assocarray solo i conti corrispondenti al tipoconto passato
 | 
			
		||||
			assoc.add(val);
 | 
			
		||||
	}
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Controlla sulla causale se il segno del totale documento (ritsoc=FALSE) 
 | 
			
		||||
// o quello delle ritenute sociali (ritsoc=TRUE) e' invertito rispetto al normale
 | 
			
		||||
bool TPag_per_cms_recordset::test_swap(TCausale& caus, bool ritsoc) const
 | 
			
		||||
{
 | 
			
		||||
  const char sez = ritsoc ? caus.sezione_ritsoc() : caus.sezione_clifo();
 | 
			
		||||
  const bool s = (caus.iva() == iva_vendite) ^ (sez == 'D');
 | 
			
		||||
  return s;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
// Calcola il totale del documento tenendo conto del segno della prima riga e di quella delle
 | 
			
		||||
// ritenute sociali sulla causale                        
 | 
			
		||||
real TPag_per_cms_recordset::totale_documento(const TRectype& mov) const
 | 
			
		||||
{
 | 
			
		||||
  real tot = mov.get_real(MOV_TOTDOC);              // Legge totale
 | 
			
		||||
  const real ritfis = mov.get_real(MOV_RITFIS);
 | 
			
		||||
  tot += ritfis;                          // Somma ritenute fiscali
 | 
			
		||||
  
 | 
			
		||||
  const real ritsoc = mov.get_real(MOV_RITSOC);           
 | 
			
		||||
 | 
			
		||||
  if (!ritsoc.is_zero())
 | 
			
		||||
  {
 | 
			
		||||
    TCausale caus(mov.get(MOV_CODCAUS));
 | 
			
		||||
    const bool swapt = test_swap(caus, false);    // Totale invertito ?
 | 
			
		||||
    const bool swaps = test_swap(caus, true);     // Ritenute sociali invertite ?
 | 
			
		||||
    if (swapt ^ swaps)                      // Somma ritenute sociali con segno
 | 
			
		||||
      tot -= ritsoc;
 | 
			
		||||
    else
 | 
			
		||||
      tot += ritsoc;
 | 
			
		||||
  }
 | 
			
		||||
 | 
			
		||||
  return tot;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
int TPag_per_cms_recordset::cerca_riga_fattura_origine(const TPartita& match, const TRectype& riga_pag)
 | 
			
		||||
{
 | 
			
		||||
  //scansione delle righe partita passata, precedenti alla riga_pag
 | 
			
		||||
  const int k = riga_pag.get_int(PART_NRIGA);
 | 
			
		||||
  for (int i = match.pred(k); i > 0; i = match.pred(i))
 | 
			
		||||
  {
 | 
			
		||||
    const TRiga_partite& riga_part = match.riga(i);
 | 
			
		||||
    if (riga_part.is_fattura())
 | 
			
		||||
    {
 | 
			
		||||
      for (int j = riga_part.rate(); j > 0; j--)
 | 
			
		||||
      {
 | 
			
		||||
        if (match.esiste(i, j, k)) //se esiste il pagamento k della rata j della riga partita i contenente la fattura
 | 
			
		||||
          return i;
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return 0;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
real TPag_per_cms_recordset::calcola_pagato_prec(const TPartita& match, const int riga_fatt, const TRectype& riga_pag)
 | 
			
		||||
{
 | 
			
		||||
  real pagato = ZERO;
 | 
			
		||||
  if (riga_fatt > 0)
 | 
			
		||||
  {
 | 
			
		||||
    const int k = riga_pag.get_int(PART_NRIGA);
 | 
			
		||||
    const TDate data_rif = riga_pag.get(_campodata);  //data di riferimento selezionata sulla maschera 
 | 
			
		||||
 | 
			
		||||
    const TRiga_partite& riga_part = match.riga(riga_fatt);
 | 
			
		||||
    for (int i = riga_part.rate(); i > 0; i--)
 | 
			
		||||
    {
 | 
			
		||||
      TRiga_scadenze& sc = riga_part.rata(i);
 | 
			
		||||
      for (int j = sc.last(); j > 0; j = sc.pred(j))
 | 
			
		||||
      {
 | 
			
		||||
        const TRiga_partite& pag = match.riga(j);
 | 
			
		||||
        const TDate datapag = pag.get_date(_campodata);
 | 
			
		||||
        const long cmp = datapag - data_rif;
 | 
			
		||||
        //la riga pagamento e' da considerare quando ha data anteriore a quella di riferimento oppur
 | 
			
		||||
        //ha data uguale ma numero di registrazione inferiore (insomma, il pagamento e' precedente
 | 
			
		||||
        //a quello di riga_pag)
 | 
			
		||||
        if (cmp < 0 || (cmp == 0 && j <= k))
 | 
			
		||||
        {
 | 
			
		||||
          pagato += pag.get_real(PAGSCA_IMPORTO);
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
  }
 | 
			
		||||
  return pagato;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
long TPag_per_cms_recordset::find_movimento(const TRectype& riga_pag) const
 | 
			
		||||
{
 | 
			
		||||
  int n_fatture = 0;  //numero di fatture trovate
 | 
			
		||||
@ -376,189 +478,304 @@ void TPag_per_cms_recordset::scan_movs(const TPag_per_cms_mask& msk)
 | 
			
		||||
  crea_righe_stampa(_righesociali, 4);*/
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TPag_per_cms_recordset::check_cms_cdc_fsc(const TRectype& rec_analriga)
 | 
			
		||||
{
 | 
			
		||||
	if (_codcosto.not_empty() && _codcosto != rec_analriga.get(RMOVANA_CODCCOSTO))
 | 
			
		||||
		return false;
 | 
			
		||||
	if (_codcms.not_empty() && _codcms != rec_analriga.get(RMOVANA_CODCMS))
 | 
			
		||||
		return false;
 | 
			
		||||
	if (_codfas.not_empty() && _codfas != rec_analriga.get(RMOVANA_CODFASE))
 | 
			
		||||
		return false;
 | 
			
		||||
 | 
			
		||||
	return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
//prepara l'assoc con tutte le righe da mandare in stampa per quanto riguarda i movimenti con
 | 
			
		||||
//saldaconto (siano essi con o senza iva)
 | 
			
		||||
void TPag_per_cms_recordset::find_commesse(const long nreg, const TRectype& riga_pag)
 | 
			
		||||
{
 | 
			
		||||
/*  TMovimentoPN pn;
 | 
			
		||||
  pn.curr().put(MOV_NUMREG, nreg);
 | 
			
		||||
  if (pn.read() == NOERR)
 | 
			
		||||
	//cerca un record di MOVANA che abbia numregcg = nreg;usa il nuovo metodo fighissimo..
 | 
			
		||||
	//..con la isam query
 | 
			
		||||
	TString query, strnreg;
 | 
			
		||||
	strnreg.format("%07ld", nreg);
 | 
			
		||||
 | 
			
		||||
	query << "USE MOVANA KEY 3\n";
 | 
			
		||||
	query << "WHERE NUMREGCG=";
 | 
			
		||||
	query << strnreg;
 | 
			
		||||
	query << "\n";
 | 
			
		||||
 | 
			
		||||
	TISAM_recordset movana(query);
 | 
			
		||||
 | 
			
		||||
	for (TRecnotype i = 0; movana.move_to(i); i++)
 | 
			
		||||
  {
 | 
			
		||||
    const TRectype& movfat = pn.curr();
 | 
			
		||||
		const long numregcg = movana.get(MOVANA_NUMREGCG).as_int();
 | 
			
		||||
		//se trova il record cercato in RMOVANA...
 | 
			
		||||
		if (numregcg == nreg)
 | 
			
		||||
		{	
 | 
			
		||||
			//prepara il record tmpcurr sul file temporaneo _tmp su cui registrare i dati da stampare
 | 
			
		||||
			TRectype& tmpcurr = _tmp->curr();
 | 
			
		||||
			tmpcurr.zero();
 | 
			
		||||
 | 
			
		||||
    real totdoc_cms;
 | 
			
		||||
    real totdoc, totdoc_netto;
 | 
			
		||||
    TAssoc_array commesse;
 | 
			
		||||
			//crea un movimento p.n. con il numero reg che viene passato al metodo (nreg relativo.. 
 | 
			
		||||
			//..ad un movimento della fattura originaria) 
 | 
			
		||||
		  TMovimentoPN pn;
 | 
			
		||||
			pn.curr().put(MOV_NUMREG, nreg);
 | 
			
		||||
			if (pn.read() == NOERR)
 | 
			
		||||
			{
 | 
			
		||||
				const TRectype& movfat = pn.curr();
 | 
			
		||||
 | 
			
		||||
    //Movimenti CON SALDACONTO
 | 
			
		||||
    //se movimento IVA..
 | 
			
		||||
    if (pn.iva_items() > 0)
 | 
			
		||||
    {
 | 
			
		||||
      for (int i = 0; i < pn.iva_items(); i++)
 | 
			
		||||
      {
 | 
			
		||||
        const TRectype& rmoviva = pn.iva(i);
 | 
			
		||||
        const TString& codcms = rmoviva.get(RMI_CODCMS);
 | 
			
		||||
        const TString& codfase = rmoviva.get(RMI_FASCMS);
 | 
			
		||||
				real totdoc_cms;
 | 
			
		||||
				real totdoc, totdoc_netto;
 | 
			
		||||
				TAssoc_array commesse;
 | 
			
		||||
    
 | 
			
		||||
        const TBill conto(rmoviva);
 | 
			
		||||
				//Movimenti CON SALDACONTO
 | 
			
		||||
				//se movimento IVA..
 | 
			
		||||
				if (pn.iva_items() > 0)
 | 
			
		||||
				{
 | 
			
		||||
					for (int i = 0; i < pn.iva_items(); i++)
 | 
			
		||||
					{
 | 
			
		||||
						const TRectype& rmoviva = pn.iva(i);
 | 
			
		||||
						const TBill zio(rmoviva);
 | 
			
		||||
						//il tutto si fa solo se l'indicatore del conto nella riga iva e' != 5
 | 
			
		||||
						if (zio.indicatore_bilancio() != 5)
 | 
			
		||||
						{
 | 
			
		||||
							const int gruppo_iva = zio.gruppo();
 | 
			
		||||
							const int conto_iva = zio.conto();
 | 
			
		||||
							const long sottoconto_iva = zio.sottoconto();
 | 
			
		||||
 | 
			
		||||
        if (cms_in_range(codcms, codfase) && conto.indicatore_bilancio() != 5)
 | 
			
		||||
        {
 | 
			
		||||
          TToken_string cms_fsc = codcms;
 | 
			
		||||
          if (codfase.not_empty())
 | 
			
		||||
            cms_fsc.add(codfase);
 | 
			
		||||
							//trova le RMOVANA del MOVANA corrente che hanno il conto = a quello della i-esima rigaiva
 | 
			
		||||
							TAnal_mov anal_mov(nreg);
 | 
			
		||||
							TRecord_array& anal_rows = anal_mov.body();
 | 
			
		||||
 | 
			
		||||
          const real importo = rmoviva.get_real(RMI_IMPONIBILE);
 | 
			
		||||
          real imposta = rmoviva.get_real(RMI_IMPOSTA);
 | 
			
		||||
          real* imp = (real*)commesse.objptr(cms_fsc);
 | 
			
		||||
          if (imp == NULL)
 | 
			
		||||
          {
 | 
			
		||||
            imp = new real;
 | 
			
		||||
            commesse.add(cms_fsc, imp);
 | 
			
		||||
          }
 | 
			
		||||
          *imp += importo;
 | 
			
		||||
          totdoc_cms += importo;
 | 
			
		||||
							if (anal_rows.rows() > 0)	//se il movana ha righe...
 | 
			
		||||
							{
 | 
			
		||||
								for (i = 1; i <= anal_rows.rows(); i++)
 | 
			
		||||
								{
 | 
			
		||||
 | 
			
		||||
          if (imposta != ZERO)
 | 
			
		||||
          {
 | 
			
		||||
            //controllo prorata
 | 
			
		||||
            const TRectype& pla = cache().get("CMS", codcms);
 | 
			
		||||
            const bool prorata = pla.get_bool("B4");
 | 
			
		||||
            if (prorata)
 | 
			
		||||
            {
 | 
			
		||||
              const TDate datareg = pn.curr().get_date(MOV_DATAREG);
 | 
			
		||||
              const int anno = datareg.year();
 | 
			
		||||
              TRegistro registro(pn.curr().get(MOV_REG), anno);
 | 
			
		||||
									//prende il conto sulla riga analitica e lo confronta con quello della riga iva
 | 
			
		||||
									const int gruppo_anal = atoi(anal_rows[i].get(RMOVANA_CODCONTO).left(3)); 
 | 
			
		||||
									const int conto_anal = atoi(anal_rows[i].get(RMOVANA_CODCONTO).mid(3,3));
 | 
			
		||||
									const long sottoconto_anal = atol(anal_rows[i].get(RMOVANA_CODCONTO).mid(6,6));
 | 
			
		||||
 | 
			
		||||
              imposta *= (CENTO - registro.prorata(anno))/CENTO;
 | 
			
		||||
              imposta.round(TCurrency::get_firm_dec()); //ci vanno i decimali della ditta
 | 
			
		||||
            }
 | 
			
		||||
									//il codconto anale e iva coincidono?
 | 
			
		||||
									if (gruppo_iva == gruppo_anal && conto_iva == conto_anal && sottoconto_iva == sottoconto_anal)
 | 
			
		||||
									{
 | 
			
		||||
 | 
			
		||||
            *imp += imposta;
 | 
			
		||||
            totdoc_cms += imposta;
 | 
			
		||||
          }
 | 
			
		||||
										const real imponibile_iva = rmoviva.get_real(RMI_IMPONIBILE);
 | 
			
		||||
										real imposta_iva = rmoviva.get_real(RMI_IMPOSTA);
 | 
			
		||||
 | 
			
		||||
        }
 | 
			
		||||
      }
 | 
			
		||||
										//commessa,cdc,fase della riga analitica devono essere coincidenti con quelle dello sheet
 | 
			
		||||
										if (check_cms_cdc_fsc(anal_rows[i]))
 | 
			
		||||
										{
 | 
			
		||||
											//costruzione dell'assoc_array con cms/cdc/fsc ed importi
 | 
			
		||||
											TToken_string cms_cdc_fsc;
 | 
			
		||||
											cms_cdc_fsc.add(anal_rows[i].get(RMOVANA_CODCMS));
 | 
			
		||||
											cms_cdc_fsc.add(anal_rows[i].get(RMOVANA_CODCCOSTO));
 | 
			
		||||
											cms_cdc_fsc.add(anal_rows[i].get(RMOVANA_CODFASE));
 | 
			
		||||
 | 
			
		||||
      totdoc = totale_documento(pn.curr()); //tot doc con ritenute fiscali + ritenute sociali (da stampare)
 | 
			
		||||
      totdoc_netto = pn.curr().get_real(MOV_TOTDOC); //questo si usa solo per il calcolo del residuo
 | 
			
		||||
    }
 | 
			
		||||
    else  //..movimento NON iva (sempre con saldaconto)
 | 
			
		||||
    {
 | 
			
		||||
      for (int i = 0; i < pn.cg_items(); i++)
 | 
			
		||||
      {
 | 
			
		||||
        const TRectype& rmov = pn.cg(i);
 | 
			
		||||
        const TBill conto(rmov);
 | 
			
		||||
											real* imp = (real*)commesse.objptr(cms_cdc_fsc);
 | 
			
		||||
											if (imp == NULL)
 | 
			
		||||
											{
 | 
			
		||||
												imp = new real;
 | 
			
		||||
												commesse.add(cms_cdc_fsc, imp);
 | 
			
		||||
											}
 | 
			
		||||
											*imp += imponibile_iva;
 | 
			
		||||
											totdoc_cms += imponibile_iva;
 | 
			
		||||
 | 
			
		||||
        TImporto importo(rmov.get_char(RMV_SEZIONE), rmov.get_real(RMV_IMPORTO));
 | 
			
		||||
        importo.normalize('D');
 | 
			
		||||
											if (imposta_iva != ZERO)
 | 
			
		||||
											{
 | 
			
		||||
												//controllo prorata
 | 
			
		||||
												const TRectype& pla = cache().get(LF_COMMESSE, anal_rows[i].get(RMOVANA_CODCMS));
 | 
			
		||||
												const bool prorata = pla.get_bool("PRORATA");
 | 
			
		||||
												if (prorata)
 | 
			
		||||
												{
 | 
			
		||||
													const TDate datareg = pn.curr().get_date(MOV_DATAREG);
 | 
			
		||||
													const int anno = datareg.year();
 | 
			
		||||
													TRegistro registro(pn.curr().get(MOV_REG), anno);
 | 
			
		||||
 | 
			
		||||
        if (conto.tipo() > ' ')
 | 
			
		||||
        {
 | 
			
		||||
          totdoc -= importo.valore(); 
 | 
			
		||||
          totdoc_netto -= importo.valore(); //valore per il calcolo del residuo
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
													imposta_iva *= (CENTO - registro.prorata(anno))/CENTO;
 | 
			
		||||
													imposta_iva.round(TCurrency::get_firm_dec()); //ci vanno i decimali della ditta
 | 
			
		||||
												}
 | 
			
		||||
        
 | 
			
		||||
        if (cerca_fiscali(conto) || cerca_sociali(conto))
 | 
			
		||||
        {
 | 
			
		||||
          totdoc -= importo.valore(); //valore da stampare nella colonna Tot.fattura con ritenute
 | 
			
		||||
          continue;
 | 
			
		||||
        }
 | 
			
		||||
												*imp += imposta_iva;
 | 
			
		||||
												totdoc_cms += imposta_iva;
 | 
			
		||||
											}
 | 
			
		||||
 | 
			
		||||
        const TString& codcms = rmov.get(RMV_CODCMS);
 | 
			
		||||
        const TString& codfase = rmov.get(RMV_FASCMS);
 | 
			
		||||
/*											TGeneric_distrib agip(imponibile_iva, TCurrency::get_firm_dec());
 | 
			
		||||
											FOR_EACH_ASSOC_OBJECT(commesse, h, k, importo)
 | 
			
		||||
											{
 | 
			
		||||
												const real& impcms = *(real*)importo;
 | 
			
		||||
												agip.add(impcms);
 | 
			
		||||
												agip_prec.add(impcms);  //distributore di importo pagato sulle commesse
 | 
			
		||||
											}*/
 | 
			
		||||
										}
 | 
			
		||||
 | 
			
		||||
        if (cms_in_range(codcms,codfase) && conto.indicatore_bilancio() != 5)
 | 
			
		||||
        {
 | 
			
		||||
          TToken_string cms_fsc = codcms;
 | 
			
		||||
          if (codfase.not_empty())
 | 
			
		||||
            cms_fsc.add(codfase);
 | 
			
		||||
									}	//if(gruppo_iva==..
 | 
			
		||||
 | 
			
		||||
          real* imp = (real*)commesse.objptr(cms_fsc);
 | 
			
		||||
          if (imp == NULL)
 | 
			
		||||
          {
 | 
			
		||||
            imp = new real;
 | 
			
		||||
            commesse.add(cms_fsc, imp);
 | 
			
		||||
          }
 | 
			
		||||
          *imp += importo.valore();
 | 
			
		||||
          totdoc_cms += importo.valore();          
 | 
			
		||||
        }
 | 
			
		||||
								}	//for (anal_rows...
 | 
			
		||||
							}	//if anal_rows() > 0...
 | 
			
		||||
						}	//if indicatore_bilancio!=5..
 | 
			
		||||
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
						//aggiungi le slice con gli importi delle righe di analitica
 | 
			
		||||
						//estrai gli importi risultanti e aggiungili a commesse (come sotto) solo se la commessa coincide
 | 
			
		||||
						//con quella selezionata
 | 
			
		||||
						//ricordarsi di considerare l'indetraibilita'
 | 
			
		||||
 | 
			
		||||
    //parte comune a movimenti IVA e non (vengono anche qui considerate le ritenute fiscali
 | 
			
		||||
    //e sociali perche' possono essere state inserite direttamente nella partita e non nel movimento
 | 
			
		||||
    //(quindi non si puo' in questo caso applicare la totale_documento()
 | 
			
		||||
    //Le ritenute fiscali vanno sempre sommate..
 | 
			
		||||
    real totpagato = riga_pag.get_real(PART_IMPORTO) + riga_pag.get_real(PART_RITENUTE);
 | 
			
		||||
    //Le ritenute sociali invece vanno testate con la test_swap..
 | 
			
		||||
    const real ritsoc = riga_pag.get_real(PART_RITSOC);           
 | 
			
		||||
    if (!ritsoc.is_zero())
 | 
			
		||||
    {
 | 
			
		||||
      const TRectype& mov = pn.curr();
 | 
			
		||||
      TCausale caus(mov.get(MOV_CODCAUS));
 | 
			
		||||
      const bool swapt = test_swap(caus, false);    // Totale invertito ?
 | 
			
		||||
      const bool swaps = test_swap(caus, true);     // Ritenute sociali invertite ?
 | 
			
		||||
      if (swapt ^ swaps)                      // Somma ritenute sociali con segno
 | 
			
		||||
        totpagato -= ritsoc;
 | 
			
		||||
      else
 | 
			
		||||
        totpagato += ritsoc;
 | 
			
		||||
    }
 | 
			
		||||
 | 
			
		||||
    const real percentuale = totpagato / totdoc_netto;
 | 
			
		||||
						
 | 
			
		||||
    //calcolo del residuo (solo movimenti saldacontati)
 | 
			
		||||
    //mi servono,dalla riga partita che viene passata,i valori dei campi per la chiave del
 | 
			
		||||
    //file delle scadenze
 | 
			
		||||
    const TPartita match(riga_pag);
 | 
			
		||||
    //ci serve la riga di fattura che origina la nostra riga pagamento
 | 
			
		||||
    const int riga_fatt = cerca_riga_fattura_origine(match, riga_pag);
 | 
			
		||||
    //quanto era stato pagato del documento prima della attuale riga_pag
 | 
			
		||||
    const real totpagato_prec = calcola_pagato_prec(match, riga_fatt, riga_pag);
 | 
			
		||||
    const real perc_prec = totpagato_prec / totdoc_netto;
 | 
			
		||||
 | 
			
		||||
    TGeneric_distrib distributore(totdoc_cms * percentuale, TCurrency::get_firm_dec());
 | 
			
		||||
    TGeneric_distrib distributore_prec(totdoc_cms * perc_prec, TCurrency::get_firm_dec());
 | 
			
		||||
    {
 | 
			
		||||
      FOR_EACH_ASSOC_OBJECT(commesse, h, k, imp)
 | 
			
		||||
      {
 | 
			
		||||
        const real& impcms = *(real*)imp;
 | 
			
		||||
        distributore.add(impcms);
 | 
			
		||||
        distributore_prec.add(impcms);  //distributore di importo pagato sulle commesse
 | 
			
		||||
      }
 | 
			
		||||
    }
 | 
			
		||||
/*						if (conto.indicatore_bilancio() != 5)
 | 
			
		||||
						{
 | 
			
		||||
							const real importo = rmoviva.get_real(RMI_IMPONIBILE);
 | 
			
		||||
							real imposta = rmoviva.get_real(RMI_IMPOSTA);
 | 
			
		||||
							real* imp = (real*)commesse.objptr(cms_fsc);
 | 
			
		||||
							if (imp == NULL)
 | 
			
		||||
							{
 | 
			
		||||
								imp = new real;
 | 
			
		||||
								commesse.add(cms_fsc, imp);
 | 
			
		||||
							}
 | 
			
		||||
							*imp += importo;
 | 
			
		||||
							totdoc_cms += importo;
 | 
			
		||||
                 
 | 
			
		||||
    FOR_EACH_ASSOC_OBJECT(commesse, h, k, imp)
 | 
			
		||||
    {
 | 
			
		||||
      const real& impcms = *(real*)imp;
 | 
			
		||||
      TPag_per_cms_struct* ppcs = new TPag_per_cms_struct;
 | 
			
		||||
							if (imposta != ZERO)
 | 
			
		||||
							{
 | 
			
		||||
								//controllo prorata
 | 
			
		||||
								const TRectype& pla = cache().get("CMS", codcms);
 | 
			
		||||
								const bool prorata = pla.get_bool("B4");
 | 
			
		||||
								if (prorata)
 | 
			
		||||
								{
 | 
			
		||||
									const TDate datareg = pn.curr().get_date(MOV_DATAREG);
 | 
			
		||||
									const int anno = datareg.year();
 | 
			
		||||
									TRegistro registro(pn.curr().get(MOV_REG), anno);
 | 
			
		||||
 | 
			
		||||
      // campi del pagamento
 | 
			
		||||
      ppcs->_tipo = 0; //movimenti da saldaconto
 | 
			
		||||
      ppcs->_codforn = riga_pag.get_long(PART_SOTTOCONTO);
 | 
			
		||||
      ppcs->_datapag = riga_pag.get_date(_campodata);
 | 
			
		||||
      ppcs->_importopagato.set_num(distributore.get());   //pagamento nella partita
 | 
			
		||||
      ppcs->_importopagato_prec.set_num(distributore_prec.get()); //pagamenti precedenti al
 | 
			
		||||
      ppcs->_descrpagamento = riga_pag.get(PART_DESCR);
 | 
			
		||||
      // campi della fattura
 | 
			
		||||
      ppcs->_nreg = nreg;
 | 
			
		||||
      ppcs->_numfat = movfat.get(MOV_NUMDOC);
 | 
			
		||||
      ppcs->_datafat = movfat.get_date(MOV_DATADOC);
 | 
			
		||||
      ppcs->_protiva = movfat.get_long(MOV_PROTIVA);
 | 
			
		||||
      ppcs->_totfat = totdoc; //questo e' quello che viene stampato in Tot.fattura
 | 
			
		||||
									imposta *= (CENTO - registro.prorata(anno))/CENTO;
 | 
			
		||||
									imposta.round(TCurrency::get_firm_dec()); //ci vanno i decimali della ditta
 | 
			
		||||
								}
 | 
			
		||||
        
 | 
			
		||||
      TToken_string cms_fsc = k;
 | 
			
		||||
								*imp += imposta;
 | 
			
		||||
								totdoc_cms += imposta;
 | 
			
		||||
							}
 | 
			
		||||
 | 
			
		||||
      ppcs->_commessa = cms_fsc.get(0);
 | 
			
		||||
      ppcs->_fase = cms_fsc.get(1);
 | 
			
		||||
      ppcs->_importocommessa.set_num(impcms); //importo da pagare scritto sulla fattura
 | 
			
		||||
						}*/
 | 
			
		||||
					}
 | 
			
		||||
 | 
			
		||||
      _righe.add(ppcs); //aggiunge il pagamento all'array dei pagamenti
 | 
			
		||||
    }
 | 
			
		||||
  }*/
 | 
			
		||||
//					totdoc = totale_documento(pn.curr()); //tot doc con ritenute fiscali + ritenute sociali (da stampare)
 | 
			
		||||
					totdoc_netto = pn.curr().get_real(MOV_TOTDOC); //questo si usa solo per il calcolo del residuo
 | 
			
		||||
				}
 | 
			
		||||
				else  //..movimento NON iva (sempre con saldaconto)
 | 
			
		||||
				{
 | 
			
		||||
					for (int i = 0; i < pn.cg_items(); i++)
 | 
			
		||||
					{
 | 
			
		||||
						const TRectype& rmov = pn.cg(i);
 | 
			
		||||
						const TBill conto(rmov);
 | 
			
		||||
 | 
			
		||||
						TImporto importo(rmov.get_char(RMV_SEZIONE), rmov.get_real(RMV_IMPORTO));
 | 
			
		||||
						importo.normalize('D');
 | 
			
		||||
 | 
			
		||||
						if (conto.tipo() > ' ')
 | 
			
		||||
						{
 | 
			
		||||
							totdoc -= importo.valore(); 
 | 
			
		||||
							totdoc_netto -= importo.valore(); //valore per il calcolo del residuo
 | 
			
		||||
							continue;
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
/*						if (cerca_fiscali(conto) || cerca_sociali(conto))
 | 
			
		||||
						{
 | 
			
		||||
							totdoc -= importo.valore(); //valore da stampare nella colonna Tot.fattura con ritenute
 | 
			
		||||
							continue;
 | 
			
		||||
						}
 | 
			
		||||
 | 
			
		||||
						const TString& codcms = rmov.get(RMV_CODCMS);
 | 
			
		||||
						const TString& codfase = rmov.get(RMV_FASCMS);
 | 
			
		||||
 | 
			
		||||
						if (conto.indicatore_bilancio() != 5)
 | 
			
		||||
						{          
 | 
			
		||||
							real* imp = (real*)commesse.objptr(cms_fsc);
 | 
			
		||||
							if (imp == NULL)
 | 
			
		||||
							{
 | 
			
		||||
								imp = new real;
 | 
			
		||||
								commesse.add(cms_fsc, imp);
 | 
			
		||||
							}
 | 
			
		||||
							*imp += importo.valore();
 | 
			
		||||
							totdoc_cms += importo.valore();          
 | 
			
		||||
						}*/
 | 
			
		||||
 | 
			
		||||
					}
 | 
			
		||||
				}	//else...
 | 
			
		||||
 | 
			
		||||
				//parte comune a movimenti IVA e non (vengono anche qui considerate le ritenute fiscali
 | 
			
		||||
				//e sociali perche' possono essere state inserite direttamente nella partita e non nel movimento
 | 
			
		||||
				//(quindi non si puo' in questo caso applicare la totale_documento()
 | 
			
		||||
				//Le ritenute fiscali vanno sempre sommate..
 | 
			
		||||
				real totpagato = riga_pag.get_real(PART_IMPORTO) + riga_pag.get_real(PART_RITENUTE);
 | 
			
		||||
				//Le ritenute sociali invece vanno testate con la test_swap..
 | 
			
		||||
				const real ritsoc = riga_pag.get_real(PART_RITSOC);           
 | 
			
		||||
				if (!ritsoc.is_zero())
 | 
			
		||||
				{
 | 
			
		||||
					const TRectype& mov = pn.curr();
 | 
			
		||||
					TCausale caus(mov.get(MOV_CODCAUS));
 | 
			
		||||
					const bool swapt = test_swap(caus, false);    // Totale invertito ?
 | 
			
		||||
					const bool swaps = test_swap(caus, true);     // Ritenute sociali invertite ?
 | 
			
		||||
					if (swapt ^ swaps)                      // Somma ritenute sociali con segno
 | 
			
		||||
						totpagato -= ritsoc;
 | 
			
		||||
					else
 | 
			
		||||
						totpagato += ritsoc;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				const real percentuale = totpagato / totdoc_netto;
 | 
			
		||||
 | 
			
		||||
				//calcolo del residuo (solo movimenti saldacontati)
 | 
			
		||||
				//mi servono,dalla riga partita che viene passata,i valori dei campi per la chiave del
 | 
			
		||||
				//file delle scadenze
 | 
			
		||||
				const TPartita match(riga_pag);
 | 
			
		||||
				//ci serve la riga di fattura che origina la nostra riga pagamento
 | 
			
		||||
				const int riga_fatt = cerca_riga_fattura_origine(match, riga_pag);
 | 
			
		||||
				//quanto era stato pagato del documento prima della attuale riga_pag
 | 
			
		||||
				const real totpagato_prec = calcola_pagato_prec(match, riga_fatt, riga_pag);
 | 
			
		||||
				const real perc_prec = totpagato_prec / totdoc_netto;
 | 
			
		||||
    
 | 
			
		||||
				TGeneric_distrib distributore(totdoc_cms * percentuale, TCurrency::get_firm_dec());
 | 
			
		||||
				TGeneric_distrib distributore_prec(totdoc_cms * perc_prec, TCurrency::get_firm_dec());
 | 
			
		||||
				{
 | 
			
		||||
					FOR_EACH_ASSOC_OBJECT(commesse, h, k, imp)
 | 
			
		||||
					{
 | 
			
		||||
						const real& impcms = *(real*)imp;
 | 
			
		||||
						distributore.add(impcms);
 | 
			
		||||
						distributore_prec.add(impcms);  //distributore di importo pagato sulle commesse
 | 
			
		||||
					}
 | 
			
		||||
				}
 | 
			
		||||
    
 | 
			
		||||
/*				FOR_EACH_ASSOC_OBJECT(commesse, h, k, imp)
 | 
			
		||||
				{
 | 
			
		||||
					const real& impcms = *(real*)imp;
 | 
			
		||||
					TPag_per_cms_struct* ppcs = new TPag_per_cms_struct;
 | 
			
		||||
 | 
			
		||||
					// campi del pagamento
 | 
			
		||||
					ppcs->_tipo = 0; //movimenti da saldaconto
 | 
			
		||||
					ppcs->_codforn = riga_pag.get_long(PART_SOTTOCONTO);
 | 
			
		||||
					ppcs->_datapag = riga_pag.get_date(_campodata);
 | 
			
		||||
					ppcs->_importopagato.set_num(distributore.get());   //pagamento nella partita
 | 
			
		||||
					ppcs->_importopagato_prec.set_num(distributore_prec.get()); //pagamenti precedenti al
 | 
			
		||||
					ppcs->_descrpagamento = riga_pag.get(PART_DESCR);
 | 
			
		||||
					// campi della fattura
 | 
			
		||||
					ppcs->_nreg = nreg;
 | 
			
		||||
					ppcs->_numfat = movfat.get(MOV_NUMDOC);
 | 
			
		||||
					ppcs->_datafat = movfat.get_date(MOV_DATADOC);
 | 
			
		||||
					ppcs->_protiva = movfat.get_long(MOV_PROTIVA);
 | 
			
		||||
					ppcs->_totfat = totdoc; //questo e' quello che viene stampato in Tot.fattura
 | 
			
		||||
      
 | 
			
		||||
					TToken_string cms_fsc = k;
 | 
			
		||||
 | 
			
		||||
					ppcs->_commessa = cms_fsc.get(0);
 | 
			
		||||
					ppcs->_fase = cms_fsc.get(1);
 | 
			
		||||
					ppcs->_importocommessa.set_num(impcms); //importo da pagare scritto sulla fattura
 | 
			
		||||
      
 | 
			
		||||
					_righe.add(ppcs); //aggiunge il pagamento all'array dei pagamenti
 | 
			
		||||
				}*/
 | 
			
		||||
 | 
			
		||||
			} //pn.read()...
 | 
			
		||||
		}	//if (numregcg==nreg)...
 | 
			
		||||
	}	//for TRecnotype...
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
bool TPag_per_cms_recordset::part_callback(const TRelation& rel, void* pJolly)
 | 
			
		||||
@ -567,8 +784,8 @@ bool TPag_per_cms_recordset::part_callback(const TRelation& rel, void* pJolly)
 | 
			
		||||
  const TRectype& riga_part_pag = rel.curr();
 | 
			
		||||
  
 | 
			
		||||
  const long nreg = recordset->find_movimento(riga_part_pag); //prima cerco un movimento della fattura...
 | 
			
		||||
/*  if (nreg > 0) //..se ne trovo almeno uno cerco la commessa corrispondente
 | 
			
		||||
    recordset->find_commesse(nreg, riga_part_pag);*/
 | 
			
		||||
  if (nreg > 0) //..se ne trovo almeno uno cerco la commessa corrispondente
 | 
			
		||||
    recordset->find_commesse(nreg, riga_part_pag);
 | 
			
		||||
  return true;
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
@ -651,6 +868,13 @@ void TPag_per_cms_recordset::set_filter(const TPag_per_cms_mask& msk, const int
 | 
			
		||||
  _dadata = msk.get_date(F_DATAINI);
 | 
			
		||||
	_adata = msk.get_date(F_DATAFIN);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
	//carica i conti memorizzati nel ca3600.ini
 | 
			
		||||
	lettura_conti(_costi, 'C');
 | 
			
		||||
	lettura_conti(_pagamenti, 'P');
 | 
			
		||||
	lettura_conti(_fiscali, 'F');
 | 
			
		||||
	lettura_conti(_sociali, 'S');
 | 
			
		||||
 | 
			
		||||
	//scansione movimenti con saldaconto
 | 
			
		||||
	scan_pags(msk);
 | 
			
		||||
 | 
			
		||||
@ -766,6 +990,15 @@ void TPag_per_cms::stampa_per_commessa(const TPag_per_cms_mask& mask, TReport_bo
 | 
			
		||||
 | 
			
		||||
void TPag_per_cms::main_loop()
 | 
			
		||||
{
 | 
			
		||||
	//il programma si puo' usare SOLO se in contabilita' analitica si usa il piano dei conti contabile
 | 
			
		||||
	TConfig& cfg = ca_config();
 | 
			
		||||
	const bool use_pdcc = cfg.get_bool("UsePdcc");
 | 
			
		||||
	if (!use_pdcc)
 | 
			
		||||
	{
 | 
			
		||||
		error_box(TR("Programma funzionante SOLO se in contabilita' analitica si usa il piano dei conti contabile"));
 | 
			
		||||
		return;
 | 
			
		||||
	}
 | 
			
		||||
 | 
			
		||||
	TPag_per_cms_mask mask;
 | 
			
		||||
  while (mask.run() == K_ENTER)
 | 
			
		||||
  {
 | 
			
		||||
 | 
			
		||||
@ -16,7 +16,7 @@
 | 
			
		||||
 | 
			
		||||
//sheets conti e righe relative
 | 
			
		||||
#define F_PDCC          301
 | 
			
		||||
#define F_PDCA          302
 | 
			
		||||
//#define F_PDCA          302	***per ora solo Pdcc***
 | 
			
		||||
#define F_PIANO         319
 | 
			
		||||
 | 
			
		||||
#define S_TIPO					101
 | 
			
		||||
 | 
			
		||||
@ -160,7 +160,7 @@ BEGIN
 | 
			
		||||
  GROUP 5
 | 
			
		||||
END
 | 
			
		||||
 | 
			
		||||
TEXT -1
 | 
			
		||||
/*TEXT -1	***per ora solo Pdcc***
 | 
			
		||||
BEGIN
 | 
			
		||||
  PROMPT 1 5 "@bPiano dei conti analitico"
 | 
			
		||||
  GROUP 6
 | 
			
		||||
@ -175,7 +175,7 @@ BEGIN
 | 
			
		||||
  ITEM "Cdc4"
 | 
			
		||||
  ITEM "Cdc5"
 | 
			
		||||
  GROUP 6
 | 
			
		||||
END
 | 
			
		||||
END*/
 | 
			
		||||
 | 
			
		||||
BUTTON DLG_SAVEREC 12 2
 | 
			
		||||
BEGIN
 | 
			
		||||
@ -402,7 +402,8 @@ ENDMASK
 | 
			
		||||
//----------------------Piano dei conti analitico------------------------------//
 | 
			
		||||
//-----------Pagina di riga dello sheet PDCA----------------------//
 | 
			
		||||
 | 
			
		||||
PAGE "Riga Piano dei conti analitico" -1 -1 78 8
 | 
			
		||||
//***per ora solo Pdcc***
 | 
			
		||||
/*PAGE "Riga Piano dei conti analitico" -1 -1 78 8
 | 
			
		||||
 | 
			
		||||
LIST S_TIPO 1 18
 | 
			
		||||
BEGIN
 | 
			
		||||
@ -462,4 +463,4 @@ END
 | 
			
		||||
 | 
			
		||||
ENDPAGE
 | 
			
		||||
 | 
			
		||||
ENDMASK
 | 
			
		||||
ENDMASK*/
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user