Patch level : 12.0 662

Files correlati     : fp
Commento            :
- Aggiornamento progetto fp per nuovo programma
- Aggiunto programma per inserimento di pec e cod sdi di tutti i clienti/fornitori in una schermata
- Sistemata posizione incremento progress_monitor, sistemato errore celle non colorate togliendo force_update() di troppo
- Come aveva fatto notare alessandro, tolto stringa_eng() e utilizzato string()
- Aggiunto in about.cpp libreria SQLAPI, cambiata scrittura versione c++ con TString.
Da quando quest'ultima è stata aggiornata per VS 2017 in release i programmi si chiudono alla seconda apertura di info, questo non si presenta in debug, vediamo se si risolve qualcosa.
This commit is contained in:
Mattia Tollari 2018-12-22 11:38:31 +01:00
parent 2c38a7d14f
commit db84f03156
14 changed files with 313 additions and 710 deletions

View File

@ -3,6 +3,8 @@ Microsoft Visual Studio Solution File, Format Version 12.00
# Visual Studio 15
VisualStudioVersion = 15.0.27130.2027
MinimumVisualStudioVersion = 10.0.40219.1
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fplib", "fplib.vcxproj", "{C575788B-0BE4-4F68-B9C9-3C204EC04E07}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fp0", "fp0.vcxproj", "{9C91BACF-9A70-4973-B8CC-FA3D2AF9867C}"
ProjectSection(ProjectDependencies) = postProject
{C575788B-0BE4-4F68-B9C9-3C204EC04E07} = {C575788B-0BE4-4F68-B9C9-3C204EC04E07}
@ -10,14 +12,16 @@ Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fp0", "fp0.vcxproj", "{9C91
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AgaLib", "AgaLib.vcxproj", "{2D38A763-3D74-4338-9362-B891784EC90E}"
EndProject
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "fplib", "fplib.vcxproj", "{C575788B-0BE4-4F68-B9C9-3C204EC04E07}"
EndProject
Global
GlobalSection(SolutionConfigurationPlatforms) = preSolution
Debug|Win32 = Debug|Win32
Release|Win32 = Release|Win32
EndGlobalSection
GlobalSection(ProjectConfigurationPlatforms) = postSolution
{C575788B-0BE4-4F68-B9C9-3C204EC04E07}.Debug|Win32.ActiveCfg = Debug|Win32
{C575788B-0BE4-4F68-B9C9-3C204EC04E07}.Debug|Win32.Build.0 = Debug|Win32
{C575788B-0BE4-4F68-B9C9-3C204EC04E07}.Release|Win32.ActiveCfg = Release|Win32
{C575788B-0BE4-4F68-B9C9-3C204EC04E07}.Release|Win32.Build.0 = Release|Win32
{9C91BACF-9A70-4973-B8CC-FA3D2AF9867C}.Debug|Win32.ActiveCfg = Debug|Win32
{9C91BACF-9A70-4973-B8CC-FA3D2AF9867C}.Debug|Win32.Build.0 = Debug|Win32
{9C91BACF-9A70-4973-B8CC-FA3D2AF9867C}.Release|Win32.ActiveCfg = Release|Win32
@ -26,10 +30,6 @@ Global
{2D38A763-3D74-4338-9362-B891784EC90E}.Debug|Win32.Build.0 = Debug|Win32
{2D38A763-3D74-4338-9362-B891784EC90E}.Release|Win32.ActiveCfg = Release|Win32
{2D38A763-3D74-4338-9362-B891784EC90E}.Release|Win32.Build.0 = Release|Win32
{C575788B-0BE4-4F68-B9C9-3C204EC04E07}.Debug|Win32.ActiveCfg = Debug|Win32
{C575788B-0BE4-4F68-B9C9-3C204EC04E07}.Debug|Win32.Build.0 = Debug|Win32
{C575788B-0BE4-4F68-B9C9-3C204EC04E07}.Release|Win32.ActiveCfg = Release|Win32
{C575788B-0BE4-4F68-B9C9-3C204EC04E07}.Release|Win32.Build.0 = Release|Win32
EndGlobalSection
GlobalSection(SolutionProperties) = preSolution
HideSolutionNode = FALSE

View File

@ -190,7 +190,7 @@
<ClCompile Include="..\src\fp\fp0.cpp" />
<ClCompile Include="..\src\fp\fp0100.cpp" />
<ClCompile Include="..\src\fp\fp0200.cpp">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
</ClCompile>
<ClCompile Include="..\src\fp\fp0300.cpp" />
<ClCompile Include="..\src\tf\tfutility.cpp" />
@ -199,15 +199,12 @@
<ClInclude Include="..\src\fp\fp0.h" />
<ClInclude Include="..\src\fp\fp0100a.h" />
<ClInclude Include="..\src\fp\fp0200a.h" />
<ClInclude Include="..\src\fp\fp0200b.h">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
</ClInclude>
<ClInclude Include="..\src\fp\fp0300a.h" />
<ClInclude Include="..\src\tf\tfutility.h" />
</ItemGroup>
<ItemGroup>
<MskCompiler Include="..\src\fp\fp0200a.uml">
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">true</ExcludedFromBuild>
<ExcludedFromBuild Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">false</ExcludedFromBuild>
</MskCompiler>
<MskCompiler Include="..\src\fp\fp0300a.uml" />
</ItemGroup>
@ -237,6 +234,9 @@
<ItemGroup>
<Library Include="..\lib\fplib.lib" />
</ItemGroup>
<ItemGroup>
<MenCompiler Include="..\src\fp\fpmenu.men" />
</ItemGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
<ImportGroup Label="ExtensionTargets">
<Import Project="CampoRules.targets" />

View File

@ -19,6 +19,9 @@
<Filter Include="Libraries">
<UniqueIdentifier>{d7227be8-6583-4473-895f-595f8a48a8cb}</UniqueIdentifier>
</Filter>
<Filter Include="Menu">
<UniqueIdentifier>{022385bd-474b-4d1f-a01c-6d799bae0328}</UniqueIdentifier>
</Filter>
</ItemGroup>
<ItemGroup>
<ClCompile Include="..\src\fp\fp0.cpp">
@ -42,7 +45,9 @@
<ClCompile Include="..\src\fp\fp0300.cpp">
<Filter>Sources</Filter>
</ClCompile>
<ClCompile Include="..\src\fp\fp0200.cpp" />
<ClCompile Include="..\src\fp\fp0200.cpp">
<Filter>Sources</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<ClInclude Include="..\src\fp\fp0.h">
@ -54,9 +59,6 @@
<ClInclude Include="..\src\fp\fp0200a.h">
<Filter>Headers</Filter>
</ClInclude>
<ClInclude Include="..\src\fp\fp0200b.h">
<Filter>Headers</Filter>
</ClInclude>
<ClInclude Include="..\src\fp\fp0100a.h">
<Filter>Headers</Filter>
</ClInclude>
@ -91,4 +93,9 @@
<Filter>Libraries</Filter>
</Library>
</ItemGroup>
<ItemGroup>
<MenCompiler Include="..\src\fp\fpmenu.men">
<Filter>Menu</Filter>
</MenCompiler>
</ItemGroup>
</Project>

View File

@ -9,7 +9,7 @@ int main(int argc, char** argv)
switch (r)
{
case 2: rt = fp0300(argc, argv); break; // Gestione fatture attive (PAA, Ex Fattura PA)
//case 1: rt = fp0200(argc, argv); break; // Gestione fatture passive (PAF)
case 1: rt = fp0200(argc, argv); break; // Inserimento massivo PEC e Cod Sdi clifo
default: rt = fp0100(argc, argv); break; // Configurazione
}
return rt;

View File

@ -1,6 +1,242 @@
#include <applicat.h>
#include <automask.h>
#include <config.h>
#include "fplib01.h"
#include <progind.h>
#include <cfven.h>
#include <doc.h>
#include "../ve/velib05.h"
#include "../cg/cglib03.h"
#include "../fe/felib.h"
#include "fp0.h"
#include "fp0200a.h"
/////////////////////////////////////////////////////////////////////////////////////
// TCC_mask
/////////////////////////////////////////////////////////////////////////////////////
class TCC_mask : public TAutomask
{
protected:
bool on_field_event(TOperable_field& o, TField_event e, long jolly) override;
void fill();
void init();
void save_all();
public:
TCC_mask() : TAutomask("fp0200a") {}
};
bool TCC_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
switch (o.dlg())
{
case DLG_RECALC:
if (e == fe_button)
fill();
break;
case DLG_SAVEREC:
if (e == fe_button)
save_all();
break;
case DLG_USER:
if (e == fe_button && jolly > 0)
{
TSheet_field& clifo = sfield(F_RIGHE);
TToken_string& row = clifo.row(clifo.selected());
TRectype rec(LF_CLIFO);
rec.put(CLI_TIPOCF, get(F_TIPOCF));
rec.put(CLI_CODCF, row.get(0));
if (rec.edit())
fill();
}
break;
case F_TIPOCF:
if(e == fe_modify)
{
set(F_DACODCF, "");
set(F_ACODCF, "");
}
break;
case S_CODSDI:
if(e == fe_modify)
{
if (o.mask().get_bool(S_ISPA))
{
if (o.mask().get(S_CODSDI).len() != 6)
{
warning_box("La lunghezza di un codice SDI di una P.A. deve essere di 6 caratteri!");
}
}
else
{
if (o.mask().get(S_CODSDI).len() != 7)
{
warning_box("La lunghezza di un codice SDI di un privato deve essere di 7 caratteri!");
}
}
}
break;
default: break;
}
return true;
}
void TCC_mask::fill()
{
TSheet_field& righe = sfield(F_RIGHE);
TString_array& sht = righe.rows_array();
TString query;
query << "USE CLIFO \n" <<
"JOIN CFVEN TO CLIFO INTO TIPOCF==TIPOCF CODCF==CODCF \n"<<
"FROM TIPOCF=#DATIPOCF ";
if (get(F_DACODCF).full())
query << "CODCF=#DACODCF";
query << "\nTO TIPOCF=#ATIPOCF ";
if (get(F_DACODCF).full())
query << "CODCF=#ACODCF";
TISAM_recordset rec(query);
// Valorizzo le variabili
rec.set_var("#DATIPOCF", get(F_TIPOCF));
rec.set_var("#ATIPOCF", get(F_TIPOCF));
if (get(F_DACODCF).full())
rec.set_var("#DACODCF", get(F_DACODCF));
if (get(F_DACODCF).full())
rec.set_var("#ACODCF", get(F_ACODCF));
TProgress_monitor pi(rec.items(), "Caricamento lista C/F");
for (bool okc = rec.move_first(); okc; okc = rec.move_next())
{
if (!pi.add_status())
break;
const TRectype& doc = rec.cursor()->curr();
TToken_string& row = righe.row(-1);
row.add(rec.get(CLI_CODCF).as_string());
row.add(rec.get(CLI_RAGSOC).as_string());
row.add(rec.get(CLI_ALLEG).as_int() == 7 ? "X" : "");
row.add(rec.get(CLI_PEC).as_string());
row.add(rec.get("17." CFV_PADESTIN).as_string());
}
righe.force_update();
righe.show();
}
void TCC_mask::save_all()
{
TString_array& sht = sfield(F_RIGHE).rows_array();
TLocalisamfile clifo(LF_CLIFO), cfven(LF_CFVEN);
int ok = NOERR;
if (!sht.empty())
{
TProgress_monitor pi(sht.items(), "Salvataggio dati");
FOR_EACH_ARRAY_ROW(sht, r, riga)
{
if (!pi.add_status())
break;
clifo.zero();
clifo.put(CLI_TIPOCF, get(F_TIPOCF));
clifo.put(CLI_CODCF, riga->get(xvtil_cid2index(S_CODCF)));
const int clifo_err = clifo.read();
if (clifo_err == NOERR)
{
clifo.put(CLI_PEC, riga->get(xvtil_cid2index(S_PEC)));
if (clifo.rewrite() != NOERR)
{
TString msg = "Fallito salvataggio record in CLIFO";
msg << clifo.get(CLI_TIPOCF) << " " << clifo.get(CLI_CODCF) << "\nSalvataggio abortito";
error_box(msg);
break;
}
}
else
{
TString msg = "Impossibile trovare in CLIFO ";
msg << clifo.get(CLI_TIPOCF) << " " << clifo.get(CLI_CODCF) << " errore " << clifo_err <<".\nSalvataggio abortito";
error_box(msg);
break;
}
cfven.zero();
cfven.put(CFV_TIPOCF, get(F_TIPOCF));
cfven.put(CFV_CODCF, riga->get(xvtil_cid2index(S_CODCF)));
const int err = cfven.read();
if (err == NOERR || err == _iskeynotfound)
{
cfven.put(CFV_PADESTIN, riga->get(xvtil_cid2index(S_CODSDI)));
if (cfven.rewrite_write() != NOERR)
{
TString msg = "Fallito salvataggio record in CFVEN ";
msg << cfven.get(CFV_TIPOCF) << " " << cfven.get(CFV_CODCF) << "\nSalvataggio abortito";
error_box(msg);
break;
}
}
else
{
TString msg = "Impossibile trovare in CFVEN ";
msg << clifo.get(CLI_TIPOCF) << " " << clifo.get(CLI_CODCF) << " errore " << clifo_err << ".\nSalvataggio abortito";
error_box(msg);
break;
}
}
}
}
/////////////////////////////////////////////////////////////////////////////////////
// TDoc2Paf
/////////////////////////////////////////////////////////////////////////////////////
class TCC_app : public TSkeleton_application
{
public:
bool create() override;
virtual void main_loop();
TCC_app() {}
};
bool TCC_app::create()
{
open_files(LF_CLIFO, LF_CFVEN, 0);
TRectype cfven(LF_CFVEN);
if (cfven.length(CFV_PADESTIN) != 7) // Nuova lunghezza per privati
return error_box(TR("Database non convertito per fatturazione F.P."));
return TSkeleton_application::create();
}
void TCC_app::main_loop()
{
int ndocs = 0;
TCC_mask mask;
while (mask.run() == K_ENTER) {}
}
int fp0200(int argc, char* argv[])
{
TCC_app app;
app.run(argc, argv, TR("Inserimento massivo codici F.P."));
return 0;
}

