Files correlati : cg3.exe Ricompilazione Demo : [ ] Commento : Bug 0001562: 002190-crp lista fatture con iva indetraibile il cliente ha prorata al 100%, con la versione 3.2 la lista fatture con iva indetraibile includeva solo le fatture in cui effettivamente c'era iva indetraibile, con la versione attuale invece vengono incluse tutte le fatture di acquisto. git-svn-id: svn://10.65.10.50/trunk@20142 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			943 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			943 lines
		
	
	
		
			26 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
//
 | 
						|
//Lista fatture:
 | 
						|
//  CG3 -6 C ==> Lista fatture per tipo costo/ricavo
 | 
						|
//  CG3 -6 I ==> Lista fatture con iva indetrabile
 | 
						|
//  CG3 -6 N ==> Lista fatture intracomunitarie
 | 
						|
//
 | 
						|
#include "cg3.h"
 | 
						|
#include "cg3700a.h"
 | 
						|
#include "cglib03.h"
 | 
						|
 | 
						|
#include <defmask.h>
 | 
						|
#include <printapp.h>
 | 
						|
#include <recarray.h>
 | 
						|
#include <sheet.h>
 | 
						|
 | 
						|
#include <nditte.h>
 | 
						|
#include <causali.h>
 | 
						|
#include <clifo.h>
 | 
						|
#include <mov.h>
 | 
						|
#include <rmoviva.h>
 | 
						|
 | 
						|
class _Iva_item : public TObject
 | 
						|
{ 
 | 
						|
  real _impv,_ivav,_impa,_ivaa;
 | 
						|
 | 
						|
public:
 | 
						|
  real& impv() { return _impv; } // Imponibile ven.
 | 
						|
  real& ivav() { return _ivav; } // Iva ven.
 | 
						|
  real& impa() { return _impa; } // Imponibile acq.
 | 
						|
  real& ivaa() { return _ivaa; } // Iva acq.
 | 
						|
  void zero()  { _impv = _ivav = _impa = _ivaa = ZERO; }
 | 
						|
  virtual TObject* dup() const { return new _Iva_item(*this); }
 | 
						|
  _Iva_item() { zero(); }  
 | 
						|
  ~_Iva_item() { }
 | 
						|
};
 | 
						|
 | 
						|
// Tipo di stampa
 | 
						|
enum tipo_st
 | 
						|
{ 
 | 
						|
  indetraibile,
 | 
						|
  costo_ricavo,
 | 
						|
  intra
 | 
						|
};
 | 
						|
 | 
						|
class TLista_fatture : public TPrintapp
 | 
						|
{
 | 
						|
  TRelation*    _rel;        // Relazione principale
 | 
						|
  int           _cur1,
 | 
						|
                _cur2,
 | 
						|
                _cur3;       // Cursori della TPrintapp
 | 
						|
  int           _tipodetprec,
 | 
						|
                _tipocrprec; // Variabili per sapere quando stampare i totali parz.              
 | 
						|
  long          _numregprec; // Per la stampa di piu' righe di uno stesso documento             
 | 
						|
  tipo_st       _tipo;       // Tipo di stampa
 | 
						|
  TArray_sheet* _ditte;      // Sheet di selezione ditte
 | 
						|
  long          _unica_ditta;
 | 
						|
 | 
						|
  TAssoc_array  _intra_items;// Array ordinato (per codice IVA)  dei totali per fatture INTRA
 | 
						|
  TAssoc_array  _indetr;// Array ordinato (per codice IVA)  dei totali per fatture indetraibili
 | 
						|
  long          _from_cf,    // Estremi selezione clienti/fornitori
 | 
						|
                _to_cf;
 | 
						|
  TString4      _from_reg,   // Estremi selezione registri
 | 
						|
                _to_reg,
 | 
						|
                _from_cau,   // Estremi selezione causali
 | 
						|
                _to_cau;
 | 
						|
  TPrintrow     _pr;
 | 
						|
  TString       _ragsoc;
 | 
						|
  TDate         _date_from,
 | 
						|
                _date_to;    // Estremi data
 | 
						|
  real          _tot_doc,  //Non ha senso tenere il totale documenti visto che la stampa rappresenta le righe: 
 | 
						|
                           //infatti uno stesso documento puo' comparire per piu' tipi indetraibilita' o tipi costo/ricavo diversi
 | 
						|
                _tot_imp,
 | 
						|
                _tot_iva,    // Totali complessivi della stampa
 | 
						|
                _tp_doc,
 | 
						|
                _tp_imp,
 | 
						|
                _tp_iva;     // Totali parziali della stampa
 | 
						|
  bool          _one_printed,
 | 
						|
                _print_all;  // Flags per il controllo della stampa totali/parziali e righe multiple
 | 
						|
                
 | 
						|
  TString _tmp;
 | 
						|
                
 | 
						|
  static bool filter_func1(const TRelation *);   // Funzione di filtro per cursore 1
 | 
						|
  static bool filter_func2(const TRelation *);   // Funzione di filtro per cursore 3
 | 
						|
                
 | 
						|
protected:
 | 
						|
  long   select_firm_range(long from, long to);
 | 
						|
  int    tiporeg(const TString& );
 | 
						|
  static bool mix_handler(TMask_field&, KEY);
 | 
						|
  static bool date_handler(TMask_field&, KEY);
 | 
						|
  static bool to_ditt_handler(TMask_field&, KEY);
 | 
						|
  static bool fr_ditt_handler(TMask_field&, KEY);
 | 
						|
  static bool select_button(TMask_field&, KEY);
 | 
						|
  static bool reset_button(TMask_field&, KEY);
 | 
						|
  
 | 
						|
  void reset_choices(TMask&);
 | 
						|
  void set_choice_limits(TMask&);
 | 
						|
  void build_ditte_sheet();
 | 
						|
  virtual bool preprocess_page(int,int);
 | 
						|
  virtual bool preprocess_print(int,int) { repeat_print();  return TRUE;} // Per stampare tutte le ditte in un unico botto
 | 
						|
  virtual print_action postprocess_page(int,int)  {return NEXT_PAGE;}
 | 
						|
  virtual print_action postprocess_print(int,int);
 | 
						|
  void    set_the_header();
 | 
						|
  virtual void set_page(int,int);
 | 
						|
  virtual bool set_print(int);
 | 
						|
  
 | 
						|
  const char* real2string(const real& r, const char* pic = NULL)
 | 
						|
  { real2currency(_tmp, r, pic); return _tmp; }
 | 
						|
 | 
						|
public:
 | 
						|
  virtual bool user_create();
 | 
						|
  virtual bool user_destroy();
 | 
						|
  TArray_sheet* get_ditte_sheet() { return _ditte; }
 | 
						|
 | 
						|
  TLista_fatture() : _ditte(NULL) {}
 | 
						|
  virtual ~TLista_fatture() {}
 | 
						|
};
 | 
						|
 | 
						|
