Patch level : 12.0 1076

Files correlati     : ve0.exe ve1.exe ve5.exe ve6.exe fp0.exe li0300a.msk lv2.exe
Commento        :
In fatturazione bolle scritto il cliente originale della fattura nel campo CFORIG quando uso il cliente FATTURARE A per poterlo recuperae nelle lettere d'intento
In configurazione delle lettere d'intento c'è il parametro "Uitlizza il cliente originale nelle fatture" per attivare il meccanismo.
This commit is contained in:
Alessandro Bonazzi 2021-09-08 16:46:02 +02:00
parent 6d4be4fadb
commit 7835079aae
3 changed files with 73 additions and 74 deletions

View File

@ -6,7 +6,7 @@
#include <relapp.h> #include <relapp.h>
#include <urldefid.h> #include <urldefid.h>
#include "../cg/cglib01.h" #include "../cg/cglib.h"
#include "lvcondv.h" #include "lvcondv.h"
#include "lvrcondv.h" #include "lvrcondv.h"

View File

@ -246,9 +246,9 @@ END
STRING F_NUM_G 4 STRING F_NUM_G 4
BEGIN BEGIN
PROMPT 2 16 "Numerazione " PROMPT 2 16 "Numerazione"
FIELD #CODNUM_G FIELD #CODNUM_G
FLAGS "H" FLAGS "D"
END END

View File

