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:
parent
b085f4b290
commit
7e2e92a480
170
ha/ha0500.cpp
170
ha/ha0500.cpp
@ -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();
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user