Corretta generazione NAC

git-svn-id: svn://10.65.10.50/branches/R_10_00@22893 c028cbd2-c16b-5b4b-a496-9718f37d4682
This commit is contained in:
guy 2013-09-11 09:46:27 +00:00
parent b085f4b290
commit 7e2e92a480

View File

@ -145,13 +145,13 @@ protected:
//metodi medio livello
bool aggiorna_contratto(const TRiga_documento& rdoc, TContratto_premi& contratto, TLog_report& log);
bool deve_generare_nac(const TContratto_premi& contratto, const TDate& data) const;
bool elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente, const TDate& data_fine, TLog_report& log);
bool genera_nac(const TMask& mask, TArray& contratti_cliente, TAssoc_array& nac_nolo, TLog_report& log);
word elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente, const TDate& data_fine, TLog_report& log);
bool genera_nac(const TMask& mask, TArray& contratti_cliente, TAssoc_array& nac_nolo, TArray& documenti_cliente, TLog_report& log);
bool genera_fat(const TMask& mask, TContratto_premi& contratto, TToken_string& nakey, TLog_report& log);
bool genera_eff(const TDocumento& fat, const real& tot_nac, TLog_report& log);
//metodi basso livello
int find_contratti_cliente(const long codcfatt, const TMask& mask, int flags, TArray& contratti_cliente);
word find_contratti_cliente(const long codcfatt, const TMask& mask, int flags, TArray& contratti_cliente);
void check_date(const TDate& datafine, TDate& dataini);
int find_numerazioni(const TString& tipo_to_elab, TString_array& num_doc);
int month_diff(const TDate& inizio, const TDate& fine) const;
@ -255,8 +255,8 @@ long THardy_elab_docs::genera_recordset(const TMask& mask, TISAM_recordset& recs
//lo stato dipende da quanto sta scritto sulla elaborazione differita (stato iniziale dei docs da considerare)
//viene messo CODNUM nella SELECT perchè, essendoci un range di date nelle chiavi, la numerazione verrebbe ignorata! (provato!)
query << "\nSELECT (STATO>=#STATOINI)";
if (tc != 8) // Per i contratti NON di nolo ...
query << "&&(STATO<'9')"; // ... scarta i documenti definitivi
if (tc != 8) // Per i contratti NON di nolo ...
query << "&&(STATO<#STATOFIN)"; // ... scarta i documenti definitivi
//in base al tipo documento che si deve elaborare (settato in configurazione), ci possono essere più numerazioni da considerare!
TConfig config(CONFIG_DITTA, "ha");
@ -297,7 +297,10 @@ long THardy_elab_docs::genera_recordset(const TMask& mask, TISAM_recordset& recs
//lo stato dei documenti da considerare va a raccatarlo nel config
const TString& stato_ini = config.get("StatoIniFatt");
const TString& stato_fin = config.get("StatoFinFatt");
recset.set_var("#STATOINI", stato_ini);
recset.set_var("#STATOFIN", stato_fin);
//se c'è l'agente specificato...
const TString& agente = mask.get(F_CODAGE);
@ -314,8 +317,9 @@ long THardy_elab_docs::genera_recordset(const TMask& mask, TISAM_recordset& recs
//metodo che riempie un array con tutti i contratti del cliente passatogli (in base alla tipologia di contratti da elaborare)
// flags: 0x7 = tutti tranne nolo; 0x8 = nolo
int THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& mask, int flags, TArray& contratti_cliente)
word THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& mask, int flags, TArray& contratti_cliente)
{
word freq = 0;
contratti_cliente.destroy();
const TDate data_fine_elab = mask.get_date(F_ADATA);
@ -434,10 +438,19 @@ int THardy_elab_docs::find_contratti_cliente(const long codcfatt, const TMask& m
}
if (curr_contratto != NULL) // Ignora contratti chiusi
{
contratti_cliente.add(curr_contratto);
switch (curr_contratto->frequenza())
{
case 'A': freq |= 0x8; break;
case 'S': freq |= 0x4; break;
case 'T': freq |= 0x2; break;
default : freq |= 0x1; break;
}
}
}
}
return contratti_cliente.items();
return freq;
}
int THardy_elab_docs::month_diff(const TDate& inizio, const TDate& fine) const
@ -530,10 +543,13 @@ bool THardy_elab_docs::deve_generare_nac(const TContratto_premi& contratto, cons
//aggiorna, in base al documento in esame curr_doc, le somme restituite nelle righe di tipo verigh02 nei contratti validi..
//..del cliente
bool THardy_elab_docs::elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente, const TDate& data_fine, TLog_report& log)
word THardy_elab_docs::elabora_contratti(TDocumento& curr_doc, TArray& contratti_cliente, const TDate& data_fine, TLog_report& log)
{
const TDate datadoc = curr_doc.get(DOC_DATADOC);
bool elaborato = false;
word elaborato = 0;
TString4 olddoc2 = curr_doc.get(DOC_DOC2); olddoc2.rpad(4); // Quattro spazi o X in corrispondenza dell'elaborazione
TString4 newdoc2 = olddoc2;
FOR_EACH_PHYSICAL_RDOC(curr_doc, r, rdoc) if (rdoc->is_merce()) //giro su tutte le righe merce delle fatture
{
@ -547,29 +563,48 @@ bool THardy_elab_docs::elabora_contratti(TDocumento& curr_doc, TArray& contratti
// Calcola l'inizio di validità dei documenti in base alla frequenza (14-01-2013)
TDate data_inizio(1, 1, data_fine.year());
const int mese = data_fine.month();
int pdef = 0;
switch (contratto.frequenza())
{
case 'M': data_inizio.set_month(mese); break; // Solo contratti NOLO
case 'S': data_inizio.set_month(mese > 6 ? 7 : 1); break;
case 'T': data_inizio.set_month(max(1, mese-2)); break;
default: break;
case 'M': pdef = 0; data_inizio.set_month(mese); break; // Solo contratti NOLO
case 'S': pdef = 2; data_inizio.set_month(mese > 6 ? 7 : 1); break;
case 'T': pdef = 1; data_inizio.set_month(max(1, mese-2)); break;
default : pdef = 3; break;
}
// Elabora solo i documenti che ricadano nell'intervallo valido
if (datadoc >= data_inizio && datadoc <= data_fine)
elaborato |= aggiorna_contratto(*rdoc, contratto, log);
if (datadoc >= data_inizio && datadoc <= data_fine && olddoc2[pdef] <= ' ')
{
if (aggiorna_contratto(*rdoc, contratto, log))
{
switch (contratto.frequenza())
{
case 'A': elaborato |= 0x8; break;
case 'S': elaborato |= 0x4; break;
case 'T': elaborato |= 0x2; break;
default : elaborato |= 0x1; break; // Solo contratti NOLO
}
if (deve_generare_nac(contratto, data_fine))
newdoc2.overwrite("X", pdef, 1);
}
}
} //for(int i..
} //FOR_EACH...
if (newdoc2 != olddoc2)
curr_doc.put(DOC_DOC2, newdoc2);
return elaborato;
}
bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
TAssoc_array& fat_nolo, TLog_report& log)
TAssoc_array& fat_nolo, TArray& documenti_cliente, TLog_report& log)
{
bool una_nac_definitiva = false;
if (contratti_cliente.empty())
return false;
return una_nac_definitiva;
//si informa se l'elaborazione è definitiva o meno
const bool definitivo = mask.get_bool(F_DEFINITIVO);
@ -593,6 +628,8 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
default : break;
}
const bool nac_ok = deve_generare_nac(contratto, data_fine);
TString80 freq = "";
switch (contratto.frequenza())
{
@ -603,7 +640,6 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
default : break;
}
const bool nac_ok = deve_generare_nac(contratto, data_fine);
//segnaliamo l'elaborazione del contratto sul log
TString log_msg;
log_msg.format(FR("Cliente:%ld Contratto:%ld %s %s"), codcf, ndoc, (const char*)tip, (const char*)freq);
@ -688,7 +724,6 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
else
nac.put(DOC_DATADOCRIF, contratto.get(DOC_DATADOCRIF));
// RIGHE
//ogni riga di tipo merce (verigh01) del contratto origina una riga della NAC
@ -814,7 +849,7 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
// CONTRATTO
//se il contratto è di tipo A/R aggiorna la riga spese speciale (verigh02)
//se il contratto è di tipo A/R aggiorna la riga spese speciale (verig02)
if (err == NOERR) switch (tipo_contratto)
{
case 'A':
@ -853,13 +888,16 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
// se non ci sono errori -> in caso di elaborazione definitiva procede alla registrazione..
//.. del contratto (ricordiamo che in memoria il contratto ha già le righe aggiornate
if (err == NOERR && definitivo)
if (err == NOERR && definitivo && nac_ok)
{
//alla fine della fiera aggiorna il contratto
err = contratto.rewrite();
if (err == NOERR)
{
log_msg << " -- Contratto aggiornato";
una_nac_definitiva = true;
}
else
log_msg << " -- Impossibile aggiornare contratto: errore " << err;
}
@ -873,9 +911,29 @@ bool THardy_elab_docs::genera_nac(const TMask& mask, TArray& contratti_cliente,
} //FOR_EACH_ARRAY_ITEM(... giro sui contratti cliente
if (una_nac_definitiva)
{
const int tc = mask.get_int(F_TIPOCONTR); // 0x7 (tutti tranne nolo) o 0x8 (solo nolo)
if (tc != 0x8)
{
const TString4 stato_finale = ini_get_string(CONFIG_DITTA, "ha", "StatoFinFatt");
FOR_EACH_ARRAY_ITEM(documenti_cliente, r, riga)
{
TDocumento& fattura = *(TDocumento*)riga;
// fattura.put(DOC_STATO, stato_finale);
fattura.rewrite();
}
TString msg;
msg.format(FR("Aggiornato stato elaborazione di %d fatture"), documenti_cliente.items());
log.log(0, msg);
}
}
//il metodo ritornerà il successo o meno della registrazione
return true;
return una_nac_definitiva;
}
bool THardy_elab_docs::genera_fat(const TMask& mask, TContratto_premi& contratto, TToken_string& fat_nolo, TLog_report& log)
@ -1033,25 +1091,29 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
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)
const word freq = find_contratti_cliente(mask.get_long(F_CODCF), mask, 0x8, contratti_cliente);
if (freq) // Nolo sarebbe solo mensile -> if (freq == 0x01)
{
TContratto_premi& contratto = *(TContratto_premi*)r_nolo;
TToken_string fatkey;
if (genera_fat(mask, contratto, fatkey, log))
FOR_EACH_ARRAY_ROW(contratti_cliente, n_nolo, 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));
fat_nolo.add(cnkey, fatkey);
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)
// giro sulle fatture (è il giro di più alto livello che viene esteso all'interno delle elabora_contratti)
const TDate data_fine = mask.get(F_ADATA);
for (bool ok = fatture.move_first(); ok; ok = fatture.move_next())
{
if (!pi.addstatus(1))
@ -1063,13 +1125,13 @@ 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, fat_nolo, log);
genera_nac(mask, contratti_cliente, fat_nolo, documenti_cliente, 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);
if (n_contratti > 0)
documenti_cliente.destroy();
const word freq = find_contratti_cliente(codcf, mask, tc, contratti_cliente);
if (freq != 0)
{
TString8 key; key.format("C|%ld", codcf);
TString msg; msg << TR("Cliente") << ' ' << codcf << ' ' << cache().get(LF_CLIFO, key, CLI_RAGSOC);
@ -1077,14 +1139,16 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
}
}
if (!contratti_cliente.empty())
if (!contratti_cliente.empty()) // Test sulla presenza di contratti
{
const TDate data_fine = mask.get(F_ADATA);
const TRectype& head = fatture.cursor()->curr();
//se ha trovato uno o più contratti validi nel periodo passa alla elaborazione dei documenti del cliente
TDocumento* curr_doc = new TDocumento(fatture.cursor()->curr());
//elabora il documento corrente aggiornando le somme restituite sui contratti validi
if (elabora_contratti(*curr_doc, contratti_cliente, data_fine, log))
TDocumento* curr_doc = new TDocumento(head);
// elabora il documento corrente aggiornando le somme restituite sui contratti validi
const word freq = elabora_contratti(*curr_doc, contratti_cliente, data_fine, log);
if (freq != 0)
documenti_cliente.add(curr_doc);
else
delete(curr_doc);
@ -1092,20 +1156,10 @@ void THardy_elab_docs::elabora_documenti(const TMask& mask, TISAM_recordset& fat
} //for (bool ok = recset.move_first()...
//generazione NAC dell'ultimo cliente (una per contratto cliente)
if (!contratti_cliente.empty())
genera_nac(mask, contratti_cliente, fat_nolo, log);
// se elaborazione definitiva NON di nolo-> cambia lo stato ai documenti di vendita elaborati
const bool definitivo = mask.get_bool(F_DEFINITIVO) && ((tc & 0x8) == 0);
if (definitivo && !documenti_cliente.empty())
if (!contratti_cliente.empty() && !documenti_cliente.empty())
{
const TString4 stato_finale = ini_get_string(CONFIG_DITTA, "ha", "StatoFinFatt");
FOR_EACH_ARRAY_ITEM(documenti_cliente, r, riga)
{
TDocumento& fattura = *(TDocumento*)riga;
fattura.put(DOC_STATO, stato_finale);
fattura.rewrite();
}
genera_nac(mask, contratti_cliente, fat_nolo, documenti_cliente, log);
documenti_cliente.destroy();
}
}