996 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			996 lines
		
	
	
		
			25 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include "cg5500.h"
 | 
						|
 | 
						|
#include <browfile.h>
 | 
						|
#include <prefix.h>
 | 
						|
#include <msksheet.h>
 | 
						|
#include <mailbox.h>
 | 
						|
#include <execp.h>
 | 
						|
#include <progind.h>
 | 
						|
#include <urldefid.h>
 | 
						|
#include <relation.h>
 | 
						|
#include <sheet.h>
 | 
						|
#include <utility.h>
 | 
						|
 | 
						|
#include "cg5500a.h"
 | 
						|
 | 
						|
const char* Visliq_app::itoname(int m)
 | 
						|
{                    
 | 
						|
  const char* mn;     
 | 
						|
  if (m == 13) 
 | 
						|
    return "Annuale";
 | 
						|
  
 | 
						|
  if (_freqviva == "M")
 | 
						|
    return itom(m);
 | 
						|
 | 
						|
  switch(m)
 | 
						|
  {
 | 
						|
  case 3:
 | 
						|
    mn = "1 Trimestre";
 | 
						|
    break;
 | 
						|
  case 6:
 | 
						|
    mn = "2 Trimestre";
 | 
						|
    break;
 | 
						|
  case 9:
 | 
						|
    mn = "3 Trimestre";
 | 
						|
    break;
 | 
						|
  case 12:
 | 
						|
    mn = "4 Trimestre";
 | 
						|
    break;
 | 
						|
  }
 | 
						|
  
 | 
						|
  return mn;
 | 
						|
}                             
 | 
						|
 | 
						|
void Visliq_app::set_freqviva()
 | 
						|
{
 | 
						|
  if (look_lia())
 | 
						|
    _freqviva = _lia->get("S7");
 | 
						|
  else
 | 
						|
  {
 | 
						|
    TLocalisamfile ditte(LF_NDITTE,TRUE);
 | 
						|
    ditte.zero(); 
 | 
						|
    ditte.put("CODDITTA", get_firm());
 | 
						|
    ditte.read();
 | 
						|
    _freqviva = ditte.get("FREQVIVA");
 | 
						|
  }
 | 
						|
}
 | 
						|
 | 
						|
bool Visliq_app::create()
 | 
						|
{ 
 | 
						|
  TApplication::create();  
 | 
						|
 | 
						|
  _firm = get_firm();
 | 
						|
  TDate oggi(TODAY);                    
 | 
						|
  _year = oggi.year();
 | 
						|
  _nditte = new TRelation(LF_NDITTE);
 | 
						|
  _ditte  = new TArray_sheet(-1, -1, 0, 0, "Selezione Ditte",
 | 
						|
                             "Cod.@5|Ragione Sociale@50|Vers.");  
 | 
						|
  
 | 
						|
  _del        = new TTable("%DEL");
 | 
						|
  _lia        = new TTable("LIA");
 | 
						|
  _lim        = new TTable("LIM");
 | 
						|
  _del_r      = &(_del->curr());
 | 
						|
  _lim_r      = &(_lim->curr());
 | 
						|
  _del_ditta  = new TRecfield(*_del_r,"CODTAB",0,4);
 | 
						|
  _del_anno   = new TRecfield(*_del_r,"CODTAB",5,8);
 | 
						|
  _del_mese   = new TRecfield(*_del_r,"CODTAB",9,10);
 | 
						|
  _del_tipo   = new TRecfield(*_del_r,"CODTAB",11,11);
 | 
						|
  _lim_anno   = new TRecfield(*_lim_r,"CODTAB",0,3);
 | 
						|
  _lim_mese   = new TRecfield(*_lim_r,"CODTAB",4,6);
 | 
						|
 | 
						|
  begin_wait();
 | 
						|
  build_nomiditte();
 | 
						|
  build_ditte_sheet();
 | 
						|
  end_wait();
 | 
						|
  
 | 
						|
  dispatch_e_menu(BAR_ITEM(1));
 | 
						|
  
 | 
						|
  return TRUE; 
 | 
						|
}
 | 
						|
 | 
						|
bool Visliq_app::destroy()
 | 
						|
{                                  
 | 
						|
  delete _lim_mese;
 | 
						|
  delete _lim_anno;
 | 
						|
  delete _del_tipo;
 | 
						|
  delete _del_mese;
 | 
						|
  delete _del_ditta;
 | 
						|
  delete _lim_r;
 | 
						|
  delete _del_r;
 | 
						|
  delete _lim;
 | 
						|
  delete _del;
 | 
						|
  delete _ditte;
 | 
						|
  delete _nditte;
 | 
						|
  
 | 
						|
  return TApplication::destroy();
 | 
						|
}
 | 
						|
 | 
						|
bool Visliq_app::ch_year_handler(TMask_field& f, KEY key)
 | 
						|
{                                                    
 | 
						|
  if (key == K_TAB && f.focusdirty())
 | 
						|
  {                         
 | 
						|
    app().begin_wait();
 | 
						|
    app().set_year(f.get());
 | 
						|
    app().build_nomiditte();
 | 
						|
    app().build_ditte_sheet();  
 | 
						|
    app().reset_fields();  
 | 
						|
    app().end_wait();
 | 
						|
  }
 | 
						|
  return TRUE;
 | 
						|
} 
 | 
						|
 | 
						|
 | 
						|
void Visliq_app::build_ditte_sheet()
 | 
						|
{
 | 
						|
  // build sheet
 | 
						|
  _ditte->destroy();
 | 
						|
  for (int i = 0; i < _nomiditte.items(); i++)
 | 
						|
  {
 | 
						|
    TToken_string* d = new TToken_string(64);
 | 
						|
    *d = (TToken_string&)_nomiditte[i];
 | 
						|
    const char vers = d->get_char(2);
 | 
						|
    bool selectable = vers == '?';
 | 
						|
    const long pos = _ditte->add(d);     
 | 
						|
    if (selectable)  _ditte->disable(pos);
 | 
						|
  }     
 | 
						|
}
 | 
						|
 | 
						|
