Patch level : 12.0 486

Files correlati     : li
Commento            : 
- Aggiunto programma per visualizzazione dei plafonds
- Aggiornato programma visualizzazioni dichiarazioni intento
- Aggiornata libreria lilib:
  - Creata createTipiStati per generare le TToken_string anche all'esterno della classe TLi_manager
  - eliminata variabile tipidoc da TLi_manager in quanto inutile, viene solo utilizzata in createTipiStati
  - Aggiunto controllo anno plafond
  - Tolta dichiarazione inutilizzata in checkUtilizzo
  - Aggiunta nuova funzione generaLiStorico() per generare le stringhe "PLAFOND" di documenti antecedenti alla nuova gestione plafond

git-svn-id: svn://10.65.10.50/branches/R_10_00@24226 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
mtollari 2017-12-12 14:07:36 +00:00
parent 2497691d9e
commit 3a0041bf48
10 changed files with 1121 additions and 27 deletions

View File

@ -10,8 +10,8 @@ int main(int argc,char** argv)
case 2: li0300(argc,argv) ; break; // Impostazioni dichiarazione d'intento
case 3: li0400(argc,argv) ; break; // Gestione archivio
case 4: li0500(argc,argv) ; break; // Stampa archivio
case 5:
default: li0600(argc,argv) ; break; // Invio dati
case 5: li0600(argc,argv) ; break; // Invio dati
default: li0100(argc,argv) ; break; // Generatore riferimenti plafond su documenti
}
return 0;
}

View File

@ -1,6 +1,7 @@
#ifndef __LI0_H
#define __LI0_H
int li0100(int argc, char* argv[]);
int li0200(int argc, char* argv[]);
int li0300(int argc, char* argv[]);
int li0400(int argc, char* argv[]);

394
src/li/li0100.cpp Normal file
View File

