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 <urldefid.h>
#include "../cg/cglib01.h"
#include "../cg/cglib.h"
#include "lvcondv.h"
#include "lvrcondv.h"

View File

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

View File

@ -9,7 +9,7 @@
#include "../pr/agenti.h"
#include "../pr/percprov.h"
#include "../cg/cfban.h"
#include "../cg/cglib03.h"
#include "../cg/cglib.h"
#include "comuni.h"
#include "lvcondv.h"
@ -1212,7 +1212,7 @@ void TFatturazione_lavanderie::post_process(TLista_documenti& doc_out, TLista_do
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;
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)
{
TToken_string cf_orig = tipocf;
cf_orig.add(act_cli);
doc.put(DOC_CFORIG, cf_orig);
doc.put(DOC_CODCF, new_cli);
key = tipocf;
key.add(new_cli);
@ -1583,7 +1587,7 @@ TRiga_documento& TFatturazione_lavanderie::find_or_create_row(TDocumento& doc_ou
if (fatt_02())
{
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);
if (data == NULL)
@ -2178,21 +2182,22 @@ void TFatturazione_lav_app::main_loop()
_msk = new TFatturazione_msk();
_msk->show(F_SAVEDATA, lv_is_02_active());
while (_msk->run()!= K_QUIT)
while (_msk->run() != K_QUIT)
{
_solototali = _msk->get_bool(F_SOLOTOTALI);
const int annoes = _msk->get_date(F_DATAFAT).year();
if (!controlli_preliminari())
{
TString str;
str << "Prima di poter eseguire la fatturazione è necessario correggere tutti gli errori segnalati.\n"
<< "Si prega di controllare i dati di configurazione.";
warning_box(str);
return;
}
_log = new TLog_report(TR("Fatturazione"));
if (_msk->get_bool(F_SAVEDATA))
{
TFilename src = firm2dir(-1);
@ -2200,11 +2205,13 @@ void TFatturazione_lav_app::main_loop()
copy_tree(src, dst);
}
//leggo i dati di primo interesse
const TString4 mskzona = _msk->get(F_CODZONA);
const TString4 mskcat = _msk->get(F_CODCATC);
//preparo le date estremi (dal - al) della query e l'anno dell'esercizio
TDate al = _msk->get_date(F_ADATA);
//se la data "al" non è corretta, la pongo uguale alla data fattura
if (!al.ok())
al = _msk->get_date(F_DATAFAT);
@ -2212,6 +2219,7 @@ void TFatturazione_lav_app::main_loop()
TDate dal = _msk->get_date(F_DADATA);
//se la data "dal" non è corretta, la pongo uguale a 1/1/annoes
if (!dal.ok())
{
dal.set_day(1);
@ -2246,15 +2254,11 @@ void TFatturazione_lav_app::main_loop()
const TString& fromcod = _msk->get(F_DACODCF);
const TString& tocod = _msk->get(F_ACODCF);
//&&(BETWEEN(DATADOC,#DADATA,#ADATA))&&(STATO==\"2\")&&(TIPODOC==\"B01\")
query << "USE DOC KEY 3 SELECT (TIPOCF==\"C\")&&"
<< "STR(BETWEEN(CODCF,\"" << fromcod << "\",\"" << tocod << "\"))\n"
<< "BY TIPOCF CODCF DATADOC\n"
<< "FROM DATADOC=#DAL 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
@ -2276,24 +2280,25 @@ void TFatturazione_lav_app::main_loop()
//TAssoc_array dei clienti per cui ho generato dei documenti
TAssoc_array cliela;
//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
const long clifo = recset.get(DOC_CODCF).as_int();
if (clifo != last_clifo)
TDocumento & doc =(TDocumento &) recset.cursor()->curr();
const TCli_for &cli = cached_clifor('C', doc.get_long(DOC_CODCF));
//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;
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);
last_clifo=clifo;
last_clifo = cli.codice();
}
if (!pi->add_status())
break;
//se non è l'ultimo cliente, allora:
if (clifo != lastcli)
if (cli.codice() != lastcli)
{
//se effettivamente devo elaborare delle bolle per questo cliente, allora:
if (docsin.items() > 0)
@ -2339,24 +2344,19 @@ void TFatturazione_lav_app::main_loop()
docsin.rewrite();
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:
bool cliok = elab.is_document_ok(docrec);
bool cliok = elab.is_document_ok(doc);
if (cliok)
{
//se il codice di zona è pieno, allora:
if (mskzona.full())
{
//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);
}
@ -2364,15 +2364,16 @@ void TFatturazione_lav_app::main_loop()
if (cliok && mskcat.full())
{
//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);
}
}
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;
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);
}
@ -2380,33 +2381,34 @@ void TFatturazione_lav_app::main_loop()
if (cliok)
{
//cerco sul contratto qual'è il periodo di fatturazione di quel cliente
indsped = recset.get(DOC_CODINDSP).as_int();
TLaundry_contract contr(clifo, indsped, datafat);
indsped = doc.get_int(DOC_CODINDSP);
TLaundry_contract contr(cli.codice(), indsped, datafat);
if(!contr.ok())
{
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);
continue;
}
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
//lista dei documenti da elaborare
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)
{
bool doc_updated = false;
// banche
key.cut(0);
key.add(clirec.get(CLI_TIPOCF));
key.add(clirec.get(CLI_CODCF));
key.add(cli.get(CLI_TIPOCF));
key.add(cli.get(CLI_CODCF));
key.add("V");
key.add("1");
@ -2417,9 +2419,9 @@ void TFatturazione_lav_app::main_loop()
if (cfban.empty())
{
abi = clirec.get(CLI_CODABI);
cab = clirec.get(CLI_CODCAB);
iban = clirec.get(CLI_IBAN);
abi = cli.get(CLI_CODABI);
cab = cli.get(CLI_CODCAB);
iban = cli.get(CLI_IBAN);
}
else
{
@ -2435,8 +2437,8 @@ void TFatturazione_lav_app::main_loop()
doc->put(DOC_IBAN, iban);
}
key.cut(0);
key.add(clirec.get(CLI_TIPOCF));
key.add(clirec.get(CLI_CODCF));
key.add(cli.get(CLI_TIPOCF));
key.add(cli.get(CLI_CODCF));
key.add("N");
key.add("1");
@ -2445,8 +2447,8 @@ void TFatturazione_lav_app::main_loop()
if (cfbanpr.empty())
{
abi = clienti.get(CFV_CODABIPR);
cab = clienti.get(CFV_CODCABPR);
abi = cli.vendite().get(CFV_CODABIPR);
cab = cli.vendite().get(CFV_CODCABPR);
}
else
{
@ -2486,26 +2488,27 @@ void TFatturazione_lav_app::main_loop()
if (doc_updated)
{
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);
}
}
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);
if (codart.full())
{
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
const TRecmag_lavanderie& rec = art.find_rec(annoes);
TString str;
str << "Cli." << clifo << ' ' << clirec.get(CLI_RICALT) << " Bolla " << docrec.get(DOC_CODNUM) << ' ' << docrec.get(DOC_TIPODOC)
<< ' ' << docrec.get(DOC_NDOC) << " del " << docrec.get(DOC_DATADOC) << " art." << codart << " - ";
str << "Cli." << cli.codice() << ' ' << cli.get(CLI_RICALT) << " Bolla " << doc.get(DOC_CODNUM) << ' ' << doc.get(DOC_TIPODOC)
<< ' ' << doc.get(DOC_NDOC) << " del " << doc.get(DOC_DATADOC) << " art." << codart << " - ";
if (rec.get_real("DOTOD") < ZERO)
{
@ -2521,15 +2524,11 @@ void TFatturazione_lav_app::main_loop()
}
bool prezzo_nullo = false;
if (prezzo_da_contratto)
{
// 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();
}
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)
else
{
prezzo_nullo = rdoc.get_real(RDOC_PREZZO).is_zero(); // Prezzo sulla bolla
}
prezzo_nullo = rdoc.get_real(RDOC_PREZZO) == ZERO; // Prezzo sulla bolla
if (prezzo_nullo)
{
const TString8 causale = rdoc.get(RDOC_CODAGG1);
@ -2547,17 +2546,11 @@ void TFatturazione_lav_app::main_loop()
}
}
}
docsin.add(doc);
}
}
}
// Forzo l'eliminazione
if(pi != NULL)
delete pi;
//se ho dei documenti in lista li elaboro e poi svuoto le TList_file
safe_delete(pi); // se ho dei documenti in lista li elaboro e poi svuoto le TList_file
if (docsin.items() != 0)
{
if (ini_get_bool(CONFIG_DITTA, "lv", "RifTest"))
@ -2611,9 +2604,15 @@ void TFatturazione_lav_app::main_loop()
switch (numdocgen)
{
case 0: str << TR("Non è stata ") << parolasi << TR(" alcuna fattura"); break;
case 1: str << TR("E' stata ") << parolasi << TR(" una fattura"); break;
default: str << TR("Sono state ") << parolapl << ' ' << numdocgen << TR(" fatture"); break;
case 0:
str << TR("Non è stata ") << parolasi << TR(" alcuna fattura");
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)
warning_box(str);