campo-sirio/src/li/li0200.cpp
Alessandro Bonazzi 59005050c9 Patch level : 12.0 982
Files correlati     : li0.exe f154.dir f154.trr li0200a.msk li0300a.msk li0400a.msk limenu.men
Commento            :

Ristrutturato modulo li
2020-07-26 19:57:29 +02:00

189 lines
4.9 KiB
C++

#include <automask.h>
#include <defmask.h>
#include <relapp.h>
#include <tabutil.h>
#include <filetext.h>
#include "..\ve\velib.h"
#include <real.h>
#include "lilib01.h"
#include "letint.h"
#include "li0.h"
#include "li0200a.h"
#define CONFIG_DICINT "DICINT.ini"
class TResDI_mask : public TAutomask
{
private:
TSheet_field& sheet; // Sheet
public:
bool on_field_event(TOperable_field& o, TField_event e, long jolly) { return true; };
TResDI_mask() : TAutomask("li0200a"), sheet(sfield(DOCUMENTI_STATO)) { load_config(); };
void load_config();
void elabTipiDoc(TToken_string& tipi, TToken_string& stati, TToken_string& tipif, TToken_string& statif);
};
void TResDI_mask::load_config()
{
//Anno
set(F_A_DATA, TDate(TODAY));
set(F_TABIVA_CODTAB, ini_get_string(CONFIG_DITTA, "li", "CODIVA"));
TToken_string tipidoc(ini_get_string(CONFIG_DITTA, "li", "TIPIDOC"));
TString_array& strarr = sheet.rows_array();
sheet.hide();
sheet.destroy();
for(int i = 0; i < tipidoc.items(); i++)
{
TString td = tipidoc.get(i);
TToken_string stati(ini_get_string(CONFIG_DITTA, "li", td));
for(int j = 0; j < stati.items(); j++)
{
TToken_string row, s(stati.get(j), ',');
row.add(td);
row.add(s.get(0));
row.add(s.get(1));
strarr.add(row);
}
}
sheet.force_update();
sheet.show();
}
void TResDI_mask::elabTipiDoc(TToken_string& tipi, TToken_string& stati, TToken_string& tipif, TToken_string& statif)
{
bool fattura;
TString tipo;
for(int i = 0; i < sheet.items(); i++)
{
TToken_string row = sheet.row(i); // Es. "F01|1|5"
int statoin = row.get_int(1), statoout = row.get_int(2);
tipo = row.get(0);
if(cache().get("%TIP", tipo).get_int("I1") == 2) // Se il tipo è una fattura
fattura = true;
else
fattura = false;
for(; statoin <= statoout; statoin++)
{
// Aggiornamento: Ci sono 4 token string ora, due per le fatture e due per il resto.
// Immetto nelle due TToken_string i valori per gestire la classe TLista_documenti
// Per ogni posizione metto il documento e stato interessato, es. F01: da 1 a 3 -> tipi {F01|F01|F01} stati {1|2|3}
if (fattura)
{
tipif.add(tipo);
statif.add(statoin);
}
else
{
tipi.add(tipo);
stati.add(statoin);
}
}
}
}
class TResDI_app : public TSkeleton_application
{
void elab(TResDI_mask& m);
public:
virtual void main_loop();
};
void TResDI_app::elab(TResDI_mask& m)
{
int clifoda = m.get_long(F_CODICE_CLIFO_DA);
int clifoa = m.get_long(F_CODICE_CLIFO_A);
TDate aData(m.get_date(F_A_DATA));
// Creo le TToken_string necessarie per filtrare i documenti
TToken_string tipi, stati, tipif, statif;
m.elabTipiDoc(tipi, stati, tipif, statif);
TRelation r_clifo(LF_CLIFO);
TRectype fil_from(r_clifo.curr()), fil_to(r_clifo.curr());
fil_from.put("TIPOCF", "C");
fil_to.put("TIPOCF", "C");
if(clifoda > 0)
fil_from.put("CODCF", clifoda);
if(clifoa > 0)
fil_to.put("CODCF", clifoa);
TCursor c_clifo(&r_clifo, "", 1, &fil_from, &fil_to);
TLog_report log(TR("Resoconto plafond"));
for(c_clifo = 0; c_clifo.pos() < c_clifo.items(); ++c_clifo)
{
TRectype row_clifo(c_clifo.curr());
TLi_manager cli(row_clifo.get_long("CODCF"), aData.year()); // Inizializzo l'oggetto per la gestione del plafond
if (cli.has_valid_plafond())
{
TArray arr = cli.get_plafond_array();
const int rows = arr.items();
for (int r = 0; r < rows; r++)
{
const TRectype & reclint = (const TRectype &) arr[r];
const int numprot = reclint.get_int(LETINT_NUMPROT);
real plafond = reclint.get_real(LETINT_IMPORTO);
real utilizzato = reclint.get_real(LETINT_UTILIZZATO);
real residuo = plafond - utilizzato;
const int tipo = reclint.get_int(LETINT_TIPOOP);
const TDate dal = reclint.get_date(LETINT_DAL);
const TDate al = reclint.get_date(LETINT_AL);
TString msg;
msg << TR("Dichiarazione di intento cliente ") << row_clifo.get_long(CLI_CODCF) << " - "<< row_clifo.get(CLI_RAGSOC) << '\n';
log.log(0, msg);
msg.cut(0) << TR("Protocollo: ") << numprot << " - " << TR("Plafond disponibile: ") << residuo << "" << '\n';
log.log(0, msg);
msg.cut(0) << TR("Tipo dichiarazione: ");
switch (tipo)
{
case SOLUZIONE_UNICA:
msg << TR("Singola") << '\n';
break;
case FINO_A_PLAFOND:
msg << TR("A concorrenza ") << TR("Dal ") << dal << '\n';
break;
case A_TEMPO:
msg << TR("Dal ") << dal << TR("Al ") << al << '\n';
break;
default:
break;
}
log.log(0, msg);
log.log(0, "");
}
}
}
log.print_or_preview();
}
void TResDI_app::main_loop()
{
TResDI_mask m;
while (m.run() == K_ENTER)
{
elab(m);
}
}
int li0200(int argc, char* argv[])
{
TResDI_app a;
a.run(argc, argv, TR("Stato lettere di intento"));
return 0;
}