@ -0,0 +1,394 @@
#include <automask.h>
#include <utility.h>
#include <toolfld.h> // TButton_tool
#include <urldefid.h> // ID Bottoni
#include "lilib01.h"
#include "li0.h"
#include "li0100a.h"
#define PLA_COLS 10 // n° colonne di lettere di intento
#define CPC(x) (START_PLA + x*3)
/* Utility ***********************/
HIDDEN bool key_handler(TMask& m, KEY k)
{
// Per ora facciamo che il SHIFT+F12 attiva sempre il campo 3
if (k == K_SHIFT+K_F12)
m.enable(DLG_OK);
return true;
}
/*****************************************************************/
class TVisLI_mask : public TAutomask
{
private:
void next_page(int p);
bool _filter_changed;
int _plColumns;
void addRow(TSheet_field& sheet, TISAM_recordset& rec);
void resetColumns(TSheet_field& sheet);
void addColumns(TSheet_field& sheet, const int col);
public:
void load_sheet();
void setFilterChanged() { _filter_changed = true; }
bool on_field_event(TOperable_field& o, TField_event e, long jolly);
TVisLI_mask();
};
TVisLI_mask::TVisLI_mask()
: TAutomask("li0100a"), _filter_changed(true)
{
if(get(F_DATAFIN).empty())
set(F_DATAFIN, TDate(TODAY));
set_handler(key_handler);
disable(DLG_OK);
}
void TVisLI_mask::load_sheet()
{
_filter_changed = false;
TSheet_field& sheet = sfield(F_RIGHE);
sheet.hide(); // Nascondo lo sheet per guadagnare un 20% di velocità di caricamento, le ottimizzazioni da PRO!
if(!sheet.empty())
sheet.destroy();
resetColumns(sheet);
TString query = "USE DOC\n";
if(get(F_TIPORIC) == "D")
{
/* Facciamo una scelta intelligente per ottimizzare sempre la chiave da usare
* Ho il filtro sul cliente? 2
* Ho il filtro sulla data? 3
* Ho il filtro sul codice numerazione? 5
* In caso di tutto negativo uso la chiave classica
*/
int key = get(F_DACODCF).full() ? 2 : (get(F_DATAINI).full() ? 3 : (get(F_CODNUM).full() ? 5 : 1));
query << "KEY " << key << "\n";
TString queryFrom, queryTo;
switch (key)
{
case 2:
{
// 2: TIPOCF+CODCF+PROVV+ANNO+DATADOC+CODNUM+NDOC
queryFrom.cut(0) << "FROM TIPOCF='C' CODCF=#DACODCF PROVV='D'";
queryTo.cut(0) << "TO TIPOCF='C' CODCF=#ACODCF PROVV='D'";
if(get(F_ANNO).full())
{
queryFrom << " ANNO=#DAANNO";
queryTo << " ANNO=#AANNO";
if(get(F_DATAINI).full())
{
queryFrom << " DATADOC=#DADATA";
if(get(F_CODNUM).full())
queryFrom << " CODNUM=#DACODNUM";
}
if(get(F_DATAFIN).full())
{
queryTo << " DATADOC=#ADATA";
if(get(F_CODNUM).full())
queryTo << " CODNUM=#ACODNUM";
}
}
}
break;
case 3:
{
// 3: DATADOC+PROVV+ANNO+CODNUM+NDOC
queryFrom.cut(0) << "DATADOC=#DADATA PROVV='D'";
queryTo.cut(0) << "DATADOC=#ADATA PROVV='D'";
if(get(F_ANNO).full())
{
queryFrom << " ANNO=#DAANNO";
queryTo << " ANNO=#AANNO";
if(get(F_CODNUM).full())
{
queryFrom << " CODNUM=#DACODNUM";
queryTo << " CODNUM=#ACODNUM";
}
}
}
break;
case 5:
{
// 5: PROVV+CODNUM+ANNO+NDOC
queryFrom.cut(0) << "PROVV='D' CODNUM=#DACODNUM";
queryTo.cut(0) << "PROVV='D' CODNUM=#ACODNUM";
if(get(F_ANNO).full())
{
queryFrom << " ANNO=#DAANNO";
queryTo << " ANNO=#AANNO";
}
}
break;
case 1:
default:
{
// 1: PROVV+ANNO+CODNUM+NDOC
queryFrom.cut(0) << "PROVV='D'";
queryTo.cut(0) << "PROVV='D'";
if(get(F_ANNO).full())
{
queryFrom << " ANNO=#DAANNO";
queryTo << " ANNO=#AANNO";
}
}
break;
}
// Campi solo filtrabili con SELECT **************************
// TIPODOC+STATO
if(get(F_TIPODOC).full())
query << "SELECT TIPODOC==#TIPODOC";
if(get(F_STATO).full())
query << "SELECT STATO==#STATO";
// Unisco query
query << "FROM " << queryFrom << "\nTO " << queryTo << "\n";
// Creo recordset
TISAM_recordset rec(query);
// Uso il metodo di TISAM_recordset per valorizzare la query, è più sicuro
if(get(F_DATAINI).full())
rec.set_var("#DADATA", get_date(F_DATAINI));
if(get(F_DATAFIN).full())
rec.set_var("#ADATA", get_date(F_DATAFIN));
if(get(F_CODNUM).full())
{
rec.set_var("#DACODNUM", get(F_CODNUM));
rec.set_var("#ACODNUM", get(F_CODNUM));
}
if(get(F_TIPODOC).full())
rec.set_var("#TIPODOC", get(F_TIPODOC));
if(get(F_ANNO).full())
{
rec.set_var("#DAANNO", get(F_ANNO));
rec.set_var("#AANNO", get(F_ANNO));
}
if(get(F_STATO).full())
rec.set_var("#STATO", get(F_STATO));
if(get(F_DACODCF).full())
rec.set_var("#DACODCF", get(F_DACODCF));
if(get(F_ACODCF).full())
rec.set_var("#ACODCF", get(F_ACODCF));
// Aggiungo le righe allo sheet
for(bool ok = rec.move_first(); ok; ok = rec.move_next())
addRow(sheet, rec);
}
else
{
TString16 key; key << get(F_ANNO) << "|" << get(F_NUMPROT);
TRectype letint = cache().get(LF_LETINT, key);
// 2: TIPOCF+CODCF+PROVV+ANNO+DATADOC+CODNUM+NDOC
query << "KEY 2\n"
"FROM TIPOCF='C' CODCF=" << letint.get("CODCLI") << " PROVV='D' ANNO=" << letint.get("ANNO") << " DATADOC=" << letint.get("DAL") << "\n"
"TO TIPOCF='C' CODCF=" << letint.get("CODCLI") << " PROVV='D' ANNO=" << letint.get("ANNO") << " DATADOC="<< letint.get("ANNO") << "1231";
TISAM_recordset rec(query);
for(bool ok = rec.move_first(); ok; ok = rec.move_next())
{
TToken_string lePlafs(rec.get("G1:PLAFOND").as_string(), ',');
for(int i = 0; i < lePlafs.items(); i++)
{
TToken_string thisPlaf = lePlafs.get(i);
if(strcmp(thisPlaf.get(1), get(F_NUMPROT)) == 0) // 1 -> _plnumprot from lilib.h
{
addRow(sheet, rec);
break;
}
}
}
}
// Forzo aggiornamento e mostro sheet
sheet.force_update();
sheet.show();
}
void TVisLI_mask::addRow(TSheet_field& sheet, TISAM_recordset& rec)
{
// Per ogni documento che aggiungo valuto quante lettere di intento utilizzo.
// Ogni lettera di intento utilizzerà 2 colonne:
// Num protocollo e QTA utilizzata
// Controllo preventivo che abbia effettivamente il plafond sul documento
if(rec.get("G1:PLAFOND").is_empty())
return;
// Creo una nuova riga
TToken_string& row = sheet.row(-1);
// Data documento
row.add(rec.get("DATADOC").as_date(), sheet.cid2index(A_DATADOC));
// Anno documento
row.add(rec.get("ANNO").as_int(), sheet.cid2index(A_ANNO));
// Numero documento
row.add(rec.get("NDOC").as_string(), sheet.cid2index(A_NUMDOC));
// Numero documento
row.add(rec.get("CODNUM").as_string(), sheet.cid2index(A_CODNUM));
// Tipo documento
row.add(rec.get("TIPODOC").as_string(), sheet.cid2index(A_TIPODOC));
// Tipo cliente
row.add("C", sheet.cid2index(A_TIPOCF));
// Codice cliente
row.add(rec.get("CODCF").as_int(), sheet.cid2index(A_CODCF));
// Ragione Sociale
static TString key; key.cut(0) << "C|" << rec.get("CODCF").as_string();
row.add(cache().get(LF_CLIFO, key, "RAGSOC"), sheet.cid2index(A_RAGSOC));
// Totale documento
row.add(rec.get("G1:TOTDOC").as_real(), sheet.cid2index(A_TOTDOC));
TToken_string lePlafs(rec.get("G1:PLAFOND").as_string(), ',');
// Abilito le colonne che mi servono
addColumns(sheet, lePlafs.items());
for(int i = 0; i < lePlafs.items() && i < PLA_COLS; i++)
{
TToken_string thisPlaf = lePlafs.get(i);
row.add(thisPlaf.get(1), sheet.cid2index(CPC(i))); // _plnumprot
row.add(thisPlaf.get(2), sheet.cid2index(CPC(i)+1)); // _plimporto
}
}
void TVisLI_mask::resetColumns(TSheet_field& sheet)
{
return; // Disabled
// Disabilito tutte le colonne che non uso
for (int i = 0; i < PLA_COLS * 2; i++)
sheet.show_column(START_PLA+i, false);
}
void TVisLI_mask::addColumns(TSheet_field& sheet, const int col)
{
return; // Disabled
for(; _plColumns <= col && _plColumns <= PLA_COLS; _plColumns++)
{
sheet.show_column(CPC(_plColumns), true);
sheet.show_column(CPC(_plColumns)+1, true);
}
}
void TVisLI_mask::next_page(int p)
{
TAutomask::next_page(p);
if (_filter_changed && curr_win() == sfield(F_RIGHE).parent())
{
load_sheet();
}
}
bool TVisLI_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
const short id = o.dlg();
switch(id)
{
case F_CODNUM:
{
if(e == fe_modify)
{
TMask& m = o.mask();
const TString4& codnum = o.get();
if(codnum.full())
{
const TCodice_numerazione & cod_num = cached_numerazione(codnum);
m.set(F_DESNUM, cod_num.descrizione());
m.set(F_TIPODOC, cod_num.tipo_doc(0));
const TTipo_documento tipodoc(cod_num.tipo_doc(0));
m.set(F_DESTIPODOC, tipodoc.descrizione());
}
}
}
break;
case F_TIPORIC:
if(e == fe_modify)
{
bool en = o.get() == "D";
enable(F_NUMPROT, !en);
// Pulisco il campo se devo
if(en) reset(F_NUMPROT);
for(int i = START_DOC; i <= END_DOC; i++)
{
enable(i, en);
// Pulisco i campi se devo
if(!en) reset(i);
}
}
break;
case DLG_RECALC:
if(e == fe_button)
next_page(1);
break;
case DLG_OK:
{
// Creo una maschera che richiede la data
TMask app("Creazione storico LI", 1, 50, 10);
app.add_button_tool(DLG_OK, "Esegui", TOOL_OK);
app.add_button_tool(DLG_CANCEL, "Annulla", TOOL_CANCEL);
app.add_date(101, 0, "Data iniziale ", 1,1);
app.field(101).check_type(CHECK_REQUIRED);
// Lancio la maschera
if(app.run() == K_ENTER)
generaLiStorico(app.get_date(101));
break;
}
case DLG_USER:
if (e == fe_button || e == fe_init)
{
// 1: PROVV+ANNO+CODNUM+NDOC
const long anno = o.mask().get_long(A_ANNO);
const TString codnum = o.mask().get(A_CODNUM);
const long numdoc = o.mask().get_long(A_NUMDOC);
const bool enab = numdoc > 0;
if (e == fe_button && enab)
{
o.disable(); // Tecnica anti doppio click!
TRectype doc(LF_DOC);
doc.put("PROVV", 'D');
doc.put("ANNO", anno);
doc.put("CODNUM", codnum);
doc.put("NDOC", numdoc);
doc.edit();
o.enable();
}
else
o.enable(enab);
}
default:
break;
}
if (e == fe_modify && jolly == 0 && id >= START_MASK && id <= END_MASK)
{
setFilterChanged();
}
return true;
}
class TVisLI_app : public TSkeleton_application
{
public:
void main_loop();
};
void TVisLI_app::main_loop()
{
open_files(LF_LETINT, LF_DOC, LF_RIGHEDOC);
TVisLI_mask m;
while (m.run() == K_ENTER)
{
// DO DA TING
}
}
int li0100(int argc, char* argv[])
{
TVisLI_app a;
a.run(argc, argv, TR("Riferimenti lettere/Documento"));
return 0;
}