inline TLista_fatture& app() { return (TLista_fatture&) main_app(); }
 | 
						|
 | 
						|
int TLista_fatture::tiporeg(const TString& reg)
 | 
						|
{
 | 
						|
  TString8 s; s.format("%4d%-3s",_date_from.year(),(const char*)reg);
 | 
						|
  return atoi(cache().get("REG", s, "I0"));
 | 
						|
}
 | 
						|
 | 
						|
bool TLista_fatture::filter_func1(const TRelation *r) 
 | 
						|
{
 | 
						|
  TLista_fatture& a = app();
 | 
						|
  const TRectype& mov = r->curr(LF_MOV);
 | 
						|
  
 | 
						|
  const TDate data = mov.get_date(MOV_DATAREG);
 | 
						|
  if (data < a._date_from || data > a._date_to)
 | 
						|
    return false;
 | 
						|
 | 
						|
  const TString& rg = mov.get(MOV_REG);  
 | 
						|
  if (rg < a._from_reg || rg > a._to_reg)
 | 
						|
    return false;
 | 
						|
  
 | 
						|
  const TRectype& riv = r->curr();
 | 
						|
  if (a._tipo == indetraibile)
 | 
						|
  {
 | 
						|
    real percind;
 | 
						|
    const int tipodet = get_tipodet_from_rmi(riv, mov, percind);
 | 
						|
    if (riv.get(RMI_TIPODET).blank() || percind.is_zero())
 | 
						|
      return false;
 | 
						|
  
 | 
						|
    const int tiporeg = a.tiporeg(rg);
 | 
						|
    if (tiporeg != 2)
 | 
						|
      return false;
 | 
						|
  }
 | 
						|
  else // Tipo costo/ricavo
 | 
						|
  {
 | 
						|
    if (riv.get_int(RMI_TIPOCR) == 0)
 | 
						|
      return false;
 | 
						|
  }  
 | 
						|
 | 
						|
  const long cod = mov.get_long(MOV_CODCF);
 | 
						|
  const bool ok = cod >= a._from_cf && cod <= a._to_cf;
 | 
						|
  return ok;
 | 
						|
}
 | 
						|
 | 
						|
