git-svn-id: svn://10.65.10.50/branches/R_10_00@23077 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
		
							parent
							
								
									d183897d21
								
							
						
					
					
						commit
						215823a913
					
				| @ -56,7 +56,7 @@ BEGIN | ||||
|   MESSAGE COPY,F_ANNOIVA,7,10 | ||||
|   USE LF_MOV KEY 2 | ||||
|   DISPLAY "Data\nRegistraz.@10" DATAREG | ||||
|   DISPLAY "Data\nCompetenza@10" DATAREG | ||||
|   DISPLAY "Data\nCompetenza@10" DATACOMP | ||||
|   DISPLAY "Numero\nregistraz.@7" NUMREG | ||||
|   DISPLAY "Causale" CODCAUS | ||||
|   DISPLAY "Numero\nDocumento@10" NUMDOC | ||||
| @ -93,8 +93,6 @@ BEGIN | ||||
|   ADD RUN cg0 -4 | ||||
|   CHECKTYPE NORMAL | ||||
|   WARNING "Causale assente" | ||||
|   MESSAGE EMPTY SHOW,F_NUMREG|HIDE,F_CC_NUMREG | ||||
|   MESSAGE SHOW,F_CC_NUMREG|HIDE,F_NUMREG | ||||
| END | ||||
| 
 | ||||
| STRING F_DESCRCAUS 50 | ||||
| @ -129,21 +127,8 @@ BEGIN | ||||
|   DISPLAY "Protoc." PROTIVA | ||||
|   DISPLAY "Descrizione@50" DESCR | ||||
|   OUTPUT F_NUMREG NUMREG | ||||
|   KEY 1 | ||||
| END | ||||
| 
 | ||||