View File

@ -0,0 +1,10 @@
#define S_CODCF 101
#define S_RAGSOC 102
#define S_ISPA 103
#define S_PEC 104
#define S_CODSDI 105
#define F_TIPOCF 201
#define F_DACODCF 202
#define F_ACODCF 203
#define F_RIGHE 204

View File

@ -7,197 +7,65 @@ BEGIN
PICTURE TOOL_CONVERT
END
BUTTON DLG_ARCHIVE 2 2
BEGIN
PROMPT 2 1 "Controlla"
PICTURE TOOL_SMILE
END
BUTTON DLG_SAVEREC 2 2
BEGIN
PROMPT 3 1 "Salva"
PICTURE TOOL_SAVEREC
END
BUTTON DLG_EDIT 10 2
BEGIN
PROMPT 3 1 "E~xcel"
PICTURE TOOL_EXCEL
END
BUTTON DLG_OK 2 2
BEGIN
PROMPT 1 1 "Esporta"
PICTURE TOOL_ELABORA
END
BUTTON DLG_EMAIL 2 2
BEGIN
PROMPT 1 1 "Crea XML"
PICTURE TOOL_EMAIL
END
#include <helpbar.h>
ENDPAGE
PAGE "Impostazioni" 0 2 0 0
DATE F_DATAINI
BEGIN
PROMPT 1 1 "Data iniziale:"
CHECKTYPE REQUIRED
VALIDATE DATE_CMP_FUNC <= F_DATAFIN
WARNING "La data iniziale non può essere maggiore della data finale"
END
DATE F_DATAFIN
BEGIN
PROMPT 40 1 "Data Finale: "
CHECKTYPE REQUIRED
VALIDATE DATE_CMP_FUNC >= F_DATAINI
WARNING "La data finale non può essere minore della data iniziale"
END
PAGE "Elenco clienti/fornitori" 0 2 0 0
RADIOBUTTON F_TIPOCF 15
BEGIN
PROMPT 1 2 "Tipo C/F"
PROMPT 1 0 "Tipo C/F"
ITEM "C|Cliente"
ITEM "F|Fornitore"
END
NUMBER F_CODCF 6
NUMBER F_DACODCF 6
BEGIN
PROMPT 18 3 "Codice:"
PROMPT 20 1 "Da codice"
USE LF_CLIFO
INPUT TIPOCF F_TIPOCF SELECT
INPUT CODCF F_CODCF
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_CODCF CODCF
OUTPUT F_RAGSOC RAGSOC
OUTPUT F_DACODCF CODCF
CHEKTYPE NORMAL
GROUP 1
FLAGS ""
END
STRING F_RAGSOC 50 49
NUMBER F_ACODCF 6
BEGIN
PROMPT 18 4 "R.Soc: "
USE LF_CLIFO KEY 2
PROMPT 40 1 "A codice"
USE LF_CLIFO
INPUT TIPOCF F_TIPOCF SELECT
INPUT RAGSOC F_RAGSOC
DISPLAY "Ragione Sociale@50" RAGSOC
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
COPY OUTPUT F_CODCF
ADD RUN CG0 -1
GROUP 1
OUTPUT F_ACODCF CODCF
CHEKTYPE NORMAL
FLAGS ""
END
RADIOBUTTON F_FATTSEL 25
BEGIN
PROMPT 1 6 "Fatture da visualizzare"
ITEM "0|Da inviare"
ITEM "1|Inviate"
ITEM "2|Mai elaborati"
ITEM "3|Forzate"
ITEM "4|Errate"
ITEM "5|Disabilitate"
ITEM "6|Tutti"
END
GROUPBOX DLG_NULL 65 5
BEGIN
PROMPT 30 6 "Tipi documento selezionati"
END
BOOLEAN B_TIPO_AUTOFATT
BEGIN
PROMPT 31 7 "Autofattura"
FLAGS ""
END
BOOLEAN B_TIPO_FATTACQ
BEGIN
PROMPT 45 7 "Fatt d'Acq"
FLAGS ""
END
BOOLEAN B_TIPO_FATTFISC
BEGIN
PROMPT 60 7 "Fatt Fisc"
FLAGS ""
END
BOOLEAN B_TIPO_FATTVEN
BEGIN
PROMPT 75 7 "Fatt Ven"
FLAGS ""
END
BOOLEAN B_TIPO_FATTSCO
BEGIN
PROMPT 31 8 "Fatt Scontr"
FLAGS ""
END
BOOLEAN B_TIPO_NOTC
BEGIN
PROMPT 45 8 "Nota Cred"
FLAGS ""
END
BOOLEAN B_TIPO_NOTD
BEGIN
PROMPT 60 8 "Nota Deb"
FLAGS ""
END
BOOLEAN B_TIPO_BOLLADOG
BEGIN
PROMPT 75 8 "Bolla Dog"
FLAGS ""
END
BOOLEAN B_TIPO_STORDOC
BEGIN
PROMPT 31 9 "Storno Doc"
FLAGS ""
END
ENDPAGE
PAGE "Trasferimento Fatture" 0 2 0 0
SPREADSHEET F_RIGHE
BEGIN
PROMPT 0 0 "Righe movimenti"
ITEM "Data\n Reg.@8F"
ITEM "Tipo\nDocum.@2F"
ITEM "Tipo\nDoc. AE.@5F"
ITEM "Numero\nDocum.@5F"
ITEM "Data\nDocum.@10"
ITEM "Aliquota@4"
ITEM "Imponibile@10"
ITEM "Imposta@10"
ITEM "Natura\nIVA@4"
ITEM "% Detr.@6"
ITEM "C/F@2"
PROMPT 1 4 ""
ITEM "Codice@6"
ITEM "Occas.@16"
ITEM "Ragione Sociale@35"
ITEM "RF/SO@16"
ITEM "Rag. Soc. RF/SO@35"
ITEM "Partita IVA@11"
ITEM "Codice Fiscale@15"
ITEM "Rev.\nCharge@4"
ITEM "Auto\nfatt.@3"
ITEM "Spedita@5"
ITEM "Inviare@5"
ITEM "Modificata@10"
ITEM "N.\nRegistraz.@10"
ITEM "Codici Errori@10"
ITEM "Ragione Sociale"
ITEM "P.A.@4"
ITEM "PEC"
ITEM "Cod. SDI@10"
END
ENDPAGE
@ -206,234 +74,32 @@ ENDMASK
PAGE "Riga" -1 -1 69 14
BOOLEAN A_SPEDITA
NUMBER S_CODCF 6
BEGIN
PROMPT 52 10 "Gia' spedita"
FIELD SPEDITA
FLAGS "D"
PROMPT 1 1 "Cod. C/F"
END
LIST A_INVIO 1 15
BEGIN
PROMPT 1 10 "Da inviare"
ITEM "X|X, Da Inviare"
ITEM "I|I, Inviato"
ITEM "N|N, Disabilitato"
ITEM "F|F, Forzato"
ITEM "E|E, Errato"
FIELD INVIO
END
BOOLEAN A_FORZATA
BEGIN
PROMPT 30 10 "Forzatura manuale"
FIELD FORZATURA
END
NUMBER A_NUMERO 10
BEGIN
PROMPT 1 0 "N.Movimento"
FLAGS "D"
FIELD PROGR
END
DATE A_DATAREG
BEGIN
PROMPT 26 0 "Data reg."
FIELD DATAREG
CHEKTYPE REQUIRED
END
LIST A_TIPOCF 1 10
BEGIN
PROMPT 1 1 "Tipo C/F "
ITEM "C|Cliente"
ITEM "F|Fornitore"
FIELD TIPOCF
FLAGS "D"
END
NUMBER A_CODCF 6
BEGIN
PROMPT 26 1 "Cod. C/F"
USE LF_CLIFO
INPUT TIPOCF A_TIPOCF SELECT
INPUT CODCF A_CODCF
DISPLAY "Codice" CODCF
DISPLAY "Ragione Sociale@50" RAGSOC
DISPLAY "Occasionale@C" OCCAS
DISPLAY "Partita IVA" PAIV
DISPLAY "Codice fiscale@16" COFI
OUTPUT A_CODCF CODCF
OUTPUT A_RAGSOC RAGSOC
OUTPUT A_PAIV PAIV
OUTPUT A_COFI COFI
ADD RUN cg0 -1
FIELD CODCF
END
STRING A_OCFPI 16
BEGIN
PROMPT 44 1 "Occas."
USE LF_OCCAS
INPUT CFPI A_OCFPI
DISPLAY "Codice@16" CFPI
DISPLAY "Ragione Sociale@50" RAGSOC
DISPLAY "Partita IVA" PAIV
DISPLAY "Codice fiscale@16" COFI
OUTPUT A_OCFPI CFPI
OUTPUT A_RAGSOC RAGSOC
OUTPUT A_PAIV PAIV
OUTPUT A_COFI COFI
CHEKTYPE NORMAL
GROUP 3
ADD RUN cg0 -6
FIELD OCFPI
END
STRING A_RAGSOC 50 47
STRING S_RAGSOC 50 50
BEGIN
FIELD RAGSOC
PROMPT 1 2 "Ragione Sociale"
FLAGS "D"
END
STRING A_RFSO 6
BOOLEAN S_ISPA
BEGIN
FIELD RFSO
PROMPT 1 4 "Codice RF/SO: "
HELP "Codice Rappresentante Fiscale o Stabile Organizzazione"
PROMPT 15 1 "Pubblica Amministrazione"
FLAGS "D"
END
STRING A_RAGSOCRFSO 50 47
STRING S_PEC 50
BEGIN
FIELD RAGSOCRFSO
PROMPT 1 5 "Rag. Soc. RF/SO"
HELP "Ragione Sociale RF/SO"
FLAGS "D"
PROMPT 1 3 "PEC"
END
STRING A_TIPODOC 2
STRING S_CODSDI 7
BEGIN
PROMPT 23 6 "Tipo doc. "
FIELD TIPODOC
USE %TPD
INPUT CODTAB A_TIPODOC
DISPLAY "Tipo " CODTAB
DISPLAY "Descrizione @50" S0
OUTPUT A_TIPODOC CODTAB
WARNING "Tipo documento errato"
CHECKTYPE REQUIRED
FLAGS "HUD"
ADD NONE
END
LIST A_TIPODOCAE 6
BEGIN
PROMPT 23 6 "Tipo doc. "
ITEM "TD01|TD01"
ITEM "TD04|TD04"
ITEM "TD05|TD05"
ITEM "TD07|TD07"
ITEM "TD08|TD08"
ITEM "TD10|TD10"
ITEM "TD11|TD11"
ITEM "ERR0|Errore"
END
STRING A_NUMDOC 7
BEGIN
PROMPT 42 6 "Num. doc. "
FLAGS "U"
FIELD NUMDOC
CHEKTYPE REQUIRED
END
DATE A_DATADOC
BEGIN
PROMPT 1 6 "Data doc."
FIELD DATADOC
CHEKTYPE REQUIRED
END
LIST A_NATURA 1 35
BEGIN
PROMPT 20 7 "Natura IVA"
ITEM "|IVA ordinaria"
ITEM "N1|N1 - IVA esclusa ex art 15"
ITEM "N2|N2 - IVA non soggetta"
ITEM "N3|N3 - IVA non imponibile"
ITEM "N4|N4 - IVA esente"
ITEM "N5|N5 - IVA in regime del margine"
ITEM "N6|N6 - IVA in reverse charge"
ITEM "N7|N7 - IVA assolta in altro stato U3"
END
STRING A_ALIQUOTA 4
BEGIN
PROMPT 1 7 "Aliquota "
HELP "Codice aliquota"
FIELD CODTAB
KEY 1
USE %IVA
FLAGS "U"
INPUT CODTAB A_ALIQUOTA
DISPLAY "Codice" CODTAB
DISPLAY "Descrizione@50" S0
DISPLAY "Tipo" S1
DISPLAY "%@5" R0
DISPLAY "Vent." S6
DISPLAY "Sospeso" B2
OUTPUT A_ALIQUOTA CODTAB
CHECKTYPE REQUIRED
VALIDATE ZEROFILL_FUNC 2
END
STRING A_DETRAIB 6
BEGIN
PROMPT 1 8 "% Detraibilita'"
HELP "Percentuale di detraibilita'"
FLAGS "D"
END
NUMBER A_IMPONIBILE 12 2
BEGIN
PROMPT 42 8 "Imponibile"
END
NUMBER A_IMPOSTA 12 2
BEGIN
PROMPT 42 9 "Imposta "
END
BOOLEAN A_REVERSE
BEGIN
PROMPT 1 9 "Reverse charge"
END
BOOLEAN A_AUTOFATT
BEGIN
PROMPT 25 9 "Autofattura"
FLAGS "D"
END
STRING A_PAIV 12
BEGIN
PROMPT 1 3 "Partita IVA "
FLAGS "D"
END
STRING A_COFI 16
BEGIN
PROMPT 33 3 "Codice Fiscale"
FLAGS "D"
END
STRING A_CODERR 10
BEGIN
PROMPT 0 13 "Codici errori"
//FLAGS "D"
PROMPT 50 3 "Codice SDI"
END
ENDPAGE

