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
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
DATAAGG|5|8|0|
UTENTE|1|16|0|
3
4
CODART|
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 tipo() const { return get_int("I1"); }
TToken_string & tipi_doc() const;
const TString& tipo_doc(int i) const;
int ntipi_doc() const;
int find_tipo_doc(const char* cod) const;
@ -987,7 +988,7 @@ public:
void auto_evasione(const int nrow = -1);
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);
TDocumento ();
@ -1012,7 +1013,7 @@ public:
for (TRiga_documento *__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(); \
int __r = 1; \
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()
{ }
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
{
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;
TString_array saved;
TString_array evaded;
TArray saved_qta;
TArray evaded_qta;
TString_array to_delete;
TToken_string original(get_original_rdoc_key(), ',');
const TString & refs = get(RDOC_ORIGINAL_ROWS);
TToken_string tok(get(RDOC_ORIGINAL_ROWS), ',');
if (refs.full())
original.add(refs);
saved.tok2arr(original, false);
docs.read('D', _doc->get_char(DOC_TIPOCF), _doc->get_long(DOC_CODCF),
year, tipi, stati, dadata, adata);
int ndocs = docs.items();
saved.tok2arr(tok);
tok = get(RDOC_ORIGINAL_QTAROWS);
if (tok.full())
FOR_EACH_TOKEN(tok, q)
saved_qta.add(new real(q));
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++)
if (docs[i].find_nrow(tiporiga, codart) < 0)
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();
if (storno)
{
@ -372,74 +385,127 @@ void TRiga_documento::update_orders(real qta, TToken_string & tipi, TToken_strin
}
docs.sort();
}
// docs->merge(actdocs);
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];
TRiga_documento & rdoc = d.find_row(tiporiga, codart);
TToken_string rdoc_key = rdoc.get_rdoc_key();
real qta_evasa = qta_da_evadere;
bool riga_evasa = false;
if (storno)
for (int nrow = d.find_nrow(tiporiga, codart); (qta_da_evadere > ZERO) && nrow > 0; nrow = d.find_nrow(tiporiga, codart, nrow + 1))
{
const real & evaso = rdoc.qtaevasa();
TRiga_documento & rdoc = d[nrow];
if (qta_evasa > evaso)
if (!rdoc.is_evasa())
{
qta_evasa = evaso;
to_delete.add(rdoc_key);
TToken_string rdoc_key = rdoc.get_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 (i < ndocs - 1)
qta_evasa = residuo;
riga_evasa = true;
}
rdoc.add(RDOC_QTAEVASA, qta_evasa);
evaded.add(rdoc_key);
if (q == nullptr)
saved_qta.add(q = new real);
*q += *((real *)eobj);
}
FOR_EACH_ARRAY_ITEM(to_delete, i, riga)
{
const int pos = saved.find(*((TToken_string *)riga));
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++)
if (docs[i].is_evaso())
docs[i].stato(stato_evaso);
docs[i].stato(stato_evaso);
else
if (docs[i].stato() == stato_evaso)
docs[i].stato(stato_aperto);
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;
if (saved.items() > 0)
{
original_key = saved.row(0);
saved.destroy(0, true);
}
put(RDOC_DACODNUM, original_key.get(0));
put(RDOC_DAANNO, original_key.get());
put(RDOC_DAPROVV, original_key.get());
put(RDOC_DANDOC, original_key.get());
put(RDOC_DAIDRIGA, original_key.get());
saved.arr2tok(original);
put(RDOC_ORIGINAL_ROWS, original);
saved.arr2tok(tok);
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)
if ((rdoc->tipo().codice() == tiporiga) && (rdoc->codice() == codice))
if ((i >= from) && (rdoc->tipo().codice() == tiporiga) && (rdoc->codice() == codice))
return i;
return -1;
}