campo-sirio/or/orlib01.cpp
guy 59fec4b029 Patch level : 2.0 512
Files correlati     : or1.exe or1100d.frm
Ricompilazione Demo : [ ]
Commento            :

GF20040
Se stampo con il dettaglio articoli solo per gli ordini evasi con la spunta
STAMPA RIGHE EVASE CON RESIDUO  mi elenca anche quegli ordini che sono stati
evasi per la quantità ordinata.


git-svn-id: svn://10.65.10.50/trunk@11294 c028cbd2-c16b-5b4b-a496-9718f37d4682
2003-06-27 14:55:37 +00:00

418 lines
15 KiB
C++
Executable File
Raw Blame History

#include "orlib.h"
#include "or1100a.h"
#include "../cg/cglib01.h"
#include "../ve/velib.h"
// Prima colonna quantita' nel form per stampa disponibilita'
#define COL1 4
TOrdine_form::TOrdine_form(const char* name) : TForm(name)
{
_art_giac = new TArticolo_giacenza;
_codgiac = new TCodgiac_livelli;
}
TOrdine_form::~TOrdine_form()
{
delete _codgiac;
delete _art_giac;
}
const int TOrdine_form::find_period(const TDate& dc)
{
CHECK(_date_array, "Invalid date array in TOrdine_form");
for (int i = _date_array->last(); i >= 0; i--) // ciuccialo alla rovescia... ehehe ;)
{
TDate& dt = (TDate&)*_date_array->objptr(i);
if (dc > dt)
break;
}
return i+1;
}
bool TOrdine_form::genera_intestazione_supplementare(pagetype p, short y)
{
CHECK(_date_array, "L'array delle date non e' impostato.");
TPrint_section* body = exist('B', p);
if (body == NULL || !body->columnwise())
return FALSE;
TPrint_section* header = exist('H', p);
if (header == NULL)
return FALSE;
const int items = _date_array->items();//body->fields();
TForm_string* s;
TString des;
for (int j=0;j<items;j++)
{
TForm_item& fi = body->find_field(COL1+j*2);
des = "Situaz. al ";
des << ((TDate*)_date_array->objptr(j))->string();
des.center_just(fi.width()*2);
s = new TForm_string(header);
s->id() = -1;
s->set_x(fi.x());
s->y() = y;
s->set_prompt(des);
s->temp() = TRUE;
header->add_field(s);
}
return TRUE;
}
bool TOrdine_form::validate(TForm_item &cf, TToken_string &s)
{
if (strcmp(s.get(0), "_ORDINE") == 0)
{
// TLocalisamfile& doc = cf.form().cursor()->file(LF_DOC);
TDocumento& doc = (TDocumento&)cf.form().cursor()->curr(LF_DOC);
//TLocalisamfile& rdoc = cf.form().cursor()->file(LF_RIGHEDOC);
TRiga_documento& rdoc = (TRiga_documento&)cf.form().cursor()->curr(LF_RIGHEDOC);
// Add custom messages here
// All the following messages takes 1 parameter: the field number to set
TString action(s.get(1));
if (action == "DESCRIZIONE")
{
// Scrive: Cod articolo/cod livello1/cod livello2/.../denominazione ultimo livello codifica /cod mag /cod dep
// Nel caso di stampa disponibilita' articoli stampa un pezzo della descrizione
// vera e proprio dell'articolo.
TString codart,livello, coddep, codmag;
codart = rdoc.get(RDOC_CODART);
if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR)
{
if (_normale)
codart << " " << _art_giac->get(ANAMAG_DESCR);
else
codart = _art_giac->get(ANAMAG_DESCR);
if (codart.len() > 40)
codart.cut(40);
}
if (_level > 0)
livello = rdoc.get(RDOC_LIVELLO);
if (livello.not_empty())
{
for (int lev=1; lev <= _level; lev++)
{
if (!_codgiac->enabled(lev))
continue;
const int starts = _codgiac->code_start(lev) -1;
const int length = _codgiac->code_length(lev);
codart << "/";
codart << livello.mid(starts,length);
}
codart << " " << _codgiac->name(_level);
codart << " " << _codgiac->group_descr(livello,_level);
}
codmag = rdoc.get(RDOC_CODMAG).left(3);
coddep = rdoc.get(RDOC_CODMAG).right(2);
if (_detail_mag && codmag.not_empty())
codart << " Mag. " << codmag;
if (_detail_dep && coddep.not_empty())
codart << " Dep. " << coddep;
cf.set(codart);
}
else
if (action == "SELECTUM")
{
const TString8 um(rdoc.get(RDOC_UMQTA));
const TString8 cur_um(cf.find_field("407").get());
if (cur_um.empty()) // Se l'unita' di misura non e' ancora stata settata prende quella principale
cf.set(um);
else
if (cur_um != um) // Se c'e' ma e' diversa dalla prec. allora setta l'unita' di misura su quella principale
if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR)
{
TForm_item& qo = cf.find_field("408");
TForm_item& qe = cf.find_field("409");
TForm_item& qr = cf.find_field("411");
real qtaor(qo.get());
real qtaev(qe.get());
real qtare(qr.get());
// Converte i totali q.ta evasa e ordinata nella unita' di misura principale
// const int index_um = _art_giac->find_um(cur_um);
// const real fc = _art_giac->um().row(index_um > 0 ? index_um : 1).get("FC");
// qtaor *= fc;
// qtaev *= fc;
// qtare *= fc;
qtaor = _art_giac->convert_to_um(qtaor, "", cur_um, TRUE);
qtaev = _art_giac->convert_to_um(qtaev, "", cur_um, TRUE);
qtare = _art_giac->convert_to_um(qtare, "", cur_um, TRUE);
qo.set(qtaor.string());
qe.set(qtaev.string());
qr.set(qtare.string());
cf.set(_art_giac->um().row(1).get("UM")); // UM principale
}
// TBI:
// Riga merce non a magazzino o non e' possibile reperire l'UM principale per art.
// non posso interrompere la sezione di stampa da qui, e neppure cambiare il raggruppamento...
// This seems to be a great dilemma... For now leave it as is: Somme dure e crude di quantita'
}
else
if (action == "CONVUM") // Converte cazzilli quantitativi nella unita' di misura corrente
{
const TString4 um = rdoc.get(RDOC_UMQTA);
const TString4 cur_um = cf.find_field("407").get();
if (cur_um != um)
if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR) // Perche' non RDOC_CODARTMAG ???
{
real qt(cf.get());
/*
const real fc = _art_giac->um().row(_art_giac->find_um(cur_um)).get("FC");
qt *= fc;
*/
qt = _art_giac->convert_to_um(qt, cur_um, um, TRUE);
cf.set(qt.string());
}
}
else
if (action == "VALTABLE") // Comandi per stampa riepilogo per valuta
{
TString subcommand(s.get(2));
if (subcommand == "RESET")
{
_totvaluta.destroy();
cf.find_field("TOTVAL1").disable();
cf.find_field("TOTVAL2").disable();
cf.find_field("TOTVAL3").disable();
cf.find_field("TOTVAL4").disable();
}
else
{
const int valute = _totvaluta.items();
TString codval(doc.get(DOC_CODVAL));
const bool is_key = _totvaluta.is_key(codval);
const bool is_new = !is_key && valute < 4;
if (is_new) // Aggiunge l'elemento se non c'e'
_totvaluta.add(codval,(_TTotale_valuta*)new _TTotale_valuta,is_key);
// Controlla/stampa al massimo 4 valute
if (is_key || is_new)
{
_TTotale_valuta& tv = (_TTotale_valuta&)_totvaluta[codval];
const bool is_valord = subcommand == "VALORD";
real& r = is_valord ? tv.totord() : tv.totres();
TString s_id;
int i_id;
// Abilita la sezione corrispondente e setta i valori all'interno
if (!is_key)
{
TString16 sec_name = "TOTVAL";
sec_name << valute+1;
tv.secnum() = valute+1;
cf.find_field(sec_name).enable();
// Setta anche il codice valuta
i_id = BODY_CODVAL + valute*10;
s_id.format("%d",i_id);
cf.find_field(s_id).set(codval);
if (valute == 0)
{
i_id--;
s_id.format("%d",i_id);
cf.find_field(s_id).set("@bTotali");
}
}
const int sn = tv.secnum();
i_id = is_valord ? BODY_TOTVALORD : BODY_TOTVALRES;
i_id += (sn-1)*10;
s_id.format("%d",i_id);
r += ((real) cf.get()); // Somma il valore corrente
cf.find_field(s_id).set(r.string());
}
}
}
else
if (action == "CALCDISP") // messaggi per calcolo disponibilita'
{
TString command(s.get(2));
if (command == "RESET") // resetta la tabella
{
_totdisp.destroy();
const real rz = ZERO;
const int items = _date_array->items();
for (int i = 0; i<items; i++)
_totdisp.add(rz);
// Legge anche una volta per tutte il TArticolo_giacenza (uargh uargh)
if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR)
{
_codmag = rdoc.get(RDOC_CODMAG);
_livello = rdoc.get(RDOC_LIVELLO);
}
else
cf.set("Errore in lettura articolo");
}
else
if (command == "CALC") // Effettua il calcolo per questa riga articolo,
//cumulando nell'array le quantita', espresse sempre in UM principale
{
const bool is_ordine_cliente = doc.get(DOC_TIPOCF)[0] == 'C';
const TString16 causmag(doc.get(DOC_CAUSMAG));
const TString16 um(rdoc.get(RDOC_UMQTA));
const TDate datacons(doc.get_date(RDOC_DATACONS));
int segno = is_ordine_cliente ? -1 : +1; // default
if (causmag.not_empty()) // se la causale esiste consulta il segno
{
TCausale_magazzino cm(causmag);
segno *= cm.sgn(is_ordine_cliente ? s_ordc : s_ordf);
}
// Reperisce fattore di conversione per UM principale,
// la quantita residua
real qtares = rdoc.qtaresidua(); // ZIO PERA! ag v<>l la riga dal document
qtares = _art_giac->convert_to_um(qtares, "", um, TRUE);
qtares *= segno; // mette a posto il segno...
// Trova il periodo giusto
const int index = find_period(datacons);
if (index >= _totdisp.items())
_totdisp.add(ZERO, index); // Added by Guy! Should never happen :-)
real& rv = (real&) _totdisp[index];
rv += qtares;
}
else
if (command == "PRNUM") // Stampa l'unita' di misura principale
{
const TRecord_array& um = _art_giac->um();
if (um.rows() > 0) // Controlla che ci sia almeno una unita' di misura
cf.set(um.row(1).get("UM")); // UM principale
else
cf.set("");
}
else
{
const int period = s.get_int(3);
//const int items = _date_array->items();
TString16 annoes;
real giacenza, scorta_min;
TEsercizi_contabili esc;
annoes << esc.date2esc(doc.get_date(DOC_DATADOC));
//TString16 codmag(rdoc.get(RDOC_CODMAG));
//TString16 livello(rdoc.get(RDOC_LIVELLO));
const int codmag_len = (_detail_dep || _detail_mag) ? _codmag.len() : 0;
const int livello_len = _level > 0 ? _livello.len() : 0;
//if (_art_giac->read(rdoc.get(RDOC_CODART)) == NOERR)
{
// Serve l'anno esercizio del magazzino...
// Ciclo sulle giacenze di magazzino
TRecord_array& mmgg = _art_giac->mag(annoes);
const int rows = mmgg.rows();
// Cumula raggruppando le giacenze per lo stesso mag/dep/liv.giac
// Scurre alla ruvescia
for (int i=mmgg.last_row();i>0;i--)
{
const TRectype& rec = mmgg.row(i); // gosh!?
//checkka se trattasi di medesimo liv giac/mag/dep in caso sia stato spec. il dettaglio
// altrimenti cumula el todo
if (codmag_len == 0 || (rec.get(MAG_CODMAG).compare(_codmag, codmag_len) == 0))
if (livello_len == 0 || (rec.get(MAG_LIVELLO).compare(_livello, livello_len) == 0))
{
giacenza += _art_giac->giacenza_corretta(rec, _giac_eff, _val_comp);
scorta_min = rec.get_real(MAG_SCORTAMIN);
}
}
}
for (int i = 0; i< period/*items*/; i++)
giacenza += (real&)_totdisp[i];
if (command == "PRNGIAC") // Stampa la giacenza prevista
{
cf.set(giacenza.string());
}
else
if (command == "PRNSOTT") // Stampa il sottoscorta
{
if (giacenza < scorta_min)
{
giacenza = scorta_min - giacenza;
cf.set(giacenza.string());
}
else
cf.set("");
}
// Ignore any other command
}
}
else
if (action == "PREZZONS")
{
real pns = rdoc.prezzo(TRUE,FALSE); // Prezzo netto scontato
cf.set(pns.string());
}
else
if (action == "RAGSOC")
{
// Compone la ragione sociale (considera gli occasionali)
// Il formato <20> il seguente: CODICE (OCFPI) RAGIONE_SOCIALE
TString ws;
const bool print_cod = s.get_int(2) != 0;
TDocumento& documento = (TDocumento&)cf.form().cursor()->curr(LF_DOC);
TCli_for& cli_for = documento.clifor();
TOccasionale& cli_occ = documento.occas();
const bool occasionale = cli_for.occasionale();
if (print_cod)
ws << cli_for.get("CODCF") << " ";
if (occasionale)
{
ws << "(" << cli_occ.get("CFPI") << ") " ;
ws << cli_occ.get("RAGSOC");
}
else
ws << cli_for.get("RAGSOC");
cf.set(ws);
}
else
if (action == "QTA")
{
cf.set(rdoc.quantita().string());
} else
if (action == "QTAEVASA")
{
cf.set(rdoc.qtaevasa().string());
} else
if (action == "RESIDUO")
{
cf.set(rdoc.qtaresidua().string());
} else
if (action == "VALORE")
{
cf.set(rdoc.valore(TRUE, AUTO_DECIMALS).string());
} else
if (action == "VALRES")
{
cf.set(rdoc.valore(FALSE, AUTO_DECIMALS).string());
} else
if (action == "GIACENZA")
{
real g = ZERO;
const TString& codart = rdoc.get(RDOC_CODARTMAG);
if (codart.not_empty() && _art_giac->read(codart) == NOERR)
{
TEsercizi_contabili esc;
const TDate oggi(TODAY);
TString16 annoes; annoes.format("%04d", esc.date2esc(oggi));
const TString16 codmag(rdoc.get("CODMAG")); // Riferito al magazzino indicato sulla riga...
const TString16 livello(_level > 0 ? rdoc.get(RDOC_LIVELLO) : "");
g = _art_giac->disponibilita(annoes, codmag, livello, TRUE); // Giacenza attuale
}
cf.set(g.string());
}
//Ignore any other command
return TRUE;
}
return TForm::validate(cf, s);
}