View File

@ -1,308 +0,0 @@
#include <applicat.h>
#include <automask.h>
#include <config.h>
#include <execp.h>
#include <golem.h>
#include <progind.h>
#include <reputils.h>
#include <tabutil.h>
#include <utility.h>
#include <agasys.h>
#include <printer.h>
#include <dongle.h> // dongle()
#include <odbcrset.h> // Oracle Recset
#include <tsdb.h>
#include <xvtdb.h>
#include <map> // std::map
#include "../ve/velib05.h"
#include "../cg/cglib03.h"
#include "../fe/felib.h"
#include "fp0200a.h"
#include "../tf/tfutility.h"
#include <memory>
#ifdef DISABLED
/////////////////////////////////////////////////////////////////////////////////////
// Globals
/////////////////////////////////////////////////////////////////////////////////////
enum return_code
{
found, // Trovato
foundcust, // Trovato in trasfatt
foundidcust,// Trovato ma con id customizzato
nextmov, // Trovato ma cambiato movimento
eof, // EOF rmoviva
eofcust, // EOF trasfatt
after // File mov su un movimento dopo rispetto a rmoviva
};
// Su DB: X o ''->Da inviare, F->Forzato, I->Inviato, N->Non inviare
enum filter_fatt
{
toSend, // "", "X", "F", "E"
sent, // "I"
untouched, // "", "X"
forced, // "F"
disabled, // "N"
err, // "E"
all // Nessun controllo
};
#define SHEET_GAP 101
#define DTE_PROVV "DTE0000001"
#define DTR_PROVV "DTR0000001"
#define TOLLARANZA 0.05
// Flag invio
#define FLAG_INVIO "X"
#define FLAG_ERRORE "E"
#define FLAG_NINVIO "N"
#define FLAG_FORZATO "F"
#define FLAG_INVIATO "I"
#define SPESOMETROBASE "ModuliSirio"
#define REG_ATT 1
#define REG_PAS 2
#define CARATTERI_SPECIALI "àèéìòù°"
/* Così facendo basta modificare la maschera (e le dichiarazioni di conseguenza)
* per avere l'inserimento nello sheet corretto */
enum spesometroFields{
_spedita = A_SPEDITA - SHEET_GAP,
_invio = A_INVIO - SHEET_GAP,
_forzata = A_FORZATA - SHEET_GAP,
_numero = A_NUMERO - SHEET_GAP,
_datareg = A_DATAREG - SHEET_GAP,
_tipocf = A_TIPOCF - SHEET_GAP,
_codcf = A_CODCF - SHEET_GAP,
_occas = A_OCFPI - SHEET_GAP,
_ragsoc = A_RAGSOC - SHEET_GAP,
_rfso = A_RFSO - SHEET_GAP,
_ragsocrfso = A_RAGSOCRFSO - SHEET_GAP,
_codnum = A_TIPODOC - SHEET_GAP,
_codnumAE = A_TIPODOCAE - SHEET_GAP,
_numdoc = A_NUMDOC - SHEET_GAP,
_datadoc = A_DATADOC - SHEET_GAP,
_natura = A_NATURA - SHEET_GAP,
_aliquota = A_ALIQUOTA - SHEET_GAP,
_detraibile = A_DETRAIB - SHEET_GAP,
_imponibile = A_IMPONIBILE - SHEET_GAP,
_importoIVA = A_IMPOSTA - SHEET_GAP, // Imposta è già preso
_reverse = A_REVERSE - SHEET_GAP,
_autofatt = A_AUTOFATT - SHEET_GAP,
_paiv = A_PAIV - SHEET_GAP,
_codfis = A_COFI - SHEET_GAP,
_coderr = A_CODERR - SHEET_GAP
};
/////////////////////////////////////////////////////////////////////////////////////
// Utilities
/////////////////////////////////////////////////////////////////////////////////////
// Da un id ritorna il tipo doc corrispondente
TString getTipoDoc(int id);
int getTipoDoc(TString id);
// Cerca una stringa all'interno di una SLIST (Potrebbe diventare una funzione di XVT.h)
static SLIST_ELT xvt_slist_find_str(SLIST list, const char* str);
// Aggiorna il file dst se più vecchio di src (Potrebbe diventare una funzione di XVT.h)
bool xvt_fsys_fupdate(const char* src, const char* dst);
// Decodifica il tipo di documento per il trasferimento fatture
const char * decodTipo(TToken_string* strarr);
// Salvo un singolo record
//bool saveRec(TToken_string row, bool esportato = false);
// Ritorno una data in formato ANSI
inline TDate toDate(const char * date) { return TDate(date).string(); }
// Salto se la riga non è abilitata
#define IF_IS_ENABLED(strarr) if(strcmp(strarr->get(_invio), FLAG_INVIO) != 0 && strcmp(strarr->get(_invio), FLAG_FORZATO) != 0 && strcmp(strarr->get(_invio), FLAG_INVIATO) != 0) continue;
// Ritorno il carattere senza accento maiuscolo
inline const char * noSpecial(char a);
// Ritorno se è ancora valida la bolla doganale senza informazioni fornitore
bool bd2017();
/////////////////////////////////////////////////////////////////////////////////////
// TFp_record
/////////////////////////////////////////////////////////////////////////////////////
// Connessione a db
SSimple_query& db()
{
SSimple_query * _db = nullptr;
if (_db == nullptr)
_db = new SSimple_query();
return *_db;
}
// Contenitore di campi di un record di database MSSQL
class TFp_record : public TObject
{
TString8 _table;
TToken_string _key;
TAssoc_array _fields;
protected:
void copy(const TFp_record& rec) { _table = rec._table; _key = rec._key; _fields = rec._fields; }
const TString& var2str(const TString& fld, const TVariant& var) const;
public:
void reset() { _fields.destroy(); }
void set(const char* fld, const TVariant& var);
void set(const char* fld, long var);
void set(const char* fld, const char* var);
void set(const char* fld, const real& var);
void set(const char* fld, const TString& var);
void set(const char* fld, const TDate& var);
void set(const char* fld, bool var);
const TVariant& get(const char* fld) const;
bool insert();
bool remove();
bool search();
bool search(const char* k1, const char* k2 = NULL, const char* k3 = NULL);
virtual TObject* dup() const { return new TFp_record(*this); }
virtual bool ok() const { return _table.not_empty(); }
TFp_record& operator=(const TFp_record& rec) { copy(rec); return *this; }
TFp_record(const TFp_record& rec) { copy(rec); }
TFp_record(const char* table);
};
/////////////////////////////////////////////////////////////////////////////////////
// TFp_cursors
/////////////////////////////////////////////////////////////////////////////////////
/*
* Classe per la gestione di RMOVIVA, MOV, TFCUST
*/
class TFp_cursors : TObject
{
friend class TCursor;
TISAM_recordset* c_rmoviva;
TISAM_recordset* c_trasfatt;
bool _newMov;
bool _newCust;
// Se trovo un record custom devo saltare tutti quelli che trovo successivamente, per fare ciò utilizzo una TToken_string
TToken_string _alqCust;
TRectype _next(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento
TRectype _nextCust(return_code& code, TString& tipocf, TString& codcf, TString& ocfpi); // Si sposta avanti di un elemento tra quelli custom
bool checkEnabled(TISAM_recordset* origCur);
public:
//TFp_cursors();
~TFp_cursors();
long int getIvaItems() { return c_rmoviva->items(); }
long int getIvaPos() { return c_rmoviva->cursor()->pos(); }
TRectype getIva() { return c_rmoviva->cursor()->curr(); }
int next(TAssoc_array& recimposte, bool& ok, TString& tipocf, TString& codcf, TString& ocfpi); // Legge tutto il prossimo movimento, in importi mette per ogni codiva la somma
int updateFilters(const char tipocf, const long codcf, TDate dal, TDate al, int cod = toSend);
};
/////////////////////////////////////////////////////////////////////////////////////
// TFp_mask
/////////////////////////////////////////////////////////////////////////////////////
class TFp_mask : public TAutomask
{
friend class TFp_cursors;
TMaskmode _mode;
bool _sheet_dirty;
bool _filter_changed;
protected:
virtual void next_page(int p);
TRecnotype nuovo_progr() const;
void changeInvio(TString tipocf, TString codcf, TString numdoc, TString invio) const;
virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
void openJava();
public:
void setFilterChanged() { _filter_changed = true; }
void load_sheet();
TFp_mask(TString msk);
~TFp_mask();
// Carico i tipi documento all'inizio
void loadConfig();
// Salvo i tipi documento
void saveConfig();
// Salvo tutti i records
bool saveAll();
// Controllo tutti i records
bool checkAll();
// Testo validità record
bool checkRec(TPrinter* stampa, TToken_string* rec);
// Controllo che siano presenti records
bool checkNotEmpty();
// Controllo finale prima di inviare il tutto, se ci sono fatture
// con più volte lo stesso codice aliquota disabilito il precedente
void theFinalCheckDown();
// Mette il flag di invio = [flag] per la riga numero [nrow]
void flagRow(int nrow, TString flag);
// Salto se la riga ha un tipo invio non del filtro
bool checkInvio(const TString& invio);
};
// Funzione inline di stampa
inline void printError(TPrinter* stampa, TString movimento, TString documento, TString msgerr);
TFp_mask& msk();
/////////////////////////////////////////////////////////////////////////////////////
// TFp_app
/////////////////////////////////////////////////////////////////////////////////////
struct clifoDoc
{
long contCliFo;
long countDoc;
std::map<TString, long> docID;
};
class TFp_app : public TSkeleton_application
{
TAnagrafica _ditta;
TString16 _cofi;
TFilename _dbname;
TLog_report* _log;
TString _logTFF;
bool _append;
TString myrfso;
static long header;
// Solitamente nei programmi di campo cerco di sfruttare le classi interne ma per mancanza di tempo sono costretto a usare l'std::vector
std::map<TString, clifoDoc> mCliDoc;
private:
int parse_line(const TString& line, TString& var, TString& val) const;
bool create_table(TScanner& TFF, const TString& table);
TString getKey(TToken_string* strarr);
TString getHeader(TToken_string* strarr);
TString getBody(TToken_string* strarr, bool add = true);
bool tff0100(TSheet_field& sheet); // Header esportazione
bool tff0200(TString key); // Anagrafica ditta
bool tff0300(TString key, TRectype r_ana); // Rappresentante fiscale ditta
bool tff0400(TSheet_field& sheet); // Anagrafica clifo
bool tff0700(TSheet_field& sheet); // Testata documento
bool tff2200(TToken_string* strarr, int nriga); // Riepilogo aliquote
bool tff3100(TToken_string* strarr, TRectype r_ana); // Rappresentante fiscale clifo
bool setEsportato(TSheet_field& sheet);
bool emptyTables(TString key); // Cancella da tutte le tabelle i record con chiave key
protected:
void log(int severity, const char* msg);
bool show_log();
bool syncronizeDB();
bool verifyDB(const bool create);
public:
virtual bool create();
virtual bool destroy();
virtual void main_loop();
bool send(TFp_mask* msk);
TFp_app() : _log(NULL) {}
};
#endif

View File

@ -12,8 +12,6 @@
#include "fp0.h"
#include "fp0300a.h"
#include <memory>
#include <map>
/////////////////////////////////////////////////////////////////////////////////////
// Globals
@ -363,7 +361,6 @@ void TPA_mask::next_page(int p)
{
TSheet_field& sf = sfield(F_DOCS);
fill();
sf.force_update();
_filter_changed = false;
}
}
@ -451,6 +448,9 @@ void TDoc2Paf::main_loop()
ndocs = 0;
FOR_EACH_ARRAY_ROW(sht, r, riga)
{
if (!pi.add_status(1))
break;
if (riga->starts_with("X"))
{
const int anno = riga->get_int(mask.sfield(F_DOCS).cid2index(S_ANNO));
@ -472,8 +472,6 @@ void TDoc2Paf::main_loop()
ndocs++;
}
}
if (!pi.add_status(1))
break;
}
}
if (ndocs > 0)

