Files correlati : Ricompilazione Demo : [ ] Commento : Tolte chiamate residue a os_dep.h Aggiunta la possibilita' di arrotondare le quantita' in base all'unita' di misura git-svn-id: svn://10.65.10.50/trunk@11028 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			261 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			261 lines
		
	
	
		
			9.6 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
//////////////////////////////////////////////////////////////
 | 
						||
// Rifatturazione cover
 | 
						||
//////////////////////////////////////////////////////////////
 | 
						||
 | 
						||
#include <applicat.h>
 | 
						||
#include <config.h>
 | 
						||
#include <defmask.h>
 | 
						||
#include <form.h>
 | 
						||
#include <msksheet.h>
 | 
						||
#include <printer.h>
 | 
						||
#include <progind.h>
 | 
						||
#include <sheet.h>
 | 
						||
 | 
						||
#include <doc.h>
 | 
						||
#include <rdoc.h>
 | 
						||
 | 
						||
#include "velib.h"
 | 
						||
#include "sconti.h"
 | 
						||
#include "vec1100.h"
 | 
						||
 | 
						||
class TRifatturazione: public TSkeleton_application
 | 
						||
{ 
 | 
						||
  TMask     * _m;                   //maschera di input dati
 | 
						||
  TString     _codnum;              // codice di numerazione del documento 
 | 
						||
  int         _anno;                // anno della documentazione
 | 
						||
  long        _codcli;              // codice del cliente
 | 
						||
  TDate       _dadata, _adata;      // estremi di data dei documenti
 | 
						||
  TRelation * _rel;
 | 
						||
  TCursor   * _cur;             
 | 
						||
  
 | 
						||
protected:
 | 
						||
  static bool date_handler(TMask_field& f, KEY k);
 | 
						||
  virtual bool create();
 | 
						||
  virtual bool destroy();
 | 
						||
  virtual void main_loop();
 | 
						||
  
 | 
						||
public:
 | 
						||
  void select_docs();
 | 
						||
  real get_price (const TString& codart, TString& um, real& quantita);  // metodo per ricavare la variazione di prezzo
 | 
						||
  void add_line (TDocumento& doc, const TRiga_documento & old_row, const TString& um, real& quantita, real& price);  // metodo per compilare le righe del nuovo documento
 | 
						||
  TRifatturazione() {};
 | 
						||
  virtual ~TRifatturazione() {};
 | 
						||
};
 | 
						||
 | 
						||
// handler delle date della maschera di input
 | 
						||
bool TRifatturazione::date_handler(TMask_field& f, KEY k)
 | 
						||
{ 
 | 
						||
  bool rt = TRUE;
 | 
						||
  TMask& m = f.mask();
 | 
						||
  if (f.to_check(k) && k == K_ENTER)
 | 
						||
  {
 | 
						||
    TDate dadata = m.get_date(F_DA_DATADOC);
 | 
						||
    TDate adata = m.get_date(F_A_DATADOC);
 | 
						||
    const int anno = m.get_int(F_ANNO);   
 | 
						||
    
 | 
						||
    int anno1 = dadata.year();
 | 
						||
    int anno2 = adata.year(); 
 | 
						||
    
 | 
						||
    if (anno1 != anno || anno2 != anno)  // le date devono avere anno coincidente con quello selezionato nella maschera
 | 
						||
    {
 | 
						||
      f.error_box ("Gli anni delle date iniziale e finale devono essere uguali all'anno selezionato");
 | 
						||
      rt = FALSE; 
 | 
						||
    } 
 | 
						||
  }
 | 
						||
  return rt;  
 | 
						||
}
 | 
						||
 | 
						||
// create della classe TRifatturazione (stanziamento degli oggetti principali)
 | 
						||