7
src/li/li0100.h Normal file
View File

@ -0,0 +1,7 @@
#define DOCUMENTI_STATO 201
#define F_DA_DATA 303
#define F_A_DATA 303
#define F_CODICE_CLIFO_DA 304
#define F_CODICE_CLIFO_A 305

72
src/li/li0100.msk Normal file
View File

@ -0,0 +1,72 @@
#include "li0100a.h"
TOOLBAR "topbar" 0 0 0 2
#include <stdbar.h>
ENDPAGE
PAGE "Visualizzatore LI per documento" 0 2 0 0
DATE F_DA_DATA
BEGIN
PROMPT 1 1 "Da data "
CHECKTYPE REQUIRED
END
DATE F_A_DATA
BEGIN
PROMPT 20 1 "A data "
CHECKTYPE REQUIRED
FLAGS "A"
END
NUMBER F_CODICE_CLIFO_DA 6
BEGIN
PROMPT 1 2 "Da cod. cliente: "
FLAG "UR"
USE LF_CLIFO
INPUT TIPOCF "C"
INPUT CODCF F_CODICE_CLIFO_DA
DISPLAY "Cliente" CODCF
DISPLAY "Ragione sociale@60" RAGSOC
OUTPUT F_CODICE_CLIFO_DA CODCF
GROUP 1
END
NUMBER F_CODICE_CLIFO_A 6
BEGIN
PROMPT 32 2 "a: "
FLAG "UR"
USE LF_CLIFO
INPUT TIPOCF "C"
INPUT CODCF F_CODICE_CLIFO_A
COPY DISPLAY F_CODICE_CLIFO_DA
OUTPUT F_CODICE_CLIFO_A CODCF
NUM_EXPR #F_CODICE_CLIFO_A>=#F_CODICE_CLIFO_DA
WARNING "Digitare un codice maggiore o uguale al campo 'da codice cliente'"
GROUP 1
END
ENDPAGE
ENDMASK
PAGE "Riga tipo numerazione" -1 -1 78 8
ENDPAGE
TOOLBAR "Documento" 0 0 0 2
BUTTON DLG_OK 2 2
BEGIN
PROMPT 1 1 ""
END
BUTTON DLG_CANCEL 2 2
BEGIN
PROMPT 1 1 ""
END
ENDPAGE
ENDMASK