@ -9,7 +9,7 @@
#include "../pr/agenti.h" #include "../pr/agenti.h"
#include "../pr/percprov.h" #include "../pr/percprov.h"
#include "../cg/cfban.h" #include "../cg/cfban.h"
#include "../cg/cglib03.h" #include "../cg/cglib.h"
#include "comuni.h" #include "comuni.h"
#include "lvcondv.h" #include "lvcondv.h"
@ -1212,7 +1212,7 @@ void TFatturazione_lavanderie::post_process(TLista_documenti& doc_out, TLista_do
if (row_has_02) if (row_has_02)
{ {
const TString key = format("%04d%04d", doc.get_int("FATID"), rdoc.get_int(RDOC_IDRIGA)); const TString key = format("%04d%04d", doc.get_int(DOC_FATID), rdoc.get_int(RDOC_IDRIGA));
real new_qta = real_qta; real new_qta = real_qta;
TCalc_02_data * data = (TCalc_02_data *) _output_rows_02.objptr(key); TCalc_02_data * data = (TCalc_02_data *) _output_rows_02.objptr(key);
@ -1418,6 +1418,10 @@ void TFatturazione_lavanderie::post_process(TLista_documenti& doc_out, TLista_do
if (new_cli > 0L) if (new_cli > 0L)
{ {
TToken_string cf_orig = tipocf;
cf_orig.add(act_cli);
doc.put(DOC_CFORIG, cf_orig);
doc.put(DOC_CODCF, new_cli); doc.put(DOC_CODCF, new_cli);
key = tipocf; key = tipocf;
key.add(new_cli); key.add(new_cli);
@ -1583,7 +1587,7 @@ TRiga_documento& TFatturazione_lavanderie::find_or_create_row(TDocumento& doc_ou
if (fatt_02()) if (fatt_02())
{ {
doc_out.set_row_ids(); doc_out.set_row_ids();
const TString key = format("%04d%04d", doc_out.get_int("FATID"), doc_out[r].get_int(RDOC_IDRIGA)); const TString key = format("%04d%04d", doc_out.get_int(DOC_FATID), doc_out[r].get_int(RDOC_IDRIGA));
TCalc_02_data * data = (TCalc_02_data *) _output_rows_02.objptr(key); TCalc_02_data * data = (TCalc_02_data *) _output_rows_02.objptr(key);
if (data == NULL) if (data == NULL)
@ -2178,21 +2182,22 @@ void TFatturazione_lav_app::main_loop()
_msk = new TFatturazione_msk(); _msk = new TFatturazione_msk();
_msk->show(F_SAVEDATA, lv_is_02_active()); _msk->show(F_SAVEDATA, lv_is_02_active());
while (_msk->run()!= K_QUIT) while (_msk->run() != K_QUIT)
{ {
_solototali = _msk->get_bool(F_SOLOTOTALI); _solototali = _msk->get_bool(F_SOLOTOTALI);
const int annoes = _msk->get_date(F_DATAFAT).year(); const int annoes = _msk->get_date(F_DATAFAT).year();
if (!controlli_preliminari()) if (!controlli_preliminari())
{ {
TString str; TString str;
str << "Prima di poter eseguire la fatturazione è necessario correggere tutti gli errori segnalati.\n" str << "Prima di poter eseguire la fatturazione è necessario correggere tutti gli errori segnalati.\n"
<< "Si prega di controllare i dati di configurazione."; << "Si prega di controllare i dati di configurazione.";
warning_box(str); warning_box(str);
return; return;
} }
_log = new TLog_report(TR("Fatturazione")); _log = new TLog_report(TR("Fatturazione"));
if (_msk->get_bool(F_SAVEDATA)) if (_msk->get_bool(F_SAVEDATA))
{ {
TFilename src = firm2dir(-1); TFilename src = firm2dir(-1);
@ -2200,11 +2205,13 @@ void TFatturazione_lav_app::main_loop()
copy_tree(src, dst); copy_tree(src, dst);
} }
//leggo i dati di primo interesse //leggo i dati di primo interesse
const TString4 mskzona = _msk->get(F_CODZONA); const TString4 mskzona = _msk->get(F_CODZONA);
const TString4 mskcat = _msk->get(F_CODCATC); const TString4 mskcat = _msk->get(F_CODCATC);
//preparo le date estremi (dal - al) della query e l'anno dell'esercizio //preparo le date estremi (dal - al) della query e l'anno dell'esercizio
TDate al = _msk->get_date(F_ADATA); TDate al = _msk->get_date(F_ADATA);
//se la data "al" non è corretta, la pongo uguale alla data fattura //se la data "al" non è corretta, la pongo uguale alla data fattura
if (!al.ok()) if (!al.ok())
al = _msk->get_date(F_DATAFAT); al = _msk->get_date(F_DATAFAT);
@ -2212,6 +2219,7 @@ void TFatturazione_lav_app::main_loop()
TDate dal = _msk->get_date(F_DADATA); TDate dal = _msk->get_date(F_DADATA);
//se la data "dal" non è corretta, la pongo uguale a 1/1/annoes //se la data "dal" non è corretta, la pongo uguale a 1/1/annoes
if (!dal.ok()) if (!dal.ok())
{ {
dal.set_day(1); dal.set_day(1);
@ -2246,15 +2254,11 @@ void TFatturazione_lav_app::main_loop()
const TString& fromcod = _msk->get(F_DACODCF); const TString& fromcod = _msk->get(F_DACODCF);
const TString& tocod = _msk->get(F_ACODCF); const TString& tocod = _msk->get(F_ACODCF);
//&&(BETWEEN(DATADOC,#DADATA,#ADATA))&&(STATO==\"2\")&&(TIPODOC==\"B01\")
query << "USE DOC KEY 3 SELECT (TIPOCF==\"C\")&&" query << "USE DOC KEY 3 SELECT (TIPOCF==\"C\")&&"
<< "STR(BETWEEN(CODCF,\"" << fromcod << "\",\"" << tocod << "\"))\n" << "STR(BETWEEN(CODCF,\"" << fromcod << "\",\"" << tocod << "\"))\n"
<< "BY TIPOCF CODCF DATADOC\n" << "BY TIPOCF CODCF DATADOC\n"
<< "FROM DATADOC=#DAL PROVV=D ANNO=" << year << "\n" << "FROM DATADOC=#DAL PROVV=D ANNO=" << year << "\n"
<< "TO DATADOC=#AL PROVV=D ANNO=" << year << "\n"; << "TO DATADOC=#AL PROVV=D ANNO=" << year << "\n";
// query << "USE DOC KEY 2 SELECT BETWEEN(DATADOC,#DADATA,#ADATA)&&STATO==\"2\")&&(TIPODOC==\"B01\")\n"
// << "FROM " << "TIPOCF=C PROVV=D ANNO=#ANNO DATADOC=#DADATA \n"
// << "TO " << "TIPOCF=C PROVV=D ANNO=#ANNO DATADOC=#ADATA \n";
//instanzio il recordset011 //instanzio il recordset011
@ -2276,24 +2280,25 @@ void TFatturazione_lav_app::main_loop()
//TAssoc_array dei clienti per cui ho generato dei documenti //TAssoc_array dei clienti per cui ho generato dei documenti
TAssoc_array cliela; TAssoc_array cliela;
//scorro tutti documenti che la query mi restiuisce //scorro tutti documenti che la query mi restiuisce
for (bool ok = recset.move_first(); ok; ok = recset.move_next())
recset.cursor()->relation()->lfile().set_curr(new TDocumento);
for (bool ok = recset.move_first(); ok && pi->add_status(); ok = recset.move_next())
{ {
//leggo il codcf TDocumento & doc =(TDocumento &) recset.cursor()->curr();
const long clifo = recset.get(DOC_CODCF).as_int(); const TCli_for &cli = cached_clifor('C', doc.get_long(DOC_CODCF));
if (clifo != last_clifo) //preparo la chiave e recupero da CFVEN i dati di quel cliente
if (cli.codice() != last_clifo)
{ {
key.format("C|%ld", clifo); key.format("C|%ld", cli.codice());
TString str; TString str;
str << TR("Cliente") << ' ' << clifo << ' ' << cache().get(LF_CLIFO, key, CLI_RAGSOC); str << TR("Cliente") << ' ' << cli.codice() << ' ' << cache().get(LF_CLIFO, key, CLI_RAGSOC);
pi->set_text(str); pi->set_text(str);
last_clifo=clifo; last_clifo = cli.codice();
} }
if (!pi->add_status())
break;
//se non è l'ultimo cliente, allora: //se non è l'ultimo cliente, allora:
if (clifo != lastcli) if (cli.codice() != lastcli)
{ {
//se effettivamente devo elaborare delle bolle per questo cliente, allora: //se effettivamente devo elaborare delle bolle per questo cliente, allora:
if (docsin.items() > 0) if (docsin.items() > 0)
@ -2339,24 +2344,19 @@ void TFatturazione_lav_app::main_loop()
docsin.rewrite(); docsin.rewrite();
docsin.destroy(-1); docsin.destroy(-1);
} }
lastcli = clifo; lastcli = cli.codice();
} }
//preparo la chiave e recupero da CFVEN i dati di quel cliente
key.format("C|%ld", clifo);
const TRectype& clienti = cache().get(LF_CFVEN,key);
const TRectype& docrec = recset.cursor()->curr();
const TRectype& clirec = cache().get(LF_CLIFO,key);
//se il documento che sto analizzando è corretto, allora: //se il documento che sto analizzando è corretto, allora:
bool cliok = elab.is_document_ok(docrec); bool cliok = elab.is_document_ok(doc);
if (cliok) if (cliok)
{ {
//se il codice di zona è pieno, allora: //se il codice di zona è pieno, allora:
if (mskzona.full()) if (mskzona.full())
{ {
//leggo il codice di zona standard di quel cliente e lo confronto con quello della maschera (V o F) //leggo il codice di zona standard di quel cliente e lo confronto con quello della maschera (V o F)
const TString& codzona = clienti.get(CFV_CODZONA); const TString& codzona = cli.vendite().get(CFV_CODZONA);
cliok = (codzona == mskzona); cliok = (codzona == mskzona);
} }
@ -2364,15 +2364,16 @@ void TFatturazione_lav_app::main_loop()
if (cliok && mskcat.full()) if (cliok && mskcat.full())
{ {
//leggo il codice categoria economica standard di quel cliente e lo confronto con quello della maschera (V o F) //leggo il codice categoria economica standard di quel cliente e lo confronto con quello della maschera (V o F)
const TString& codcat = clienti.get(CFV_CODCATC); const TString& codcat = cli.vendite().get(CFV_CODCATC);
cliok = (codcat == mskcat); cliok = (codcat == mskcat);
} }
} }
else else
if (!_solototali && elab.is_document_compatible(docrec) && docrec.get(DOC_STATO) < stato_min) if (!_solototali && elab.is_document_compatible(doc) && doc.get(DOC_STATO) < stato_min)
{ {
TString msg; TString msg;
msg << "Cli. " << clifo << ' ' << clirec.get(CLI_RICALT) << " Bolla n. " << docrec.get(DOC_NDOC) << " del " << docrec.get(DOC_DATADOC) << " in stato " << docrec.get(DOC_STATO);
msg << "Cli. " << cli.codice() << ' ' << cli.get(CLI_RICALT) << " Bolla n. " << doc.get(DOC_NDOC) << " del " << doc.get(DOC_DATADOC) << " in stato " << doc.get(DOC_STATO);
log(msg); log(msg);
} }
@ -2380,33 +2381,34 @@ void TFatturazione_lav_app::main_loop()
if (cliok) if (cliok)
{ {
//cerco sul contratto qual'è il periodo di fatturazione di quel cliente //cerco sul contratto qual'è il periodo di fatturazione di quel cliente
indsped = recset.get(DOC_CODINDSP).as_int(); indsped = doc.get_int(DOC_CODINDSP);
TLaundry_contract contr(clifo, indsped, datafat);
TLaundry_contract contr(cli.codice(), indsped, datafat);
if(!contr.ok()) if(!contr.ok())
{ {
TString msg; TString msg;
msg << TR("Non ci sono contratti in essere per il cliente ") << clifo << " " << clirec.get(CLI_RICALT) << TR(" in data ") << datafat.string();
msg << TR("Non ci sono contratti in essere per il cliente ") << cli.codice() << " " << cli.get(CLI_RICALT) << TR(" in data ") << datafat.string();
log(msg); log(msg);
continue; continue;
} }
const int contrper = contr.get_int(LVCONDV_PERFAT); const int contrper = contr.get_int(LVCONDV_PERFAT);
//se il cliente non è sospeso e se si è nel periodo di fatturazione giusto, aggiungo il documento alla //se il cliente non è sospeso e se si è nel periodo di fatturazione giusto, aggiungo il documento alla
//lista dei documenti da elaborare //lista dei documenti da elaborare
if (!contr.get_bool(LVCONDV_FATTSOSP) && contrper <= period) if (!contr.get_bool(LVCONDV_FATTSOSP) && contrper <= period)
{ {
TDocumento * doc = new TDocumento(recset.cursor()->curr());
// if (aggcli && !_solototali && doc->get(DOC_CODNUM) == num_buoni && doc->tipo().codice() == tipo_buoni) // if (aggcli && !_solototali && doc->get(DOC_CODNUM) == num_buoni && doc->tipo().codice() == tipo_buoni)
if (aggcli && !_solototali) if (aggcli && !_solototali)
{ {
bool doc_updated = false; bool doc_updated = false;
// banche // banche
key.cut(0); key.cut(0);
key.add(clirec.get(CLI_TIPOCF)); key.add(cli.get(CLI_TIPOCF));
key.add(clirec.get(CLI_CODCF)); key.add(cli.get(CLI_CODCF));
key.add("V"); key.add("V");
key.add("1"); key.add("1");
@ -2417,9 +2419,9 @@ void TFatturazione_lav_app::main_loop()
if (cfban.empty()) if (cfban.empty())
{ {
abi = clirec.get(CLI_CODABI); abi = cli.get(CLI_CODABI);
cab = clirec.get(CLI_CODCAB); cab = cli.get(CLI_CODCAB);
iban = clirec.get(CLI_IBAN); iban = cli.get(CLI_IBAN);
} }
else else
{ {
@ -2435,8 +2437,8 @@ void TFatturazione_lav_app::main_loop()
doc->put(DOC_IBAN, iban); doc->put(DOC_IBAN, iban);
} }
key.cut(0); key.cut(0);
key.add(clirec.get(CLI_TIPOCF)); key.add(cli.get(CLI_TIPOCF));
key.add(clirec.get(CLI_CODCF)); key.add(cli.get(CLI_CODCF));
key.add("N"); key.add("N");
key.add("1"); key.add("1");
@ -2445,8 +2447,8 @@ void TFatturazione_lav_app::main_loop()
if (cfbanpr.empty()) if (cfbanpr.empty())
{ {
abi = clienti.get(CFV_CODABIPR); abi = cli.vendite().get(CFV_CODABIPR);
cab = clienti.get(CFV_CODCABPR); cab = cli.vendite().get(CFV_CODCABPR);
} }
else else
{ {
@ -2486,26 +2488,27 @@ void TFatturazione_lav_app::main_loop()
if (doc_updated) if (doc_updated)
{ {
TString msg(" Cli."); TString msg(" Cli.");
msg << clifo << " " << clirec.get(CLI_RICALT) << "Bolla " << docrec.get(DOC_CODNUM) << ' ' << docrec.get(DOC_TIPODOC)
<< ' ' << docrec.get(DOC_NDOC) << " del " << docrec.get(DOC_DATADOC) << " aggiornata la testata "; msg << cli.codice() << " " << cli.get(CLI_RICALT) << "Bolla " << doc.get(DOC_CODNUM) << ' ' << doc.get(DOC_TIPODOC)
<< ' ' << doc.get(DOC_NDOC) << " del " << doc.get(DOC_DATADOC) << " aggiornata la testata ";
log(msg); log(msg);
} }
} }
for (int r = 1; !_solototali && r <= doc->physical_rows(); r++) for (int r = 1; !_solototali && r <= doc.physical_rows(); r++)
{ {
const TRiga_documento& rdoc = (*doc)[r]; const TRiga_documento& rdoc = doc[r];
const TCodice_articolo codart = rdoc.get(RDOC_CODARTMAG); const TCodice_articolo codart = rdoc.get(RDOC_CODARTMAG);
if (codart.full()) if (codart.full())
{ {
const TRectype & rcont = contr.row(codart); const TRectype & rcont = contr.row(codart);
const TArticolo_lavanderie& art = cached_article_laundry(codart, 'C', clifo, use_indsp ? indsped : 0); const TArticolo_lavanderie& art = cached_article_laundry(codart, 'C', cli.codice(), use_indsp ? indsped : 0);
//estraggo il record corrispondente su LF_CLIFOGIAC //estraggo il record corrispondente su LF_CLIFOGIAC
const TRecmag_lavanderie& rec = art.find_rec(annoes); const TRecmag_lavanderie& rec = art.find_rec(annoes);
TString str; TString str;
str << "Cli." << clifo << ' ' << clirec.get(CLI_RICALT) << " Bolla " << docrec.get(DOC_CODNUM) << ' ' << docrec.get(DOC_TIPODOC) str << "Cli." << cli.codice() << ' ' << cli.get(CLI_RICALT) << " Bolla " << doc.get(DOC_CODNUM) << ' ' << doc.get(DOC_TIPODOC)
<< ' ' << docrec.get(DOC_NDOC) << " del " << docrec.get(DOC_DATADOC) << " art." << codart << " - "; << ' ' << doc.get(DOC_NDOC) << " del " << doc.get(DOC_DATADOC) << " art." << codart << " - ";
if (rec.get_real("DOTOD") < ZERO) if (rec.get_real("DOTOD") < ZERO)
{ {
@ -2521,15 +2524,11 @@ void TFatturazione_lav_app::main_loop()
} }
bool prezzo_nullo = false; bool prezzo_nullo = false;
if (prezzo_da_contratto) if (prezzo_da_contratto)
{ prezzo_nullo = rcont.get_real(LVRCONDV_PREZZO) == ZERO && contr.get_real(LVCONDV_IMPFIX) == ZERO; // Segnalo prezzo nullo solo se il contratto non è ad importo fisso (07/11/2011)
// Segnalo prezzo nullo solo se il contratto non è ad importo fisso (07/11/2011)
prezzo_nullo = rcont.get_real(LVRCONDV_PREZZO).is_zero() && contr.get_real(LVCONDV_IMPFIX).is_zero();
}
else else
{ prezzo_nullo = rdoc.get_real(RDOC_PREZZO) == ZERO; // Prezzo sulla bolla
prezzo_nullo = rdoc.get_real(RDOC_PREZZO).is_zero(); // Prezzo sulla bolla
}
if (prezzo_nullo) if (prezzo_nullo)
{ {
const TString8 causale = rdoc.get(RDOC_CODAGG1); const TString8 causale = rdoc.get(RDOC_CODAGG1);
@ -2547,17 +2546,11 @@ void TFatturazione_lav_app::main_loop()
} }
} }
} }
docsin.add(doc); docsin.add(doc);
} }
} }
} }
safe_delete(pi); // se ho dei documenti in lista li elaboro e poi svuoto le TList_file
// Forzo l'eliminazione
if(pi != NULL)
delete pi;
//se ho dei documenti in lista li elaboro e poi svuoto le TList_file
if (docsin.items() != 0) if (docsin.items() != 0)
{ {
if (ini_get_bool(CONFIG_DITTA, "lv", "RifTest")) if (ini_get_bool(CONFIG_DITTA, "lv", "RifTest"))
@ -2611,9 +2604,15 @@ void TFatturazione_lav_app::main_loop()
switch (numdocgen) switch (numdocgen)
{ {
case 0: str << TR("Non è stata ") << parolasi << TR(" alcuna fattura"); break; case 0:
case 1: str << TR("E' stata ") << parolasi << TR(" una fattura"); break; str << TR("Non è stata ") << parolasi << TR(" alcuna fattura");
default: str << TR("Sono state ") << parolapl << ' ' << numdocgen << TR(" fatture"); break; break;
case 1:
str << TR("E' stata ") << parolasi << TR(" una fattura");
break;
default:
str << TR("Sono state ") << parolapl << ' ' << numdocgen << TR(" fatture");
break;
} }
if (numdocgen <= 0) if (numdocgen <= 0)
warning_box(str); warning_box(str);