void Visliq_app::reset_fields()
 | 
						|
{
 | 
						|
  _mask->field(F_CODDITTA).set("");
 | 
						|
  _mask->field(F_RAGSOC).set("");
 | 
						|
}
 | 
						|
 | 
						|
void Visliq_app::build_nomiditte()
 | 
						|
{                 
 | 
						|
  _nomiditte.destroy();
 | 
						|
  // ricostruire _nomiditte e rifare build_ditte_sheet
 | 
						|
  TLocalisamfile& dt = _nditte->lfile();
 | 
						|
  TString fr(2);
 | 
						|
 | 
						|
  for (dt.first(); !dt.eof(); dt.next())
 | 
						|
  {     
 | 
						|
    // check no archivi
 | 
						|
    fr = "??";
 | 
						|
    bool good = prefhndl->exist(dt.get_long("CODDITTA"));                        
 | 
						|
    
 | 
						|
    if (good) 
 | 
						|
    {   
 | 
						|
      // check no parametri liquidazione                                               
 | 
						|
      TApplication::set_firm(dt.get_long("CODDITTA"));   
 | 
						|
      TTable lia("LIA");
 | 
						|
      lia.put("CODTAB", format("%d",_year));
 | 
						|
      if (lia.read() != NOERR) good = FALSE; 
 | 
						|
      else fr = lia.get("S7");
 | 
						|
    }
 | 
						|
    
 | 
						|
    TToken_string* d = new TToken_string(64);
 | 
						|
    
 | 
						|
    // add record 
 | 
						|
    d->add(dt.get("CODDITTA"));
 | 
						|
    d->add(dt.get("RAGSOC"));
 | 
						|
    d->add(fr);
 | 
						|
    
 | 
						|
    _nomiditte.add(d);  
 | 
						|
  }
 | 
						|
  TApplication::set_firm(_firm);
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
 | 
						|
void Visliq_app::set_mask_freq(TMask& m)
 | 
						|
{
 | 
						|
  if (_freqviva == "M")
 | 
						|
  {
 | 
						|
    m.show(F_MONTHS);
 | 
						|
    m.hide(F_TRIMS);
 | 
						|
  }
 | 
						|
  else
 | 
						|
  {
 | 
						|
    m.hide(F_MONTHS);
 | 
						|
    m.show(F_TRIMS);
 | 
						|
  }
 | 
						|
}      
 | 
						|
 | 
						|
 | 
						|
bool Visliq_app::sheet_action(int r, KEY k)
 | 
						|
{                    
 | 
						|
  // non si possono cancellare o aggiungere righe
 | 
						|
  return (k != K_DEL && k != K_INS);
 | 
						|
}
 | 
						|
 | 
						|
bool Visliq_app::vers_action(int r, KEY k)
 | 
						|
{                    
 | 
						|
  // non si possono cancellare o aggiungere righe 
 | 
						|
  return (k != K_DEL && k != K_INS);
 | 
						|
}
 | 
						|
 | 
						|
const char* Visliq_app::link_handler(TMask& m, 
 | 
						|
                                     int n, const char* txt, bool doubleclick)
 | 
						|
{
 | 
						|
  // con click visualizza, con double click modifica
 | 
						|
  TString st(txt);                                   
 | 
						|
  bool iscred = FALSE;
 | 
						|
  static int group; 
 | 
						|
  int firstfoc;
 | 
						|
 | 
						|
  if (group != 0) m.hide(group);    
 | 
						|
  
 | 
						|
  if (st.find("rimborso") != -1) 
 | 
						|
  { group = -1;  firstfoc = F_RIMBORSO;  }
 | 
						|
  else if (st.find("debito") != -1 || st.find("credito") != -1)
 | 
						|
  { group = -2;  firstfoc = F_RETTIFICA; }
 | 
						|
  else if (st.find("acconto") != -1)
 | 
						|
  { group = -3;  firstfoc = F_ACCONTO;   } 
 | 
						|
  else if (st.find("Versamenti") != -1)                 
 | 
						|
  { group = -4;  firstfoc = F_DELDATE;   } 
 | 
						|
  
 | 
						|
  m.show(group);        
 | 
						|
  m.enable(group);  
 | 
						|
  
 | 
						|
  if (doubleclick) m.field(firstfoc).set_focus();
 | 
						|
 | 
						|
  return NULL;
 | 
						|
}                                               
 | 
						|
 | 
						|
 | 
						|
 | 
						|
bool Visliq_app::menu(MENU_TAG m)
 | 
						|
{
 | 
						|
  if (m == BAR_ITEM(1))
 | 
						|
    return vis_liq();       
 | 
						|
  
 | 
						|
  return TApplication::menu(m);
 | 
						|
}                
 | 
						|
 | 
						|
// handlers
 | 
						|
bool Visliq_app::set_ditta(TMask_field& f, KEY k)
 | 
						|
{                               
 | 
						|
  bool found = TRUE;
 | 
						|
  if (k == K_TAB && f.focusdirty())
 | 
						|
  {
 | 
						|
    found = FALSE;
 | 
						|
    TString ditta = f.get();
 | 
						|
    TArray_sheet* sh = app().get_ditte_sheet();
 | 
						|
    for (int i = 0; i < sh->items(); i++)
 | 
						|
    { 
 | 
						|
      TToken_string& row = sh->row(i);
 | 
						|
      if (ditta == row.get(0))
 | 
						|
      { 
 | 
						|
        if (sh->enabled(i))
 | 
						|
        {
 | 
						|
          f.mask().field(F_CODDITTA).set(row.get(0));
 | 
						|
          f.mask().field(F_RAGSOC).set(row.get(1));
 | 
						|
          app().set_freqviva(row.get(2));
 | 
						|
          app().set_mask_freq(f.mask()); 
 | 
						|
          found = TRUE;
 | 
						|
        }
 | 
						|
        else { f.reset(); beep(); }
 | 
						|
        break;
 | 
						|
      }
 | 
						|
    }
 | 
						|
  } 
 | 
						|
  return found;
 | 
						|
}
 | 
						|
 | 
						|
bool Visliq_app::set_ragsoc(TMask_field& f, KEY k)
 | 
						|
{   
 | 
						|
  bool found = TRUE;
 | 
						|
  if (k == K_TAB && f.focusdirty())
 | 
						|
  {
 | 
						|
    found = FALSE;
 | 
						|
    TString ditta = f.get();
 | 
						|
    TArray_sheet* sh = app().get_ditte_sheet();
 | 
						|
    for (int i = 0; i < sh->items(); i++)
 | 
						|
    { 
 | 
						|
      TToken_string& row = sh->row(i);
 | 
						|
      TString ts(row.get(1));
 | 
						|
      if (ts.find(ditta) != -1)
 | 
						|
      { 
 | 
						|
        if (sh->enabled(i))
 | 
						|
        {
 | 
						|
          f.mask().field(F_CODDITTA).set(row.get(0));
 | 
						|
          f.mask().field(F_RAGSOC).set(row.get(1));
 | 
						|
          app().set_freqviva(row.get(2)); 
 | 
						|
          app().set_mask_freq(f.mask()); 
 | 
						|
          found = TRUE;
 | 
						|
          break;
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
  } 
 | 
						|
  return found;  
 | 
						|
}
 | 
						|
 | 
						|
 | 
						|
bool Visliq_app::sel_mese_sh1 (TMask_field& f, KEY k)
 | 
						|
{                                                  
 | 
						|
  if (k != K_SPACE) return TRUE;
 | 
						|
  
 | 
						|
  TMask& m = *(app().get_main_mask());
 | 
						|
  TSheet_field& sh = (TSheet_field&)m.field(F_VISLIQ1);
 | 
						|
  int month = sh.selected()+1;
 | 
						|
  TToken_string& tt = sh.row(sh.selected());
 | 
						|
  if (sh.items() == 4) month *= 3;  
 | 
						|
  app().vis_one(month);  
 | 
						|
  app().look_lim(month);
 | 
						|
  app().update_sheet_row(tt);
 | 
						|
  TMask& sm = sh.sheet_mask();
 | 
						|
  
 | 
						|
  sm.field(103).set(tt.get(2));
 | 
						|
  sm.field(104).set(tt.get(3));
 | 
						|
  sm.field(105).set(tt.get(4));
 | 
						|
  sm.field(106).set(tt.get(5));
 | 
						|
  sm.field(107).set(tt.get(6));
 | 
						|
 | 
						|
  sh.force_update();
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
bool Visliq_app::sel_mese_sh2 (TMask_field& f, KEY k)
 | 
						|
{               
 | 
						|
  if (k != K_SPACE) return TRUE;
 | 
						|
 | 
						|
  TMask& m = *(app().get_main_mask());
 | 
						|
  TSheet_field& sh = (TSheet_field&)m.field(F_VISLIQ2);
 | 
						|
  int month = sh.selected()+1;
 | 
						|
  if (sh.items() == 4) month *= 3;
 | 
						|
  app().vis_one(month);
 | 
						|
  return TRUE;
 | 
						|
}
 | 
						|
 | 
						|
void Visliq_app::update_sheet_row(TToken_string& t)
 | 
						|
{
 | 
						|
  t.add(abs(_lim->get_real("R0")).string(),2);  
 | 
						|
  t.add((_lim->get_real("R0")).sign() >= 0 ? "D" : "C", 3);
 | 
						|
  t.add((_lim->get_real("R1")).string(),4);
 | 
						|
  t.add(abs(_lim->get_real("R5")).string(),5);
 | 
						|
  t.add((_lim->get_real("R5")).sign() >= 0 ? "D" : "C", 6);
 | 
						|
}
 | 
						|
 | 
						|
bool Visliq_app::vis_liq()
 | 
						|
{               
 | 
						|
  long ditta = get_firm();
 | 
						|
  set_freqviva();
 | 
						|
  KEY k;
 | 
						|
  
 | 
						|
  TMask m("cg5500a");
 | 
						|
  _mask = &m;
 | 
						|
  
 | 
						|
  m.set_handler(F_CODDITTA, set_ditta);   
 | 
						|
  m.set_handler(F_RAGSOC,   set_ragsoc);   
 | 
						|
  m.set_handler(F_YEAR,     ch_year_handler);   
 | 
						|
 | 
						|
  set_mask_freq(m);
 | 
						|
  _year = m.get_int(F_YEAR);
 | 
						|
  
 | 
						|
  while ((k = m.run()) != K_ESC)
 | 
						|
  { 
 | 
						|
    if (k == DLG_SELECT)
 | 
						|
    {
 | 
						|
      if (_ditte->run() == K_ENTER)
 | 
						|
      {
 | 
						|
        TToken_string& row = _ditte->row(_ditte->selected()); 
 | 
						|
        m.field(F_CODDITTA).set(row.get(0));
 | 
						|
        m.field(F_RAGSOC).set(row.get(1));
 | 
						|
        set_freqviva(row.get(2)); 
 | 
						|
        set_mask_freq(m);        
 | 
						|
      }
 | 
						|
    }
 | 
						|
    else if (k == K_ENTER)
 | 
						|
    { 
 | 
						|
      long dtt   = m.get_long(F_CODDITTA); 
 | 
						|
      
 | 
						|
      set_firm(dtt);
 | 
						|
      int month = m.get_int(_freqviva == "M" ? F_MONTHS : F_TRIMS);
 | 
						|
      if (month == 0)
 | 
						|
        vis_all();
 | 
						|
      else
 | 
						|
        vis_one(month);
 | 
						|
      _mask = &m;   
 | 
						|
    }
 | 
						|
  } 
 | 
						|
 | 
						|
  set_firm(ditta);
 | 
						|
  
 | 
						|
  return FALSE;
 | 
						|
}    
 | 
						|
 | 
						|
 | 
						|
bool Visliq_app::vis_all()
 | 
						|
{                                               
 | 
						|
  if (!look_lia())
 | 
						|
    return FALSE;               
 | 
						|
 | 
						|
  // mask diverse per trimestrale e annuale
 | 
						|
  TMask m(_freqviva == "M" ? "cg5500b" : "cg5500c");   
 | 
						|
 | 
						|
  TString abi(5);
 | 
						|
  TString cab(5);
 | 
						|
  TString cnc(5);
 | 
						|
  
 | 
						|
  _mask = &m;
 | 
						|
  
 | 
						|
  TSheet_field& sh = (TSheet_field&)m.field(F_VISLIQ1); 
 | 
						|
  TSheet_field& sv = (TSheet_field&)m.field(F_VISLIQ2); 
 | 
						|
  
 | 
						|
  _liq_sheet  = &sh;
 | 
						|
  _vers_sheet = &sv;
 | 
						|
  
 | 
						|
  // disabilita aggiunta/eliminazione righe
 | 
						|
  sh.set_notify(sheet_action);
 | 
						|
  // qui occorre modificare le deleghe
 | 
						|
  sv.set_notify(vers_action);
 | 
						|
 | 
						|
  sh.sheet_mask().set_handler(101,sel_mese_sh1);
 | 
						|
  sv.sheet_mask().set_handler(101,sel_mese_sh2);
 | 
						|
 | 
						|
  m.field(F_CREDPREC).set(_lia->get_real("R0").string());
 | 
						|
 | 
						|
  // set sheet
 | 
						|
  for (int i = 1; i <= 12; i++)
 | 
						|
  {                      
 | 
						|
    
 | 
						|
    if (!is_month_ok(i)) 
 | 
						|
      continue;     
 | 
						|
    
 | 
						|
    if (!look_lim(i))
 | 
						|
    {
 | 
						|
      sh.row(i-1) = *(new TToken_string("||||||")); 
 | 
						|
      sh.disable_cell(i-1, -1);
 | 
						|
      continue;
 | 
						|
    }                                   
 | 
						|
    
 | 
						|
    TToken_string* tt = new TToken_string(80);
 | 
						|
    
 | 
						|
    tt->add("");          // questo e' il bottone
 | 
						|
    tt->add(itoname(i));
 | 
						|
    tt->add(abs(_lim->get_real("R0")).string());
 | 
						|
    tt->add(_lim->get_real("R0").sign() < 0 ? "C" : "D");
 | 
						|
    tt->add(_lim->get_real("R1").string());
 | 
						|
    tt->add(abs(_lim->get_real("R5")).string());
 | 
						|
    tt->add(_lim->get_real("R5").sign() < 0 ? "C" : "D");
 | 
						|
    
 | 
						|
    sh.row(i-1) = (*tt);
 | 
						|
  }  
 | 
						|
  
 | 
						|
  // calcola versamenti
 | 
						|
  real  versamenti[13];   
 | 
						|
  TDate date[13];   
 | 
						|
  TToken_string banche[13]; 
 | 
						|
  
 | 
						|
  for (_del->first(); !_del->eof(); _del->next())
 | 
						|
  {                    
 | 
						|
    if (atol(*_del_ditta) != get_firm()  ||
 | 
						|
        atoi(*_del_anno)  != _year)
 | 
						|
      continue;
 | 
						|
    
 | 
						|
    // uso solo deleghe normali (tipo == 1) e acconti (tipo == 7)                              
 | 
						|
    int tipod = atoi(*_del_tipo);
 | 
						|
    if (tipod != 1 && tipod != 7) 
 | 
						|
      continue;
 | 
						|
    
 | 
						|
    // somma versamenti nel mese adeguato  
 | 
						|
    int m = atoi(*_del_mese);
 | 
						|
 | 
						|
    if (m >= 12)
 | 
						|
      m = tipod == 7 ? 12 : 13;
 | 
						|
 | 
						|
    versamenti[m-1] += _del->get_real("R0") + _del->get_real("R1");
 | 
						|
    date[m-1]        = _del->get_date("D0");
 | 
						|
    banche[m-1].add(_del->get("S7"),0);
 | 
						|
    banche[m-1].add(_del->get("S8"),1);
 | 
						|
    banche[m-1].add(_del->get("S9"),2);
 | 
						|
  }
 | 
						|
  
 | 
						|
  TString nomemese(26);          
 | 
						|
 | 
						|
  for (i = 1; i <= 13; i++)
 | 
						|
  {  
 | 
						|
    if (!is_month_ok(i)) 
 | 
						|
      continue;
 | 
						|
 | 
						|
    TToken_string* tt = new TToken_string(80);
 | 
						|
    nomemese = itoname(i == 13 ? 12 : i);              
 | 
						|
    
 | 
						|
    if (i == 12) nomemese << " acconto";
 | 
						|
    if (i == 13) nomemese << " saldo";
 | 
						|
    
 | 
						|
    tt->add("");                      // questo e' il bottone
 | 
						|
    tt->add(nomemese);                // mese
 | 
						|
    tt->add(date[i-1].string());      // data vers.
 | 
						|
    tt->add(banche[i-1].get(0));      // azienda
 | 
						|
    tt->add(banche[i-1].get(1));      // dipendenza
 | 
						|
    tt->add(banche[i-1].get(2));      // concessionaria
 | 
						|
    tt->add(versamenti[i-1].string());// versamenti 
 | 
						|
    
 | 
						|
    sv.row(i-1) = (*tt);
 | 
						|
  }  
 | 
						|
  
 | 
						|
  sh.enable_column(0, FALSE);
 | 
						|
  sv.enable_column(0, FALSE);
 | 
						|
  
 | 
						|
  // save initial rows
 | 
						|
  _vers_rows = sv.rows_array();
 | 
						|
  _liq_rows  = sh.rows_array();
 | 
						|
  
 | 
						|
  KEY k = m.run();        
 | 
						|
  
 | 
						|
  bool save  = k == K_SAVE;  
 | 
						|
  bool asked = save;
 | 
						|
 | 
						|
  if (k != K_ESC)
 | 
						|
  {
 | 
						|
    if (m.field(F_CREDPREC).dirty())
 | 
						|
    {                
 | 
						|
      real r(m.get(F_CREDPREC));
 | 
						|
      if (!asked && !save)
 | 
						|
      {
 | 
						|
        save = yesno_box("Modifiche non registrate: salvare?"); 
 | 
						|
        asked = TRUE;
 | 
						|
      } 
 | 
						|
      if (save)
 | 
						|
      {   
 | 
						|
        _lia->put("R0",r);
 | 
						|
        _lia->rewrite();        
 | 
						|
        if (look_lim(1))
 | 
						|
        {
 | 
						|
          _lim->put("B0","");
 | 
						|
          _lim->rewrite();
 | 
						|
        }
 | 
						|
      }
 | 
						|
    }
 | 
						|
 | 
						|
    // check modifiche liquidazione 
 | 
						|
    for (int i = 0; i < _liq_rows.items(); i++)
 | 
						|
    {
 | 
						|
      // compare sheet row with previous
 | 
						|
      TToken_string& tt = sh.row(i);
 | 
						|
      TToken_string& ot = (TToken_string&)_liq_rows[i];   
 | 
						|
      
 | 
						|
      real rmb1(tt.get(4)), rmb2(ot.get(4)),
 | 
						|
      rtt1(tt.get(5)), rtt2(ot.get(5));
 | 
						|
      char deb1 = tt.get_char(6), deb2 = ot.get_char(6); 
 | 
						|
      
 | 
						|
      bool modified = (rmb1 != rmb2 || rtt1 != rtt2 || deb1 != deb2);
 | 
						|
 | 
						|
      if (modified)
 | 
						|
      {
 | 
						|
        if (!asked && !save)
 | 
						|
        {
 | 
						|
          save = yesno_box("Modifiche non registrate: salvare?"); 
 | 
						|
          asked = TRUE;
 | 
						|
        } 
 | 
						|
        if (save)
 | 
						|
        {             
 | 
						|
          int month = i + 1; 
 | 
						|
          if (sh.items() == 4) month *= 3;
 | 
						|
          look_lim(month);
 | 
						|
          _lim->put("R1", rmb1);
 | 
						|
          if (deb1 == 'C') rtt1 = -rtt1;
 | 
						|
          _lim->put("R5", rtt1);
 | 
						|
          _lim->put("S7", deb1);
 | 
						|
          _lim->put("B0", "");
 | 
						|
          _lim->rewrite();
 | 
						|
        }
 | 
						|
      }
 | 
						|
    } 
 | 
						|
    // check modifiche versamenti
 | 
						|
    for (i = 0; i < _vers_rows.items(); i++)
 | 
						|
    {   
 | 
						|
      // compare sheet row with previous
 | 
						|
      TToken_string& tt = sv.row(i); 
 | 
						|
      TToken_string& ot = (TToken_string&)_vers_rows[i];
 | 
						|
 | 
						|
      TDate     d1(tt.get(2)),   d2(ot.get(2));
 | 
						|
      TString abi1(tt.get(3)), abi2(ot.get(3)),
 | 
						|
      cab1(tt.get(4)), cab2(ot.get(4)),
 | 
						|
      con1(tt.get(5)), con2(ot.get(5));
 | 
						|
      real    imp1(tt.get(6)), imp2(ot.get(6));
 | 
						|
      
 | 
						|
      bool modified = (d1   !=   d2 || abi1 != abi2 ||
 | 
						|
                       cab1 != cab2 || con1 != con2 ||
 | 
						|
                       imp1 != imp2);
 | 
						|
      
 | 
						|
      if (modified)
 | 
						|
      {
 | 
						|
        if (!asked && !save)
 | 
						|
        {
 | 
						|
          save = yesno_box("Modifiche non registrate: salvare?"); 
 | 
						|
          asked = TRUE;
 | 
						|
        } 
 | 
						|
        if (save)
 | 
						|
        {         
 | 
						|
          int mult  = sv.items() == 4 ? 3 : 1;
 | 
						|
          int month = 12;  
 | 
						|
          if (i < 11) month = (i+1) * mult; 
 | 
						|
          int type = i == 11 ? 7 : 1; 
 | 
						|
          look_del(month, type, TRUE);
 | 
						|
          
 | 
						|
          _del->put("D0", d1);
 | 
						|
          _del->put("S7", abi1);
 | 
						|
          _del->put("S8", cab1);
 | 
						|
          _del->put("S9", con1);
 | 
						|
          _del->put("R0", imp1);  
 | 
						|
          _del->put("R1", "");        // azzeriamo l'eventuale interesse
 | 
						|
          _del->rewrite();           
 | 
						|
        }
 | 
						|
      }
 | 
						|
    } 
 | 
						|
 | 
						|
  }
 | 
						|
  
 | 
						|
  _mask = NULL; 
 | 
						|
 | 
						|
  return TRUE;
 | 
						|
}    
 | 
						|
 | 
						|
 | 
						|
bool Visliq_app::vis_one(int m)
 | 
						|
{       
 | 
						|
  begin_wait();
 | 
						|
  TMask msk("cg5500d");
 | 
						|
  bool recorded = FALSE;
 | 
						|
  TString nomem("Liquidazione IVA ");
 | 
						|
  nomem << itoname(m);
 | 
						|
  nomem << " " << _year;
 | 
						|
  
 | 
						|
  // ricalcolo liquidazione  TMessage msg;  
 | 
						|
  TFilename f;
 | 
						|
  f.temp("prliq");
 | 
						|
  
 | 
						|
  TToken_string body(36);
 | 
						|
  body.add(_year);
 | 
						|
  body.add(m);
 | 
						|
  body.add(get_firm());
 | 
						|
  body.add("V");        // visualizzazione: no ff alla fine, zeri stampati
 | 
						|
  body.add(""); 
 | 
						|
  body.add(f); 
 | 
						|
  
 | 
						|
  TMessage msg("cg4 -2", "RCL", body);
 | 
						|
  msg.send();
 | 
						|
 | 
						|
  TBrowsefile_field& brw = (TBrowsefile_field&)msk.field(F_VISFLQ); 
 | 
						|
  brw.set_link_handler(link_handler);
 | 
						|
  brw.enable_link("Modifica: ", 'r');            
 | 
						|
 | 
						|
  look_lim(m);
 | 
						|
  real rimborso  = _lim->get_real("R1");
 | 
						|
  real rettifica = _lim->get_real("R5");
 | 
						|
  TString desc1(_lim->get("S0"));
 | 
						|
  TString desc2(_lim->get("S1"));
 | 
						|
  real acconto;
 | 
						|
  
 | 
						|
  if (m == 12)
 | 
						|
  {     
 | 
						|
    look_lia();
 | 
						|
    acconto   = _lia->get_real("R4");
 | 
						|
  }
 | 
						|
  
 | 
						|
  msk.field(F_YEAR).set(nomem);
 | 
						|
  msk.field(F_RIMBORSO).set(rimborso.string());             
 | 
						|
  if (rettifica.sign() < 0)
 | 
						|
  { 
 | 
						|
    msk.field(F_RETTIFICA).set(abs(rettifica).string());             
 | 
						|
    msk.field(F_DEBCRE).set("C");
 | 
						|
  }
 | 
						|
  else 
 | 
						|
  {
 | 
						|
    msk.field(F_RETTIFICA).set(rettifica.string()); 
 | 
						|
    msk.field(F_DEBCRE).set("D");
 | 
						|
  }                                               
 | 
						|
  
 | 
						|
  msk.field(F_DESCR1).set(desc1);             
 | 
						|
  msk.field(F_DESCR2).set(desc1);             
 | 
						|
  msk.field(F_ACCONTO).set(acconto.string());             
 | 
						|
  
 | 
						|
  long line;
 | 
						|
  TExternal_app liq("cg4 -2");
 | 
						|
{
 | 
						|
  end_wait();
 | 
						|
  TProgind(10l,"Estrazione liquidazione: prego attendere", FALSE,FALSE);
 | 
						|
  liq.run();                       
 | 
						|
  
 | 
						|
  if (liq.error())
 | 
						|
  {
 | 
						|
    beep();
 | 
						|
    return FALSE;
 | 
						|
  }    
 | 
						|
  begin_wait();
 | 
						|
  line = brw.set_text(f, "CALCOLO LIQUIDAZIONE D'IMPOSTA"); 
 | 
						|
  brw.goto_pos(brw.lines()-16l, 9);
 | 
						|
  
 | 
						|
  real risultato = _lim->get_real("R0");
 | 
						|
  risultato      += (rimborso + rettifica - acconto);
 | 
						|
  
 | 
						|
  TViswin* vsw = brw.vis_win();
 | 
						|
  long ll, ll2, lvers = -1; int x; 
 | 
						|
 | 
						|
  int  isdebt = risultato.sign();
 | 
						|
  long lrivr  = vsw->search("Versamenti effettuati",x,line,TRUE);
 | 
						|
  long lrisd  = vsw->search("RISULTATO", x, line, TRUE);     // RISULTATO a debito
 | 
						|
  long lrisc  = vsw->search("RISULTATO", x, lrisd+1l, TRUE); //             credito
 | 
						|
  if (risultato.sign())
 | 
						|
    lvers = vsw->search(isdebt < 0 ? "CREDITO ATTUALE" : "IVA DA VERSARE",
 | 
						|
                        x, line, TRUE);
 | 
						|
  if (lvers == -1l)                      
 | 
						|
    lvers = vsw->search("IVA A DEBITO DA NON VERSARE", x, line, TRUE);
 | 
						|
  
 | 
						|
  real risc(real::ita2eng(brw.get_text(lrisc,58,15)));                         
 | 
						|
  real risd(real::ita2eng(brw.get_text(lrisd,75,15)));
 | 
						|
  
 | 
						|
  real vers = 0.0; 
 | 
						|
  TDate date(TODAY);             
 | 
						|
  TString cab(5), abi(5), con(5);   
 | 
						|
  
 | 
						|
  bool is_delega = FALSE;
 | 
						|
  
 | 
						|
  if (is_delega = look_del(m,1))
 | 
						|
  {
 | 
						|
    vers = _del->get_real("R0") + _del->get_real("R1");
 | 
						|
    date = _del->get_date("D0");
 | 
						|
    abi  = _del->get("S7");
 | 
						|
    cab  = _del->get("S8");
 | 
						|
    con  = _del->get("S9");
 | 
						|
  }
 | 
						|
  
 | 
						|
  msk.field(F_DELDATE).set(date.string());
 | 
						|
  msk.field(F_DELIMP).set(vers.string());
 | 
						|
  msk.field(F_DELABI).set(abi);
 | 
						|
  msk.field(F_DELCAB).set(cab);
 | 
						|
  msk.field(F_DELCON).set(con);
 | 
						|
  
 | 
						|
  if (lrisd == -1l || lrisc == -1l) return FALSE;                       
 | 
						|
  if (lvers == -1l) lvers = lrisc+1l;
 | 
						|
 | 
						|
  bool write_lia = FALSE, write_lim = FALSE, write_del = FALSE;
 | 
						|
  end_wait();
 | 
						|
  
 | 
						|
  for(;;)
 | 
						|
  {
 | 
						|
    KEY k = msk.run();  
 | 
						|
    
 | 
						|
    if (k == K_INS || k == K_SAVE)
 | 
						|
    {       
 | 
						|
      real    n_acconto  (msk.get(F_ACCONTO));
 | 
						|
      real    n_rimborso (msk.get(F_RIMBORSO));
 | 
						|
      real    n_rettifica(msk.get(F_RETTIFICA));
 | 
						|
      real    n_delimp(msk.get(F_DELIMP));
 | 
						|
      TString n_desc1 (msk.get(F_DESCR1));
 | 
						|
      TString n_desc2 (msk.get(F_DESCR2));
 | 
						|
 | 
						|
      if (msk.field(F_RETTIFICA).dirty() || msk.field(F_DEBCRE).dirty())
 | 
						|
      {   
 | 
						|
        ll  = vsw->search("Rettifiche IVA a credito",x,line,TRUE);
 | 
						|
        ll2 = vsw->search("Rettifiche IVA a debito", x,line,TRUE);
 | 
						|
        
 | 
						|
        if (ll != -1 && ll2 != -1)
 | 
						|
        {
 | 
						|
          if (msk.get(F_DEBCRE) == "D")
 | 
						|
          {
 | 
						|
            vsw->replace(ll2, n_rettifica.string("###.###.###.###"), 75);
 | 
						|
            vsw->replace(ll,  "               ", 58);
 | 
						|
          }                  
 | 
						|
          else
 | 
						|
          {
 | 
						|
            vsw->replace(ll,  n_rettifica.string("###.###.###.###           "), 58);
 | 
						|
            vsw->replace(ll2, "               ", 75);
 | 
						|
          }
 | 
						|
          
 | 
						|
          risultato -= rettifica; // vecchia rettifica 
 | 
						|
          
 | 
						|
          // scorporo vecchia
 | 
						|
          if (rettifica.sign() > 0)
 | 
						|
            risd -= rettifica;
 | 
						|
          else
 | 
						|
            risc += rettifica;
 | 
						|
          
 | 
						|
          // incorporo nuova
 | 
						|
          if (msk.get(F_DEBCRE) == "C") 
 | 
						|
          { 
 | 
						|
            risc        += n_rettifica;
 | 
						|
            n_rettifica = -n_rettifica;  
 | 
						|
          }
 | 
						|
          else 
 | 
						|
          { 
 | 
						|
            risd += n_rettifica;
 | 
						|
          }
 | 
						|
 | 
						|
          risultato += n_rettifica;
 | 
						|
 | 
						|
          vsw->replace(lrisc, risc.string("###.###.###.###"), 58);                    
 | 
						|
          vsw->replace(lrisd, risd.string("###.###.###.###"), 75);
 | 
						|
          
 | 
						|
          _lim->put("R5", n_rettifica);
 | 
						|
          _lim->put("S7", msk.get(F_DEBCRE));
 | 
						|
          _lim->put("R0", risultato);
 | 
						|
          
 | 
						|
          set_risultato(vsw, lvers, risultato);   
 | 
						|
          
 | 
						|
          // altro giro, altro regalo
 | 
						|
          rettifica = n_rettifica;
 | 
						|
        }
 | 
						|
        write_lim = TRUE;
 | 
						|
      }
 | 
						|
      if (msk.field(F_ACCONTO).dirty())
 | 
						|
      {
 | 
						|
        ll  = vsw->search("Versamento acconto dicembre",x,line,TRUE);
 | 
						|
        if (ll != -1)
 | 
						|
          vsw->replace(ll, n_acconto.string("###.###.###.###"), 58);                    
 | 
						|
        write_lia = TRUE;  
 | 
						|
        risultato += acconto;
 | 
						|
        risultato -= n_acconto;    
 | 
						|
        risc      -= acconto;
 | 
						|
        risc      += n_acconto;
 | 
						|
        _lia->put("R4", n_acconto);
 | 
						|
        _lim->put("R0", risultato);
 | 
						|
        vsw->replace(lrisc, risc.string("###.###.###.###"), 58);                    
 | 
						|
        set_risultato(vsw, lvers, risultato);
 | 
						|
      }
 | 
						|
      if (msk.field(F_RIMBORSO).dirty())
 | 
						|
      {
 | 
						|
        ll = vsw->search("Iva chiesta a rimborso",x,line,TRUE);
 | 
						|
        if (ll != -1)
 | 
						|
          vsw->replace(ll, n_rimborso.string("###.###.###.###"), 75);
 | 
						|
        write_lim = TRUE;  
 | 
						|
        risultato -= rimborso;
 | 
						|
        risultato += n_rimborso;    
 | 
						|
        risd      -= rimborso;
 | 
						|
        risd      += n_rimborso;
 | 
						|
        _lim->put("R1", n_rimborso);
 | 
						|
        _lim->put("R0", risultato);
 | 
						|
        vsw->replace(lrisd, risd.string("###.###.###.###"), 75);
 | 
						|
        set_risultato(vsw, lvers, risultato);
 | 
						|
      }
 | 
						|
 | 
						|
      if (msk.field(F_DESCR1).dirty())
 | 
						|
      { 
 | 
						|
        _lim->put("S0", n_desc1);
 | 
						|
        write_lim = TRUE;
 | 
						|
      }
 | 
						|
      if (msk.field(F_DESCR2).dirty())
 | 
						|
      {
 | 
						|
        _lim->put("S1", n_desc2);
 | 
						|
        write_lim = TRUE;
 | 
						|
      }                     
 | 
						|
      
 | 
						|
      // delegations
 | 
						|
      if (msk.field(F_DELDATE).dirty())
 | 
						|
      {
 | 
						|
        if (!is_delega) 
 | 
						|
        {
 | 
						|
          look_del(m,1,TRUE);
 | 
						|
          is_delega = TRUE;
 | 
						|
        }                  
 | 
						|
        _del->put("D0",msk.get(F_DELDATE));
 | 
						|
        write_del = TRUE;
 | 
						|
      }        
 | 
						|
      
 | 
						|
      if (msk.field(F_DELIMP).dirty())
 | 
						|
      {        
 | 
						|
        if (!is_delega) 
 | 
						|
        {
 | 
						|
          look_del(m,1,TRUE);
 | 
						|
          is_delega = TRUE;
 | 
						|
        }                  
 | 
						|
        if (lrivr != -1)
 | 
						|
          vsw->replace(lrivr, n_delimp.string("###.###.###.###"), 58);
 | 
						|
 | 
						|
        // per ora non modifichiamo nulla
 | 
						|
        // in quanto non entrano in liquidazione
 | 
						|
        //        risultato += vers;
 | 
						|
        //        risultato -= n_delimp;    
 | 
						|
        //        risc      -= vers;
 | 
						|
        //        risc      += n_delimp;
 | 
						|
        //        vsw->replace(lrisc, risc.string("###.###.###.###"), 58);                    
 | 
						|
        //        set_risultato(vsw, lvers, risultato);
 | 
						|
 | 
						|
        _del->put("R0", n_delimp);
 | 
						|
        _del->put("R1", "");
 | 
						|
        write_del = TRUE;
 | 
						|
      }
 | 
						|
      if (msk.field(F_DELABI).dirty())
 | 
						|
      {
 | 
						|
        if (!is_delega) 
 | 
						|
        {
 | 
						|
          look_del(m,1,TRUE);
 | 
						|
          is_delega = TRUE;
 | 
						|
        }                  
 | 
						|
        _del->put("S7",msk.get(F_DELABI));
 | 
						|
        write_del = TRUE;
 | 
						|
      }
 | 
						|
      if (msk.field(F_DELCAB).dirty())
 | 
						|
      {
 | 
						|
        if (!is_delega) 
 | 
						|
        {
 | 
						|
          look_del(m,1,TRUE);
 | 
						|
          is_delega = TRUE;
 | 
						|
        }                  
 | 
						|
        _del->put("S8",msk.get(F_DELCAB));
 | 
						|
        write_del = TRUE;
 | 
						|
      }
 | 
						|
      if (msk.field(F_DELCON).dirty())
 | 
						|
      {
 | 
						|
        if (!is_delega) 
 | 
						|
        {
 | 
						|
          look_del(m,1,TRUE);
 | 
						|
          is_delega = TRUE;
 | 
						|
        }                  
 | 
						|
        _del->put("S9",msk.get(F_DELCON));
 | 
						|
        write_del = TRUE;
 | 
						|
      }
 | 
						|
      // end delegations
 | 
						|
      
 | 
						|
      if (write_lia && k == K_SAVE)
 | 
						|
        _lia->rewrite();    
 | 
						|
      
 | 
						|
      if (write_del && k == K_SAVE)
 | 
						|
        _del->rewrite();
 | 
						|
 | 
						|
      if ((write_lim || write_lia) && k == K_SAVE)
 | 
						|
      {
 | 
						|
        _lim->put("B0", "");
 | 
						|
        _lim->rewrite();
 | 
						|
      }
 | 
						|
      
 | 
						|
      if (k == K_SAVE) recorded = TRUE;   
 | 
						|
      
 | 
						|
      if (write_lim || write_lia) 
 | 
						|
        vsw->refresh(); 
 | 
						|
    } 
 | 
						|
    else if (k == K_QUIT)
 | 
						|
    {
 | 
						|
      if ((write_lim || write_lia) && !recorded)
 | 
						|
      {
 | 
						|
        KEY kk = yesnocancel_box("Modifiche non registrate: salvare?");
 | 
						|
        if (kk == K_NO)
 | 
						|
          break;
 | 
						|
        else if (kk == K_YES)
 | 
						|
        {
 | 
						|
          if (write_lia)
 | 
						|
          {
 | 
						|
            _lia->rewrite();
 | 
						|
            _lim->put("B0", "");
 | 
						|
            _lim->rewrite();
 | 
						|
          } 
 | 
						|
          break;
 | 
						|
        }
 | 
						|
      }
 | 
						|
      else break;
 | 
						|
    }
 | 
						|
    else if (k == K_ESC) break;   
 | 
						|
  }  
 | 
						|
}
 | 
						|
 | 
						|
remove(f);
 | 
						|
 | 
						|
return recorded;
 | 
						|
}    
 | 
						|
 | 
						|
void Visliq_app::set_risultato(TViswin* vsw, long line, real& r)
 | 
						|
{         
 | 
						|
  TString256 ln;
 | 
						|
  ln.spaces();        
 | 
						|
  
 | 
						|
  // does not gestisc interessi e riporti debito < 50000
 | 
						|
  
 | 
						|
  if (r.sign() < 0)
 | 
						|
  { 
 | 
						|
    ln.overwrite("CREDITO ATTUALE", 23);
 | 
						|
    ln.overwrite(abs(r).string("###.###.###.###"), 58);
 | 
						|
  }
 | 
						|
  else if (r.sign() > 0)
 | 
						|
  {
 | 
						|
    ln.overwrite("IVA DA VERSARE", 23);
 | 
						|
    ln.overwrite(r.string("###.###.###.###"), 75);
 | 
						|
  } 
 | 
						|
  vsw->replace(line, ln, 0);     
 | 
						|
}
 | 
						|
 | 
						|
int cg5500(int argc, char* argv[])
 | 
						|
{
 | 
						|
  Visliq_app app;
 | 
						|
  app.run(argc, argv, "Visualizzazione Liquidazione");
 | 
						|
  return 0;
 | 
						|
}
 |