Files correlati : Ricompilazione Demo : [ ] Commento : riporto da 11 importazione documenti terminata (per quanto riguarda i campi noti); per gli ignoti si vedra'! git-svn-id: svn://10.65.10.50/branches/R_10_00@21083 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			430 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			430 lines
		
	
	
		
			13 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <applicat.h>
 | 
						||
#include <automask.h>
 | 
						||
#include <config.h>
 | 
						||
#include <progind.h>
 | 
						||
#include <recarray.h>
 | 
						||
#include <recset.h>
 | 
						||
#include <relapp.h>
 | 
						||
#include <reputils.h>
 | 
						||
 | 
						||
#include <clifo.h>
 | 
						||
#include <doc.h>
 | 
						||
#include <rdoc.h>
 | 
						||
 | 
						||
#include "../mg/umart.h"
 | 
						||
#include "../ve/condv.h"
 | 
						||
#include "../ve/rcondv.h"
 | 
						||
 | 
						||
#include "halib.h"
 | 
						||
#include "ha0.h"
 | 
						||
#include "ha0400a.h"
 | 
						||
 | 
						||
///////////////////////////////////////////////////////////
 | 
						||
// TAutomask
 | 
						||
///////////////////////////////////////////////////////////
 | 
						||
class THardy_tied_mask : public TAutomask
 | 
						||
{
 | 
						||
  int _pos_check, _pos_codcf, _pos_ragsoc, _pos_anno, _pos_codnum, _pos_ndoc, _pos_tipodoc, _pos_importo, _pos_condpag, _pos_codage;
 | 
						||
protected:
 | 
						||
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
						||
 | 
						||
  bool one_checked() const;
 | 
						||
  void check_all(const bool checked);
 | 
						||
 | 
						||
  long fill_recordset(const long codcf, TISAM_recordset& recset);
 | 
						||
  void fill_sheet();
 | 
						||
 | 
						||
  int elabora_contratto(TToken_string* riga_sheet, TLog_report& log);
 | 
						||
  real find_costo(const TString& codart, const TString& um) const;
 | 
						||
 | 
						||
public:
 | 
						||
  THardy_tied_mask();
 | 
						||
  ~THardy_tied_mask();
 | 
						||
};
 | 
						||
 | 
						||
 | 
						||