| NUMBER F_CC_NUMREG 7 | ||||
| BEGIN | ||||
|   PROMPT 3 10 "Numero operazione   " | ||||
|   HELP "Numero del movimento di prima nota da modificare" | ||||
|   USE LF_MOV SELECT BETWEEN(CODCAUS,#F_CODCAUS,#F_CODCAUS) | ||||
|   INPUT NUMREG F_CC_NUMREG | ||||
|   COPY DISPLAY F_NUMREG | ||||
|   OUTPUT F_CC_NUMREG NUMREG | ||||
|   MESSAGE COPY F_NUMREG | ||||
|   FLAGS "H" | ||||
|   KEY 1 | ||||
|   CHECKTYPE REQUIRED | ||||
|   KEY 1 | ||||
| END | ||||
| 
 | ||||
| ENDPAGE | ||||
|  | ||||
| @ -542,6 +542,12 @@ BEGIN | ||||
|   FIELD RITSOC | ||||
| END | ||||
| 
 | ||||
| CURRENCY F_REVCHARGE 18 | ||||
| BEGIN | ||||
|   PROMPT 1 17 "Reverse charge   " | ||||
|   FIELD REVCHARGE | ||||
| END | ||||
| 
 | ||||
| DATE F_DATA74TER | ||||
| BEGIN | ||||
|   PROMPT 52 15 "Data 74/ter  " | ||||
| @ -552,18 +558,18 @@ END | ||||
| 
 | ||||
| BOOLEAN F_IVAXCASSA | ||||
| BEGIN | ||||
|   PROMPT 1 17 "IVA per cassa" | ||||
|   PROMPT 1 18 "IVA per cassa" | ||||
|   FIELD IVAXCASSA | ||||
|   MODULE IC | ||||
| END | ||||
| 
 | ||||
| BOOLEAN F_LIQDIFF | ||||
| BEGIN | ||||
|   PROMPT 25 17 "Liquidazione differita" | ||||
|   PROMPT 25 18 "Liquidazione differita" | ||||
|   WARNING "Data di incasso per liquidazione differita" | ||||
|   FIELD LIQDIFF | ||||
|   MESSAGE FALSE CLEAR,F_DATAINC | ||||
|   MESSAGE TRUE  ENABLE,F_DATAINC | ||||
|   MESSAGE TRUE ENABLE,F_DATAINC | ||||
|   FLAGS "H" | ||||
| END | ||||
|   | ||||
| @ -590,7 +596,7 @@ END | ||||
| 
 | ||||
| STRING F_VALUTAINTRA 3 | ||||
| BEGIN | ||||
|   PROMPT 1 18 "Cambio intracom. " | ||||
|   PROMPT 1 19 "Cambio intracom. " | ||||
|   FIELD CODVALI | ||||
|   FLAGS "UZ" | ||||
|   GROUP 4 | ||||
| @ -608,7 +614,7 @@ END | ||||
| 
 | ||||
| NUMBER F_CAMBIOINTRA 15 6 | ||||
| BEGIN | ||||
|   PROMPT 25 18 "" | ||||
|   PROMPT 25 19 "" | ||||
|   FIELD CAMBIOI | ||||
|   FLAGS "U" | ||||
|   GROUP 4 | ||||
| @ -617,20 +623,20 @@ END | ||||
| 
 | ||||
| DATE F_DATAINTRA | ||||
| BEGIN | ||||
|   PROMPT 43 18 "Data competenza intra " | ||||
|   PROMPT 43 19 "Data competenza intra " | ||||
|   FIELD DATACOMPI | ||||
| END | ||||
| 
 | ||||
| CURRENCY F_CORRISPETTIVO 18 | ||||
| BEGIN | ||||
|   PROMPT 1 19 "Corrispettivo    " | ||||
|   PROMPT 1 20 "Corrispettivo    " | ||||
|   FIELD CORRLIRE | ||||
|   GROUP 4 | ||||
| END | ||||
| 
 | ||||
| CURRENCY F_CORRVALUTA 18 | ||||
| BEGIN | ||||
|   PROMPT 39 19 "Corrispet. valuta " | ||||
|   PROMPT 39 20 "Corrispet. valuta " | ||||
|   FIELD CORRVALUTA | ||||
|   GROUP 4 | ||||
|   VALIDATE REQIF_FUNC 1 F_VALUTAINTRA | ||||
| @ -639,7 +645,7 @@ END | ||||
| 
 | ||||
| STRING NP_CONTSEP 6 | ||||
| BEGIN | ||||
|   PROMPT 1 20 "Cont. separata " | ||||
|   PROMPT 1 21 "Cont. separata " | ||||
|   USE &NPENT | ||||
|   INPUT CODTAB NP_CONTSEP | ||||
|   DISPLAY "Codice@6" CODTAB | ||||
| @ -652,7 +658,7 @@ END | ||||
| 
 | ||||
| STRING NP_DESCONTSEP 50 | ||||
| BEGIN | ||||
|   PROMPT 25 20 "" | ||||
|   PROMPT 25 21 "" | ||||
|   USE &NPENT KEY 2 | ||||
|   INPUT S0 NP_DESCONTSEP | ||||
|   DISPLAY "Descrizione@50" S0 | ||||
|  | ||||
							
								
								
									
										228
									
								
								cg/cg2102.cpp
									
									
									
									
									
								
							
							
						
						
									
										228
									
								
								cg/cg2102.cpp
									
									
									
									
									
								
							| @ -31,7 +31,7 @@ char TPrimanota_application::row_type(const TToken_string& s) | ||||
|   if (s.full()) | ||||
|   { | ||||
|     s.get(CG_ROWTYPE%DLG_USER-1, t); // Can't use cgs().cid2index() here!
 | ||||
|     if (t < 'A' || t > 'Z') | ||||
|     if (!((t >= 'A' && t <= 'Z')||((t >= '0' && t <= '9')))) // is not alphanumeric?
 | ||||
|       t = ' ';  | ||||
|   } | ||||
|   return t; | ||||
| @ -72,42 +72,39 @@ const real& TPrimanota_application::cod2IVA(const TMask& m) | ||||
| // Certified 99%  Non sono sicurissimo degli imponibili negativi
 | ||||
| real TPrimanota_application::scorpora(real& imponibile, const real& percent) | ||||
| { | ||||
|   real imposta; | ||||
|   const int dec = TCurrency::get_firm_dec(); | ||||
|   if (dec == 0)  // Gestione Lire
 | ||||
|   { | ||||
|     imposta = abs(imponibile) * percent / (percent + CENTO); | ||||
|     imposta.ceil(); | ||||
|     if (imponibile.sign() < 0) imposta = -imposta; | ||||
|   } | ||||
|   else | ||||
|   {              // Gestione Euro
 | ||||
|     imposta = imponibile * percent / (percent + CENTO); | ||||
|     imposta.round(dec); | ||||
|   } | ||||
|   real imposta = imponibile * percent / (percent + CENTO); | ||||
|   imposta.round(dec); | ||||
|   imponibile -= imposta; | ||||
|   return imposta; | ||||
| }   | ||||
| 
 | ||||
| 
 | ||||
| // Calcola il totale del documento tenendo conto del segno della prima riga e di quella delle
 | ||||
| // ritenute sociali sulla causale                        
 | ||||
| // Calcola il totale del documento tenendo conto del segno della prima riga 
 | ||||
| // e di quella delle ritenute sociali sulla causale, ritenute fiscali e reverse charge
 | ||||
| real TPrimanota_application::totale_documento() | ||||
| { | ||||
|   const TMask& m = curr_mask(); | ||||
| 
 | ||||
|   real tot(m.get(F_TOTALE));              // Legge totale
 | ||||
|   const real ritfis(m.get(F_RITFIS)); | ||||
|   real tot = m.get(F_TOTALE);              // Legge totale
 | ||||
|   const real ritfis = m.get(F_RITFIS); | ||||
|   tot += ritfis;                          // Somma ritenute fiscali
 | ||||
|    | ||||
|   const real ritsoc(m.get(F_RITSOC));            | ||||
|   const real ritsoc = m.get(F_RITSOC);            | ||||
|   const real revcha = m.get(F_REVCHARGE); | ||||
| 
 | ||||
|   const bool swapt = test_swap(false);    // Totale invertito ?
 | ||||
|   const bool swaps = test_swap(true);     // Ritenute sociali invertite ?
 | ||||
|   if (swapt ^ swaps)                      // Somma ritenute sociali con segno
 | ||||
|   { | ||||
|     tot -= ritsoc; | ||||
|     tot -= revcha; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     tot += ritsoc;                         | ||||
|     tot += revcha; | ||||
|   } | ||||
| 
 | ||||
|   return tot; | ||||
| } | ||||
| @ -129,7 +126,7 @@ bool TPrimanota_application::suspended_handler(TMask_field& f, KEY k) | ||||
|     if (suspended) | ||||
|     {                                                                     | ||||
|       sf = f.get(); | ||||
|       return f.error_box(TR("Il codice '%s' e' sospeso e non puo' essere utilizzato"), sf);   | ||||
|       return f.error_box(TR("Il codice '%s' è sospeso e non puo' essere utilizzato"), sf);   | ||||
|     }   | ||||
|   } | ||||
|   return true; | ||||
| @ -141,11 +138,10 @@ bool TPrimanota_application::suspended_handler(TMask_field& f, KEY k) | ||||
| 
 | ||||