59
src/li/li0100a.h Normal file
View File

@ -0,0 +1,59 @@
#define START_MASK 401
#define START_DOC 403
#define END_DOC 414
#define F_TIPORIC 401
#define F_NUMPROT 402
#define F_DATAINI 403
#define F_DATAFIN 404
#define F_CODNUM 405
#define F_DESNUM 406
#define F_TIPODOC 407
#define F_DESTIPODOC 408
#define F_ANNO 409
#define F_STATO 410
#define F_DACODCF 411
#define F_DARAGSOC 412
#define F_ACODCF 413
#define F_ARAGSOC 414
#define END_MASK 499
#define F_RIGHE 301
#define START_SHEET 101
#define A_DATADOC 101
#define A_ANNO 102
#define A_NUMDOC 103
#define A_CODNUM 104
#define A_TIPODOC 105
#define A_TIPOCF 106
#define A_CODCF 107
#define A_RAGSOC 108
#define A_TOTDOC 109
// Campi lettere intento
#define START_PLA 110
#define PLA1_NUMPROT 110
#define PLA1_QTA 111
#define PLA2_NUMPROT 112
#define PLA2_QTA 113
#define PLA3_NUMPROT 114
#define PLA3_QTA 115
#define PLA4_NUMPROT 116
#define PLA4_QTA 117
#define PLA5_NUMPROT 118
#define PLA5_QTA 119
#define PLA6_NUMPROT 120
#define PLA6_QTA 121
#define PLA7_NUMPROT 122
#define PLA7_QTA 123
#define PLA8_NUMPROT 124
#define PLA8_QTA 125
#define PLA9_NUMPROT 126
#define PLA9_QTA 127
#define PLA10_NUMPROT 128
#define PLA10_QTA 129
#define END_SHEET 109

469
src/li/li0100a.msk Normal file
View File

