1999-04-06 15:34:39 +00:00
# include <applicat.h>
# include <automask.h>
# include <defmask.h>
# include <execp.h>
2007-11-30 11:00:26 +00:00
# include <modaut.h>
1999-04-06 15:34:39 +00:00
# include <progind.h>
# include <relation.h>
2010-01-04 10:06:04 +00:00
# include <reputils.h>
2003-07-30 10:59:43 +00:00
# include <tabutil.h>
1999-04-06 15:34:39 +00:00
# include <clifo.h>
# include <cfven.h>
2012-05-23 14:29:40 +00:00
# include <doc.h>
2011-07-07 22:40:14 +00:00
# include <mov.h>
2010-12-26 23:15:37 +00:00
# include <rmov.h>
1999-04-06 15:34:39 +00:00
# include "../cg/cgsaldac.h"
# include "../ef/ef0301.h"
# include "ef0.h"
# include "ef0A00a.h"
///////////////////////////////////////////////////////////
// Main Mask
///////////////////////////////////////////////////////////
class TPE_mask : public TAutomask
{
2003-07-30 10:59:43 +00:00
TRelation * _rel ;
bool _spork ;
bool _is_new ;
1999-04-06 15:34:39 +00:00
protected :
virtual bool on_field_event ( TOperable_field & o , TField_event e , long jolly ) ;
bool on_sheet_event ( TOperable_field & o , TField_event e , long jolly ) ;
2010-01-04 10:06:04 +00:00
bool check_bank ( TEffetto & effetto , TLog_report & log ) const ;
1999-04-06 15:34:39 +00:00
public :
2010-04-06 13:32:21 +00:00
bool calc_residual ( const TRiga_scadenze & scad , real & impres , real & imppag , TDate & datapag , bool & valben ,
2004-03-16 10:43:48 +00:00
char & accsal , int & rdist , int & reff ,
2011-06-17 14:26:55 +00:00
bool & partially_unassigned , int & tipopag , bool is_old = false , int ndist = 0 ) const ;
bool fill_row ( const TRiga_scadenze & rs , TToken_string & row , bool & partially_unassigned , bool force , bool is_new , int ndist = 0 ) ;
1999-04-06 15:34:39 +00:00
bool fill_rate ( ) ;
2003-07-30 10:59:43 +00:00
int insert_row ( const TToken_string & row ) ;
2004-03-16 10:43:48 +00:00
bool fill_distinta ( bool clear_all = false ) ;
2003-07-30 10:59:43 +00:00
void sort_sheet ( ) ;
1999-04-06 15:34:39 +00:00
void update_total ( ) ;
2010-04-06 13:32:21 +00:00
virtual bool on_key ( KEY key ) ;
1999-04-06 15:34:39 +00:00
2011-07-07 22:40:14 +00:00
TRectype & new_row_effetto ( TDistinta & dist , char tipocf , long codcf , const TString & cup , const TString & cig , const TString & contsep ,
2010-12-26 23:15:37 +00:00
const TDate & datapag , int & rigadist , int & rigaeff ) const ;
2003-07-30 10:59:43 +00:00
long get_free_num ( ) const ;
1999-04-06 15:34:39 +00:00
void save_rate ( ) ;
void print ( ) ;
2003-07-30 10:59:43 +00:00
TPE_mask ( ) ;
virtual ~ TPE_mask ( ) ;
1999-04-06 15:34:39 +00:00
} ;
2010-04-06 13:32:21 +00:00
bool TPE_mask : : on_key ( KEY key )
{
if ( key = = K_F8 )
{
TSheet_field & s = sfield ( F_SHEET ) ;
const int row = s . selected ( ) ;
if ( row > = 0 )
{
s . update_row ( row ) ;
TToken_string & r = s . row ( row ) ;
2010-05-20 13:04:32 +00:00
const bool attivo = get ( F_TIPOCF ) = = " C " ;
const TString data ( attivo ? get ( F_DATADIST ) : r . get ( s . cid2index ( F_DATA ) ) ) ;
2010-04-06 13:32:21 +00:00
2010-05-20 13:04:32 +00:00
r . add ( data , s . cid2index ( F_DATAPAG ) ) ;
2010-04-06 13:32:21 +00:00
s . update_mask ( row ) ;
s . force_update ( row ) ;
}
return false ;
}
return true ;
}
1999-04-06 15:34:39 +00:00
// Calcola il residuo di una rata tenendo conto anche degli eventuali
// effetti non ancora contabilizzati
bool TPE_mask : : calc_residual ( const TRiga_scadenze & scad ,
2010-04-06 13:32:21 +00:00
real & impres , real & imppag , TDate & datapag , bool & valben ,
2003-07-30 10:59:43 +00:00
char & accsal , int & rdist , int & reff ,
2004-03-16 10:43:48 +00:00
bool & partially_unassigned , int & tipopag ,
2011-06-17 14:26:55 +00:00
bool is_old , int ndist ) const
2003-07-30 10:59:43 +00:00
{
tipopag = scad . get_int ( SCAD_TIPOPAG ) ;
const bool valuta = scad . in_valuta ( ) ;
1999-04-06 15:34:39 +00:00
const char tipocf = scad . get_char ( SCAD_TIPOCF ) ;
2003-07-30 10:59:43 +00:00
TImporto importo = scad . residuo ( TRUE ) ;
importo . normalize ( tipocf = = ' C ' ? ' D ' : ' A ' ) ;
1999-04-06 15:34:39 +00:00
2003-07-30 10:59:43 +00:00
impres = importo . valore ( ) ;
1999-04-06 15:34:39 +00:00
imppag = ZERO ;
accsal = ' A ' ;
rdist = reff = 0 ;
2003-07-30 10:59:43 +00:00
partially_unassigned = FALSE ;
// Contolla se ci sono pagamenti non assegnati da gestire
const TRiga_partite & fattura = scad . riga ( ) ;
TPartita & partita = fattura . partita ( ) ;
const TRecord_array & unassigned = partita . unassigned ( ) ;
if ( unassigned . rows ( ) > 0 )
1999-04-06 15:34:39 +00:00
{
2003-07-30 10:59:43 +00:00
real tot_unassigned ; // Totale pagamenti non assegnati
for ( int u = unassigned . last_row ( ) ; u > 0 ; u = unassigned . pred_row ( u ) )
1999-04-06 15:34:39 +00:00
{
2003-07-30 10:59:43 +00:00
const real imp = unassigned [ u ] . get ( valuta ? PAGSCA_IMPORTOVAL : PAGSCA_IMPORTO ) ;
tot_unassigned + = imp ;
}
// Scala non assegnati dalle rate precedenti ancora aperte
const int nrata = scad . get_int ( SCAD_NRATA ) ;
for ( int r = 1 ; r < nrata ; r + + )
{
if ( ! fattura . rata ( r ) . chiusa ( ) )
1999-04-06 15:34:39 +00:00
{
2003-07-30 10:59:43 +00:00
TImporto res = fattura . rata ( r ) . residuo ( TRUE ) ;
tot_unassigned - = res . valore ( ) ;
if ( tot_unassigned < = ZERO )
break ;
}
}
// Scala non assegnati dalla rata corrente
if ( tot_unassigned > ZERO )
{
if ( tot_unassigned > = impres )
impres = ZERO ;
1999-04-06 15:34:39 +00:00
else
2003-07-30 10:59:43 +00:00
impres - = tot_unassigned ;
partially_unassigned = TRUE ;
}
}
// Se c'e' ancora un residuo calcola totale pagato con effetti
if ( ! impres . is_zero ( ) )
{
TRectype & filter = _rel - > curr ( ) ;
const char * field [ ] = { SCAD_ANNO , SCAD_NUMPART , SCAD_NRIGA , SCAD_NRATA , NULL } ;
for ( int i = 0 ; field [ i ] ; i + + )
filter . put ( field [ i ] , scad . get ( field [ i ] ) ) ;
TCursor cur ( _rel , " " , 2 , & filter , & filter ) ; // Elenco effetti su questa rata
const long codcf = scad . get_long ( SCAD_SOTTOCONTO ) ;
TString80 expr ;
2010-03-03 14:56:33 +00:00
expr < < ' ( ' < < LF_EFFETTI < < " -> " < < EFF_EFFCONT < < " != \" X \" )&& " ;
expr < < ' ( ' < < LF_EFFETTI < < " -> " < < EFF_TIPOCF < < " == \" " < < tipocf < < " \" )&& " ;
expr < < ' ( ' < < LF_EFFETTI < < " -> " < < EFF_CODCF < < " == \" " < < codcf < < " \" ) " ;
2003-07-30 10:59:43 +00:00
cur . setfilter ( expr , TRUE ) ;
const long items = cur . items ( ) ;
if ( items > 0L )
{
cur . freeze ( ) ;
const TRectype & riga = cur . curr ( ) ;
const TRectype & effe = cur . curr ( LF_EFFETTI ) ;
2004-03-16 10:43:48 +00:00
TString8 key = get ( F_TIPODIST ) ; key < < get ( F_DIST ) ;
2003-07-30 10:59:43 +00:00
for ( cur = 0L ; cur . pos ( ) < items ; + + cur )
1999-04-06 15:34:39 +00:00
{
2004-03-16 10:43:48 +00:00
TString8 effkey = effe . get ( EFF_TIPODIST ) ; effkey < < effe . get ( EFF_NDIST ) ;
2011-06-17 14:26:55 +00:00
if ( effkey = = key & & ( ndist = = 0 | | ndist ! = effe . get_int ( EFF_NDIST ) ) )
1999-04-06 15:34:39 +00:00
{
2003-07-30 10:59:43 +00:00
rdist = effe . get_int ( EFF_NRIGADIST ) ;
2010-04-06 13:32:21 +00:00
datapag = effe . get_date ( EFF_DATASCAD ) ;
valben = effe . get_bool ( EFF_DSCVAL ) ;
2003-07-30 10:59:43 +00:00
reff = riga . get_int ( REFF_NRIGATR ) ;
accsal = riga . get_char ( REFF_ACCSAL ) ;
imppag + = riga . get_real ( valuta ? REFF_IMPORTOVAL : REFF_IMPORTO ) ;
tipopag = effe . get_int ( EFF_TIPOPAG ) ;
}
else
{
if ( riga . get_char ( REFF_ACCSAL ) = = ' S ' )
{
impres = ZERO ;
2004-03-16 10:43:48 +00:00
if ( is_old )
return true ; // Devo farla vedere
2003-07-30 10:59:43 +00:00
break ;
}
impres - = riga . get_real ( valuta ? REFF_IMPORTOVAL : REFF_IMPORTO ) ;
}
1999-04-06 15:34:39 +00:00
}
}
}
return ! impres . is_zero ( ) ;
}
void TPE_mask : : update_total ( )
{
TSheet_field & s = sfield ( F_SHEET ) ;
const int postot = s . cid2index ( F_IMPORTO ) ;
2010-03-03 14:56:33 +00:00
real tot ;
1999-04-06 15:34:39 +00:00
FOR_EACH_SHEET_ROW_BACK ( s , r , row )
tot + = real ( row - > get ( postot ) ) ;
set ( F_TOTAL , tot ) ;
2010-03-03 14:56:33 +00:00
enable ( DLG_SAVEREC , ! tot . is_zero ( ) ) ;
2003-07-30 10:59:43 +00:00
}
2011-06-17 14:26:55 +00:00
bool TPE_mask : : fill_row ( const TRiga_scadenze & rs , TToken_string & row , bool & partially_unassigned , bool force , bool is_old , int ndist )
2003-07-30 10:59:43 +00:00
{
const int tipopageff = get_int ( F_TIPOPAGEFF ) ;
2010-03-03 14:56:33 +00:00
int tipopag = 0 ;
2003-07-30 10:59:43 +00:00
real impres , imppag ;
char accsal ; int rigadist , rigaeff ;
2010-04-06 13:32:21 +00:00
TDate datapag ;
bool valben = false ;
2010-05-20 13:04:32 +00:00
const bool attivo = get ( F_TIPOCF ) = = " C " ;
2010-04-06 13:32:21 +00:00
2003-07-30 10:59:43 +00:00
row . cut ( 0 ) ;
2011-06-17 14:26:55 +00:00
bool ok = calc_residual ( rs , impres , imppag , datapag , valben , accsal , rigadist , rigaeff , partially_unassigned , tipopag , is_old , ndist ) | | force ;
2004-03-16 10:43:48 +00:00
if ( ok )
2010-03-03 14:56:33 +00:00
ok = tipopageff = = 0 | | tipopag = = tipopageff ; // Eventuale filtro sul tipo pagamento
2003-07-30 10:59:43 +00:00
if ( ok )
{
row . add ( imppag . string ( ) ) ;
row . add ( accsal ) ;
2010-05-20 13:04:32 +00:00
const TDate datadef = attivo ? rs . get_date ( SCAD_DATASCAD ) : get_date ( F_DATADIST ) ;
row . add ( datapag = = datadef ? " " : datapag ) ;
2010-04-06 13:32:21 +00:00
row . add ( valben ? " X " : " " ) ;
2003-07-30 10:59:43 +00:00
row . add ( impres . string ( ) ) ;
row . add ( rs . get_long ( SCAD_SOTTOCONTO ) ) ;
2010-03-03 14:56:33 +00:00
TString8 cod ; cod < < rs . get_char ( SCAD_TIPOCF ) < < ' | ' < < rs . get_long ( SCAD_SOTTOCONTO ) ;
2003-07-30 10:59:43 +00:00
row . add ( cache ( ) . get ( LF_CLIFO , cod , CLI_RAGSOC ) ) ;
row . add ( rs . get ( SCAD_ANNO ) ) ;
row . add ( rs . get ( SCAD_NUMPART ) ) ;
row . add ( rs . get ( SCAD_NRIGA ) ) ;
row . add ( rs . get ( SCAD_NRATA ) ) ;
row . add ( rs . get ( SCAD_DATASCAD ) ) ;
row . add ( rigadist ) ;
row . add ( rigaeff ) ;
switch ( tipopag )
{
2004-03-16 10:43:48 +00:00
case 1 : row . add ( TR ( " Rimessa Diretta " ) ) ; break ;
case 2 : row . add ( TR ( " Tratta " ) ) ; break ;
case 3 : row . add ( TR ( " Ricevuta Bancaria " ) ) ; break ;
case 4 : row . add ( TR ( " Cessione " ) ) ; break ;
case 5 : row . add ( TR ( " Pagher<EFBFBD> " ) ) ; break ;
case 6 : row . add ( TR ( " Lettera di credito " ) ) ; break ;
case 7 : row . add ( TR ( " Tratta accettata " ) ) ; break ;
case 8 : row . add ( TR ( " Rapporti interbancari diretti " ) ) ; break ;
case 9 : row . add ( TR ( " Bonifico " ) ) ; break ;
2003-07-30 10:59:43 +00:00
default : break ;
}
2010-12-26 23:15:37 +00:00
TRiga_partite & rp = rs . riga ( ) ;
TString cup ;
TString cig ;
const long numreg = rp . get_long ( PART_NREG ) ;
if ( numreg > 0 )
{
TToken_string key ;
key . add ( numreg ) ;
key . add ( 1 ) ;
const TRectype & rmov = cache ( ) . get ( LF_RMOV , key ) ;
cup = rmov . get ( RMV_CUP ) ;
cig = rmov . get ( RMV_CIG ) ;
}
row . add ( cup ) ;
2011-05-04 12:20:50 +00:00
row . add ( " " ) ;
2010-12-26 23:15:37 +00:00
row . add ( cig ) ;
2011-05-04 12:20:50 +00:00
row . add ( " " ) ;
2011-05-23 14:31:31 +00:00
TToken_string key ;
key . add ( get ( F_TIPOCF ) ) ;
key . add ( rs . get_long ( SCAD_SOTTOCONTO ) ) ;
key . add ( " V " ) ;
key . add ( 1 ) ;
const TRectype & ns_ban = cache ( ) . get ( LF_CFBAN , key ) ;
if ( ns_ban . empty ( ) )
{
row . add ( " " ) ;
row . add ( " " ) ;
}
else
{
row . add ( rs . get ( SCAD_CODABI ) ) ;
row . add ( rs . get ( SCAD_CODCAB ) ) ;
}
row . add ( " " ) ;
2003-07-30 10:59:43 +00:00
}
return ok ;
}
HIDDEN long row_compare ( TToken_string & r1 , TToken_string & r2 , const int sort_mode )
{
long cmp = 0 ;
if ( sort_mode = = 1 )
{
const TDate d1 = r1 . get ( F_DATA - FIRST_FIELD ) ;
const TDate d2 = r2 . get ( F_DATA - FIRST_FIELD ) ;
cmp = d1 - d2 ;
if ( cmp ! = 0 )
return cmp ; // else normal comparing
}
else if ( sort_mode = = 2 )
{
const real i1 = r1 . get ( F_RESIDUO - FIRST_FIELD ) ;
const real i2 = r2 . get ( F_RESIDUO - FIRST_FIELD ) ;
const real diff = i1 - i2 ;
cmp = diff . sign ( ) ;
if ( cmp ! = 0 )
return cmp ; // else normal comparing
}
2010-04-08 14:16:40 +00:00
for ( int i = 5 ; cmp = = 0 & & i < = 10 ; i + + )
2003-07-30 10:59:43 +00:00
{
2010-04-08 14:16:40 +00:00
if ( i = = 6 ) continue ;
if ( i = = 8 )
2003-07-30 10:59:43 +00:00
{
TString16 p1 ; r1 . get ( i , p1 ) ;
TString16 p2 ; r2 . get ( i , p2 ) ;
cmp = p1 . compare ( p2 ) ;
}
else
{
long n1 ; r1 . get ( i , n1 ) ;
long n2 ; r2 . get ( i , n2 ) ;
cmp = n1 - n2 ;
}
}
return cmp ;
}
int TPE_mask : : insert_row ( const TToken_string & row )
{
const int sort_mode = get_int ( F_SORT ) ;
TString_array & sheet = sfield ( F_SHEET ) . rows_array ( ) ;
int first = 0 ;
int last = sheet . items ( ) - 1 ;
long cmp = - 1 ;
int cur = 0 ;
while ( first < = last )
{
cur = ( first + last ) / 2 ;
TToken_string & curr = sheet . row ( cur ) ;
cmp = row_compare ( ( TToken_string & ) row , curr , sort_mode ) ;
if ( cmp = = 0 )
break ;
if ( cmp > 0 )
first = cur + 1 ;
else
last = cur - 1 ;
}
if ( cmp )
{
if ( cmp > 0 )
cur + + ;
sheet . insert ( row , cur ) ;
}
return cur ;
}
void TPE_mask : : sort_sheet ( )
{
TWait_cursor hourglass ;
const int sort_mode = get_int ( F_SORT ) ;
TString_array & rows = sfield ( F_SHEET ) . rows_array ( ) ;
for ( int i = 0 ; i < rows . items ( ) - 1 ; i + + )
{
for ( int j = i + 1 ; j < rows . items ( ) ; j + + )
{
TToken_string & r1 = rows . row ( i ) ;
TToken_string & r2 = rows . row ( j ) ;
if ( row_compare ( r1 , r2 , sort_mode ) > 0 )
rows . swap ( i , j ) ;
}
}
1999-04-06 15:34:39 +00:00
}
bool TPE_mask : : fill_rate ( )
{
const long ndist = get_long ( F_DIST ) ;
const TDate dadata = get ( F_DA_DATA ) ;
2003-07-30 10:59:43 +00:00
const TDate adata = get ( F_A_DATA ) ;
1999-04-06 15:34:39 +00:00
const TString & codval = get ( F_CODVAL ) ;
TSheet_field & sheet = sfield ( F_SHEET ) ;
2011-01-17 11:32:50 +00:00
// sheet.destroy();
1999-04-06 15:34:39 +00:00
TRelation rel ( LF_PARTITE ) ;
TRectype filter ( LF_PARTITE ) ;
filter . put ( PART_TIPOCF , get ( F_TIPOCF ) ) ;
filter . put ( PART_GRUPPO , 0 ) ;
filter . put ( PART_CONTO , 0 ) ;
filter . put ( PART_SOTTOCONTO , get ( F_CLIFO ) ) ;
TString filtro ;
filtro < < " (CHIUSA!= \" X \" )&&(CODVAL== \" " < < codval < < " \" ) " ;
2003-07-30 10:59:43 +00:00
TCursor partite ( & rel , filtro , 1 , & filter , & filter ) ;
1999-04-06 15:34:39 +00:00
2003-07-30 10:59:43 +00:00
const long items = partite . items ( ) ;
1999-04-06 15:34:39 +00:00
partite . freeze ( ) ;
2003-07-30 10:59:43 +00:00
if ( items > 0 )
1999-04-06 15:34:39 +00:00
{
2003-07-30 10:59:43 +00:00
TRectype & partita = partite . curr ( ) ;
TProgind pi ( items , " Caricamento partite aperte " , TRUE , TRUE ) ;
long last_cf = 0 ;
int last_year = 0 ;
TString16 last_game ;
TToken_string row ;
for ( partite = 0L ; partite . pos ( ) < items ; + + partite )
1999-04-06 15:34:39 +00:00
{
2003-07-30 10:59:43 +00:00
pi . addstatus ( 1 ) ;
if ( pi . iscancelled ( ) )
break ;
if ( sheet . items ( ) > 900 ) // Anche troppe righe
break ;
const long cur_cf = partita . get_long ( PART_SOTTOCONTO ) ;
const int cur_year = partita . get_int ( PART_ANNO ) ;
const TString & cur_game = partita . get ( PART_NUMPART ) ;
if ( cur_cf = = last_cf & & cur_year = = last_year & & cur_game = = last_game )
continue ;
last_cf = cur_cf ;
last_year = cur_year ;
last_game = cur_game ;
const TPartita game ( partita ) ;
const int last = game . last ( ) ;
for ( int riga = game . prima_fattura ( ) ; riga > 0 & & riga < = last ; riga = game . succ ( riga ) )
{
const TRiga_partite & rp = game . riga ( riga ) ;
if ( rp . is_fattura ( ) )
{
for ( int rata = 1 ; rata < = rp . rate ( ) ; rata + + )
{
const TRiga_scadenze & rs = rp . rata ( rata ) ;
if ( ! rs . chiusa ( ) )
{
const TDate data = rs . get ( SCAD_DATASCAD ) ;
if ( data > = dadata & & ( ! adata . ok ( ) | | data < = adata ) )
2011-06-17 14:26:55 +00:00
{
2003-07-30 10:59:43 +00:00
bool partially_unassigned ;
2011-06-17 14:26:55 +00:00
if ( fill_row ( rs , row , partially_unassigned , false , false , ndist ) )
2003-07-30 10:59:43 +00:00
{
const int numrow = sheet . items ( ) ;
2011-05-04 12:20:50 +00:00
sheet . row ( numrow ) = row ;
sheet . check_row ( numrow ) ;
2003-07-30 10:59:43 +00:00
if ( partially_unassigned )
sheet . disable_cell ( numrow , 1 ) ; // Non permette di mettere a saldo
}
}
} // if rata aperta
} // for ogni rata
} // if e' una fattura
} // for ogni fattura
} // for ogni partita
} // if ci sono partite
2004-03-16 10:43:48 +00:00
return fill_distinta ( false ) ;
2003-07-30 10:59:43 +00:00
}
1999-04-06 15:34:39 +00:00
2003-07-30 10:59:43 +00:00
bool TPE_mask : : fill_distinta ( bool clear_all )
{
TWait_cursor hourglass ;
TSheet_field & sheet = sfield ( F_SHEET ) ;
if ( clear_all )
sheet . destroy ( ) ;
const char tdist = get ( F_TIPODIST ) [ 0 ] ;
const long ndist = get_long ( F_DIST ) ;
TDistinta dist ( tdist , ndist ) ;
const bool dist_cont = dist . contabilizzata ( ) ;
if ( dist . items ( ) > 0 )
{
2010-12-26 23:15:37 +00:00
int rows = 0 ;
2003-07-30 10:59:43 +00:00
for ( int e = 0 ; e < dist . items ( ) ; e + + )
1999-04-06 15:34:39 +00:00
{
2003-07-30 10:59:43 +00:00
const TEffetto & eff = dist [ e ] ;
const TBill clifo ( 0 , 0 , eff . get_long ( EFF_CODCF ) , eff . get_char ( EFF_TIPOCF ) ) ;
2010-12-26 23:15:37 +00:00
2003-07-30 10:59:43 +00:00
if ( e = = 0 )
set ( F_TIPOPAG , eff . get_int ( EFF_TIPOPAG ) ) ;
for ( int r = 1 ; r < = eff . rows_r ( ) ; r + + )
1999-04-06 15:34:39 +00:00
{
2003-07-30 10:59:43 +00:00
const TRectype & reff = eff . row_r ( r ) ;
2012-05-23 14:29:40 +00:00
int anno = reff . get_int ( REFF_ANNO ) ;
TString8 part = reff . get ( REFF_NUMPART ) ;
if ( anno < = 0 | | part . blank ( ) )
{
TToken_string dockey ;
dockey . add ( reff . get ( REFF_PROVV ) ) ;
dockey . add ( reff . get ( REFF_ANNODOC ) ) ;
dockey . add ( reff . get ( REFF_CODNUM ) ) ;
dockey . add ( reff . get ( REFF_NFATT ) ) ;
const long numreg = atol ( cache ( ) . get ( LF_DOC , dockey , DOC_NUMREG ) ) ;
if ( numreg > 0 )
{
TPartite_array games ;
if ( games . add_numreg ( numreg ) = = 1 )
{
const TPartita * g = games . first ( ) ;
const int nriga = g - > prima_fattura ( numreg ) ;
if ( nriga > 0 )
{
TRectype & wreff = ( TRectype & ) reff ;
wreff . put ( REFF_ANNO , anno = g - > anno ( ) ) ;
wreff . put ( REFF_NUMPART , part = g - > numero ( ) ) ;
wreff . put ( REFF_NRIGA , nriga ) ;
}
}
}
if ( anno < = 0 )
{
warning_box ( TR ( " La riga %d della distinta <20> priva di riferimenti al saldaconto " ) , e + 1 ) ;
if ( e = = 0 )
{
e = dist . items ( ) ;
break ;
}
}
}
2003-07-30 10:59:43 +00:00
const int nriga = reff . get_int ( REFF_NRIGA ) ;
const int nrata = reff . get_int ( REFF_NRATA ) ;
TPartita game ( clifo , anno , part ) ;
if ( game . esiste ( nriga , nrata ) )
1999-04-06 15:34:39 +00:00
{
2003-07-30 10:59:43 +00:00
TRiga_scadenze & rs = game . rata ( nriga , nrata ) ;
bool partially_unassigned ;
2010-12-26 23:15:37 +00:00
TSheet_field & sheet = sfield ( F_SHEET ) ;
TToken_string & row = sheet . row ( rows + + ) ;
if ( fill_row ( rs , row , partially_unassigned , dist_cont , clear_all ) )
1999-04-06 15:34:39 +00:00
{
2010-12-26 23:15:37 +00:00
row . add ( eff . get ( EFF_CUP ) , sheet . cid2index ( F_CUP ) ) ;
row . add ( eff . get ( EFF_CIG ) , sheet . cid2index ( F_CIG ) ) ;
2011-05-23 14:31:31 +00:00
row . add ( eff . get ( EFF_CODABI ) , sheet . cid2index ( F_ABIAPP ) ) ;
row . add ( eff . get ( EFF_CODCAB ) , sheet . cid2index ( F_CABAPP ) ) ;
row . add ( eff . get ( EFF_IBAN ) , sheet . cid2index ( F_IBANAPP ) ) ;
2011-05-04 12:20:50 +00:00
sheet . check_row ( r - 1 ) ;
2003-07-30 10:59:43 +00:00
if ( partially_unassigned )
2010-12-26 23:15:37 +00:00
sheet . disable_cell ( r - 1 , 1 ) ; // Non e' possibile mettere saldo
2003-07-30 10:59:43 +00:00
if ( dist_cont )
2010-12-26 23:15:37 +00:00
sheet . disable_cell ( r - 1 , - 1 ) ; // Non e' possibile modificare nulla
2003-07-30 10:59:43 +00:00
}
}
else
{
TString msg ;
msg < < " La riga " < < ( e + 1 ) < < " della distinta " < < ndist
< < " si riferisce ad una rata o partita non valida: \n "
< < clifo . tipo ( ) < < ' ' < < clifo . codclifo ( ) < < ' ' < < anno < < ' '
< < part < < " Riga " < < nriga < < " Rata " < < nrata < < " \n "
< < " Si desidera eliminare l'effetto? " ;
if ( yesno_box ( msg ) )
{
TLocalisamfile righe ( LF_REFFETTI ) ;
righe . curr ( ) = reff ;
if ( righe . remove ( ) ! = NOERR )
error_box ( " Errore di cancellazione riga effetto: %d " , righe . status ( ) ) ;
1999-04-06 15:34:39 +00:00
}
}
}
}
2003-07-30 10:59:43 +00:00
}
if ( get_bool ( F_SORT ) )
sort_sheet ( ) ;
1999-04-06 15:34:39 +00:00
sheet . force_update ( ) ;
update_total ( ) ;
2003-07-30 10:59:43 +00:00
_spork = FALSE ;
1999-04-06 15:34:39 +00:00
2003-07-30 10:59:43 +00:00
const bool full = sheet . items ( ) > 0 ;
if ( full )
{
disable ( - 3 ) ;
disable ( - 4 ) ;
}
enable ( - 5 , full & & ! dist_cont ) ;
show ( F_UNCONTABIL , dist_cont ) ;
return full ;
1999-04-06 15:34:39 +00:00
}
2011-07-07 22:40:14 +00:00
TRectype & TPE_mask : : new_row_effetto ( TDistinta & dist , char tipocf , long codcf , const TString & cup , const TString & cig , const TString & contsep ,
2010-12-26 23:15:37 +00:00
const TDate & datapag , int & rigadist , int & rigaeff ) const
1999-04-06 15:34:39 +00:00
{
TString16 codice ; codice < < tipocf < < ' | ' < < codcf ;
2003-07-30 10:59:43 +00:00
const bool ragg = ! cache ( ) . get ( LF_CFVEN , codice , CFV_RAGGEFF ) . blank ( ) ;
1999-04-06 15:34:39 +00:00
TEffetto * neweff = NULL ;
if ( ragg )
{
for ( int i = 0 ; i < dist . items ( ) ; i + + )
{
TEffetto & eff = dist [ i ] ;
2010-04-08 14:16:40 +00:00
if ( eff . get_char ( EFF_TIPOCF ) = = tipocf & & eff . get_long ( EFF_CODCF ) = = codcf & & datapag = = eff . get_date ( EFF_DATASCAD ) )
1999-04-06 15:34:39 +00:00
{
2010-12-26 23:15:37 +00:00
bool found = true ;
if ( main_app ( ) . has_module ( CUAUT ) )
{
const TString & eff_cup = eff . get ( EFF_CUP ) ;
found = ( cup = = eff_cup ) & & ( cig = = eff . get ( EFF_CIG ) ) ;
2011-07-07 22:40:14 +00:00
}
if ( found & & main_app ( ) . has_module ( NPAUT ) )
{
const TString & eff_contsep = eff . get ( EFF_CONTSEP ) ;
found & = ( contsep = = eff_contsep ) ;
2010-12-26 23:15:37 +00:00
}
if ( found )
{
neweff = & eff ;
rigadist = i + 1 ;
break ;
}
1999-04-06 15:34:39 +00:00
}
}
}
if ( neweff = = NULL )
{
neweff = new TEffetto ;
dist . righe ( ) . add ( neweff ) ;
rigadist = dist . items ( ) ;
neweff - > put ( EFF_TIPOCF , tipocf ) ;
neweff - > put ( EFF_CODCF , codcf ) ;
neweff - > put ( EFF_CODVAL , get ( F_CODVAL ) ) ;
neweff - > put ( EFF_CAMBIO , get ( F_CAMBIO ) ) ;
2003-07-30 10:59:43 +00:00
neweff - > put ( EFF_DATACAMBIO , get ( F_DATACAMBIO ) ) ;
2010-12-26 23:15:37 +00:00
neweff - > put ( EFF_CUP , cup ) ;
neweff - > put ( EFF_CIG , cig ) ;
2011-07-07 22:40:14 +00:00
neweff - > put ( EFF_CONTSEP , contsep ) ;
1999-04-06 15:34:39 +00:00
}
rigaeff = neweff - > rows_r ( ) + 1 ;
return neweff - > row_r ( rigaeff , TRUE ) ;
}
2010-01-04 10:06:04 +00:00
bool TPE_mask : : check_bank ( TEffetto & effetto , TLog_report & log ) const
{
const int tipopag = effetto . get_int ( EFF_TIPOPAG ) ;
2010-03-03 14:56:33 +00:00
const int tipocf = effetto . get_char ( EFF_TIPOCF ) ;
2010-01-04 10:06:04 +00:00
2010-03-03 14:56:33 +00:00
// Controllo solo ri.ba. clienti e bonifici fornitori
2011-05-23 14:31:31 +00:00
TString8 abi = effetto . get ( EFF_CODABI ) ;
TString8 cab = effetto . get ( EFF_CODCAB ) ;
TString80 iban = effetto . get ( EFF_IBAN ) ;
2010-01-04 10:06:04 +00:00
2011-05-23 14:31:31 +00:00
TToken_string key ( 8 ) ;
key = effetto . get ( EFF_TIPOCF ) ;
key . add ( effetto . get ( EFF_CODCF ) ) ;
const TRectype & clifo = cache ( ) . get ( LF_CLIFO , key ) ;
2010-01-04 10:06:04 +00:00
2011-05-23 14:31:31 +00:00
if ( real : : is_null ( abi ) | | real : : is_null ( cab ) )
{
abi = clifo . get ( CLI_CODABI ) ;
cab = clifo . get ( CLI_CODCAB ) ;
}
if ( iban . blank ( ) )
iban = clifo . get ( CLI_IBAN ) ;
if ( iban . starts_with ( " IT " ) & & iban . len ( ) > 15 )
{
abi = iban . mid ( 5 , 5 ) ;
cab = iban . mid ( 10 , 5 ) ;
}
2010-01-04 10:06:04 +00:00
2011-05-23 14:31:31 +00:00
effetto . put ( EFF_CODABI , abi ) ;
effetto . put ( EFF_CODCAB , cab ) ;
effetto . put ( EFF_IBAN , iban ) ;
2010-01-04 10:06:04 +00:00
2011-07-07 22:40:14 +00:00
if ( tipocf = = ' C ' & & tipopag = = 3 )
if ( real : : is_null ( abi ) | | real : : is_null ( cab ) )
{
TString msg ;
msg . format ( FR ( " Impossibile determinare ABI/CAB del %s sull'effetto %ld " ) ,
( const char * ) key , effetto . get_long ( EFF_NPROGTR ) ) ;
log . log ( 2 , msg ) ;
return false ;
}
2010-01-04 10:06:04 +00:00
2011-05-23 14:31:31 +00:00
if ( ( tipocf = = ' F ' & & tipopag = = 9 ) & & iban . blank ( ) )
{
TString msg ;
msg . format ( FR ( " Impossibile determinare IBAN del %s sull'effetto %ld " ) ,
( const char * ) key , effetto . get_long ( EFF_NPROGTR ) ) ;
log . log ( 2 , msg ) ;
return false ;
2010-01-04 10:06:04 +00:00
}
return true ;
}
1999-04-06 15:34:39 +00:00
void TPE_mask : : save_rate ( )
{
2010-01-04 10:06:04 +00:00
TLog_report log ( TR ( " Generazione effetti " ) ) ;
1999-04-06 15:34:39 +00:00
const char tipodist = get ( F_TIPODIST ) [ 0 ] ;
2003-07-30 10:59:43 +00:00
long numdist = get_long ( F_DIST ) ;
if ( _is_new )
{
TLocalisamfile f ( LF_EFFETTI ) ; f . setkey ( 4 ) ;
2010-01-04 10:06:04 +00:00
while ( true )
2003-07-30 10:59:43 +00:00
{
f . put ( EFF_TIPODIST , tipodist ) ;
f . put ( EFF_NDIST , numdist ) ;
f . put ( EFF_NRIGADIST , 1 ) ;
2012-03-06 16:47:39 +00:00
if ( f . read ( _isgteq ) ! = NOERR | | f . get_char ( EFF_TIPODIST ) ! = tipodist | | f . get_long ( EFF_NDIST ) ! = numdist )
2003-07-30 10:59:43 +00:00
break ;
const long nd = get_free_num ( ) ;
2010-01-04 10:06:04 +00:00
TString msg ; msg . format ( FR ( " La distinta %ld <20> gi<67> presente: verr<72> rinumerata in %ld " ) , numdist , nd ) ;
log . log ( 1 , msg ) ;
2003-07-30 10:59:43 +00:00
numdist = nd ;
}
2012-03-06 16:47:39 +00:00
_is_new = false ;
2003-07-30 10:59:43 +00:00
}
1999-04-06 15:34:39 +00:00
TDistinta distinta ( tipodist , numdist , _lock ) ;
2003-07-30 10:59:43 +00:00
const TString & codval = get ( F_CODVAL ) ;
const real cambio = get ( F_CAMBIO ) ;
2010-01-04 10:06:04 +00:00
const int tipopag = get_int ( F_TIPOPAG ) ;
2003-07-30 10:59:43 +00:00
2010-03-03 14:56:33 +00:00
bool zeroes = false ; // Esistono righe effetto da cancellare
2010-05-20 13:04:32 +00:00
const bool attivo = get ( F_TIPOCF ) = = " C " ;
1999-04-06 15:34:39 +00:00
TSheet_field & sheet = sfield ( F_SHEET ) ;
FOR_EACH_SHEET_ROW ( sheet , r , row )
{
2003-07-30 10:59:43 +00:00
real imp = row - > get ( sheet . cid2index ( F_IMPORTO ) ) ;
1999-04-06 15:34:39 +00:00
real impval ;
2010-03-03 14:56:33 +00:00
if ( codval . full ( ) & & ! imp . is_zero ( ) )
1999-04-06 15:34:39 +00:00
{
impval = imp ;
2012-02-07 15:35:25 +00:00
TCurrency c ( impval , codval , cambio ) ;
1999-04-06 15:34:39 +00:00
c . change_to_firm_val ( ) ;
imp = c . get_num ( ) ;
}
char accsal = row - > get_char ( sheet . cid2index ( F_ACCSAL ) ) ;
int rigadist = row - > get_int ( sheet . cid2index ( F_RIGADIST ) ) ;
int rigaeff = row - > get_int ( sheet . cid2index ( F_RIGAEFF ) ) ;
if ( rigaeff > 0 | | accsal = = ' S ' | | imp > ZERO )
{
2010-04-08 14:16:40 +00:00
TToken_string key ;
key . add ( get ( F_TIPOCF ) ) ;
key . add ( " 0|0 " ) ;
key . add ( row - > get ( sheet . cid2index ( F_CODCF ) ) ) ;
key . add ( row - > get ( sheet . cid2index ( F_ANNO ) ) ) ;
key . add ( row - > get ( sheet . cid2index ( F_PARTITA ) ) ) ;
key . add ( row - > get ( sheet . cid2index ( F_RIGA ) ) ) ;
// Trova partita
const TRectype & part = cache ( ) . get ( LF_PARTITE , key ) ;
// Trova rata
key . add ( row - > get ( sheet . cid2index ( F_RATA ) ) ) ;
const TRectype & scad = cache ( ) . get ( LF_SCADENZE , key ) ;
2010-05-19 15:43:59 +00:00
// eff.put(EFF_DATASCAD, scad.get(SCAD_DATASCAD));
2010-04-08 14:16:40 +00:00
TDate datapag ( row - > get ( sheet . cid2index ( F_DATAPAG ) ) ) ;
if ( ! datapag . ok ( ) )
2010-05-20 13:04:32 +00:00
datapag = attivo ? scad . get ( SCAD_DATASCAD ) : get ( F_DATADIST ) ;
2011-01-12 23:29:50 +00:00
const TString cup = row - > get ( sheet . cid2index ( F_CUP ) ) ;
2011-07-07 22:40:14 +00:00
const TRectype & mov = cache ( ) . get ( LF_MOV , part . get ( PART_NREG ) ) ;
2011-01-12 23:29:50 +00:00
const TString cig = row - > get ( sheet . cid2index ( F_CIG ) ) ;
2011-07-07 22:40:14 +00:00
const TString16 contsep = mov . get ( MOV_CONTSEP ) ;
1999-04-06 15:34:39 +00:00
if ( rigaeff < = 0 )
{
2010-01-04 10:06:04 +00:00
const char tipocf = get ( F_TIPOCF ) [ 0 ] ;
const long codcf = row - > get_long ( sheet . cid2index ( F_CODCF ) ) ;
2011-07-07 22:40:14 +00:00
TRectype & reff = new_row_effetto ( distinta , tipocf , codcf , cup , cig , contsep , datapag , rigadist , rigaeff ) ;
2010-05-19 15:43:59 +00:00
reff . put ( REFF_ANNO , row - > get ( sheet . cid2index ( F_ANNO ) ) ) ;
1999-04-06 15:34:39 +00:00
reff . put ( REFF_NUMPART , row - > get ( sheet . cid2index ( F_PARTITA ) ) ) ;
2010-05-19 15:43:59 +00:00
reff . put ( REFF_NRIGA , row - > get ( sheet . cid2index ( F_RIGA ) ) ) ;
reff . put ( REFF_NRATA , row - > get ( sheet . cid2index ( F_RATA ) ) ) ;
2010-04-08 14:16:40 +00:00
2010-05-19 15:43:59 +00:00
reff . put ( REFF_NFATT , part . get ( PART_NUMDOC ) ) ;
2003-07-30 10:59:43 +00:00
reff . put ( REFF_DATAFATT , part . get ( PART_DATADOC ) ) ;
2010-05-19 15:43:59 +00:00
reff . put ( REFF_IMPFATT , part . get ( PART_IMPORTO ) ) ;
2011-05-23 14:31:31 +00:00
1999-04-06 15:34:39 +00:00
TEffetto & eff = distinta [ rigadist - 1 ] ;
2010-04-06 13:32:21 +00:00
eff . put ( EFF_DSCVAL , row - > get ( sheet . cid2index ( F_VALBEN ) ) ) ;
2010-03-03 14:56:33 +00:00
eff . put ( EFF_TIPOPAG , tipopag ) ;
2011-05-23 14:31:31 +00:00
eff . put ( EFF_CODABI , row - > get ( sheet . cid2index ( F_ABIAPP ) ) ) ;
eff . put ( EFF_CODCAB , row - > get ( sheet . cid2index ( F_ABIAPP ) ) ) ;
eff . put ( EFF_IBAN , row - > get ( sheet . cid2index ( F_IBANAPP ) ) ) ;
1999-04-06 15:34:39 +00:00
}
TEffetto & eff = distinta [ rigadist - 1 ] ;
2010-12-26 23:15:37 +00:00
2010-05-20 13:04:32 +00:00
eff . put ( EFF_DATASCAD , datapag ) ;
2011-01-12 23:29:50 +00:00
eff . put ( EFF_CUP , cup ) ;
eff . put ( EFF_CIG , cig ) ;
2011-07-07 22:40:14 +00:00
eff . put ( EFF_CONTSEP , contsep ) ;
2010-01-04 10:06:04 +00:00
check_bank ( eff , log ) ; // Cerca di sistemare ABI/CAB/IBAN
1999-04-06 15:34:39 +00:00
TRectype & reff = eff . row_r ( rigaeff ) ;
2011-07-07 22:40:14 +00:00
2010-03-03 14:56:33 +00:00
const real oldimp = reff . get ( REFF_IMPORTO ) ;
const real oldimpval = reff . get ( REFF_IMPORTOVAL ) ;
1999-04-06 15:34:39 +00:00
reff . put ( REFF_IMPORTO , imp ) ;
reff . put ( REFF_IMPORTOVAL , impval ) ;
reff . put ( REFF_ACCSAL , accsal ) ;
2010-03-03 14:56:33 +00:00
if ( accsal ! = ' S ' & & imp . is_zero ( ) )
1999-04-06 15:34:39 +00:00
{
reff . put ( REFF_ACCSAL , ' Z ' ) ; // Segna la riga come NULLA
2010-03-03 14:56:33 +00:00
zeroes = true ;
1999-04-06 15:34:39 +00:00
}
}
}
// Ricalcola totali righe ed elimina le righe NULLE
2003-07-30 10:59:43 +00:00
TLocalisamfile f ( LF_EFFETTI ) ; f . setkey ( 1 ) ;
1999-04-06 15:34:39 +00:00
for ( int rd = distinta . items ( ) - 1 ; rd > = 0 ; rd - - )
{
TEffetto & eff = distinta [ rd ] ;
real totimp , totimpval ;
for ( int i = eff . rows_r ( ) ; i > 0 ; i - - )
{
const TRectype & reff = eff . row_r ( i ) ;
if ( reff . get_char ( REFF_ACCSAL ) = = ' Z ' )
2003-07-30 10:59:43 +00:00
{
2010-04-26 13:18:35 +00:00
eff . destroy_row_r ( i , true ) ;
2003-07-30 10:59:43 +00:00
}
1999-04-06 15:34:39 +00:00
else
{
totimp + = reff . get_real ( EFF_IMPORTO ) ;
totimpval + = reff . get_real ( EFF_IMPORTOVAL ) ;
}
}
2003-07-30 10:59:43 +00:00
if ( eff . rows_r ( ) = = 0 )
{
int err = eff . read ( f , eff , _lock ) ;
if ( err = = NOERR )
err = eff . remove ( f ) ;
if ( err = = NOERR )
2010-04-26 13:18:35 +00:00
distinta . righe ( ) . destroy ( rd , true ) ;
2003-07-30 10:59:43 +00:00
else
2010-01-04 10:06:04 +00:00
{
TString msg ;
msg . format ( FR ( " Errore %d durante la cancellazione della riga %d " ) , err , rd + 1 ) ;
log . log ( 2 , msg ) ;
}
2003-07-30 10:59:43 +00:00
}
1999-04-06 15:34:39 +00:00
else
{
2010-01-04 10:06:04 +00:00
eff . put ( EFF_TIPOPAG , tipopag ) ;
1999-04-06 15:34:39 +00:00
eff . put ( EFF_IMPORTO , totimp ) ;
eff . put ( EFF_IMPORTOVAL , totimpval ) ;
2003-07-30 10:59:43 +00:00
eff . put ( EFF_CODVAL , codval ) ;
eff . put ( EFF_CAMBIO , cambio ) ;
eff . put ( EFF_DATACAMBIO , get ( F_DATACAMBIO ) ) ;
eff . put ( EFF_SPESE , get ( F_SPESE ) ) ;
1999-04-06 15:34:39 +00:00
}
}
TToken_string dati_dist ;
dati_dist . add ( tipodist ) ;
dati_dist . add ( numdist ) ;
dati_dist . add ( get ( F_DATADIST ) ) ;
dati_dist . add ( get ( F_ABI ) ) ;
dati_dist . add ( get ( F_CAB ) ) ;
2010-03-22 13:27:56 +00:00
dati_dist . add ( get ( F_PROG ) ) ;
2010-03-03 14:56:33 +00:00
distinta . write ( false , & dati_dist ) ;
2010-01-04 10:06:04 +00:00
if ( log . recordset ( ) - > items ( ) > 0 )
log . preview ( ) ;
1999-04-06 15:34:39 +00:00
}
void TPE_mask : : print ( )
{
TString16 cmd ;
cmd < < " ef0 -4 " < < get ( F_TIPODIST ) < < ' ' < < get ( F_DIST ) ;
TExternal_app app ( cmd ) ;
app . run ( ) ;
}
bool TPE_mask : : on_sheet_event ( TOperable_field & o , TField_event e , long jolly )
{
TMask & m = o . mask ( ) ;
switch ( o . dlg ( ) )
{
case F_IMPORTO :
if ( e = = fe_modify )
{
2003-07-30 10:59:43 +00:00
TMask_field & as = m . field ( F_ACCSAL ) ;
if ( as . enabled ( ) )
{
const real imp = m . get ( F_IMPORTO ) ;
const real res = m . get ( F_RESIDUO ) ;
as . set ( imp > = res ? " S " : " A " ) ;
}
1999-04-06 15:34:39 +00:00
}
break ;
case F_PAGA :
if ( e = = fe_button )
{
TMask & m = o . mask ( ) ;
if ( m . get_real ( F_IMPORTO ) . is_zero ( ) )
{
m . set ( F_IMPORTO , m . get ( F_RESIDUO ) ) ;
2003-07-30 10:59:43 +00:00
TMask_field & as = m . field ( F_ACCSAL ) ;
if ( as . enabled ( ) )
as . set ( " S " ) ;
1999-04-06 15:34:39 +00:00
}
else
{
m . reset ( F_IMPORTO ) ;
m . reset ( F_ACCSAL ) ;
}
2010-01-04 10:06:04 +00:00
_spork = true ;
1999-04-06 15:34:39 +00:00
}
break ;
case F_SHEET :
switch ( e )
{
case se_query_add :
2012-05-23 14:29:40 +00:00
if ( ! field ( F_UNCONTABIL ) . active ( ) ) // Non posso modificare distinte contabilizzate
1999-04-06 15:34:39 +00:00
{
2003-11-10 15:01:25 +00:00
TOperable_field & ronaldo = ( TOperable_field & ) field ( F_AGGIORNA ) ;
if ( ronaldo . active ( ) )
on_field_event ( ronaldo , fe_button , 0 ) ;
1999-04-06 15:34:39 +00:00
}
2010-01-04 10:06:04 +00:00
return false ;
2012-05-23 14:29:40 +00:00
case se_query_modify :
if ( field ( F_UNCONTABIL ) . active ( ) ) // Non posso modificare distinte contabilizzate
return false ;
break ;
1999-04-06 15:34:39 +00:00
case se_notify_modify :
2010-03-03 14:56:33 +00:00
_spork = true ;
1999-04-06 15:34:39 +00:00
update_total ( ) ;
break ;
default :
break ;
}
2003-07-30 10:59:43 +00:00
1999-04-06 15:34:39 +00:00
default :
break ;
}
2010-01-04 10:06:04 +00:00
return true ;
2003-07-30 10:59:43 +00:00
}
long TPE_mask : : get_free_num ( ) const
{
2012-03-06 16:47:39 +00:00
const TString & tipodist = get ( F_TIPODIST ) ;
2003-07-30 10:59:43 +00:00
TLocalisamfile eff ( LF_EFFETTI ) ; eff . setkey ( 4 ) ;
TRectype & curr = eff . curr ( ) ;
curr . put ( EFF_TIPODIST , tipodist ) ;
curr . put ( EFF_NDIST , 99999L ) ;
const int err = eff . read ( _isgreat ) ;
long n = 1L ;
if ( err ! = _isemptyfile )
{
if ( err = = NOERR )
eff . prev ( ) ;
if ( curr . get ( EFF_TIPODIST ) = = tipodist )
n + = curr . get_long ( EFF_NDIST ) ;
}
return n ;
1999-04-06 15:34:39 +00:00
}
bool TPE_mask : : on_field_event ( TOperable_field & o , TField_event e , long jolly )
{
switch ( o . dlg ( ) )
{
case DLG_NEWREC :
{
2003-07-30 10:59:43 +00:00
const long n = get_free_num ( ) ;
1999-04-06 15:34:39 +00:00
set ( F_DIST , n ) ;
2003-07-30 10:59:43 +00:00
disable ( F_DIST ) ;
disable ( DLG_NEWREC ) ;
set_focus_field ( F_ABI ) ;
_is_new = TRUE ;
_spork = FALSE ;
1999-04-06 15:34:39 +00:00
}
break ;
case F_DIST :
if ( e = = fe_modify )
{
TEdit_field & ef = ( TEdit_field & ) o ;
bool ok = ef . check ( ) ;
if ( ok )
{
const TCursor & cur = * ef . browse ( ) - > cursor ( ) ;
ok = cur . ok ( ) ;
if ( ok )
{
const TRectype & rec = cur . curr ( ) ;
if ( rec . get_bool ( EFF_EFFCONT ) )
2003-07-30 10:59:43 +00:00
{
2010-01-04 10:06:04 +00:00
warning_box ( FR ( " La distinta %s <20> gi<67> stata contabilizzata, \n "
" per cui non <20> possibile modificarla " ) , ( const char * ) ef . get ( ) ) ;
2003-07-30 10:59:43 +00:00
show ( F_UNCONTABIL ) ;
}
2004-03-16 10:43:48 +00:00
ok = fill_distinta ( true ) ;
1999-04-06 15:34:39 +00:00
}
}
2003-07-30 10:59:43 +00:00
_is_new = ! ok ; // Memorizza se <20> una distinta nuova
enable ( - 3 , _is_new ) ; // Abilita tipo, cliente, valuta, ecc., solo se nuova
enable ( F_TIPOPAG , _is_new ) ;
2011-06-17 14:26:55 +00:00
if ( ! _is_new )
{
set ( F_TIPOEFF , get ( F_TIPOCF ) ) ;
disable ( F_TIPOEFF ) ;
}
1999-04-06 15:34:39 +00:00
}
break ;
2003-07-30 10:59:43 +00:00
case F_CODVAL :
if ( e = = fe_modify & & ! o . empty ( ) )
{
TTable cam ( " CAM " ) ;
cam . put ( " CODTAB " , o . get ( ) ) ;
int err = cam . read ( _isgteq ) ;
if ( err ! = NOERR | | cam . get ( " CODTAB " ) . compare ( o . get ( ) , 3 ) ! = 0 )
{
const TRectype & val = cache ( ) . get ( " %VAL " , o . get ( ) ) ;
TString16 str = val . get ( " S4 " ) ;
if ( str . blank ( ) ) str = val . get ( " R10 " ) ;
set ( F_CAMBIO , str ) ;
}
}
break ;
1999-04-06 15:34:39 +00:00
case F_AGGIORNA :
if ( e = = fe_button )
{
2003-07-30 10:59:43 +00:00
TEdit_field & numdist = efield ( F_DIST ) ;
if ( ! numdist . empty ( ) )
1999-04-06 15:34:39 +00:00
{
2012-05-23 14:29:40 +00:00
bool go = true ;
2003-07-30 10:59:43 +00:00
if ( ! numdist . enabled ( ) & & sfield ( F_SHEET ) . items ( ) > 0 )
{
go = check_fields ( ) ;
2010-01-04 10:06:04 +00:00
if ( go & & _spork & & yesno_box ( TR ( " Si desidera registrare la distinta? " ) ) )
2003-07-30 10:59:43 +00:00
save_rate ( ) ;
1999-04-06 15:34:39 +00:00
}
2003-07-30 10:59:43 +00:00
if ( go )
go = fill_rate ( ) ;
1999-04-06 15:34:39 +00:00
}
else
2010-01-04 10:06:04 +00:00
return error_box ( TR ( " E' necessario specificare un numero di distinta " ) ) ;
1999-04-06 15:34:39 +00:00
}
break ;
case F_CONTABILI :
if ( e = = fe_button )
{
2003-07-30 10:59:43 +00:00
const char tipodist = get ( F_TIPODIST ) [ 0 ] ;
const long numdist = get_long ( F_DIST ) ;
TString16 cmd ;
cmd < < " ef0 -7 " < < tipodist < < ' ' < < numdist ;
1999-04-06 15:34:39 +00:00
TExternal_app app ( cmd ) ;
2003-07-30 10:59:43 +00:00
if ( app . run ( ) = = 0 )
{
long numreg = 0 ; // Numero di registrazione contabile
TLocalisamfile eff ( LF_EFFETTI ) ;
eff . setkey ( 4 ) ;
eff . put ( EFF_TIPODIST , tipodist ) ;
eff . put ( EFF_NDIST , numdist ) ;
eff . put ( EFF_NRIGADIST , 1 ) ; // Cerco prima riga distinta
if ( eff . read ( ) = = NOERR )
numreg = eff . get_long ( EFF_NUMREG ) ;
if ( numreg > 0 )
message_box ( " La distinta %ld e' stata contabilizzata col movimento %ld " ,
numdist , numreg ) ;
else
warning_box ( " La distinta %ld non e' stata contabilizzata " , numdist ) ;
}
1999-04-06 15:34:39 +00:00
stop_run ( K_ESC ) ;
}
break ;
2003-07-30 10:59:43 +00:00
case F_UNCONTABIL :
if ( e = = fe_button )
{
const char tipodist = get ( F_TIPODIST ) [ 0 ] ;
const long numdist = get_long ( F_DIST ) ;
if ( tipodist > ' ' & & numdist > 0 )
{
TRelation rel ( LF_EFFETTI ) ;
TRectype & rec = rel . curr ( ) ;
rec . put ( EFF_TIPODIST , tipodist ) ;
rec . put ( EFF_NDIST , numdist ) ;
TCursor cur ( & rel , " " , 4 , & rec , & rec ) ;
const TRecnotype items = cur . items ( ) ;
cur . freeze ( ) ;
TAssoc_array movs ;
for ( cur = 0 ; cur . pos ( ) < items ; + + cur )
{
movs . add ( rec . get ( EFF_NUMREG ) ) ;
rec . zero ( EFF_EFFCONT ) ;
rec . zero ( EFF_NUMREG ) ;
rel . rewrite ( ) ;
}
if ( movs . items ( ) > 0 )
{
TString msg ;
2012-05-23 14:29:40 +00:00
msg = TR ( " E' necessario cancellare i seguenti movimenti contabili: \n " ) ;
2003-07-30 10:59:43 +00:00
FOR_EACH_ASSOC_OBJECT ( movs , hash , key , obj )
msg < < key < < ' ' ;
warning_box ( msg ) ;
}
stop_run ( K_ESC ) ;
}
}
break ;
1999-04-06 15:34:39 +00:00
case DLG_DELREC :
2012-05-23 14:29:40 +00:00
if ( e = = fe_button & & yesno_box ( FR ( " Confermare l'eliminazione della distinta %ld " ) ,
1999-04-06 15:34:39 +00:00
get_long ( F_DIST ) ) )
{
TSheet_field & sheet = sfield ( F_SHEET ) ;
FOR_EACH_SHEET_ROW ( sheet , r , row )
2003-07-30 10:59:43 +00:00
{
row - > add ( " " , 0 ) ;
row - > add ( " A " , 1 ) ;
}
1999-04-06 15:34:39 +00:00
save_rate ( ) ;
}
break ;
case DLG_SAVEREC :
if ( e = = fe_button )
2003-07-30 10:59:43 +00:00
{
TEdit_field & cab = efield ( F_CAB ) ;
if ( ! cab . empty ( ) )
{
if ( check_fields ( ) )
{
save_rate ( ) ;
2004-03-16 10:43:48 +00:00
fill_distinta ( true ) ;
2003-07-30 10:59:43 +00:00
disable ( F_TIPOPAG ) ;
}
}
else
return error_box ( " E' necessario specificare una banca di presentazione " ) ;
1999-04-06 15:34:39 +00:00
}
break ;
case DLG_PRINT :
if ( e = = fe_button )
{
print ( ) ;
return FALSE ;
}
break ;
2003-07-30 10:59:43 +00:00
case F_SORT :
if ( e = = fe_modify )
{
TSheet_field & s = sfield ( F_SHEET ) ;
if ( s . items ( ) > 0 )
{
sort_sheet ( ) ;
s . force_update ( ) ;
}
}
break ;
2010-04-06 13:32:21 +00:00
case F_DATAPAG :
if ( e = = fe_close )
{
TDate datapag ( o . get ( ) ) ;
2010-05-20 13:04:32 +00:00
const bool attivo = get ( F_TIPOCF ) = = " C " ;
2010-04-06 13:32:21 +00:00
if ( ! datapag . ok ( ) )
2010-05-20 13:04:32 +00:00
datapag = attivo ? o . mask ( ) . get_date ( F_DATA ) : get_date ( F_DATADIST ) ;
return datapag > = get_date ( F_DATADIST ) | | yesno_box ( " Riga n. %d. Data pagamento precedente alla data distinta. \n Si desidera continuare " , sfield ( F_SHEET ) . selected ( ) + 1 ) ;
2010-04-06 13:32:21 +00:00
}
1999-04-06 15:34:39 +00:00
case F_SHEET :
return on_sheet_event ( o , e , jolly ) ;
default :
if ( jolly > 0 )
return on_sheet_event ( o , e , jolly ) ;
break ;
}
return TRUE ;
2003-07-30 10:59:43 +00:00
}
TPE_mask : : TPE_mask ( ) : TAutomask ( " ef0a00a " )
{
_rel = new TRelation ( LF_REFFETTI ) ;
_rel - > add ( LF_EFFETTI , " NPROGTR==NPROGTR " ) ;
1999-04-06 15:34:39 +00:00
}
2003-07-30 10:59:43 +00:00
TPE_mask : : ~ TPE_mask ( )
{ delete _rel ; }
1999-04-06 15:34:39 +00:00
///////////////////////////////////////////////////////////
// Main Program
///////////////////////////////////////////////////////////
class TPagamento_effetti : public TSkeleton_application
{
TPE_mask * _mask ;
2007-11-30 11:00:26 +00:00
public :
virtual bool create ( ) ;
1999-04-06 15:34:39 +00:00
virtual void main_loop ( ) ;
virtual void print ( ) ;
2007-11-30 11:00:26 +00:00
virtual bool firm_change_enabled ( ) const { return false ; }
1999-04-06 15:34:39 +00:00
} ;
void TPagamento_effetti : : main_loop ( )
{
open_files ( LF_TABCOM , LF_TAB , LF_CLIFO , LF_CFVEN ,
LF_PARTITE , LF_SCADENZE , LF_PAGSCA ,
LF_EFFETTI , LF_REFFETTI , LF_CESS , 0 ) ;
enable_menu_item ( M_FILE_PRINT ) ;
_mask = new TPE_mask ;
do
{
2003-07-30 10:59:43 +00:00
_mask - > reset ( ) ;
1999-04-06 15:34:39 +00:00
_mask - > enable ( - 3 ) ;
2003-07-30 10:59:43 +00:00
_mask - > enable ( F_TIPOPAG ) ;
1999-04-06 15:34:39 +00:00
_mask - > enable ( - 4 ) ;
_mask - > disable ( - 5 ) ;
2003-07-30 10:59:43 +00:00
_mask - > disable ( DLG_SAVEREC ) ;
_mask - > hide ( F_UNCONTABIL ) ;
1999-04-06 15:34:39 +00:00
_mask - > sfield ( F_SHEET ) . destroy ( ) ;
}
while ( _mask - > run ( ) ! = K_QUIT ) ;
delete _mask ;
_mask = NULL ;
}
void TPagamento_effetti : : print ( )
{
if ( _mask )
_mask - > print ( ) ;
}
2007-11-30 11:00:26 +00:00
bool TPagamento_effetti : : create ( )
{
2009-10-13 14:48:02 +00:00
if ( ! has_module ( EPAUT ) )
2007-11-30 11:00:26 +00:00
return error_box ( TR ( " Modulo non autorizzato " ) ) ;
return TSkeleton_application : : create ( ) ;
}
1999-04-06 15:34:39 +00:00
int ef0A00 ( int argc , char * argv [ ] )
{
TPagamento_effetti pe ;
2007-11-30 11:00:26 +00:00
pe . run ( argc , argv , TR ( " Disposizioni incassi/pagamenti " ) ) ;
1999-04-06 15:34:39 +00:00
return 0 ;
}