| int TPrimanota_application::type2pos(char tipo) | ||||
| { | ||||
|   TString_array& cg = app().cgs().rows_array(); | ||||
|   for (int i = 0; i < cg.items(); i++) | ||||
|   TString_array& a = app().cgs().rows_array(); | ||||
|   FOR_EACH_ARRAY_ROW(a, i, s) | ||||
|   { | ||||
|     const TToken_string& s = cg.row(i); | ||||
|     const char t = row_type(s); | ||||
|     const char t = row_type(*s); | ||||
|     if (t == tipo) | ||||
|       return i; | ||||
|   } | ||||
| @ -155,15 +151,13 @@ int TPrimanota_application::type2pos(char tipo) | ||||
| // Trova nelle righe contabili un conto nelle righe di tipo prescelto
 | ||||
| int TPrimanota_application::bill2pos(const TBill& conto, char tipo) | ||||
| { | ||||
|   TString_array& cg = app().cgs().rows_array(); | ||||
|   const int num_rows = cg.items(); | ||||
|   for (int i = 0; i < num_rows; i++) | ||||
|   TString_array& a = app().cgs().rows_array(); | ||||
|   FOR_EACH_ARRAY_ROW(a, i, s) | ||||
|   { | ||||
|     TToken_string& s = cg.row(i); | ||||
|     const char t = row_type(s); | ||||
|     const char t = row_type(*s); | ||||
|     if (t == tipo) | ||||
|     { | ||||
|       const TBill c(s, 3, 0x0); | ||||
|       const TBill c(*s, 3, 0x0); | ||||
|       if (c == conto) | ||||
|         return i; | ||||
|     } | ||||
| @ -174,17 +168,15 @@ int TPrimanota_application::bill2pos(const TBill& conto, char tipo) | ||||
| // Trova nelle righe contabili un conto di contropartita per il conto dato
 | ||||
| int TPrimanota_application::bill2contr(const TBill& conto, char sezione) const | ||||
| { | ||||
|   TString_array& rows = cgs().rows_array(); | ||||
|   const int num_rows = rows.items(); | ||||
|   TBill c;                                // Conto corrente (Buona questa!)
 | ||||
|   for (int i = 0; i < num_rows; i++) | ||||
|   TString_array& a = app().cgs().rows_array(); | ||||
|   TBill c; // Conto corrente (Buona questa!)
 | ||||
|   FOR_EACH_ARRAY_ROW(a, i, r) | ||||
|   { | ||||
|     TToken_string& r = rows.row(i); | ||||
|     const real dare(r.get(0)); | ||||
|     const real dare(r->get(0)); | ||||
|     const char sez = dare.is_zero() ? 'A' : 'D'; | ||||
|     if (sez == sezione)                   // Devo cercare sezione contraria
 | ||||
|       continue; | ||||
|     c.get(r, 3, 0x0); | ||||
|     c.get(*r, 3, 0x0); | ||||
|     if (conto == c) | ||||
|       return i; | ||||
|   } | ||||
| @ -197,12 +189,11 @@ int TPrimanota_application::bill_used(const TBill& conto) const | ||||
|   TString_array& rows = ivas().rows_array(); | ||||
|   TBill c;               // Conto corrente
 | ||||
|   int users = 0; | ||||
|   for (int i = rows.items(); i >= 0 ; i--) | ||||
|   FOR_EACH_ARRAY_ROW(rows, i, row) | ||||
|   { | ||||
|     TToken_string& row = rows.row(i); | ||||
|     if (!row.empty_items()) | ||||
|     if (!row->empty_items()) | ||||
|     {                        | ||||
|       c.get(row, 6, 0x0); | ||||
|       c.get(*row, 6, 0x0); | ||||
|       if (conto == c)  | ||||
|         users++; | ||||
|     }   | ||||
| @ -276,16 +267,19 @@ bool TPrimanota_application::sub_cgs_imp(int n, const TImporto& imp) | ||||
| 
 | ||||
| TImporto TPrimanota_application::real2imp(const real& r, char row_type) | ||||
| {    | ||||
|   bool dare; | ||||
|   if (row_type == 'S') | ||||
|   bool dare = false; | ||||
| 
 | ||||
|   switch (row_type) | ||||
|   { | ||||
|   case 'S': | ||||
|   case 'V': | ||||
|     dare = causale().sezione_ritsoc() == 'D'; | ||||
|   } | ||||
|   else | ||||
|   { | ||||
|     break; | ||||
|   default: | ||||
|     dare = causale().sezione_clifo() == 'D'; | ||||
|     if (row_type != 'T' && row_type != 'F')  | ||||
|       dare = !dare; | ||||
|     break; | ||||
|   }   | ||||
|    | ||||
|   TImporto importo(dare ? 'D' : 'A', r); | ||||
| @ -297,7 +291,7 @@ void TPrimanota_application::disable_cgs_cells(int n, char tipo) | ||||
| { | ||||
|   TSheet_field& cg = cgs(); | ||||
| 
 | ||||
|   int first = 0, last = 0;    // Range di righe da disabilitare
 | ||||
|   int first = 0, last = 0;    // Range di colonne da disabilitare
 | ||||
|   switch(tipo) | ||||
|   { | ||||
|   case 'T':                   // Totale documento
 | ||||
| @ -321,6 +315,8 @@ void TPrimanota_application::disable_cgs_cells(int n, char tipo) | ||||
|   case 'P':                   // Abbuoni passivi
 | ||||
|   case 'R':                   // Ritenute professionali
 | ||||
|   case 'S':                   // Ritenute Sociali
 | ||||
|   case 'V':                   // Reverse charge
 | ||||
|   case '1':                   // Scissione pagamenti art, 17-ter DPR 633/72
 | ||||
|     last = 3;                  | ||||
|     break;           | ||||
|   case 'K':                   // Riga cliente/fornitore per saldaconto
 | ||||
| @ -410,15 +406,16 @@ int TPrimanota_application::set_cgs_row(int n, const TImporto& imp, | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| HIDDEN int compare_rows(const TObject** o1, const TObject** o2) | ||||
| HIDDEN int compare_rows(const TSortable& o1, const TSortable& o2, void* jolly) | ||||
| { | ||||
|   // Totale, Rit.Fisc., Rit.Soc., da riga IVA, riga contabile, IVA detr., IVA non detr.
 | ||||
|   const char* const sort_order = "TFSI DNAPRC";  | ||||
|   const char* const sort_order = "TFSVI DN1APRC";  | ||||
| 
 | ||||
|   const TToken_string* r1 = (const TToken_string*)*o1; | ||||
|   const TToken_string* r2 = (const TToken_string*)*o2; | ||||
|   const char c1 = app().row_type(*r1); | ||||
|   const char c2 = app().row_type(*r2); | ||||
|   const TToken_string& r1 = (const TToken_string&)o1; | ||||
|   const TToken_string& r2 = (const TToken_string&)o2; | ||||
|   const TPrimanota_application& a = *(TPrimanota_application*)jolly; | ||||
|   const char c1 = a.row_type(*r1); | ||||
|   const char c2 = a.row_type(*r2); | ||||
|   return int(strchr(sort_order, c1) - strchr(sort_order, c2)); | ||||
| } | ||||
| 
 | ||||
| @ -466,7 +463,7 @@ void TPrimanota_application::cgs_pack() | ||||
|     }   | ||||
|   }   | ||||
|   if (!pagamento && rowtypes_present)  // Il pagamento e' gia' ordinato
 | ||||
|     rows.TArray::sort(compare_rows);   // Pack and sort array
 | ||||
|     rows.TArray::sort(compare_rows, &app());   // Pack and sort array
 | ||||
| } | ||||
| 
 | ||||
| 
 | ||||
| @ -1124,10 +1121,11 @@ bool TPrimanota_application::descr_handler(TMask_field& f, KEY k) | ||||
|       if (first >= 0) | ||||
|       { | ||||
|         TSheet_field& cg = app().cgs(); | ||||
|         const TString80 old = cg.row(first).get(8); | ||||
|         const int pos = cg.cid2index(CG_DESCR); | ||||
|         const TFixed_string old = cg.row(first).get(pos); | ||||
|         if (old.blank() || f.get().find(old) >= 0) | ||||
|         { | ||||
|           cg.row(first).add(f.get(), 8); | ||||
|           cg.row(first).add(f.get(), pos); | ||||
|           cg.force_update(first); | ||||
|         }   | ||||
|       }   | ||||
| @ -1136,7 +1134,7 @@ bool TPrimanota_application::descr_handler(TMask_field& f, KEY k) | ||||
|   if (k == K_ENTER && f.get().empty()) | ||||
|   { | ||||
|     if (f.mask().get(F_CODCAUS).empty()) | ||||
|       return f.error_box(TR("La descrizione del documento e' necessaria in assenza della causale")); | ||||
|       return f.error_box(TR("La descrizione del documento è necessaria in assenza della causale")); | ||||
|   } | ||||
|   return true; | ||||
| } | ||||
| @ -1378,11 +1376,10 @@ real TPrimanota_application::calcola_imp() const | ||||
|   TArray& rows = ivas().rows_array(); | ||||
| 
 | ||||
|   real imponibili, imposte; | ||||
|   for (int r = rows.items()-1; r >= 0; r--) | ||||
|   FOR_EACH_ARRAY_ROW(rows, r, row) if (!row->empty_items()) | ||||
|   { | ||||
|     TToken_string& row = (TToken_string&)rows[r]; | ||||
|     imponibili += real(row.get(0));   | ||||
|     imposte += real(row.get(3)); | ||||
|     imponibili += real(row->get(0));   | ||||
|     imposte += real(row->get(3)); | ||||
|   } | ||||
|    | ||||
|   TMask& m = curr_mask(); | ||||
| @ -1392,7 +1389,7 @@ real TPrimanota_application::calcola_imp() const | ||||
|   // Se e' attiva la terza pagina allora riporta i totali in testata
 | ||||
|   if (is_fattura()) | ||||
|   {                               | ||||
|     real tot(m.get(F_TOTALE)); tot -= imposte; | ||||
|     real tot = m.get(F_TOTALE); tot -= imposte; | ||||
|     m.set(FS_IMPONIBILI, tot); | ||||
|     m.set(FS_IMPOSTE, imposte); | ||||
|   } | ||||
| @ -1426,7 +1423,7 @@ int TPrimanota_application::get_importi_iva(const TToken_string& row, | ||||
| { | ||||
|   real imptot;       row.get(0, imptot);   // Importo scritto nella riga iva
 | ||||
|   TString4 zanicchi; row.get(1, zanicchi); // Codice IVA
 | ||||
|   TString4 codind;   row.get(2, codind);   // Codice indetraibilita'
 | ||||
|   TString4 codind;   row.get(2, codind);   // Codice indetraibilità
 | ||||
|   real ivatot;       row.get(3, ivatot);   // Imposta scritta nella riga iva
 | ||||
| 
 | ||||
|   int annodoc = app()._msk[2]->get_date(F_DATADOC).year(); | ||||
| @ -1649,6 +1646,32 @@ bool TPrimanota_application::iva_notify(TSheet_field& iva, int r, KEY k) | ||||
|     }  // for (int d = 0; d < 2; d++)
 | ||||
| 
 | ||||
|     TMask& m = a.curr_mask();                                    | ||||
| 
 | ||||
|     if (m.get_int(F_ANNOIVA) >= 2015 && a.clifo() == 'C') // Controllo split-payment
 | ||||
|     { | ||||
|       const int r_norm  = type2pos('D'); | ||||
|       const int r_split = type2pos('1'); | ||||
|       const bool split_needed = r_norm >= 0 && a.is_split_payment(); | ||||
|       if (split_needed) | ||||
|       { | ||||
|         TImporto imp_split = a.get_cgs_imp(r_norm); imp_split.swap_section(); | ||||
|         if (r_split < 0) | ||||
|         { | ||||
|           TToken_string row_norm = a.cgs().row(r_norm);  | ||||
|           TBill iva_split(row_norm, 3); | ||||
|           const char* desc = TR("IVA art. 17-ter D.P.R. 633/1972)"); | ||||
|           a.set_cgs_row(-1, imp_split, iva_split, desc, '1'); | ||||
|         } | ||||
|         else | ||||
|           a.set_cgs_imp(r_split, imp_split); | ||||
|       } | ||||
|       else | ||||
|       { | ||||
|         if (r_split >= 0) | ||||
|           a.reset_cgs_row(r_split); | ||||
|       } | ||||
|     } | ||||
|      | ||||
|     if (r == 0)                             // Se cambio la prima riga ...
 | ||||
|     { | ||||
|       a.add_cgs_tot(m);                     // ... ricalcola conti e imponibili
 | ||||
| @ -1676,9 +1699,14 @@ bool TPrimanota_application::iva_notify(TSheet_field& iva, int r, KEY k) | ||||
|         imposta = m.get_real(F_IMPOSTE);    | ||||
|         imponibile = m.get_real(F_TOTALE) - imposta;    | ||||
|       } | ||||
|       imposta.round(pag.round(inv)); imponibile.round(pag.round(inv)); | ||||
|       real pimposta(pag.imposta(inv)); real pimponibile(pag.imponibile(inv)); | ||||
|       pimposta.round(pag.round(inv)); pimponibile.round(pag.round(inv)); | ||||
|       imposta.round(pag.round(inv));          | ||||
|       imponibile.round(pag.round(inv));    | ||||
|        | ||||
|       real pimposta(pag.imposta(inv));        | ||||
|       pimposta.round(pag.round(inv));  | ||||
|        | ||||
|       real pimponibile(pag.imponibile(inv));  | ||||
|       pimponibile.round(pag.round(inv)); | ||||
|      | ||||
|       if (pimposta != imposta || pimponibile != imponibile)  | ||||
|         a.set_scadenze(m);                // Ricalcola rate 
 | ||||
| @ -1701,9 +1729,9 @@ bool TPrimanota_application::iva_handler(TMask_field& f, KEY k) | ||||
|       const TCurrency tot(app().totale_documento()); | ||||
|       if (imp != tot) | ||||
|       { | ||||
|         const TString t(tot.string(true)); | ||||
|         const TString i(imp.string(true)); | ||||
|         return error_box(FR("La somma del totale documento e delle ritenute (%s) e' diverso dalla "  | ||||
|         const TString t = tot.string(true); | ||||
|         const TString i = imp.string(true); | ||||
|         return error_box(FR("La somma del totale documento e delle ritenute (%s) è diverso dalla "  | ||||
|                          "somma degli imponibili e delle imposte (%s)"),  | ||||
|                          (const char*)t, (const char*)i); | ||||
|       }   | ||||
| @ -1717,11 +1745,11 @@ bool TPrimanota_application::iva_handler(TMask_field& f, KEY k) | ||||
|         {                             | ||||
|           const TFixed_string codiva = row.get(1); | ||||
|           if (codiva.blank()) | ||||
|             return error_box(FR("Il codice IVA della riga %d e' obbligatorio"), i+1); | ||||
|             return error_box(FR("Il codice IVA della riga %d è obbligatorio"), i+1); | ||||
|          | ||||
|           TBill c(row, 5, 0x1); | ||||
|           if (!c.ok() || !c.find())  | ||||
|             return error_box(FR("Il conto della riga iva %d e' errato o incompleto"), i+1); | ||||
|             return error_box(FR("Il conto della riga iva %d è errato o incompleto"), i+1); | ||||
|         } | ||||
|       } | ||||
|     }   | ||||
| @ -2167,6 +2195,10 @@ bool TPrimanota_application::caus_query_handler(TMask_field& f, KEY key) | ||||
|     const TString& cau = f.get(); | ||||
|     const int ann = m.get_int(F_ANNOIVA); | ||||
| 
 | ||||
|     TEdit_field& numreg = m.efield(F_NUMREG); | ||||
|     TString16 filter; if (cau.full()) filter << MOV_CODCAUS << "==\"" << cau << '"'; | ||||
|     numreg.browse()->set_filter(filter); | ||||
|      | ||||
|     const TipoIVA i = app().cau2IVA(cau, ann);    // Cerca causale e suo tipo
 | ||||
|     if (i != iva_errata) | ||||
|       return suspended_handler(f, key);  // Controlla sospensione
 | ||||
| @ -2695,10 +2727,19 @@ void TPrimanota_application::add_cgs_tot(TMask& m) | ||||
|   else | ||||
|   { | ||||
|     // Creazione/Aggiornamento riga totale 
 | ||||
|     const real tot(m.get(F_TOTALE)); | ||||
|     real tot = m.get(F_TOTALE); | ||||
|     if (app().is_split_payment()) | ||||
|     { | ||||
|       calcola_imp(); // Ricalcola totale IVA
 | ||||
|       tot -= m.get_real(F_IMPOSTE); | ||||
|     } | ||||
|      | ||||
|     TString80 descr; | ||||
|     if (riga_totale >= 0) | ||||
|       descr = cgs().row(riga_totale).get(8); | ||||
|     { | ||||
|       const int idx_des = ss.cid2index(CG_DESCR); | ||||
|       descr = ss.row(riga_totale).get(idx_des); | ||||
|     } | ||||
|     if (descr.blank()) | ||||
|       descr = m.get(F_DESCR); | ||||
| 		TImporto imp = real2imp(tot, 'T'); | ||||
| @ -2906,7 +2947,7 @@ bool TPrimanota_application::main_codiva_handler(TMask_field& f, KEY key) | ||||
| 				f.mask().set(F_RITFIS, imposta, true); | ||||
| 			} | ||||
| 		} | ||||
| 		if (imp.is_zero()) // Se il totale documento non e' stato spezzato
 | ||||
| 		if (imp.is_zero()) // Se il totale documento non è stato spezzato
 | ||||
|     {                      | ||||
|       TToken_string& row = a.ivas().row(0); | ||||
|       iva_notify(a.ivas(), 0, K_SPACE); | ||||
| @ -3153,23 +3194,21 @@ bool TPrimanota_application::totdocval_handler(TMask_field& f, KEY key) | ||||
| 
 | ||||
| // Aggiunge o aggiorna la riga delle ritenute fiscali o sociali   
 | ||||
| // Certified 99%
 | ||||
| void TPrimanota_application::add_cgs_rit(bool fiscali) | ||||
| void TPrimanota_application::add_cgs_ritenute(char tipo) | ||||
| {                             | ||||
|   if (_as400) | ||||
|     return; | ||||
| 
 | ||||
|   TMask& m = curr_mask(); | ||||
|   const real imp(m.get(fiscali ? F_RITFIS : F_RITSOC)); // Determina importo
 | ||||
| 
 | ||||
|   const char tipo = fiscali ? 'F' : 'S'; | ||||
|   const real imp = m.get(tipo=='F' ? F_RITFIS : (tipo=='S' ? F_RITSOC : F_REVCHARGE)); // Determina importo
 | ||||
|   const int pos = type2pos(tipo);          // Cerca la riga contabile
 | ||||
|   if (pos < 0)                             // Se non c'e' ...
 | ||||
|   {   | ||||
|     if (!imp.is_zero())                      // ... e l'importo e' valido
 | ||||
|     {                                        // crea una nuova riga di ritenute
 | ||||
|       const int riga = fiscali ? RIGA_RITENUTE_FISCALI : RIGA_RITENUTE_SOCIALI; | ||||
|     if (!imp.is_zero())                    // ... e l'importo e' valido crea una nuova riga di ritenute
 | ||||
|     {                                       | ||||
|       const int riga = tipo=='F' ? RIGA_RITENUTE_FISCALI : (tipo== 'S' ? RIGA_RITENUTE_SOCIALI : RIGA_REVERSE_CHARGE); | ||||
|       TBill conto; causale().bill(riga, conto); | ||||
|       const TString desc(causale().desc_agg(riga)); | ||||
|       const TString desc = causale().desc_agg(riga); | ||||
|       set_cgs_row(-1, real2imp(imp, tipo), conto, desc, tipo); | ||||
|     }   | ||||
|   } | ||||
| @ -3221,7 +3260,7 @@ bool TPrimanota_application::protiva_handler(TMask_field& f, KEY key) | ||||
| bool TPrimanota_application::ritfis_handler(TMask_field& f, KEY key) | ||||
| { | ||||
|   if (key == K_TAB && f.focusdirty()) | ||||
|     app().add_cgs_rit(true); | ||||
|     app().add_cgs_ritenute('F'); | ||||
|   return true; | ||||
| } | ||||
| 
 | ||||
| @ -3231,10 +3270,20 @@ bool TPrimanota_application::ritfis_handler(TMask_field& f, KEY key) | ||||
| bool TPrimanota_application::ritsoc_handler(TMask_field& f, KEY key) | ||||
| { | ||||
|   if (key == K_TAB && f.focusdirty()) | ||||
|     app().add_cgs_rit(false); | ||||
|     app().add_cgs_ritenute('S'); | ||||
|   return true; | ||||
| }                                   | ||||
| 
 | ||||
| // Handler of F_REVCHARGE
 | ||||
| // Certified 100%
 | ||||
| bool TPrimanota_application::revcharge_handler(TMask_field& f, KEY key) | ||||
| { | ||||
|   if (key == K_TAB && f.focusdirty()) | ||||
|     app().add_cgs_ritenute('V'); | ||||
|   return true; | ||||
| }                                   | ||||
| 
 | ||||
| 
 | ||||
| HIDDEN void inventa_cambio_intra(TMask& m) | ||||
| { | ||||
|   const TString& codval = m.get(F_VALUTAINTRA); | ||||
| @ -3455,14 +3504,15 @@ bool TPrimanota_application::solaiva_handler(TMask_field& f, KEY key) | ||||
|     {                       | ||||
|       TSheet_field& iva = a.ivas(); | ||||
|       const int righe = iva.items(); | ||||
|       TProgind pi(righe, TR("Generazione righe contabilita'"), false, true); | ||||
|       TProgind pi(righe, TR("Generazione righe contabilità"), false, true); | ||||
|        | ||||
|       TSheet_field& cg = a.cgs(); | ||||
|       cg.reset(); | ||||
|        | ||||
|       a.add_cgs_tot(m);                                        // Genera totale documento
 | ||||
|       if (m.get(F_RITFIS).not_empty()) a.add_cgs_rit(true);    // Genera ritenute fiscali
 | ||||
|       if (m.get(F_RITSOC).not_empty()) a.add_cgs_rit(false);   // Genera ritenute sociali
 | ||||
|       a.add_cgs_tot(m);                                            // Genera totale documento
 | ||||
|       if (!m.efield(F_RITFIS).empty()) a.add_cgs_ritenute('F');    // Genera ritenute fiscali
 | ||||
|       if (!m.efield(F_RITSOC).empty()) a.add_cgs_ritenute('S');    // Genera ritenute sociali
 | ||||
|       if (!m.efield(F_REVCHARGE).empty()) a.add_cgs_ritenute('V'); // Genera reverse charge
 | ||||
|        | ||||
|       TToken_string oldrow(128); | ||||
|       for (int i = 0; i < righe; i++) | ||||
| @ -3535,12 +3585,12 @@ bool TPrimanota_application::quadratura_handler(TMask_field& f, KEY key) | ||||
| 			if (m.field(F_CLIENTE).shown()) | ||||
| 			{ | ||||
| 				clifo.put(CLI_TIPOCF, "C");    | ||||
| 				clifo.put(CLI_CODCF, m.get(F_CLIENTE));; | ||||
| 				clifo.put(CLI_CODCF, m.get(F_CLIENTE)); | ||||
| 			}                                  | ||||
| 			else | ||||
| 			{ | ||||
| 				clifo.put(CLI_TIPOCF, "F");    | ||||
| 				clifo.put(CLI_CODCF, m.get(F_FORNITORE));; | ||||
| 				clifo.put(CLI_CODCF, m.get(F_FORNITORE)); | ||||
| 			}        | ||||
| 
 | ||||
| 			if (cliforel.read() == NOERR) | ||||
|  | ||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user