bool TRifatturazione::create()
 | 
						||
{  
 | 
						||
  open_files(LF_DOC, LF_RIGHEDOC, LF_CFVEN, LF_ANAMAG, LF_UMART, LF_CONDV, LF_RCONDV, 0);
 | 
						||
  _m = new TMask ("vec1100a");
 | 
						||
  _rel = new TRelation (LF_DOC);
 | 
						||
  _cur = new TCursor( _rel, "", 2);
 | 
						||
  
 | 
						||
  _m -> set_handler (F_ANNO, date_handler); //prende i dati dalla maschera per controllarli   
 | 
						||
  
 | 
						||
  return TSkeleton_application::create();
 | 
						||
}
 | 
						||
 | 
						||
// destroy della classe TRifatturazione (distrugge ci<63> che la create genera)
 | 
						||
bool TRifatturazione::destroy()
 | 
						||
{
 | 
						||
  delete _cur;
 | 
						||
  delete _rel;
 | 
						||
  delete _m;
 | 
						||
  
 | 
						||
  return TSkeleton_application::destroy();
 | 
						||
}
 | 
						||
 | 
						||
// main loop della classe TRifatturazione (essenzialmente carica la maschera)
 | 
						||
void TRifatturazione::main_loop()
 | 
						||
{
 | 
						||
  KEY key;
 | 
						||
  while ((key = _m -> run()) != K_QUIT)
 | 
						||
  {
 | 
						||
    select_docs();
 | 
						||
  }  
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void TRifatturazione::select_docs()
 | 
						||
// applica la relation ed il cursor sul file LF_DOC (non li crea perch<63> lo ha gi<67> fatto la create()!!) e setta il filtro
 | 
						||
{                 
 | 
						||
  TString16 f;
 | 
						||
  f.format("CODNUM==\"%s\"", (const char *) _m->get(F_CODNUM));     // DEVI SEMPRE usare (const char *) nelle format !!!!
 | 
						||
 | 
						||
  TRectype darec(LF_DOC),arec(LF_DOC); // Record estremi filtro
 | 
						||
  
 | 
						||
  darec.put(DOC_TIPOCF,"C");                     // Setta i parametri del primo record
 | 
						||
  darec.put(DOC_CODCF, _m->get(F_CODCF));
 | 
						||
  darec.put(DOC_PROVV, "D");
 | 
						||
  darec.put(DOC_ANNO, _m->get(F_ANNO));
 | 
						||
  darec.put(DOC_DATADOC, _m->get(F_DA_DATADOC));
 | 
						||
  
 | 
						||
  arec.put(DOC_TIPOCF,"C");                      // ..e quelli dell'ultimo (cambia solo la data!!)
 | 
						||
  arec.put(DOC_CODCF, _m->get(F_CODCF));
 | 
						||
  arec.put(DOC_PROVV, "D");
 | 
						||
  arec.put(DOC_ANNO, _m->get(F_ANNO));
 | 
						||
  arec.put(DOC_DATADOC, _m->get(F_A_DATADOC));
 | 
						||
   
 | 
						||
  _cur->setfilter(f); 
 | 
						||
  _cur->setregion(darec,arec);
 | 
						||
  
 | 
						||
  const long items = _cur->items();     
 | 
						||
  _cur -> freeze();                  // applica la freeze per 'congelare' il file al momento dell'applicazione del cursore
 | 
						||
                                     // va qui! prima di cominciare la scansione ma appena dopo la definizione degli items
 | 
						||
  TDocumento* indoc = new TDocumento;       // creo indoc in modo da non perdere traccia del documento
 | 
						||
  _cur->file().set_curr (indoc);            // cos<6F> ogni record principale del cursore <20> un documento
 | 
						||
  TProgind pi(items,"Elaborazione in corso..",TRUE,TRUE);   // barra di progressione
 | 
						||
  
 | 
						||
  TDate datadoc = _m->get(F_DATADOC);
 | 
						||
  
 | 
						||
  TDocumento doc;                             // doc su cui scriver<65>!!
 | 
						||
  *_cur=0;                                    // preparo la testata del nuovo documento facendola uguale a quella del primo
 | 
						||
  doc.put(DOC_PROVV, "D");                    // documento (tanto devono essere tutti uguali)
 | 
						||
  doc.put(DOC_ANNO,datadoc.year());
 | 
						||
  doc.put(DOC_CODNUM, _m->get(F_CODNUM));
 | 
						||
  doc.copy_data(doc, _cur->curr());           // copia la testata del record sul quale si <20> posizionato
 | 
						||
  doc.put(DOC_DATADOC, datadoc);              // assegna al nuovo documento la data che veniva dalla maschera
 | 
						||
  doc.put(DOC_STATO, "1");                    // e mette lo stato iniziale
 | 
						||
  
 | 
						||
  for (*_cur=0; _cur->pos() < items; ++(*_cur))
 | 
						||
  {
 | 
						||
    pi.addstatus(1);                          // barra di progressione
 | 
						||
    if (pi.iscancelled()) break;              // <20> possibile interrompere l'elaborazione
 | 
						||
    
 | 
						||
    for ( int r =1; r <= indoc->rows(); r++)     // cicla sulle righe del documento selezionato
 | 
						||
    {
 | 
						||
      const TRiga_documento& row = (*indoc)[r];
 | 
						||
      if (row.is_merce())                        // lavora solo se la riga <20> di tipo merce
 | 
						||
      {
 | 
						||
        TString80 codart(row.get(RDOC_CODARTMAG)); // crea una stringa con il codice articolo
 | 
						||
        if (codart.not_empty())
 | 
						||
        {
 | 
						||
          TString16 um(row.get(RDOC_UMQTA));         // ed una con l'unit<69> di misura che trova nella riga
 | 
						||
          real quantita = row.get(RDOC_QTA);         // e una con la quantit<69> della riga
 | 
						||
        
 | 
						||
          real price = get_price (codart,um,quantita);   // trova la variazione di prezzo per l'articolo, la sua um (di base) e la quantit<69> in um(base)
 | 
						||
          
 | 
						||
          if (price > 0) add_line(doc,row,um,quantita,price);  // compila le righe del documento
 | 
						||
        }
 | 
						||
      }
 | 
						||
    }
 | 
						||
    
 | 
						||
  }
 | 
						||
  if (doc.rows() > 0)
 | 
						||
  {
 | 
						||
    doc.write();
 | 
						||
  }                         
 | 
						||
  _cur->file().set_curr(new TRectype(LF_DOC));
 | 
						||
  _cur->freeze(FALSE);                      
 | 
						||
}  
 | 
						||
  
 | 
						||
 | 
						||
real TRifatturazione::get_price (const TString& codart, TString& um, real& quantita)
 | 
						||
{ 
 | 
						||
 | 
						||
  TString codlist = _m->get(F_LISTINO);        // prende il codice listino
 | 
						||
  TToken_string chiave;                        // crea la chiave di lettura del file LF_RCONDV; una volta creata la chiave
 | 
						||
  chiave.add("L");                             // ha i parametri per trovare il prezzo nel corrispondente record (non viene
 | 
						||
  chiave.add("");                              // utilizzato un TRectype per esigenze di velocit<69>)
 | 
						||
  chiave.add("");
 | 
						||
  chiave.add("");
 | 
						||
  chiave.add(codlist);
 | 
						||
  chiave.add("A");
 | 
						||
  chiave.add(codart);
 | 
						||
//  chiave.add(um_base);  
 | 
						||
  
 | 
						||
  const TRectype& rcondv = cache().get(LF_RCONDV, chiave);
 | 
						||
  const real old_price = rcondv.get("PREZZO"); // devi prendere il PREZZO dalle righe listino del listino con codice codlist
 | 
						||
  real new_price;
 | 
						||
  if (old_price != ZERO)
 | 
						||
  { 
 | 
						||
    TArticolo articolo(codart);      // crea un oggetto TArticolo con il codice codart
 | 
						||
    quantita = articolo.convert_to_um (quantita,NULL,um);    // converte la quantita in um base  
 | 
						||
    real perc = _m->get(F_PERCENT);      // dalla maschera prendi la % di sovrapprezzo
 | 
						||
    new_price = perc / 100 * old_price;    // mi serve il solo sovrapprezzo
 | 
						||
    um = articolo.um()[1].get(UMART_UM);  // deve prendere l'unit<69> di misura base dell'articolo (lo prende come primo record delle unit<69> di misura)
 | 
						||
  }
 | 
						||
  
 | 
						||
  return new_price;  
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
void TRifatturazione::add_line (TDocumento& doc, const TRiga_documento & old_row, const TString& um, real& quantita, real& price)
 | 
						||
{
 | 
						||
  int tot_lines = doc.rows();
 | 
						||
  
 | 
						||
  for ( int i = 1; i <= tot_lines; i++)
 | 
						||
  {
 | 
						||
    const TRiga_documento & riga = doc[i];
 | 
						||
    TString codartmag = riga.get(RDOC_CODARTMAG);
 | 
						||
    TString codart = old_row.get(RDOC_CODARTMAG);
 | 
						||
    if (codartmag == codart) break;
 | 
						||
  }
 | 
						||
  
 | 
						||
  if (i > tot_lines)      // se non ha trovato il codart...   // mette nella riga (che copia da quella del documento originale)
 | 
						||
                                                              // codart, quantit<69>, prezzo, um e azzera alcuni campi
 | 
						||
  {
 | 
						||
    TRiga_documento & new_row = doc.new_row(old_row.tipo().codice()); // copia la riga del documento originale (stesso tiporiga)
 | 
						||
    TDocumento::copy_data(new_row, old_row); 
 | 
						||
    new_row.zero(RDOC_GENERATA);
 | 
						||
    new_row.put(RDOC_PREZZO, price);
 | 
						||
    new_row.put(RDOC_UMQTA, um);
 | 
						||
    new_row.put(RDOC_QTA, quantita);
 | 
						||
    new_row.zero(RDOC_QTAEVASA);
 | 
						||
    new_row.zero(RDOC_QTAGG1);
 | 
						||
    new_row.zero(RDOC_QTAGG2);
 | 
						||
    new_row.zero(RDOC_QTAGG3);
 | 
						||
    new_row.zero(RDOC_QTAGG4);
 | 
						||
    new_row.zero(RDOC_QTAGG5);
 | 
						||
    new_row.zero(RDOC_RIGAEVASA);
 | 
						||
    new_row.zero(RDOC_SCONTO);
 | 
						||
    new_row.zero(RDOC_PERCPROV);
 | 
						||
    new_row.zero(RDOC_IMPFISSO);
 | 
						||
    new_row.zero(RDOC_IMPFISUN);
 | 
						||
    new_row.set_original_rdoc_key(old_row);  // metodo per prendere i valori dei campi chiave nella riga originale e metterli
 | 
						||
                                              // nei campi di tipo DA.. del file RDOC ('mmazza!!)     
 | 
						||
  }
 | 
						||
  else                    // se ha trovato il codart...
 | 
						||
                          // mette nella riga del nuovo documento solo la quantit<69>, aggiungendola a quella che esiste gi<67>
 | 
						||
  {
 | 
						||
    TRiga_documento & riga = doc[i];                        
 | 
						||
    real qta = riga.get(RDOC_QTA);
 | 
						||
    qta += quantita;
 | 
						||
    riga.put(RDOC_QTA,qta);
 | 
						||
  }
 | 
						||
 
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
// Do all the work!
 | 
						||
int vec1100(int argc, char* argv[])
 | 
						||
{ 
 | 
						||
  TRifatturazione a;
 | 
						||
  a.run(argc, argv, "Rifatturazione");
 | 
						||
  return (0);
 | 
						||
}
 | 
						||
 |