View File

@ -851,7 +851,7 @@ const TString& TDoc_fp::converti_prezzo(const real& prezzo) const
{
TCurrency app(prezzo, _doc_cambio._cod_val, _doc_cambio._cambio, true);
app.change_to_euro_val();
ret << app.get_num().stringa_eng(0,8);
ret << app.get_num().string(0,8);
}
else
ret << prezzo;
@ -1501,10 +1501,11 @@ bool TDoc_fp::doc_to_paf(TDocumentoEsteso& doc)
// <DatiRitenuta>
if (sp.tipo_ritenuta() == 'F')
{
paf0700f.set("P7_TIPORITENUTA", cliente.fisica() ? "RT01" : "RT02");
paf0700f.set("P7_IMPORTORIT", converti_prezzo(doc.imponibile() * sp.perc() / CENTO));
paf0700f.set("P7_ALIQUOTARIT", TCodiceIVA(sp.cod_iva()).percentuale());
paf0700f.set("P7_CAUSPAGAM", cache().get("CA7", to_tstring(sp.caus_770()), "S2"));
paf0700f.set("P7_TIPORITENUTA", cliente.fisica() ? "RT01" : "RT02");
paf0700f.set("P7_IMPORTORIT", converti_prezzo(doc.imponibile() * sp.perc() / CENTO));
paf0700f.set("P7_ALIQUOTARIT", TCodiceIVA(sp.cod_iva()).percentuale());
static TString caus770; caus770.cut(0); caus770.format("%02d", sp.caus_770());
paf0700f.set("P7_CAUSPAGAM", cache().get("CA7", caus770, "S2"));
}
// </DatiRitenuta>
}