long THardy_tied_mask::fill_recordset(const long codcf, TISAM_recordset& recset)
 | 
						||
{
 | 
						||
  TString query;
 | 
						||
  const char tipo_contratto = get(F_TIPO)[0];
 | 
						||
 | 
						||
  query << "USE RDOC";
 | 
						||
  query << "\nSELECT (DOC.STATO=5)&&(TIPORIGA=#TIPORIGA)&&(STR(" << RCA_2_ANTICIPATO << "<=" << RCA_2_RESO_STORICO << "))";
 | 
						||
  //in base al tipo contratto cambia la query
 | 
						||
  if (tipo_contratto == 'T')
 | 
						||
    query << "&&((DOC.TIPODOC=#A_TIPODOC)||(DOC.TIPODOC=#R_TIPODOC))";
 | 
						||
  else
 | 
						||
    query << "&&(DOC.TIPODOC=#TIPODOC)";
 | 
						||
 | 
						||
  if (codcf > 0)
 | 
						||
    query << "&&(DOC.TIPOCF='C')&&(DOC.CODCF=#CODCF)";
 | 
						||
 | 
						||
  query << "\nJOIN DOC INTO PROVV=PROVV ANNO=ANNO CODNUM=CODNUM NDOC=NDOC";
 | 
						||
 | 
						||
  //setta la query al recordset, che inizialmente aveva una query vuota
 | 
						||
  recset.set(query);
 | 
						||
 | 
						||
  //settaggio delle variabili
 | 
						||
  //tipo riga
 | 
						||
  const TString4 tiporiga = HARDY_TIPORIGA_SOMMA;
 | 
						||
  recset.set_var("#TIPORIGA", tiporiga);
 | 
						||
  //numerazione
 | 
						||
  TConfig config(CONFIG_DITTA, "ha");
 | 
						||
  const TString4 tipo_a = config.get("CoAntTip");
 | 
						||
  const TString4 tipo_r = config.get("CoRifaTip");
 | 
						||
  switch (tipo_contratto)
 | 
						||
  {
 | 
						||
  case 'A': recset.set_var("#TIPODOC", tipo_a); break;
 | 
						||
  case 'R': recset.set_var("#TIPODOC", tipo_r); break;
 | 
						||
  case 'T': recset.set_var("#A_TIPODOC", tipo_a);  recset.set_var("#R_TIPODOC", tipo_r); break;
 | 
						||
  default:  break;
 | 
						||
  }
 | 
						||
 | 
						||
  //clifo
 | 
						||
  if (codcf > 0)
 | 
						||
    recset.set_var("#CODCF", codcf);
 | 
						||
 | 
						||
  //e alla fine della fiera...
 | 
						||
  const long items = recset.items();
 | 
						||
  return items;
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
 | 
						||
void THardy_tied_mask::fill_sheet()
 | 
						||
{
 | 
						||
 | 
						||
  TSheet_field& sf_righe = sfield(F_RIGHE);
 | 
						||
  sf_righe.destroy();
 | 
						||
 | 
						||
  //query per raccattare i contratti pareggiati; in base al filtro sul cliente cambia la query
 | 
						||
  TString query;
 | 
						||
  long recset_items;
 | 
						||
  TISAM_recordset recset(query);
 | 
						||
  const long codcf = get_long(F_CODCF);
 | 
						||
  
 | 
						||
  recset_items = fill_recordset(codcf, recset);
 | 
						||
 | 
						||
  //riempie le righe dello sheet
 | 
						||
  TProgind progind(recset_items, "Ricerca contratti in corso...", false, true);
 | 
						||
  //record corrente
 | 
						||
  //const TRectype& rec = recset.cursor()->curr();    ****cazzone****
 | 
						||
  //per ogni riga del recordset va ad aggiornare lo sheet sulla maschera (aggiunge la riga)
 | 
						||
  for (bool ok = recset.move_first(); ok; ok = recset.move_next())
 | 
						||
  {
 | 
						||
    progind.addstatus(1);
 | 
						||
 | 
						||
    TToken_string& row = sf_righe.row(-1);          //riga sheet da riempire
 | 
						||
 | 
						||
    row.add("");
 | 
						||
    const TString& codcf = recset.get("DOC.CODCF").as_string();
 | 
						||
    row.add(codcf);
 | 
						||
    TToken_string key;
 | 
						||
    key.add("C");
 | 
						||
    key.add(codcf);
 | 
						||
    const TString& ragsoc = cache().get(LF_CLIFO, key, CLI_RAGSOC);
 | 
						||
    row.add(ragsoc);
 | 
						||
    const int anno = recset.get(RDOC_ANNO).as_int();
 | 
						||
    row.add(anno);
 | 
						||
    const TString& codnum = recset.get(RDOC_CODNUM).as_string();
 | 
						||
    row.add(codnum);
 | 
						||
    const long ndoc = recset.get(RDOC_NDOC).as_int();
 | 
						||
    row.add(ndoc);
 | 
						||
    const TString& tipo = recset.get("DOC.TIPODOC").as_string();
 | 
						||
    row.add(tipo);
 | 
						||
    real importo = recset.get(RCA_2_ANTICIPATO).as_real();
 | 
						||
    const TString& str_importo = importo.string();
 | 
						||
    row.add(str_importo);
 | 
						||
    const TString& codpag = recset.get("DOC.CODPAG").as_string();
 | 
						||
    row.add(codpag);
 | 
						||
    const TString& codag = recset.get("DOC.CODAG").as_string();
 | 
						||
    row.add(codag);
 | 
						||
 | 
						||
    sf_righe.check_row(sf_righe.items()-1, 3);
 | 
						||
  }
 | 
						||
 | 
						||
  //mostra e aggiorna lo sheet
 | 
						||
  sf_righe.show();
 | 
						||
  sf_righe.force_update();
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
//controlla sulla colonna delle spunte se almeno una <20> checkata
 | 
						||
bool THardy_tied_mask::one_checked() const
 | 
						||
{
 | 
						||
  TSheet_field& sf_righe = sfield(F_RIGHE);
 | 
						||
  FOR_EACH_SHEET_ROW(sf_righe, i, riga)
 | 
						||
  {
 | 
						||
    if (riga->get_char(0) > ' ')
 | 
						||
      return true;
 | 
						||
  }
 | 
						||
  return false;
 | 
						||
}
 | 
						||
 | 
						||
//checka-dechecka la colonna di spunte dello sheet
 | 
						||
void THardy_tied_mask::check_all(const bool checked)
 | 
						||
{
 | 
						||
  TSheet_field& sf_righe = sfield(F_RIGHE);
 | 
						||
 | 
						||
  FOR_EACH_SHEET_ROW(sf_righe, i, riga)
 | 
						||
    riga->add(checked ? "X" : "", 0);
 | 
						||
 | 
						||
  sf_righe.force_update();
 | 
						||
}
 | 
						||
 | 
						||
 | 
						||
real THardy_tied_mask::find_costo(const TString& codart, const TString& um) const
 | 
						||
{
 | 
						||
  const TRectype& rec_anamag = cache().get(LF_ANAMAG, codart);
 | 
						||
  real costo = rec_anamag.get_real(ANAMAG_ULTCOS1);
 | 
						||
  if (costo <= ZERO)
 | 
						||
    costo = rec_anamag.get_real(ANAMAG_COSTSTD);
 | 
						||
 | 
						||
  if (costo <= ZERO)
 | 
						||
  {
 | 
						||
    TLocalisamfile umart(LF_UMART);
 | 
						||
    umart.setkey(2);
 | 
						||
    umart.put(UMART_CODART, codart);
 | 
						||
    umart.put(UMART_UM, um);
 | 
						||
    const int err_umart = umart.read();
 | 
						||
    if (err_umart == NOERR)
 | 
						||
      costo = umart.get_real(UMART_PREZZO) * 0.5;
 | 
						||
  }
 | 
						||
 | 
						||
  return costo;
 | 
						||
}
 | 
						||
 | 
						||
//metodo base per l'elaborazione dei contratti pareggiati
 | 
						||
int THardy_tied_mask::elabora_contratto(TToken_string* riga_sheet, TLog_report& log)
 | 
						||
{
 | 
						||
  //si crea il contratto_premi di origine, per caricare i dati che poi dovr<76> modificare
 | 
						||
  const long codcf = riga_sheet->get_long(_pos_codcf);
 | 
						||
  const int anno = riga_sheet->get_int(_pos_anno);
 | 
						||
  const TString& codnum = riga_sheet->get(_pos_codnum);
 | 
						||
  const long ndoc = riga_sheet->get_long(_pos_ndoc);
 | 
						||
  
 | 
						||
  //crea il contratto premi...
 | 
						||
  TContratto_premi contratto_premi('D', anno, codnum, ndoc);
 | 
						||
  //..e le sue righe
 | 
						||
  TRecord_array& righe_contr_premi = contratto_premi.body();
 | 
						||
 | 
						||
  //indicatore di errore complessivo!
 | 
						||
  int err = NOERR;
 | 
						||
 | 
						||
  //cerca il listino cliente corrispondente..
 | 
						||
  const TString4 listino_cliente = contratto_premi.get(DOC_CODCONT);
 | 
						||
 | 
						||
  TToken_string key;
 | 
						||
  key.add("C");             //0
 | 
						||
  key.add("");              //1
 | 
						||
  key.add("C");             //2
 | 
						||
  key.add(codcf);           //3
 | 
						||
  key.add(listino_cliente); //4
 | 
						||
  TLocalisamfile condv(LF_CONDV);
 | 
						||
  condv.put(CONDV_TIPO, key.get(0));
 | 
						||
  condv.put(CONDV_CATVEN, key.get(1));
 | 
						||
  condv.put(CONDV_TIPOCF, key.get(2));
 | 
						||
  condv.put(CONDV_CODCF, key.get(3));
 | 
						||
  condv.put(RCONDV_COD, key.get(4));
 | 
						||
  err = condv.read();
 | 
						||
  //se non lo trova (non dovrebbe MAI accadere, ma i listini cliente possono essere erroneamente accoppati via gestione contratti campo
 | 
						||
  if (err != NOERR)
 | 
						||
  {
 | 
						||
    TString msg;
 | 
						||
    msg.format("Il contratto premi %4d%s%7ld del cliente %6ld non ha un listino cliente associato !! Errore: %d", 
 | 
						||
               anno, (const char*)codnum, ndoc, codcf, err);
 | 
						||
    log.log(2, msg);
 | 
						||
  }
 | 
						||
 | 
						||
  //se lo trova scatta l'analisi delle righe listino cliente
 | 
						||
  TLocalisamfile rcondv(LF_RCONDV);
 | 
						||
 | 
						||
  //e adesso scatta la ricerca dell'articolo del contratto premi dentro le righe del listino cliente...
 | 
						||
  for (int i = righe_contr_premi.last_row(); i > 0 && err == NOERR; i = righe_contr_premi.pred_row(i))
 | 
						||
  {
 | 
						||
    TRectype& riga = righe_contr_premi[i];
 | 
						||
    //solo le righe merce del contratto premi devono essere scasinate!
 | 
						||
    if (riga.get(RDOC_TIPORIGA) == HARDY_TIPORIGA_MERCE)
 | 
						||
    {
 | 
						||
      const TString80 codart = riga.get(RDOC_CODART);
 | 
						||
      const TString4 um = riga.get(RDOC_UMQTA);
 | 
						||
      //adesso gli tocca cercare lo stesso articolo (e UM) dentro le righe listino cliente per raccatare il prezzo
 | 
						||
      rcondv.put(RCONDV_TIPO, key.get(0));
 | 
						||
      rcondv.put(RCONDV_CATVEN, key.get(1));
 | 
						||
      rcondv.put(RCONDV_TIPOCF, key.get(2));
 | 
						||
      rcondv.put(RCONDV_CODCF, key.get(3));
 | 
						||
      rcondv.put(RCONDV_COD, key.get(4));
 | 
						||
      rcondv.put(RCONDV_TIPORIGA, 'A');
 | 
						||
      rcondv.put(RCONDV_CODRIGA, codart);
 | 
						||
 | 
						||
      //la u.m. ci va solo se il listino cliente ha la gestione u.m. (tanto per complicarsi la vita!)
 | 
						||
      const bool gestum_contr = cache().get(LF_CONDV, key, CONDV_GESTUM) == "X";
 | 
						||
      if (gestum_contr)
 | 
						||
        rcondv.put(RCONDV_UM, um);
 | 
						||
 | 
						||
      err = rcondv.read(_isequal, _lock);
 | 
						||
      if (err == NOERR)
 | 
						||
      {
 | 
						||
        //premio e ns_carico li prende dalla riga del contratto premi
 | 
						||
        const real premio = riga.get_real(RC_1_PREMIO);
 | 
						||
        const real ns_carico = riga.get_real(RC_1_NSCARICO);
 | 
						||
        //il prezzo lo prende dal listino cliente
 | 
						||
        real prezzo = rcondv.get_real(RCONDV_PREZZO);
 | 
						||
        //aggiorna il prezzo con una formula ladresca...
 | 
						||
        prezzo = prezzo - premio + ns_carico;
 | 
						||
 | 
						||
        //controlla di non avere un prezzo del cazzo!
 | 
						||
        const real costo = find_costo(codart, um);
 | 
						||
        if (prezzo < costo)
 | 
						||
        {
 | 
						||
          TString msg;
 | 
						||
          msg.format("Il prezzo dell'articolo %s e' inferiore alla meta' del costo !", (const char*)codart);
 | 
						||
          log.log(2, msg);
 | 
						||
        }
 | 
						||
 | 
						||
        rcondv.put(RCONDV_PREZZO, prezzo);
 | 
						||
        
 | 
						||
        err = rcondv.rewrite();
 | 
						||
        if (err != NOERR)
 | 
						||
        {
 | 
						||
          TString msg;
 | 
						||
          msg.format("Imossibile aggiornare il listino %s del cliente %6ld ! Errore %d", (const char*)listino_cliente, codcf, err);
 | 
						||
          log.log(1, msg);
 | 
						||
        }
 | 
						||
      }
 | 
						||
      else
 | 
						||
      {
 | 
						||
        TString msg;
 | 
						||
        msg.format("Impossibile trovare l'articolo %s con u.m. %s nel listino %s del cliente %6ld !! Errore %d", 
 | 
						||
                  (const char*)codart, (const char*)um, (const char*)listino_cliente, codcf, err);
 | 
						||
        log.log(2, msg);
 | 
						||
      }
 | 
						||
 | 
						||
    } //if (riga.get(RDOC_TIPORIGA)...
 | 
						||
  } //for (int i = righe_contr_premi.last_row()...
 | 
						||
 | 
						||
  //alla fine della fiera il contratto premi va messo in stato scaduto, ovvero 9 direi...
 | 
						||
  if (err == NOERR)
 | 
						||
  {
 | 
						||
    const TTipo_documento& tipodoc = contratto_premi.tipo();
 | 
						||
    const char stato_scaduto = tipodoc.stato_chiuso();
 | 
						||
 | 
						||
    contratto_premi.put(DOC_STATO, stato_scaduto);
 | 
						||
    err = contratto_premi.rewrite();
 | 
						||
 | 
						||
    if (err != NOERR)
 | 
						||
    {
 | 
						||
      TString msg;
 | 
						||
      msg.format("Impossibile aggiornare il contratto premi %4d%s%7ld del cliente %6ld !! Errore %d",
 | 
						||
                 anno, (const char*)codnum, ndoc, err);
 | 
						||
      log.log(2, msg);
 | 
						||
    }
 | 
						||
  }
 | 
						||
 | 
						||
  //aggiornamento positivo del log!
 | 
						||
  if (err == NOERR)
 | 
						||
  {
 | 
						||
    TString msg;
 | 
						||
    msg.format("Chiuso contratto premi %7ld del cliente %6ld - Aggiornato listino %s", ndoc, codcf, (const char*)listino_cliente);
 | 
						||
  }
 | 
						||
 | 
						||
  return err;
 | 
						||
}
 | 
						||
 | 
						||
bool THardy_tied_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | 
						||
{
 | 
						||
  switch (o.dlg())
 | 
						||
	{
 | 
						||
  case F_TIPO:
 | 
						||
    if (e == fe_modify)
 | 
						||
    {
 | 
						||
      //riempie lo sheet con i contratti pareggiati
 | 
						||
      const TString& tipo = get(F_TIPO);
 | 
						||
      if (tipo.full())
 | 
						||
        fill_sheet();
 | 
						||
    }
 | 
						||
 | 
						||
    //toolbar
 | 
						||
  case DLG_CHECKALL:
 | 
						||
    if (e == fe_button)
 | 
						||
    {
 | 
						||
      check_all(!one_checked());
 | 
						||
    }
 | 
						||
    break;
 | 
						||
 | 
						||
  case DLG_OK:
 | 
						||
    if (e == fe_button)
 | 
						||
    {
 | 
						||
      //gi<67> che ci siamo mettiamoci pure un log di elaborazione
 | 
						||
      TLog_report log("Elaborazione contratti selezionati");
 | 
						||
      log.kill_duplicates();
 | 
						||
      log.log(0, "");
 | 
						||
      TSheet_field& righe = sfield(F_RIGHE);
 | 
						||
      FOR_EACH_SHEET_ROW(righe, r, riga)
 | 
						||
      {
 | 
						||
        //vengono elaborate solo le righe checkate
 | 
						||
        const char checked = riga->get_char(0);
 | 
						||
        if (checked == 'X')
 | 
						||
          int err = elabora_contratto(riga, log);
 | 
						||
      }
 | 
						||
      log.print_or_preview();
 | 
						||
    }
 | 
						||
    break;
 | 
						||
  default:
 | 
						||
    break;
 | 
						||
  }
 | 
						||
  return true;
 | 
						||
}
 | 
						||
 | 
						||
THardy_tied_mask::THardy_tied_mask() : TAutomask ("ha0400a")
 | 
						||
{
 | 
						||
  //assegna una volta per tutte le pos delle colonne di sheet
 | 
						||
  TSheet_field& sf_righe = sfield(F_RIGHE);
 | 
						||
  _pos_check = sf_righe.cid2index(S_CHECK);
 | 
						||
  _pos_codcf = sf_righe.cid2index(S_CODCF);
 | 
						||
  _pos_ragsoc = sf_righe.cid2index(S_RAGSOC);
 | 
						||
  _pos_anno = sf_righe.cid2index(S_ANNO);
 | 
						||
  _pos_codnum = sf_righe.cid2index(S_CODNUM);
 | 
						||
  _pos_ndoc = sf_righe.cid2index(S_NDOC);
 | 
						||
  _pos_tipodoc = sf_righe.cid2index(S_TIPO);
 | 
						||
  _pos_importo = sf_righe.cid2index(S_IMPORTO);
 | 
						||
  _pos_condpag = sf_righe.cid2index(S_CONDPAG);
 | 
						||
  _pos_codage = sf_righe.cid2index(S_CODAG);
 | 
						||
}
 | 
						||
 | 
						||
THardy_tied_mask::~THardy_tied_mask()
 | 
						||
{
 | 
						||
}
 | 
						||
 | 
						||
///////////////////////////////////////
 | 
						||
// TSkeleton_application
 | 
						||
///////////////////////////////////////
 | 
						||
class THardy_tied : public TSkeleton_application
 | 
						||
{
 | 
						||
protected:
 | 
						||
public:
 | 
						||
  virtual void main_loop();
 | 
						||
  virtual bool create();
 | 
						||
};
 | 
						||
 | 
						||
void THardy_tied::main_loop()
 | 
						||
{
 | 
						||
  THardy_tied_mask mask;
 | 
						||
  while (mask.run() == K_ENTER)
 | 
						||
  {
 | 
						||
  }
 | 
						||
}
 | 
						||
 | 
						||
bool THardy_tied::create()
 | 
						||
{
 | 
						||
  open_files(LF_DOC, LF_RIGHEDOC, LF_CONDV, LF_RCONDV, 0);
 | 
						||
 | 
						||
	return TSkeleton_application::create();
 | 
						||
}
 | 
						||
 | 
						||
int ha0400 (int argc, char* argv[])
 | 
						||
{
 | 
						||
  THardy_tied tiedapp;
 | 
						||
  tiedapp.run(argc, argv, TR("Elaborazione contratti premio pareggiati"));
 | 
						||
  return 0;
 | 
						||
} |