bool TLista_fatture::filter_func2(const TRelation *r) 
 | 
						|
{
 | 
						|
  const TLista_fatture& a = app();
 | 
						|
  const TRectype& mov = r->curr(LF_MOV);
 | 
						|
  
 | 
						|
  const TDate data = mov.get_date(MOV_DATAREG);
 | 
						|
  if (data < a._date_from || data > a._date_to)
 | 
						|
    return false;
 | 
						|
  
 | 
						|
  const TString& cau = mov.get(MOV_CODCAUS);
 | 
						|
  if (cau >= a._from_cau && cau <= a._to_cau)
 | 
						|
  {
 | 
						|
    const bool is_intra = r->lfile().get_bool(RMI_INTRA);
 | 
						|
    return is_intra;
 | 
						|
  }
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
bool TLista_fatture::date_handler(TMask_field& f, KEY key)
 | 
						|
{ 
 | 
						|
  if ((key == K_TAB && f.focusdirty()) || key == K_ENTER)
 | 
						|
  {
 | 
						|
    TMask& m = f.mask();
 | 
						|
    const TDate da(m.get_date(FLD_DATE_FROM));
 | 
						|
    const TDate a(m.get_date(FLD_DATE_TO));
 | 
						|
 | 
						|
    if (da.ok())
 | 
						|
      m.set(FLD_ANNO, da.year()); else
 | 
						|
    if (a.ok())
 | 
						|
      m.set(FLD_ANNO, a.year());
 | 
						|
 | 
						|
    if (a.ok() && da.ok()) // Solo se sono entrambi compilati
 | 
						|
    {
 | 
						|
      if (da > a)
 | 
						|
        return f.error_box(TR("La data di fine deve essere maggiore della data di inizio."));
 | 
						|
      if (da.year() != a.year())
 | 
						|
        return f.error_box(TR("Le date devono appartenere allo stesso anno."));
 | 
						|
    }
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool TLista_fatture::mix_handler(TMask_field& f, KEY key)
 | 
						|
{
 | 
						|
  if (f.to_check(key))
 | 
						|
  {
 | 
						|
    TMask& m = f.mask();
 | 
						|
    short dlg1 = f.dlg();
 | 
						|
    short dlg2;
 | 
						|
    
 | 
						|
    if (dlg1 == FLD_TO_FOR) 
 | 
						|
      dlg2 = FLD_FROM_FOR;
 | 
						|
    else
 | 
						|
      if (dlg1 == FLD_TO_REG)
 | 
						|
        dlg2 = FLD_FROM_REG;
 | 
						|
      else
 | 
						|
        dlg2 = FLD_FROM_CAU;
 | 
						|
    
 | 
						|
    if (dlg1 == FLD_TO_FOR)
 | 
						|
    {
 | 
						|
      const long l1 = m.get_long(dlg1);
 | 
						|
      const long l2 = m.get_long(dlg2);
 | 
						|
      if (l1 != 0L && l2 != 0L && l1 < l2)
 | 
						|
        return f.error_box(TR("Intervallo clienti/fornitori errato."));
 | 
						|
      return TRUE;
 | 
						|
    }
 | 
						|
    
 | 
						|
    const TString msg(dlg1 == FLD_TO_REG ? TR("Intervallo registri errato.") : TR("Intervallo causali errato."));
 | 
						|
    const TString s1(m.get(dlg1));
 | 
						|
    const TString s2(m.get(dlg2));
 | 
						|
    if (s1.not_empty() && s2.not_empty() && s1 < s2)
 | 
						|
      return f.error_box(msg);
 | 
						|
    return TRUE;
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool TLista_fatture::to_ditt_handler(TMask_field& f, KEY key)
 | 
						|
{
 | 
						|
  TMask& m = f.mask();
 | 
						|
  if (key == K_F9)
 | 
						|
  {
 | 
						|
    TArray_sheet* sh = app().get_ditte_sheet();
 | 
						|
    TMask& m = f.mask();
 | 
						|
    
 | 
						|
    sh->disable_check();
 | 
						|
    sh->disable(DLG_USER);
 | 
						|
    if (sh->run() == K_ENTER)
 | 
						|
    {
 | 
						|
      app().select_firm_range(m.get_long(FLD_DFR),sh->row(sh->selected()).get_long(1));
 | 
						|
      app().set_choice_limits(m);
 | 
						|
    }
 | 
						|
    sh->enable(DLG_USER);
 | 
						|
  }
 | 
						|
  if (key == K_TAB && f.focusdirty())
 | 
						|
  {
 | 
						|
    app().select_firm_range(m.get_long(FLD_DFR), m.get_long(FLD_DTO));
 | 
						|
    app().set_choice_limits(m);
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool TLista_fatture::fr_ditt_handler(TMask_field& f, KEY key)
 | 
						|
{                          
 | 
						|
  TMask& m = f.mask();
 | 
						|
  if (key == K_F9)
 | 
						|
  {
 | 
						|
    TMask& m = f.mask();
 | 
						|
    TArray_sheet* sh = app().get_ditte_sheet();
 | 
						|
 | 
						|
    sh->disable_check();    
 | 
						|
    sh->disable(DLG_USER);
 | 
						|
    if (sh->run() == K_ENTER)
 | 
						|
    {
 | 
						|
      app().select_firm_range(sh->row(sh->selected()).get_long(1), m.get_long(FLD_DTO));
 | 
						|
      app().set_choice_limits(m);
 | 
						|
    }
 | 
						|
    sh->enable(DLG_USER);
 | 
						|
 }
 | 
						|
  else if (key == K_TAB && f.focusdirty())
 | 
						|
  {
 | 
						|
    app().select_firm_range(m.get_long(FLD_DFR), m.get_long(FLD_DTO));
 | 
						|
    app().set_choice_limits(m);
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
long TLista_fatture::select_firm_range(long from, long to)
 | 
						|
{
 | 
						|
  if (to == 0l) to = 99999L;                              
 | 
						|
  
 | 
						|
  for (int i = 0; i < _ditte->items(); i++)
 | 
						|
  {
 | 
						|
    if (_ditte->row_disabled(i))
 | 
						|
      continue;
 | 
						|
 | 
						|
    TToken_string& d = _ditte->row(i);
 | 
						|
 | 
						|
    const long cod = d.get_long(1);
 | 
						|
    if (cod >= from && cod <= to)
 | 
						|
      _ditte->check(i);
 | 
						|
    else 
 | 
						|
      _ditte->uncheck(i);
 | 
						|
  } 
 | 
						|
  
 | 
						|
  return _ditte->checked();
 | 
						|
}
 | 
						|
 | 
						|
bool TLista_fatture::select_button(TMask_field& f, KEY key)
 | 
						|
{
 | 
						|
  if (key == K_SPACE)
 | 
						|
  {
 | 
						|
    app()._ditte->enable_check();
 | 
						|
    if (app()._ditte->run() == K_ENTER)
 | 
						|
      app().set_choice_limits(f.mask());
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool TLista_fatture::reset_button(TMask_field& f, KEY key)
 | 
						|
{
 | 
						|
  if (key == K_SPACE)
 | 
						|
    app().reset_choices(f.mask());
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
void TLista_fatture::reset_choices(TMask& m)
 | 
						|
{
 | 
						|
  m.reset(FLD_SELECTED);
 | 
						|
  m.reset(FLD_DFR);
 | 
						|
  m.reset(FLD_DTO);
 | 
						|
  m.disable(DLG_PRINT);
 | 
						|
  _ditte->check(-1, false);
 | 
						|
}
 | 
						|
 | 
						|
void TLista_fatture::set_choice_limits(TMask& m)
 | 
						|
{     
 | 
						|
  long first = -1l, last = -1l;
 | 
						|
  const long items = _ditte->items();
 | 
						|
  for (int i = 0; i < items; i++)
 | 
						|
  {
 | 
						|
    if (_ditte->checked(i))
 | 
						|
    {
 | 
						|
      const long dit = _ditte->row(i).get_long(1);
 | 
						|
      if (first == -1l) first = dit;
 | 
						|
      if (last < dit)   last  = dit;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  if (first != -1) 
 | 
						|
    m.set(FLD_DFR, first);
 | 
						|
  if (last  != -1)
 | 
						|
    m.set(FLD_DTO, last);
 | 
						|
  const long checked = _ditte->checked();
 | 
						|
  m.enable(DLG_PRINT,checked > 0);
 | 
						|
  m.set(FLD_SELECTED, checked);
 | 
						|
}
 | 
						|
 | 
						|
void TLista_fatture::build_ditte_sheet()
 | 
						|
{
 | 
						|
  _ditte->destroy();
 | 
						|
 | 
						|
  long first_enabled = 0;
 | 
						|
  long firms_enabled = 0;
 | 
						|
  
 | 
						|
  TLocalisamfile nditte(LF_NDITTE);
 | 
						|
  for (int err = nditte.first(); err == NOERR; err = nditte.next())
 | 
						|
  {
 | 
						|
    TToken_string* d = new TToken_string(64);
 | 
						|
    d->add(" ");
 | 
						|
    const long n = nditte.get_long(NDT_CODDITTA);
 | 
						|
    d->add(n);
 | 
						|
    d->add(nditte.get(NDT_RAGSOC));
 | 
						|
    
 | 
						|
    const bool unselectable = !prefix().exist(n);
 | 
						|
    
 | 
						|
    const long pos = _ditte->add(d);     
 | 
						|
    if (unselectable)
 | 
						|
      _ditte->disable_row(pos);
 | 
						|
    else
 | 
						|
    {
 | 
						|
      _ditte->enable_row(pos);
 | 
						|
      if (firms_enabled++ == 0)
 | 
						|
        first_enabled = pos;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  
 | 
						|
  _unica_ditta = (firms_enabled == 1) ? first_enabled : -1; 
 | 
						|
}
 | 
						|
 | 
						|
bool TLista_fatture::preprocess_page(int file, int counter)
 | 
						|
{
 | 
						|
  TCursor*  curs = current_cursor();
 | 
						|
  const TRectype& rec  = curs->curr();
 | 
						|
  const TRectype& mov = curs->curr(LF_MOV);
 | 
						|
  _ragsoc = curs->curr(LF_CLIFO).get(CLI_RAGSOC);
 | 
						|
  _ragsoc.strip_double_spaces();
 | 
						|
  real percind;
 | 
						|
  const int tipodet = get_tipodet_from_rmi(rec, mov, percind);
 | 
						|
  if (_tipo == indetraibile && percind < CENTO)
 | 
						|
  {
 | 
						|
    const int dec = TCurrency::get_firm_dec();
 | 
						|
    real imponibile = rec.get_real(RMI_IMPONIBILE) * percind / CENTO; imponibile.round(dec);
 | 
						|
    real imposta    = rec.get_real(RMI_IMPOSTA) * percind / CENTO; imposta.round(dec);
 | 
						|
    ((TRectype&)rec).put(RMI_IMPONIBILE, imponibile);
 | 
						|
    ((TRectype&)rec).put(RMI_IMPOSTA, imposta);
 | 
						|
  }
 | 
						|
 | 
						|
  const int tipocr  = rec.get_int(RMI_TIPOCR);
 | 
						|
  const long numreg = rec.get_long(RMI_NUMREG);
 | 
						|
  
 | 
						|
  if (_tipodetprec == -1)  _tipodetprec = tipodet;
 | 
						|
  if (_tipocrprec  == -1)  _tipocrprec  = tipocr;
 | 
						|
  
 | 
						|
  const bool new_det = (_tipo == indetraibile && tipodet != _tipodetprec);
 | 
						|
  const bool new_cr  = (_tipo == costo_ricavo && tipocr != _tipocrprec);
 | 
						|
  if (new_det || new_cr) // Stampa totali parziali
 | 
						|
  {
 | 
						|
    const bool is_cr = _tipo == costo_ricavo;
 | 
						|
    TString256 s(TR("TOTALE TIPO "));
 | 
						|
    _pr.reset();
 | 
						|
    _pr.set_style(boldstyle);
 | 
						|
    s << (is_cr ? TR("COSTO/RICAVO ") : TR("INDETRAIBILITA' "));
 | 
						|
    s << (is_cr ? _tipocrprec : _tipodetprec);
 | 
						|
    _pr.put(s,42);
 | 
						|
    if (_tp_doc != 0.0)
 | 
						|
      _pr.put(real2string(_tp_doc),73);
 | 
						|
    if (_tp_imp != 0.0)
 | 
						|
      _pr.put(real2string(_tp_imp),89);
 | 
						|
    if (_tp_iva != 0.0)
 | 
						|
      _pr.put(real2string(_tp_iva),112);
 | 
						|
    printer().print(_pr);
 | 
						|
    _pr.reset();
 | 
						|
    printer().print(_pr);
 | 
						|
    _tipodetprec = tipodet;
 | 
						|
    _tipocrprec  = tipocr;
 | 
						|
    _tp_doc = 0.0; _tp_imp = 0.0; _tp_iva = 0.0;
 | 
						|
  }
 | 
						|
  
 | 
						|
  real doc = mov.get_real(MOV_TOTDOC);
 | 
						|
  real imp = rec.get_real(RMI_IMPONIBILE);
 | 
						|
  real iva = rec.get_real(RMI_IMPOSTA);
 | 
						|
  if (_tipo == intra)
 | 
						|
  {
 | 
						|
    TString4 codiva  = rec.get(RMI_CODIVA);
 | 
						|
    const int tipomov = tiporeg(mov.get(MOV_REG));
 | 
						|
    if (tipomov == 2 && tipodet == 9)
 | 
						|
      codiva = "~A19"; // Speciale per acquisti indeducibili art. 19
 | 
						|
    const bool is_key = _intra_items.is_key(codiva); // Esiste l'elemento ?
 | 
						|
    // Se si' allora prendi quello, altrimenti prendine uno nuovo
 | 
						|
    _Iva_item newiva;
 | 
						|
    _Iva_item& xiva = (is_key ? (_Iva_item&) _intra_items[codiva] : newiva);
 | 
						|
    // Somma imponibile/imposta per vendite/acquisti
 | 
						|
    if (tipomov == 1) //vendite
 | 
						|
    {
 | 
						|
      xiva.impv() += imp;
 | 
						|
      xiva.ivav() += iva;
 | 
						|
    }
 | 
						|
    else // acquisti
 | 
						|
    {
 | 
						|
      xiva.impa() += imp;
 | 
						|
      xiva.ivaa() += iva;
 | 
						|
    }
 | 
						|
    _intra_items.add(codiva,xiva,is_key); 
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    _tot_imp += imp;
 | 
						|
    _tot_iva += iva;
 | 
						|
    _tp_imp  += imp;
 | 
						|
    _tp_iva  += iva;
 | 
						|
    const int tipomov = tiporeg(mov.get(MOV_REG));
 | 
						|
    if (_tipo == indetraibile && tipomov == 2 && tipodet > 0)
 | 
						|
		{
 | 
						|
	    TString4 codiva  = rec.get(RMI_CODIVA);
 | 
						|
	    _Iva_item * iva_row = (_Iva_item *) _indetr.objptr(codiva);
 | 
						|
			if (iva_row == NULL)
 | 
						|
			{
 | 
						|
				iva_row = new _Iva_item;
 | 
						|
				_indetr.add(codiva, iva_row);
 | 
						|
			}
 | 
						|
			iva_row->impa() += imp;
 | 
						|
			iva_row->ivaa() += iva;
 | 
						|
		}
 | 
						|
	}
 | 
						|
 | 
						|
  const bool same_reg = numreg == _numregprec;
 | 
						|
  if (same_reg && !new_det && !new_cr) // Se sta stampando un'altra riga di uno stesso documento,
 | 
						|
  {                                    // cambia il formato di stampa delle righe
 | 
						|
    _print_all = false;
 | 
						|
    reset_print();
 | 
						|
    set_page(0,0);    // Ignore parameters passed
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    if (_tipo != intra)
 | 
						|
    {
 | 
						|
      _tot_doc += doc;
 | 
						|
      _tp_doc  += doc;
 | 
						|
    }
 | 
						|
    _print_all = TRUE;
 | 
						|
    reset_print();
 | 
						|
    set_page(0,0);    // Ignore parameters passed
 | 
						|
  }
 | 
						|
  _numregprec = numreg;
 | 
						|
  
 | 
						|
  if (!_one_printed) 
 | 
						|
    _one_printed = TRUE;
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
print_action TLista_fatture::postprocess_print(int file, int counter)
 | 
						|
{
 | 
						|
  TPrinter& p = printer();
 | 
						|
  if (_one_printed)
 | 
						|
    if (_tipo != intra)
 | 
						|
    {
 | 
						|
      const bool is_cr = _tipo == costo_ricavo;
 | 
						|
      TString256 s(TR("TOTALE TIPO "));
 | 
						|
      _pr.reset();
 | 
						|
      _pr.set_style(boldstyle);
 | 
						|
      s << (is_cr ? TR("COSTO/RICAVO ") : TR("INDETRAIBILITA' "));
 | 
						|
      s << (is_cr ? _tipocrprec : _tipodetprec);
 | 
						|
      _pr.put(s,42);
 | 
						|
      if (_tp_doc != 0.0)
 | 
						|
        _pr.put(real2string(_tp_doc),73);
 | 
						|
      if (_tp_imp != 0.0)
 | 
						|
        _pr.put(real2string(_tp_imp),89);
 | 
						|
      if (_tp_iva != 0.0)
 | 
						|
        _pr.put(real2string(_tp_iva),112);
 | 
						|
      p.print(_pr);
 | 
						|
      _pr.reset();
 | 
						|
      p.print(_pr);
 | 
						|
 | 
						|
      if (!is_cr)
 | 
						|
      {
 | 
						|
        p.print(_pr);
 | 
						|
        _pr.set_style(boldstyle);
 | 
						|
        _pr.put(TR("TOTALE GENERALE             :"),42);
 | 
						|
        if (_tot_doc != 0.0)
 | 
						|
          _pr.put(real2string(_tot_doc),73);
 | 
						|
        if (_tot_imp != 0.0)
 | 
						|
          _pr.put(real2string(_tot_imp),89);
 | 
						|
        if (_tot_iva != 0.0)
 | 
						|
          _pr.put(real2string(_tot_iva),112);
 | 
						|
        p.print(_pr);
 | 
						|
      }
 | 
						|
			if (_tipo == indetraibile)
 | 
						|
			{
 | 
						|
				real tot3,tot4;
 | 
						|
				TString16 cod;
 | 
						|
				TString80 des;
 | 
						|
				_Iva_item * xiva; // Scorre gli elementi memorizzati
 | 
						|
 | 
						|
				_pr.reset();
 | 
						|
				for (int i=0; i<3; i++)
 | 
						|
					p.print(_pr);
 | 
						|
				_pr.put(FR("Cod.@92gACQUISTI INDETRAIBILI"),1);
 | 
						|
				p.print(_pr);
 | 
						|
				_pr.reset();
 | 
						|
				_pr.put(FR("IVA  Descrizione@82gImponibile@101gImposta"),1);
 | 
						|
				p.print(_pr);
 | 
						|
				_pr.reset();
 | 
						|
				p.print(_pr);
 | 
						|
	      
 | 
						|
				for (xiva = (_Iva_item *) _indetr.first_item(); xiva != NULL; xiva = (_Iva_item*)_indetr.succ_item())
 | 
						|
				{
 | 
						|
					real& r3 = xiva->impa();
 | 
						|
					real& r4 = xiva->ivaa();
 | 
						|
					cod = _indetr.get_hashobj()->key();
 | 
						|
					des = cache().get("%IVA", cod).get("S0");
 | 
						|
					_pr.put(cod,1);  
 | 
						|
					_pr.put(des,6);
 | 
						|
					if (r3 != ZERO)
 | 
						|
						_pr.put(real2string(r3),77);
 | 
						|
					if (r4 != ZERO)
 | 
						|
						_pr.put(real2string(r4),93);
 | 
						|
					tot3 += r3;
 | 
						|
					tot4 += r4;
 | 
						|
					p.print(_pr);
 | 
						|
					_pr.reset();
 | 
						|
				}
 | 
						|
	      p.print(_pr);
 | 
						|
				_pr.put(TR("Totale Generale IVA"),1);
 | 
						|
				if (tot3 != ZERO)
 | 
						|
					_pr.put(real2string(tot3),77);
 | 
						|
				if (tot4 != ZERO)
 | 
						|
					_pr.put(real2string(tot4),93);
 | 
						|
				p.print(_pr);
 | 
						|
			}
 | 
						|
    }
 | 
						|
    else
 | 
						|
    {
 | 
						|
      // Stampa gli elementi di _intra_items
 | 
						|
      real tot1,tot2,tot3,tot4;
 | 
						|
      TString16 cod;
 | 
						|
      TString80 des;
 | 
						|
      _Iva_item * xiva; // Scorre gli elementi memorizzati
 | 
						|
 | 
						|
      _pr.reset();
 | 
						|
      for (int i=0; i<3; i++)
 | 
						|
        p.print(_pr);
 | 
						|
      _pr.put(FR("Cod.@57gVENDITE@92gACQUISTI"),1);
 | 
						|
      p.print(_pr);
 | 
						|
      _pr.reset();
 | 
						|
      _pr.put(FR("IVA  Descrizione@45gImponibile@66gImposta@82gImponibile@101gImposta"),1);
 | 
						|
      p.print(_pr);
 | 
						|
      _pr.reset();
 | 
						|
      p.print(_pr);
 | 
						|
      
 | 
						|
      for (xiva = (_Iva_item *) _intra_items.first_item(); xiva != NULL; xiva = (_Iva_item*)_intra_items.succ_item())
 | 
						|
      {
 | 
						|
        real& r1 = xiva->impv();
 | 
						|
        real& r2 = xiva->ivav();
 | 
						|
        real& r3 = xiva->impa();
 | 
						|
        real& r4 = xiva->ivaa();
 | 
						|
        cod = _intra_items.get_hashobj()->key();
 | 
						|
        if (cod == "~A19")
 | 
						|
        {
 | 
						|
          p.print(_pr);
 | 
						|
          _pr.put(TR("Totale "),1);
 | 
						|
          if (tot1 != 0.0)
 | 
						|
            _pr.put(real2string(tot1),40);
 | 
						|
          if (tot2 != 0.0)
 | 
						|
            _pr.put(real2string(tot2),58);
 | 
						|
          if (tot3 != 0.0)
 | 
						|
            _pr.put(real2string(tot3),77);
 | 
						|
          if (tot4 != 0.0)
 | 
						|
            _pr.put(real2string(tot4),93);
 | 
						|
          p.print(_pr);
 | 
						|
          _pr.reset();
 | 
						|
          p.print(_pr);
 | 
						|
          des = TR("Totale acquisti indeducibili per ART.19");
 | 
						|
          _pr.put(des,1);
 | 
						|
        }
 | 
						|
        else
 | 
						|
        {
 | 
						|
          des = cache().get("%IVA", cod).get("S0");
 | 
						|
          _pr.put(cod,1);  
 | 
						|
          _pr.put(des,6);
 | 
						|
        }
 | 
						|
        if (r1 != 0.0)
 | 
						|
          _pr.put(real2string(r1),40);
 | 
						|
        if (r2 != 0.0)
 | 
						|
          _pr.put(real2string(r2),58);
 | 
						|
        if (r3 != 0.0)
 | 
						|
          _pr.put(real2string(r3),77);
 | 
						|
        if (r4 != 0.0)
 | 
						|
          _pr.put(real2string(r4),93);
 | 
						|
        tot1 += r1;
 | 
						|
        tot2 += r2;
 | 
						|
        tot3 += r3;
 | 
						|
        tot4 += r4;
 | 
						|
        p.print(_pr);
 | 
						|
        _pr.reset();
 | 
						|
      }
 | 
						|
      p.print(_pr);
 | 
						|
      _pr.put(TR("Totale Generale IVA"),1);
 | 
						|
      if (tot1 != 0.0)
 | 
						|
        _pr.put(real2string(tot1),40);
 | 
						|
      if (tot2 != 0.0)
 | 
						|
        _pr.put(real2string(tot2),58);
 | 
						|
      if (tot3 != 0.0)
 | 
						|
        _pr.put(real2string(tot3),77);
 | 
						|
      if (tot4 != 0.0)
 | 
						|
        _pr.put(real2string(tot4),93);
 | 
						|
      p.print(_pr);
 | 
						|
    }
 | 
						|
  return NEXT_PAGE;
 | 
						|
}
 | 
						|
 | 
						|
void TLista_fatture::set_the_header()
 | 
						|
{ 
 | 
						|
  int soh = 1;    
 | 
						|
  const long firm = get_firm();
 | 
						|
 | 
						|
  reset_header ();
 | 
						|
	const TRectype & nditte = cache().get(LF_NDITTE, firm);
 | 
						|
 | 
						|
  TDate today(TODAY);
 | 
						|
  TString s(132), rw(132);
 | 
						|
  TString16 s1,s2;
 | 
						|
  s = nditte.get(NDT_RAGSOC);    
 | 
						|
  s1 = _date_from.string();
 | 
						|
  s2 = _date_to.string();
 | 
						|
  char c[2]={'N','D'};
 | 
						|
 | 
						|
  set_header (soh++, FR("Ditta : %ld %s@100gData@106g%s  @123gPag. @#"),
 | 
						|
             firm,  (const char *)s,  (const char *)today);
 | 
						|
 
 | 
						|
  s.format(FR("Dalla data %s  Alla data %s"),(const char*)s1,(const char*)s2);
 | 
						|
  if (_tipo == indetraibile || _tipo == costo_ricavo)
 | 
						|
  {
 | 
						|
    s << FR("@45g Dal fornitore ");
 | 
						|
    if (_from_cf == 0L && _to_cf == 999999L)
 | 
						|
      s << TR(" Al fornitore");
 | 
						|
    else
 | 
						|
    {
 | 
						|
      s << _from_cf;
 | 
						|
      s << TR("  Al fornitore ");
 | 
						|
      s << _to_cf;
 | 
						|
    }
 | 
						|
    s << FR("@94g Dal registro ");
 | 
						|
    if (_from_reg.empty() && _to_reg == "~~~")
 | 
						|
      s << TR(" Al registro");
 | 
						|
    else
 | 
						|
    {
 | 
						|
      s << _from_reg;
 | 
						|
      s << TR("  Al registro ");
 | 
						|
      s << _to_reg;
 | 
						|
    }
 | 
						|
    if (_tipo == costo_ricavo)
 | 
						|
    {
 | 
						|
      set_header(soh++,FR("@50gLISTA FATTURE PER TIPO COSTO/RICAVO"));
 | 
						|
      c[0] = 'C'; c[1] = 'R';
 | 
						|
    }
 | 
						|
    else
 | 
						|
      set_header(soh++,FR("@50gLISTA FATTURE CON IVA INDETRAIBILE"));
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    set_header(soh++,FR("@50gLISTA FATTURE INTRACOMUNITARIE"));
 | 
						|
    s << FR("@45g Dal c. causale ");
 | 
						|
    if (_from_cau.empty() && _to_cau == "~~~")
 | 
						|
      s << TR("  Al c. causale");
 | 
						|
    else
 | 
						|
    {
 | 
						|
      s << _from_cau;
 | 
						|
      s << TR("  Al codice causale ");
 | 
						|
      s << _to_cau;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  
 | 
						|
  set_header(soh++,s);    
 | 
						|
  
 | 
						|
  rw.fill('-');
 | 
						|
  set_header(soh++, (const char *) rw);
 | 
						|
  set_header(soh++, FR("@12gNum@21gDocumento@63gCod.@68gM@70gTipo@106gCod@110g%c@128gNum."),c[0]);
 | 
						|
  set_header(soh++, FR("Data reg.@12gprot.@18gData@30gNumero@37gCodice@44gRagione sociale@63gReg.@68gL@70gDoc."
 | 
						|
                       "@75gTot.documento@94gImponibile@106gIva@110g%c@118gImposta@128gReg."),c[1]);
 | 
						|
  set_header(soh++, (const char *) rw);
 | 
						|
    
 | 
						|
  set_header(soh,"");
 | 
						|
}
 | 
						|
 | 
						|
void TLista_fatture::set_page(int file, int counter)
 | 
						|
{ 
 | 
						|
  int nriga=1;
 | 
						|
  set_the_header();
 | 
						|
 | 
						|
  if (_print_all)
 | 
						|
  {
 | 
						|
    set_row(nriga,"@ld@12g@5,rs@18g@ld@29g@7,rs",FLD(LF_MOV,MOV_DATAREG),FLD(LF_MOV,MOV_PROTIVA),
 | 
						|
                                               FLD(LF_MOV,MOV_DATADOC),FLD(LF_MOV,MOV_NUMDOC));
 | 
						|
    set_row(nriga,"@37g@6,rn@44g#-18.18t@63g@3s@67g@2,rn",FLD(LF_MOV,MOV_CODCF),&_ragsoc,FLD(LF_MOV,MOV_REG), FLD(LF_MOV,MOV_MESELIQ));
 | 
						|
    set_row(nriga,"@70g@2s@73g@15n",FLD(LF_MOV,MOV_TIPODOC),FLD(LF_MOV,MOV_TOTDOC));
 | 
						|
    set_row(nriga,"@125g@7,rn",FLD(LF_MOV,MOV_NUMREG));
 | 
						|
  }
 | 
						|
  set_row(nriga,"@89g@15n@105g@4,rs",FLD(LF_RMOVIVA,RMI_IMPONIBILE),FLD(LF_RMOVIVA,RMI_CODIVA));
 | 
						|
  
 | 
						|
  const bool cr = _tipo == costo_ricavo;
 | 
						|
  if (cr)
 | 
						|
    set_row(nriga,"@110g@1s",FLD(LF_RMOVIVA, RMI_TIPOCR));
 | 
						|
  else
 | 
						|
  {
 | 
						|
    real percind;
 | 
						|
    const int tipodet = get_tipodet_from_rmi(current_cursor()->curr(), current_cursor()->curr(LF_MOV), percind);
 | 
						|
    set_row(nriga,"@110g%d", tipodet);
 | 
						|
  }
 | 
						|
  set_row(nriga,"@112g@15n",FLD(LF_RMOVIVA,RMI_IMPOSTA));
 | 
						|
}
 | 
						|
 | 
						|
bool TLista_fatture::set_print(int m)
 | 
						|
{
 | 
						|
  TMask msk("cg3700a");
 | 
						|
  msk.set_handler(FLD_DATE_FROM, date_handler);
 | 
						|
  msk.set_handler(FLD_DATE_TO,   date_handler);
 | 
						|
  msk.set_handler(FLD_FROM_FOR, mix_handler);
 | 
						|
  msk.set_handler(FLD_TO_FOR, mix_handler);
 | 
						|
  msk.set_handler(FLD_FROM_REG, mix_handler);
 | 
						|
  msk.set_handler(FLD_TO_REG, mix_handler);
 | 
						|
  msk.set_handler(FLD_FROM_CAU, mix_handler);
 | 
						|
  msk.set_handler(FLD_TO_CAU, mix_handler);
 | 
						|
  msk.set_handler(FLD_DTO,  to_ditt_handler);
 | 
						|
  msk.set_handler(FLD_DFR,  fr_ditt_handler);
 | 
						|
  msk.set_handler(BUT_SEL,  select_button);
 | 
						|
  msk.set_handler(BUT_ANN,  reset_button);
 | 
						|
 | 
						|
  add_file(LF_RMOVIVA);
 | 
						|
  set_real_picture("###.###.###.###");
 | 
						|
  set_magic_currency(TRUE);
 | 
						|
 | 
						|
  if (_unica_ditta >= 0)
 | 
						|
  {
 | 
						|
    _ditte->check(_unica_ditta);
 | 
						|
    set_choice_limits(msk);
 | 
						|
  }
 | 
						|
  
 | 
						|
  switch (_tipo)
 | 
						|
  {
 | 
						|
    case costo_ricavo: 
 | 
						|
      msk.set_caption(TR("Lista fatture per costo/ricavo"));
 | 
						|
      msk.field(FLD_FROM_FOR).set_prompt(TR("Da cli./for. "));
 | 
						|
      msk.field(FLD_TO_FOR).set_prompt(TR("A cli./for.  "));
 | 
						|
      break;
 | 
						|
    case intra: 
 | 
						|
      msk.set_caption(TR("Lista fatture intracomunitarie"));
 | 
						|
      msk.hide(-1);
 | 
						|
      msk.show(-2);
 | 
						|
      break;
 | 
						|
    default:
 | 
						|
      break;
 | 
						|
  }
 | 
						|
  while (msk.run() == K_ENTER)
 | 
						|
  {
 | 
						|
    _from_cf = msk.get_long(FLD_FROM_FOR);
 | 
						|
    _to_cf   = msk.get_long(FLD_TO_FOR);
 | 
						|
    if (_to_cf == 0L) 
 | 
						|
      _to_cf = 999999L;
 | 
						|
    _from_reg = msk.get(FLD_FROM_REG);
 | 
						|
    _to_reg   = msk.get(FLD_TO_REG);
 | 
						|
    if (_to_reg.empty())
 | 
						|
      _to_reg = "~~~";
 | 
						|
    _from_cau = msk.get(FLD_FROM_CAU);
 | 
						|
    _to_cau   = msk.get(FLD_TO_CAU);
 | 
						|
    if (_to_cau.empty())
 | 
						|
      _to_cau = "~~~";
 | 
						|
    _date_from = msk.get_date(FLD_DATE_FROM);
 | 
						|
    _date_to   = msk.get_date(FLD_DATE_TO);
 | 
						|
 | 
						|
    int cur; // Seleziona il cursore corrente
 | 
						|
    switch (_tipo)
 | 
						|
    {
 | 
						|
      case costo_ricavo:
 | 
						|
        cur = _cur2;
 | 
						|
        break;
 | 
						|
      case intra:
 | 
						|
        cur = _cur3;
 | 
						|
        break;
 | 
						|
      default:
 | 
						|
        cur = _cur1;
 | 
						|
        break;
 | 
						|
    }  
 | 
						|
    
 | 
						|
    // Cosi' filtra il cursore ad ogni inizio stampa
 | 
						|
    get_cursor(_cur1)->set_filterfunction(filter_func1,TRUE); // Cursore 1
 | 
						|
    get_cursor(_cur2)->set_filterfunction(filter_func1,TRUE); // Cursore 2
 | 
						|
    get_cursor(_cur3)->set_filterfunction(filter_func2,TRUE); // Cursore 3
 | 
						|
 | 
						|
    select_cursor(cur);
 | 
						|
    
 | 
						|
    // Salva la ditta corrente
 | 
						|
    TPrefix& pref = prefix();
 | 
						|
    const long save_firm = pref.get_codditta();
 | 
						|
    
 | 
						|
    // Ciclo sulle ditte slezionate
 | 
						|
    const long items = _ditte->items();
 | 
						|
    printer().open();
 | 
						|
    for (int i = 0; i < items; i++)
 | 
						|
    {  
 | 
						|
      if (_ditte->checked(i))
 | 
						|
      {
 | 
						|
        _tipocrprec  = -1;
 | 
						|
        _tipodetprec = -1;
 | 
						|
        _numregprec  = -1L;
 | 
						|
        _tot_doc = 0.0; 
 | 
						|
        _tot_imp = 0.0; _tot_iva = 0.0;
 | 
						|
        _tp_doc  = 0.0; _tp_imp  = 0.0; _tp_iva  = 0.0;
 | 
						|
        _one_printed = false; _print_all = TRUE;
 | 
						|
        pref.set_codditta(_ditte->row(i).get_long(1));
 | 
						|
        if (get_cursor(cur)->items() > 0)
 | 
						|
        {
 | 
						|
          if (_tipo == intra)
 | 
						|
            _intra_items.destroy(); // Azzera l'array dei totali per fatture intra
 | 
						|
          if (_tipo == indetraibile)
 | 
						|
            _indetr.destroy(); // Azzera l'array dei totali per fatture intra
 | 
						|
          print();
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
    if (printer().isopen())
 | 
						|
      printer().close();
 | 
						|
      
 | 
						|
    // Ripristina la ditta
 | 
						|
    pref.set_codditta(save_firm);
 | 
						|
    msk.reset();
 | 
						|
  }
 | 
						|
  return false;
 | 
						|
}
 | 
						|
 | 
						|
bool TLista_fatture::user_create()
 | 
						|
{
 | 
						|
  _tipo = indetraibile;
 | 
						|
  const int argc = TApplication::argc();
 | 
						|
  if (argc > 2)
 | 
						|
  {
 | 
						|
    const char c = argv(2)[0];
 | 
						|
    switch (c)
 | 
						|
    {
 | 
						|
      case 'C': _tipo = costo_ricavo;
 | 
						|
        break;
 | 
						|
      case 'N': _tipo = intra;
 | 
						|
        break;
 | 
						|
      default:
 | 
						|
        break;
 | 
						|
    }
 | 
						|
  }
 | 
						|
  _ditte  = new TArray_sheet(-1, -1, -4, -4, TR("Selezione Ditte"),
 | 
						|
                             HR("@1|Cod.@5R|Ragione Sociale@50"));
 | 
						|
  open_files(LF_NDITTE, LF_TAB, LF_TABCOM, 0);
 | 
						|
 | 
						|
  _rel = new TRelation(LF_RMOVIVA);
 | 
						|
  _rel->add(LF_MOV,"NUMREG==NUMREG");
 | 
						|
  _rel->add(LF_CAUSALI,"CODCAUS==CODCAUS",1,LF_MOV); // Relazione
 | 
						|
  _rel->add(LF_CLIFO,"TIPOCF==TIPO|CODCF==CODCF",1,LF_MOV);
 | 
						|
                         
 | 
						|
  _cur1 = add_cursor(new TSorted_cursor(_rel,"TIPODET|23->DATAREG|NUMREG")); // Cursore valido per lista fatture con iva indetraibile
 | 
						|
  _cur2 = add_cursor(new TSorted_cursor(_rel,"TIPOCR|23->DATAREG|NUMREG"));  // Cursore valido per lista fatture per tipo costo/ricavo
 | 
						|
  _cur3 = add_cursor(new TCursor(_rel));                                     // Cursore valido per lista fatture intracomunitarie
 | 
						|
  
 | 
						|
  build_ditte_sheet();
 | 
						|
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool TLista_fatture::user_destroy()
 | 
						|
{
 | 
						|
  if (_ditte)  delete _ditte;
 | 
						|
  if (_rel)    delete _rel;
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
// Main
 | 
						|
///////////////////////////////////////////////////////////
 | 
						|
 | 
						|
int cg3700(int argc, char* argv[])
 | 
						|
{          
 | 
						|
  TLista_fatture lf;
 | 
						|
  lf.run(argc, argv, TR("Lista fatture"));
 | 
						|
  return 0;
 | 
						|
}
 |