View File

@ -4,4 +4,5 @@ Picture = <cg01>
Module = fp
Flags = ""
Item_01 = "Configurazione", "fp0 -0", ""+
Item_02 = "Invio fatture", "fp0 -2", ""
Item_02 = "Invio fatture", "fp0 -2", ""
Item_03 = "Inserimento riferimenti C/F", "fp0 -1", ""

View File

@ -13,6 +13,7 @@
#include <treectrl.h>
#include <urldefid.h>
#include <utility.h>
#include <xvtdb.h>
static int txt_sort(const TSortable& o1, const TSortable& o2, void* jolly)
{
@ -471,7 +472,7 @@ TInfo_mask::TInfo_mask() : TProperty_sheet(TR("Informazioni"))
}
TFilename temp; temp.tempdir();
TString strdb, strsql;
TString strdb, strsql, strsqlapi = SQLAPIV;
{
TISAM_recordset rs("");
strdb = rs.driver_version();
@ -555,6 +556,7 @@ TInfo_mask::TInfo_mask() : TProperty_sheet(TR("Informazioni"))
add_prop(TR("Libreria GUI"), strwx);
add_prop(TR("Libreria PDF"), printer);
add_prop(TR("Libreria SQL"), strsql);
add_prop(TR("Libreria SQLAPI"), strsqlapi);
add_prop(TR("Libreria Matematica"), "GreenLeaf Library");
#ifdef _MSC_VER
@ -567,11 +569,11 @@ TInfo_mask::TInfo_mask() : TProperty_sheet(TR("Informazioni"))
else
{
// 1900 -> 14, 1910 -> 15
cver = _MSC_VER;
cver = _MSC_VER / 100 - 5 + _MSC_VER % 100 / 10;
csub = _MSC_VER % 100 % 10; // Is that a thing?
}
add_prop(TR("Libreria C++"), format("Microsoft Visual Studio %d.%d", cver, csub));
TString msg = "Microsoft Visual Studio"; msg << cver << "." << csub;
add_prop(TR("Libreria C++"), msg);
#endif
set_read_only();

View File

@ -1285,13 +1285,6 @@ const char* real::stringa (int len, int dec, char pad) const
return str;
}
// Certified 99%
const char* real::stringa_eng(int len, int dec, char pad) const
{
char* str = const_cast<char*>(string(len, dec, pad));
return str;
}
// Certified 99%
const char* real::stringe(int len, int dec, char pad) const
{

View File

@ -115,9 +115,6 @@ public:
// @cmember Trasforma un reale in stringa (chiama <mf real::string>), ma
// ritorna il formato italiano
const char* stringa(int len = 0, int dec = UNDEFINED, char pad = ' ') const;
// @cmember Trasforma un reale in stringa (chiama <mf real::string>), ma
// ritorna il formato inglese
const char* stringa_eng(int len = 0, int dec = UNDEFINED, char pad = ' ') const;
// @cmember Trasforma un reale in stringa (chiama <mf real::string>),
//ma ritorna il formato atteso da Excel
const char* stringe(int len = 0, int dec = UNDEFINED, char pad = ' ') const;