Generazione fatture + nAC di nolo invece del viceversa

git-svn-id: svn://10.65.10.50/branches/R_10_00@22861 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2013-05-27 12:01:21 +00:00
parent 5a65876e44
commit cb52f86f76
3 changed files with 85 additions and 67 deletions

View File

@ -491,7 +491,7 @@ bool THardy_elab_docs::elabora_contratti(TDocumento& curr_doc, TArray& contratti
bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
TAssoc_array& nac_nolo, TLog_report& log)
TAssoc_array& fat_nolo, TLog_report& log)
{
if (contratti_cliente.empty())
return false;
@ -552,7 +552,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
cod_riga = codspesa;
}
const TDate datadoc = mask.get(F_DATAELAB);
const TDate datadoc = mask.get(tipo_contratto == 'N' ? F_DATANOLO : F_DATAELAB);
const int anno = datadoc.year();
//solo in caso di elaborazione definitiva si scrivono NAC di tipo D;
//sennò di tipo P, che sono uccidibili all'inizio di ogni nuova elaborazione
@ -567,7 +567,24 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
nac.put(DOC_CODAG, codage);
nac.put(DOC_CODPAG, contratto.get(DOC_CODPAG));
nac.put(DOC_DOC1, contratto.get(DOC_DOC1));
nac.put(DOC_DATADOCRIF, contratto.get(DOC_DATADOCRIF));
TToken_string cnkey; // Chiave contratto
cnkey.add(contratto.get(DOC_PROVV));
cnkey.add(contratto.get(DOC_ANNO));
cnkey.add(contratto.get(DOC_CODNUM));
cnkey.add(contratto.get(DOC_NDOC));
TToken_string* fatkey = (TToken_string*)fat_nolo.objptr(cnkey);
if (fatkey != NULL)
{
// Skip fatkey->get(0) = PROVV
nac.put(DOC_ANNORIF, fatkey->get(1));
nac.put(DOC_CODNUMRIF, fatkey->get());
nac.put(DOC_NUMDOCRIF, fatkey->get());
nac.put(DOC_DATADOCRIF, fatkey->get());
}
else
nac.put(DOC_DATADOCRIF, contratto.get(DOC_DATADOCRIF));
// RIGHE
@ -677,7 +694,6 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
}
}
// salvataggi vari
// ---------------
// NAC
@ -718,20 +734,14 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
}
break;
case 'N':
{
TToken_string nakey; // Chiave NAC
nakey.add(provv);
nakey.add(anno);
nakey.add(nac_codnum);
nakey.add(nac.get(DOC_NDOC));
TToken_string cnkey; // Chiave contratto
cnkey.add(contratto.get(DOC_PROVV));
cnkey.add(contratto.get(DOC_ANNO));
cnkey.add(contratto.get(DOC_CODNUM));
cnkey.add(contratto.get(DOC_NDOC));
nac_nolo.add(cnkey, nakey); // memorizza la coppia contratto/nac di nolo
if (fatkey != NULL)
{
const char provv = fatkey->get_char(0);
const int anno = fatkey->get_int();
const char* codnum = fatkey->get();
const long ndoc = fatkey->get_long();
const TDocumento fat(provv, anno, codnum, ndoc);
genera_eff(fat, nac.totale_doc(), log);
}
break;
default:
@ -761,7 +771,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
return true;
}
bool THardy_elab_docs::genera_fat(const TMask& mask, TContratto_premi& contratto, TToken_string& nac_nolo, TLog_report& log)
bool THardy_elab_docs::genera_fat(const TMask& mask, TContratto_premi& contratto, TToken_string& fat_nolo, TLog_report& log)
{
//si informa se l'elaborazione è definitiva o meno
const char provv = mask.get_bool(F_DEFINITIVO) ? 'D' : 'P';
@ -835,23 +845,11 @@ bool THardy_elab_docs::genera_fat(const TMask& mask, TContratto_premi& contratto
(const char*)fat_codnum, (const char*)fat_tipodoc, fat.get_char(DOC_PROVV), fat.get_long(DOC_NDOC));
log.log(0, log_msg);
real tot_nac;
if (!nac_nolo.empty_items())
{
const char provv = nac_nolo.get(0)[0];
const int anno = nac_nolo.get_int();
const TString4 codnum = nac_nolo.get();
const long ndoc = nac_nolo.get_long();
TDocumento nac(provv, anno, codnum, ndoc);
nac.put(DOC_DATADOCRIF, fat.get(DOC_DATADOC));
nac.put(DOC_CODNUMRIF, fat.get(DOC_CODNUM));
nac.put(DOC_ANNORIF, fat.get(DOC_ANNO));
nac.put(DOC_NUMDOCRIF, fat.get(DOC_NDOC));
nac.rewrite();
tot_nac = nac.totale_doc();
}
genera_eff(fat, tot_nac, log);
fat_nolo = fat.get(DOC_PROVV);
fat_nolo.add(fat.get(DOC_ANNO));
fat_nolo.add(fat.get(DOC_CODNUM));
fat_nolo.add(fat.get(DOC_NDOC));
fat_nolo.add(fat.get(DOC_DATADOC));
}
else
{
@ -921,10 +919,31 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
long old_codcf = 0L;
//array con l'insieme dei contratti e dei documenti elaborati per un singolo cliente!
TArray contratti_cliente, documenti_cliente;
TAssoc_array nac_nolo;
TAssoc_array fat_nolo;
const int tc = mask.get_int(F_TIPOCONTR); // 0x7 (tutti tranne nolo) o 0x8 (solo nolo)
if (tc & 0x8) // Elaborazione nolo?
{
// Elabora tutti i contratti di nolo per generare fatture ed effetti
const int cn = find_contratti_cliente(mask.get_long(F_CODCF), mask, 0x8, contratti_cliente);
FOR_EACH_ARRAY_ROW(contratti_cliente, n_nolo, r_nolo)
{
TContratto_premi& contratto = *(TContratto_premi*)r_nolo;
TToken_string fatkey;
if (genera_fat(mask, contratto, fatkey, log))
{
TToken_string cnkey; // Chiave contratto
cnkey.add(contratto.get(DOC_PROVV));
cnkey.add(contratto.get(DOC_ANNO));
cnkey.add(contratto.get(DOC_CODNUM));
cnkey.add(contratto.get(DOC_NDOC));
fat_nolo.add(cnkey, fatkey);
}
}
}
//giro sulle fatture (è il giro di più alto livello che viene esteso all'interno delle elabora_contratti)
for (bool ok = fatture.move_first(); ok; ok = fatture.move_next())
{
@ -937,21 +956,32 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
{
//generazione NAC del cliente precedente (una per contratto cliente)
if (old_codcf > 0 && !documenti_cliente.empty())
genera_nac(mask, contratti_cliente, nac_nolo, log);
genera_nac(mask, contratti_cliente, fat_nolo, log);
//aggiorna old_codcf in modo da poter controllare i contratti solo al cambio codcf
old_codcf = codcf;
const int n_contratti = find_contratti_cliente(codcf, mask, tc, contratti_cliente);
TString8 key; key.format("C|%ld", codcf);
TString msg; msg << TR("Cliente") << ' ' << codcf << ' ' << cache().get(LF_CLIFO, key, CLI_RAGSOC);
log.log(0, msg);
const int n_contratti = find_contratti_cliente(codcf, mask, tc, contratti_cliente);
if (n_contratti == 0)
if (n_contratti > 0)
{
TString msg;
msg << TR("Il cliente non ha un contratto valido nel periodo selezionato pur avendo fatture.");
log.log(1, msg);
log.log(0, msg);
}
else
{
if (tc & 0x8) // Elaborazione nolo?
{
// Nulla di grave se non esistono contratti di nolo
}
else
{
log.log(0, msg);
msg = TR("Non ha un contratto valido nel periodo selezionato pur avendo fatture.");
log.log(1, msg);
}
}
}
@ -971,7 +1001,7 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
//generazione NAC dell'ultimo cliente (una per contratto cliente)
if (!contratti_cliente.empty())
genera_nac(mask, contratti_cliente, nac_nolo, log);
genera_nac(mask, contratti_cliente, fat_nolo, log);
//se elaborazione definitiva -> cambia lo stato ai documenti di vendita elaborati, mettendolo uguale..
//..a quello deciso in configurazione
@ -986,26 +1016,6 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
fattura.rewrite();
}
}
if (tc & 0x8) // Elaborazino nolo?
{
// Elabora tutti i contratti di nolo per generare fatture ed effetti
const int cn = find_contratti_cliente(mask.get_long(F_CODCF), mask, 0x8, contratti_cliente);
FOR_EACH_ARRAY_ROW(contratti_cliente, n_nolo, r_nolo)
{
TContratto_premi& contratto = *(TContratto_premi*)r_nolo;
TToken_string cnkey; // Chiave contratto
cnkey.add(contratto.get(DOC_PROVV));
cnkey.add(contratto.get(DOC_ANNO));
cnkey.add(contratto.get(DOC_CODNUM));
cnkey.add(contratto.get(DOC_NDOC));
const TToken_string* nk = (const TToken_string*)nac_nolo.objptr(cnkey);
TToken_string nakey = nk ? *nk : EMPTY_STRING;
genera_fat(mask, contratto, nakey, log);
}
}
}
//metodo di alto livello con i punti principali del programma (come da analisi...)
@ -1055,3 +1065,4 @@ int ha0500 (int argc, char* argv[])
elabapp.run(argc, argv, TR("Generazione NAC"));
return 0;
}

View File

@ -13,3 +13,4 @@
#define F_DATAELAB 214
#define F_DEFINITIVO 215
#define F_KILLPROVV 216
#define F_DATANOLO 217

View File

@ -81,16 +81,22 @@ END
BOOLEAN F_KILLPROVV
BEGIN
PROMPT 2 8 "Eliminare tutte le note di accredito provvisorie"
PROMPT 2 8 "Elimina note di accredito provvisorie"
END
DATE F_DATAELAB
BEGIN
PROMPT 43 7 "Data elaborazione "
PROMPT 45 7 "Data elaborazione "
FLAGS "A"
CHECKTYPE REQUIRED
END
DATE F_DATANOLO
BEGIN
PROMPT 45 8 "Data NAC nolo "
FLAGS "A"
CHECKTYPE REQUIRED
END
RADIOBUTTON F_TIPOCONTR 1 76
BEGIN