@ -0,0 +1,469 @@
#include "li0100a.h"
TOOLBAR "topbar" 0 0 0 2
BUTTON DLG_RECALC 2 2
BEGIN
PROMPT 1 1 "Carica"
PICTURE TOOL_CONVERT
END
BUTTON DLG_OK 2 2
BEGIN
PROMPT 1 1 "Precarica"
PICTURE TOOL_ELABORA
END
#include <helpbar.h>
ENDPAGE
PAGE "Impostazioni" 0 2 0 0
LISTBOX F_TIPORIC 20
BEGIN
PROMPT 1 1 "Ricerca per "
ITEM "D|Estremi documenti"
ITEM "L|Lettera"
END
NUMBER F_NUMPROT 6
BEGIN
PROMPT 40 1 "Cod. lettera "
USE LF_LETINT
JOIN LF_CLIFO INTO TIPOCF="C" CODCF=CODCLI
KEY 1
INPUT ANNO F_ANNO
DISPLAY "Anno@6" ANNO
DISPLAY "Numprot@8" NUMPROT
DISPLAY "Data Reg.@12" DATAREG
DISPLAY "Cliente@8" CODCLI
DISPLAY "Ragione sociale@50" LF_CLIFO->RAGSOC
DISPLAY "Importo" IMPORTO
DISPLAY "Chiusa" CHIUSA
OUTPUT F_NUMPROT NUMPROT
OUTPUT F_ANNO ANNO
OUTPUT F_DACODCF CODCLI
OUTPUT F_DARAGSOC LF_CLIFO->RAGSOC
OUTPUT F_ACODCF CODCLI
OUTPUT F_ARAGSOC LF_CLIFO->RAGSOC
FLAGS "DU"
END
DATE F_DATAINI
BEGIN
PROMPT 1 2 "Data iniziale"
VALIDATE DATE_CMP_FUNC <= F_DATAFIN
WARNING "La data iniziale non può essere maggiore della data finale"
END
DATE F_DATAFIN
BEGIN
PROMPT 40 2 "Data Finale "
VALIDATE DATE_CMP_FUNC >= F_DATAINI
WARNING "La data finale non può essere minore della data iniziale"
END
GROUPBOX DLG_NULL 80 5
BEGIN
PROMPT 0 3 "Documento"
END
STRING F_CODNUM 5
BEGIN
PROMPT 1 4 "Numerazione "
HELP "Codice numerazione"
USE %NUM
INPUT CODTAB F_CODNUM
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_CODNUM CODTAB
OUTPUT F_DESNUM S0
FLAG "UPA"
WARNING "Numerazione assente"
KEY 1 2
END
STRING F_DESNUM 50
BEGIN
PROMPT 24 4 ""
HELP "Descrizione numerazione"
USE %NUM KEY 2
INPUT S0 F_DESNUM
DISPLAY "Descrizione@60" S0
DISPLAY "Codice" CODTAB
COPY OUTPUT F_CODNUM
END
STRING F_TIPODOC 5
BEGIN
PROMPT 1 5 "Tipo "
HELP "Codice tipo documento"
USE %TIP
INPUT CODTAB F_TIPODOC
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_TIPODOC CODTAB
OUTPUT F_DESTIPODOC S0
FLAG "UP"
END
STRING F_DESTIPODOC 50
BEGIN
PROMPT 24 5 ""
HELP "Descrizione tipo documento"
USE %TIP KEY 2
INPUT S0 F_DESTIPODOC
DISPLAY "Descrizione@60" S0
DISPLAY "Codice" CODTAB
COPY OUTPUT F_TIPODOC
END
NUMBER F_ANNO 4
BEGIN
PROMPT 1 6 "Esercizio "
CHECKTYPE REQUIRED
NUM_EXPR #F_ANNO>0
FLAG "AP"
WARNING "Inserire un anno valido"
END
STRING F_STATO 1
BEGIN
PROMPT 24 6 "Stato "
USE %STD
INPUT CODTAB F_STATO
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
OUTPUT F_STATO CODTAB
FLAG "U"
END
GROUPBOX DLG_NULL 80 4
BEGIN
PROMPT 0 8 "Clienti"
END
NUMBER F_DACODCF 6
BEGIN
PROMPT 1 9 "Da Codice"
USE LF_CLIFO
INPUT TIPOCF "C" SELECT
INPUT CODCF F_DACODCF
DISPLAY "Codice" CODCF
DISPLAY "Ragione Sociale@50" RAGSOC
DISPLAY "Occasionale@C" OCCAS
DISPLAY "Codice Fiscale@16" COFI
DISPLAY "Partita IVA@15" PAIV
OUTPUT F_DACODCF CODCF
OUTPUT F_DARAGSOC RAGSOC
CHEKTYPE NORMAL
GROUP 1
FLAGS ""
END
STRING F_DARAGSOC 50 49
BEGIN
PROMPT 21 9 "R.Soc"
USE LF_CLIFO KEY 2
INPUT TIPOCF "C" SELECT
INPUT RAGSOC F_DARAGSOC
DISPLAY "Ragione Sociale@50" RAGSOC
DISPLAY "Codice" CODCF
DISPLAY "Codice Fiscale@16" COFI
DISPLAY "Partita IVA@15" PAIV
COPY OUTPUT F_DACODCF
ADD RUN CG0 -1
GROUP 1
FLAGS ""
END
NUMBER F_ACODCF 6
BEGIN
PROMPT 1 10 "A Codice "
USE LF_CLIFO
INPUT TIPOCF "C" SELECT
INPUT CODCF F_ACODCF
DISPLAY "Codice" CODCF
DISPLAY "Ragione Sociale@50" RAGSOC
DISPLAY "Occasionale@C" OCCAS
DISPLAY "Codice Fiscale@16" COFI
DISPLAY "Partita IVA@15" PAIV
OUTPUT F_ACODCF CODCF
OUTPUT F_ARAGSOC RAGSOC
CHEKTYPE NORMAL
GROUP 1
FLAGS ""
END
STRING F_ARAGSOC 50 49
BEGIN
PROMPT 21 10 "R.Soc"
USE LF_CLIFO KEY 2
INPUT TIPOCF "C" SELECT
INPUT RAGSOC F_ARAGSOC
DISPLAY "Ragione Sociale@50" RAGSOC
DISPLAY "Codice" CODCF
DISPLAY "Codice Fiscale@16" COFI
DISPLAY "Partita IVA@15" PAIV
COPY OUTPUT F_ACODCF
ADD RUN CG0 -1
GROUP 1
FLAGS ""
END
STRING DLG_PROFILE 256
BEGIN
PROMPT 1 -1 "Profilo "
PSELECT
FLAGS "H"
END
ENDPAGE
PAGE "Documenti/Lettere Intento" 0 2 0 0
SPREADSHEET F_RIGHE
BEGIN
PROMPT 0 0 "Righe movimenti"
ITEM "Data\n Doc.@8F"
ITEM "Anno\nDoc.@5F"
ITEM "Numero\nDocum.@5F"
ITEM "Cod.\nNum.@8F"
ITEM "Tipo\nDoc.@4F"
ITEM "C/F@2"
ITEM "Codice@6"
ITEM "Ragione Sociale@35"
ITEM "Tot. Doc.@10"
ITEM "Num Prot1@8"
ITEM "Utilizzato1@10"
ITEM "Num Prot2@8"
ITEM "Utilizzato2@10"
ITEM "Num Prot3@8"
ITEM "Utilizzato3@10"
ITEM "Num Prot4@8"
ITEM "Utilizzato4@10"
ITEM "Num Prot5@8"
ITEM "Utilizzato5@10"
ITEM "Num Prot6@8"
ITEM "Utilizzato6@10"
ITEM "Num Prot7@8"
ITEM "Utilizzato7@10"
ITEM "Num Prot8@8"
ITEM "Utilizzato8@10"
ITEM "Num Prot9@8"
ITEM "Utilizzato9@10"
ITEM "Num Prot10@8"
ITEM "Utilizzato10@10"
END
ENDPAGE
ENDMASK
PAGE "Riga" -1 -1 69 14
DATE A_DATADOC
BEGIN
PROMPT 26 0 "Data documento."
FLAGS "D"
END
NUMBER A_ANNO 4
BEGIN
PROMPT 1 0 "Anno documento"
FLAGS "D"
END
NUMBER A_NUMDOC 10
BEGIN
PROMPT 1 0 "Numero documento"
FLAGS "D"
END
STRING A_CODNUM 5
BEGIN
PROMPT 1 0 "Codice numerazione documento"
FLAGS "D"
END
STRING A_TIPODOC 5
BEGIN
PROMPT 23 6 "Tipo doc. "
FLAGS "D"
END
STRING A_TIPOCF 1
BEGIN
PROMPT 1 1 "Tipo C/F "
FLAGS "D"
END
NUMBER A_CODCF 6
BEGIN
PROMPT 26 1 "Cod. C/F"
FLAGS "D"
END
STRING A_RAGSOC 50 47
BEGIN
FIELD RAGSOC
PROMPT 1 2 "Ragione Sociale"
FLAGS "D"
END
NUMBER A_TOTDOC 12 2
BEGIN
PROMPT 42 8 "Imponibile"
FLAGS "D"
END
NUMBER PLA1_NUMPROT 6
BEGIN
PROMPT 42 8 "Num Prot"
FLAGS "D"
END
NUMBER PLA1_QTA 12 2
BEGIN
PROMPT 42 8 "Util"
FLAGS "D"
END
NUMBER PLA2_NUMPROT 6
BEGIN
PROMPT 42 8 "Num Prot"
FLAGS "D"
END
NUMBER PLA2_QTA 12 2
BEGIN
PROMPT 42 8 "Util"
FLAGS "D"
END
NUMBER PLA3_NUMPROT 6
BEGIN
PROMPT 42 8 "Num Prot"
FLAGS "D"
END
NUMBER PLA3_QTA 12 2
BEGIN
PROMPT 42 8 "Util"
FLAGS "D"
END
NUMBER PLA4_NUMPROT 6
BEGIN
PROMPT 42 8 "Num Prot"
FLAGS "D"
END
NUMBER PLA4_QTA 12 2
BEGIN
PROMPT 42 8 "Util"
FLAGS "D"
END
NUMBER PLA5_NUMPROT 6
BEGIN
PROMPT 42 8 "Num Prot"
FLAGS "D"
END
NUMBER PLA5_QTA 12 2
BEGIN
PROMPT 42 8 "Util"
FLAGS "D"
END
NUMBER PLA6_NUMPROT 6
BEGIN
PROMPT 42 8 "Num Prot"
FLAGS "D"
END
NUMBER PLA6_QTA 12 2
BEGIN
PROMPT 42 8 "Util"
FLAGS "D"
END
NUMBER PLA7_NUMPROT 6
BEGIN
PROMPT 42 8 "Num Prot"
FLAGS "D"
END
NUMBER PLA7_QTA 12 2
BEGIN
PROMPT 42 8 "Util"
FLAGS "D"
END
NUMBER PLA8_NUMPROT 6
BEGIN
PROMPT 42 8 "Num Prot"
FLAGS "D"
END
NUMBER PLA8_QTA 12 2
BEGIN
PROMPT 42 8 "Util"
FLAGS "D"
END
NUMBER PLA9_NUMPROT 6
BEGIN
PROMPT 42 8 "Num Prot"
FLAGS "D"
END
NUMBER PLA9_QTA 12 2
BEGIN
PROMPT 42 8 "Util"
FLAGS "D"
END
NUMBER PLA10_NUMPROT 6
BEGIN
PROMPT 42 8 "Num Prot"
FLAGS "D"
END
NUMBER PLA10_QTA 12 2
BEGIN
PROMPT 42 8 "Util"
FLAGS "D"
END
ENDPAGE
TOOLBAR "topbar" 0 0 0 2
BUTTON DLG_OK 2 2
BEGIN
PROMPT 1 1 ""
END
BUTTON DLG_USER 2 2
BEGIN
PROMPT 2 1 "Collega"
PICTURE TOOL_LINK
END
BUTTON DLG_DELREC 2 2
BEGIN
PROMPT 2 1 "Elimina"
PICTURE TOOL_DELREC
END
BUTTON DLG_CANCEL 2 2
BEGIN
PROMPT 4 1 ""
END
ENDPAGE
ENDMASK

