Patch level : 12.0 1014

Files correlati     : ve0.exe ve1.exe ve5.exe ve6.exe f47.dir f47.trr
Commento            :

Aggiunta chiave per CODPMS agli articoli
Migliorata l'autoevasione ordini
This commit is contained in:
Alessandro Bonazzi 2020-11-25 19:48:03 +01:00
parent 169e9281af
commit e81b6eb4af
6 changed files with 135 additions and 56 deletions

View File

@ -1,3 +1,3 @@
47 47
0 0
$anamag|0|0|1121|0|Anagrafica di magazzino|NART|| $anamag|0|0|1115|0|Anagrafica di magazzino|NART||

View File

@ -98,7 +98,8 @@ USER17|1|20|0|Campo libero 17
USER18|1|20|0|Campo libero 18 USER18|1|20|0|Campo libero 18
DATAAGG|5|8|0| DATAAGG|5|8|0|
UTENTE|1|16|0| UTENTE|1|16|0|
3 4
CODART| CODART|
UPPER(DESCR)|X UPPER(DESCR)|X
GRMERC+CODART| GRMERC+CODART|X
COD_PMS|X

View File

@ -420,6 +420,7 @@ public:
const int revision_len() const { return get_int("I0"); } const int revision_len() const { return get_int("I0"); }
const int tipo() const { return get_int("I1"); } const int tipo() const { return get_int("I1"); }
TToken_string & tipi_doc() const;
const TString& tipo_doc(int i) const; const TString& tipo_doc(int i) const;
int ntipi_doc() const; int ntipi_doc() const;
int find_tipo_doc(const char* cod) const; int find_tipo_doc(const char* cod) const;
@ -987,7 +988,7 @@ public:
void auto_evasione(const int nrow = -1); void auto_evasione(const int nrow = -1);
void qta_evasa_auto_pack(const int nrow) { _qta_evasa_auto.destroy(nrow, true); } void qta_evasa_auto_pack(const int nrow) { _qta_evasa_auto.destroy(nrow, true); }
int find_nrow(const char * tiporiga, const char * codice) const; int find_nrow(const char * tiporiga, const char * codice, int from = 1) const;
TRiga_documento & find_row(const char * tiporiga, const char * codice); TRiga_documento & find_row(const char * tiporiga, const char * codice);
TDocumento (); TDocumento ();
@ -1012,7 +1013,7 @@ public:
for (TRiga_documento *__rdoc = ((TDocumento &)__doc).rowptr(__r); \ for (TRiga_documento *__rdoc = ((TDocumento &)__doc).rowptr(__r); \
__r > 0; __rdoc = ((TDocumento &)__doc).rowptr(--__r)) __r > 0; __rdoc = ((TDocumento &)__doc).rowptr(--__r))
#define FOR_EACH_RDOC(_doc, __r, __row) \ #define FOR_EACH_RDOC(__doc, __r, __rdoc) \
const int nr##__r = ((TDocumento &)__doc).rows(); \ const int nr##__r = ((TDocumento &)__doc).rows(); \
int __r = 1; \ int __r = 1; \
for (TRiga_documento *__rdoc = ((TDocumento &)__doc).rowptr(__r); \ for (TRiga_documento *__rdoc = ((TDocumento &)__doc).rowptr(__r); \

View File

@ -21,6 +21,17 @@ TCodice_numerazione::TCodice_numerazione(const TRectype& rec)
TCodice_numerazione::~TCodice_numerazione() TCodice_numerazione::~TCodice_numerazione()
{ } { }
TToken_string & TCodice_numerazione::tipi_doc() const
{
TToken_string & tipi = get_tmp_string(256);
int ntipi = ntipi_doc();
for (int i = 0; i < ntipi; i++)
tipi.add(tipo_doc(i));
return tipi;
}
const TString& TCodice_numerazione::tipo_doc(int i) const const TString& TCodice_numerazione::tipo_doc(int i) const
{ {
CHECK(i < 36, "Impossibbile tipo documento"); CHECK(i < 36, "Impossibbile tipo documento");

View File

@ -344,21 +344,34 @@ void TRiga_documento::update_orders(real qta, TToken_string & tipi, TToken_strin
TLista_documenti docs; TLista_documenti docs;
TString_array saved; TString_array saved;
TString_array evaded; TString_array evaded;
TArray saved_qta;
TArray evaded_qta;
TString_array to_delete; TString_array to_delete;
TToken_string original(get_original_rdoc_key(), ','); TToken_string tok(get(RDOC_ORIGINAL_ROWS), ',');
const TString & refs = get(RDOC_ORIGINAL_ROWS);
if (refs.full()) saved.tok2arr(tok);
original.add(refs); tok = get(RDOC_ORIGINAL_QTAROWS);
saved.tok2arr(original, false); if (tok.full())
docs.read('D', _doc->get_char(DOC_TIPOCF), _doc->get_long(DOC_CODCF), FOR_EACH_TOKEN(tok, q)
year, tipi, stati, dadata, adata); saved_qta.add(new real(q));
int ndocs = docs.items();
int ndocs = docs.read('D', _doc->get_char(DOC_TIPOCF), _doc->get_long(DOC_CODCF),
year, tipi, stati, dadata, adata);;
for (int i = 0; i < ndocs; i++) for (int i = 0; i < ndocs; i++)
if (docs[i].find_nrow(tiporiga, codart) < 0) if (docs[i].find_nrow(tiporiga, codart) < 0)
docs.destroy(i, false); docs.destroy(i, false);
else
if (!storno)
{
bool to_delete = true;
for (int nrow = docs[i].find_nrow(tiporiga, codart); to_delete && nrow > 0; nrow = docs[i].find_nrow(tiporiga, codart, nrow + 1))
to_delete &= docs[i][nrow].is_evasa();
if (to_delete)
docs.destroy(i, false);
}
docs.pack(); docs.pack();
if (storno) if (storno)
{ {
@ -372,74 +385,127 @@ void TRiga_documento::update_orders(real qta, TToken_string & tipi, TToken_strin
} }
docs.sort(); docs.sort();
} }
// docs->merge(actdocs);
ndocs = docs.items(); ndocs = docs.items();
for (int i = storno ? ndocs - 1 : 0; qta_da_evadere > ZERO && (storno ? i >= 0 : i < ndocs); storno ? i-- : i++) for (int i = storno ? ndocs - 1 : 0; (qta_da_evadere > ZERO) && (storno ? i >= 0 : i < ndocs); storno ? i-- : i++)
{ {
TDocumento & d = docs[i]; TDocumento & d = docs[i];
TRiga_documento & rdoc = d.find_row(tiporiga, codart);
TToken_string rdoc_key = rdoc.get_rdoc_key(); for (int nrow = d.find_nrow(tiporiga, codart); (qta_da_evadere > ZERO) && nrow > 0; nrow = d.find_nrow(tiporiga, codart, nrow + 1))
real qta_evasa = qta_da_evadere;
bool riga_evasa = false;
if (storno)
{ {
const real & evaso = rdoc.qtaevasa(); TRiga_documento & rdoc = d[nrow];
if (qta_evasa > evaso) if (!rdoc.is_evasa())
{ {
qta_evasa = evaso; TToken_string rdoc_key = rdoc.get_rdoc_key();
to_delete.add(rdoc_key); real qta_evasa = qta_da_evadere;
bool riga_evasa = false;
if (storno)
{
const real & evaso = rdoc.qtaevasa();
if (qta_evasa > evaso)
{
qta_evasa = evaso;
to_delete.add(rdoc_key);
}
else
{
const int pos = saved.find(rdoc_key);
if (pos >= 0)
{
real *q = (real *)saved_qta.objptr(pos);
if (q == nullptr)
evaded_qta.add(q = new real);
*q -= qta_evasa;
}
}
rdoc.sub(RDOC_QTAEVASA, qta_evasa);
}
else
{
const real & residuo = rdoc.qtaresidua();
if (residuo <= qta_da_evadere)
{
if (i < ndocs - 1)
qta_evasa = residuo;
riga_evasa = true;
}
rdoc.add(RDOC_QTAEVASA, qta_evasa);
const int saved_pos = saved.find(rdoc_key);
if (saved_pos >= 0)
{
real *q = (real *)saved_qta.objptr(saved_pos);
if (q == nullptr)
evaded_qta.add(q = new real);
*q += qta_evasa;
}
else
{
const int pos = evaded.add(rdoc_key);
real *q = (real *)evaded_qta.objptr(pos);
if (q == nullptr)
evaded_qta.add(q = new real);
*q += qta_evasa;
}
}
rdoc.put(RDOC_RIGAEVASA, riga_evasa);
qta_da_evadere -= qta_evasa;
} }
rdoc.sub(RDOC_QTAEVASA, qta_evasa);
} }
else saved.merge_token(evaded);
FOR_EACH_ARRAY_ITEM(evaded_qta, i, eobj)
{ {
const real & residuo = rdoc.qtaresidua(); const int pos = saved.find(evaded.row(i));
real *q = (real *)saved_qta.objptr(pos);
if (residuo <= qta_da_evadere ) if (q == nullptr)
{ saved_qta.add(q = new real);
if (i < ndocs - 1) *q += *((real *)eobj);
qta_evasa = residuo; }
riga_evasa = true; FOR_EACH_ARRAY_ITEM(to_delete, i, riga)
} {
rdoc.add(RDOC_QTAEVASA, qta_evasa); const int pos = saved.find(*((TToken_string *)riga));
evaded.add(rdoc_key);
if (pos >= 0)
{
saved.destroy(pos);
saved_qta.destroy(pos);
}
} }
rdoc.put(RDOC_RIGAEVASA, riga_evasa);
qta_da_evadere -= qta_evasa;
} }
saved.pack();
for (int i = 0; i < ndocs; i++) for (int i = 0; i < ndocs; i++)
if (docs[i].is_evaso()) if (docs[i].is_evaso())
docs[i].stato(stato_evaso); docs[i].stato(stato_evaso);
else else
if (docs[i].stato() == stato_evaso) if (docs[i].stato() == stato_evaso)
docs[i].stato(stato_aperto); docs[i].stato(stato_aperto);
docs.rewrite(); docs.rewrite();
saved.merge_token(evaded);
FOR_EACH_ARRAY_ITEM(to_delete, i, riga)
{
const int pos = saved.find(*((TToken_string *)riga));
if (pos >= 0)
saved.destroy(pos);
}
saved.pack();
TToken_string original_key; TToken_string original_key;
if (saved.items() > 0) if (saved.items() > 0)
{
original_key = saved.row(0); original_key = saved.row(0);
saved.destroy(0, true);
}
put(RDOC_DACODNUM, original_key.get(0)); put(RDOC_DACODNUM, original_key.get(0));
put(RDOC_DAANNO, original_key.get()); put(RDOC_DAANNO, original_key.get());
put(RDOC_DAPROVV, original_key.get()); put(RDOC_DAPROVV, original_key.get());
put(RDOC_DANDOC, original_key.get()); put(RDOC_DANDOC, original_key.get());
put(RDOC_DAIDRIGA, original_key.get()); put(RDOC_DAIDRIGA, original_key.get());
saved.arr2tok(original); saved.arr2tok(tok);
put(RDOC_ORIGINAL_ROWS, original); put(RDOC_ORIGINAL_ROWS, tok);
tok.cut(0);
FOR_EACH_ARRAY_ITEM(saved_qta, i, sobj)
tok.add(*((real *)sobj));
put(RDOC_ORIGINAL_QTAROWS, tok);
} }
} }
} }

View File

@ -3606,10 +3606,10 @@ void TDocumento::auto_evasione(const int nrow)
} }
} }
int TDocumento::find_nrow(const char * tiporiga, const char * codice) const int TDocumento::find_nrow(const char * tiporiga, const char * codice, int from) const
{ {
FOR_EACH_SELF_RDOC(i, rdoc) FOR_EACH_SELF_RDOC(i, rdoc)
if ((rdoc->tipo().codice() == tiporiga) && (rdoc->codice() == codice)) if ((i >= from) && (rdoc->tipo().codice() == tiporiga) && (rdoc->codice() == codice))
return i; return i;
return -1; return -1;
} }