View File

@ -88,8 +88,7 @@ void TResDI_mask::elabTipiDoc(TToken_string& tipi, TToken_string& stati, TToken_
}
class TResDI_app : public TSkeleton_application
{
{
void elab(TResDI_mask& m);
public:
virtual void main_loop();
@ -123,7 +122,7 @@ void TResDI_app::elab(TResDI_mask& m)
{
TRectype row_clifo(c_clifo.curr());
TLi_manager currentCli(row_clifo.get_char("TIPOCF"), row_clifo.get_long("CODCF")); // Inizializzo l'oggetto per la gestione del plafond
TLi_manager currentCli(row_clifo.get_char("TIPOCF"), row_clifo.get_long("CODCF"), aData); // Inizializzo l'oggetto per la gestione del plafond
if(currentCli.hasValidPlafond())
{
real plafond = currentCli.getPlafond();

View File

@ -1,29 +1,16 @@
#include "lilib01.h"
#include <recarray.h>
#include <utility.h>
#include <progind.h>
#define SOLUZIONE_UNICA 1
#define FINO_A_PLAFOND 2
void TLi_manager::elabTipiStati()
{
if(tipi.blank() && stati.blank())
{
for(int i = 0; i < tipidoc.items(); i++)
{
TString app("");
tipidoc.get(i, app);
TToken_string statidoc(ini_get_string(CONFIG_DITTA, "li", app), ',');
for(int j = statidoc.get_int(0); j <= statidoc.get_int(1); j++)
{
tipi.add(app);
stati.add(j);
}
}
}
createTipiStati(tipi, stati);
}
const TToken_string& TLi_manager::getUse(TDocumento& d, const bool write)
{
static TToken_string& ret = get_tmp_string();
@ -428,6 +415,12 @@ bool TLi_manager::recalcAfter(const TDocumento& d, TLog_report& lerr)
void TLi_manager::elabPlafond()
{
validPlafond = false;
// Controllo preventivo per evitare di fare calcoli su anni precedenti al plafond
if(iniDicInt.year() < 2017)
return;
TRelation letint(LF_LETINT);
TRectype filtro(letint.curr());
filtro.add("CODCLI", codcli);
@ -436,8 +429,6 @@ void TLi_manager::elabPlafond()
// Creo un cursore ordinato e prelevo la prima riga non chiusa
TCursor c_dicint(&letint, "", 2, &filtro, &filtro);
validPlafond = false;
if(c_dicint.items() > 0)
{
// Cerco finchè non arrivo alla fine o non trovo una soluzione
@ -644,8 +635,7 @@ bool TLi_manager::testPlafond(TLista_documenti& dout, TLog_report& lerr)
/* Per scelte implementative non ha una accuratezza del 100% */
bool TLi_manager::checkUtilizzo(TDocumento& d, real impNC)
{
TLista_documenti din;
bool ok;
bool ok = true;
TToken_string lePlafs(d.get("PLAFOND"), ',');
// Se me lo passa la funzione evito di calcolarlo
@ -704,7 +694,6 @@ void TLi_manager::revertModifiche()
TLi_manager::TLi_manager(const char t, const long c, TDate iniDic, TDate finDic)
: tipocf (t), codcli(c), iniDicInt(iniDic), finDicInt(finDic),
tipidoc(ini_get_string(CONFIG_DITTA, "li", "TIPIDOC")),
codivaDef(ini_get_string(CONFIG_DITTA, "li", "CODIVA")),
codivaAlt(ini_get_string(CONFIG_DITTA, "li", "CODIVALT")),
plafond(ZERO), validPlafond(false), soluzione(false), elabPR(false)
@ -715,7 +704,6 @@ TLi_manager::TLi_manager(const char t, const long c, TDate iniDic, TDate finDic)
TLi_manager::TLi_manager(const char t, const long c, TDate finDic)
: tipocf (t), codcli(c), finDicInt(finDic),
tipidoc(ini_get_string(CONFIG_DITTA, "li", "TIPIDOC")),
codivaDef(ini_get_string(CONFIG_DITTA, "li", "CODIVA")),
codivaAlt(ini_get_string(CONFIG_DITTA, "li", "CODIVALT")),
plafond(ZERO), validPlafond(false), soluzione(false), elabPR(false)
@ -725,4 +713,108 @@ TLi_manager::TLi_manager(const char t, const long c, TDate finDic)
iniDicInt.set_year(finDic.year());
elabTipiStati();
elabPlafond();
}
static void createTipiStati(TToken_string& tipi, TToken_string& stati)
{
static const TToken_string tipidoc(ini_get_string(CONFIG_DITTA, "li", "TIPIDOC"));
if(tipi.blank() && stati.blank())
{
for(int i = 0; i < tipidoc.items(); i++)
{
TString app("");
tipidoc.get(i, app);
TToken_string statidoc(ini_get_string(CONFIG_DITTA, "li", app), ',');
for(int j = statidoc.get_int(0); j <= statidoc.get_int(1); j++)
{
tipi.add(app);
stati.add(j);
}
}
}
}
bool generaLiStorico(TDate dataIni)
{
// Apro la tabella dei plafonds con chiave 2 (CODCLI+ANNO+NUMPROT) e per ogni cliente calcolo i plafond dal 2017
TRelation rletint(LF_LETINT);
TString filter = "DAL>="; filter << dataIni.date2ansi();
TCursor cletint(&rletint, filter, 2);
static TToken_string tipi, stati;
createTipiStati(tipi, stati);
static TString codIVAP = ini_get_string(CONFIG_DITTA, "li", "CODIVA");
static TString codIVAS = ini_get_string(CONFIG_DITTA, "li", "CODIVALT");
TProgress_monitor status(cletint.items(), "Aggiornamento plafond");
for(cletint = 0; cletint.pos() < cletint.items();) // Il cursore avanza sotto
{
if(!status.add_status())
break;
TRectype rletint = cletint.curr();
++cletint;
TRectype rletintn = cletint.curr();
// Controllo subuto che non sia una dichiarazione a tempo
if(rletint.get_int("TIPOOP") == 3)
continue;
// Date
TDate startCurr = rletint.get_date("DAL"), endCurr;
endCurr = rletint.get_int("CODCLI") == rletintn.get_int("CODCLI") ? rletintn.get_date("DAL")-- : NULLDATE;
// Dati lettera
real impLI = rletint.get_real("IMPORTO");
bool soluzione = rletint.get_int("TIPOOP") == SOLUZIONE_UNICA;
// Adesso che so le date apro tutti i documenti
TLista_documenti din;
din.read('D', 'C', rletint.get_long("CODCLI"), startCurr.year(), tipi, stati, startCurr, endCurr);
for(int i = 0; i < din.items(); i++)
{
#ifdef DBG
if(din[i].numero() == 1202 && din[i].anno() == 2017)
bool tolla = true;
#endif
real utilizzato = ZERO;
TAssoc_array tabIva = din[i].tabella_iva(true);
for (TRiepilogo_iva * totali = (TRiepilogo_iva *) tabIva.get(); totali != NULL; totali = (TRiepilogo_iva *) tabIva.get())
{
if(totali->cod_iva().codice() == codIVAP || totali->cod_iva().codice() == codIVAS)
utilizzato += cache().get("%TIP", din[i].tipo().codice()).get_bool("B7") ? -totali->imp_orig() : totali->imp_orig();
}
if(utilizzato.is_zero())
{
if(DEBUG_ENABLED)
{
static bool erase = yesno_box("Vuoi resettare anche i documenti con utilizzo a zero?\nCi metterà più tempo");
din[i].put("PLAFOND", "");
din[i].rewrite();
}
continue;
}
// Controllo di non superare il plafond
if(impLI >= utilizzato)
{
// Creo la chiave da scrivere e metto tutto dentro
TString key; key << rletint.get("ANNO") << "|" << rletint.get("NUMPROT") << "|" << utilizzato.string();
din[i].put("PLAFOND", key);
din[i].rewrite();
}
else
{
// Error!
if(DEBUG_ENABLED)
warning_box("Superato plafond, si passa alla nuova lettera");
break;
}
// Solo per una lettera
if(soluzione)
break;
}
}
return true;
}

View File

@ -35,7 +35,6 @@ class TLi_manager : TObject
TDate finDicInt;
real plafond;
const TToken_string tipidoc;
const TString codivaDef;
const TString codivaAlt;
// Elenco di plafond con eventuale
@ -100,6 +99,8 @@ public:
virtual ~TLi_manager() {}
};
static void createTipiStati(TToken_string& tipi, TToken_string& stati);
bool generaLiStorico(TDate dataIni);
#endif