Files correlati : Ricompilazione Demo : [ ] Commento : git-svn-id: svn://10.65.10.50/branches/R_10_00@22044 c028cbd2-c16b-5b4b-a496-9718f37d4682
		
			
				
	
	
		
			269 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
			
		
		
	
	
			269 lines
		
	
	
		
			8.1 KiB
		
	
	
	
		
			C++
		
	
	
		
			Executable File
		
	
	
	
	
#include <applicat.h>
 | 
						||
#include <automask.h>
 | 
						||
#include <progind.h>
 | 
						||
#include <recarray.h>
 | 
						||
#include <recset.h>
 | 
						||
#include <reputils.h>
 | 
						||
#include <textset.h>
 | 
						||
#include <utility.h>
 | 
						||
 | 
						||
#include <doc.h>
 | 
						||
#include <rdoc.h>
 | 
						||
#include "../mg/codcorr.h"
 | 
						||
#include "../cg/cglib01.h"
 | 
						||
#include "../ve/velib.h"
 | 
						||
 | 
						||
#include "halib.h"
 | 
						||
 | 
						||
#include "ha2.h"
 | 
						||
#include "ha2100a.h"
 | 
						||
 | 
						||
const char* const APPNAME = TR("Esselunga: generazione file Privat"); 
 | 
						||
 | 
						||
///////////////////////////////////////////////////////////
 | 
						||
// TAutomask
 | 
						||
///////////////////////////////////////////////////////////
 | 
						||
class THardy_esselunga_mask : public TAutomask
 | 
						||
{
 | 
						||
protected:
 | 
						||
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
 | 
						||
 | 
						||
public:
 | 
						||
  THardy_esselunga_mask();
 | 
						||
	virtual ~THardy_esselunga_mask() {};
 | 
						||
};
 | 
						||
 | 
						||
THardy_esselunga_mask::THardy_esselunga_mask() : TAutomask ("ha2100a")
 | 
						||
{
 | 
						||
}
 | 
						||
 | 
						||
bool THardy_esselunga_mask::on_field_event(TOperable_field& o, TField_event e, long jolly)
 | 
						||
{ 
 | 
						||
  return true;
 | 
						||
}
 | 
						||
 | 
						||
/////////////////////////////////////////////////////////////
 | 
						||
//	Recordset per file privat
 | 
						||
/////////////////////////////////////////////////////////////
 | 
						||
class TPrivat_recordset : public TAS400_recordset
 | 
						||
{
 | 
						||
public:
 | 
						||
	TPrivat_recordset(const TString4 dipendenza);
 | 
						||
};
 | 
						||
 | 
						||
TPrivat_recordset::TPrivat_recordset(const TString4 dipendenza)
 | 
						||
: TAS400_recordset("AS400(53)")
 | 
						||
{
 | 
						||
	TConfig config(CONFIG_DITTA, "ha");
 | 
						||
	const TString16 cod_hardy = config.get("Esselunga_CodHardy");
 | 
						||
	create_field("CDC",				-1, 3,  _intzerofld);		// centro di costo
 | 
						||
	create_field("CODART",		-1, 6,  _longzerofld);	  // codice articolo
 | 
						||
	create_field("CODFORN",		-1, 6,  _longzerofld,  true, TVariant(cod_hardy));		// codice fornitore
 | 
						||
	create_field("TIPOBOLLA", -1, 1,  _alfafld, true, TVariant("A"));	// tipo bolla
 | 
						||
	create_field("NUMBOLLA",	-1, 12, _alfafld);	// numero bolla
 | 
						||
	create_field("DATABOLLA", -1, 8,  _longzerofld);	  // data bolla
 | 
						||
	create_field("QTACONS",		-1, 7,  _alfafld);		// qta consegnata
 | 
						||
	create_field("QTARESA",	  -1, 7,  _alfafld);		// qta resa
 | 
						||
	create_field("CODDIP",		-1, 1,  _alfafld,  true, TVariant(dipendenza));		// codice dipendenza
 | 
						||
	create_field("FINE-REC",  -1, 2,  _alfafld, true, TVariant("\r\n")); // a capo
 | 
						||
}
 | 
						||
 | 
						||
///////////////////////////////////////
 | 
						||
// TSkeleton_application
 | 
						||
///////////////////////////////////////
 | 
						||
class THardy_esselunga : public TSkeleton_application
 | 
						||
{
 | 
						||
protected:
 | 
						||
  long genera_recordset(const TMask& mask, TISAM_recordset& recset);
 | 
						||
  void elabora(const TMask& mask);
 | 
						||
  void check_date(const TDate& datafine, TDate& dataini);
 | 
						||
  long check_cliente(const long codcf, const TString4 dipendenza);
 | 
						||
	TFilename scrivi_testata(const TMask& mask);
 | 
						||
 | 
						||
public:
 | 
						||
  virtual void main_loop();
 | 
						||
  virtual bool create();
 | 
						||
};
 | 
						||
 | 
						||
//metodo per ricavare la data iniziale di elaborazione qualora l'utonto non la metta e l'esercizio da usare
 | 
						||
void THardy_esselunga::check_date(const TDate& datafine, TDate& dataini)
 | 
						||
{
 | 
						||
  TEsercizi_contabili esc;
 | 
						||
  TDate datafine_tmp = datafine;
 | 
						||
  const int esercizio = esc.date2esc(datafine);
 | 
						||
  esc.code2range(esercizio, dataini, datafine_tmp);
 | 
						||
}
 | 
						||
 | 
						||
//metodo che filtra tutti i documenti in base ai parametri della maschera
 | 
						||
long THardy_esselunga::genera_recordset(const TMask& mask, TISAM_recordset& recset)
 | 
						||
{
 | 
						||
  TString query;
 | 
						||
	query << "USE DOC KEY 3\n";
 | 
						||
 | 
						||
	TString filt_expr;
 | 
						||
	// aggiungo alla query le condizioni sulle numerazioni selezionare da maschera
 | 
						||
	TSheet_field& sheet = mask.sfield(F_SHEETDOC);
 | 
						||
  const long items = sheet.items();
 | 
						||
  if (items > 0)
 | 
						||
  {
 | 
						||
	  TString16 codnum;
 | 
						||
	  filt_expr << " SELECT";
 | 
						||
	  FOR_EACH_SHEET_ROW(sheet, r, row)
 | 
						||
	  {
 | 
						||
	    codnum = row->get(0);
 | 
						||
	    if (codnum.not_empty())
 | 
						||
	    {
 | 
						||
	    	filt_expr << " (CODNUM=\"";
 | 
						||
	    	filt_expr << codnum << "\") ||";
 | 
						||
	    }
 | 
						||
	  }
 | 
						||
	  filt_expr.rtrim(2);  
 | 
						||
		query << filt_expr;
 | 
						||
	}
 | 
						||
  query << "\nFROM DATADOC=#DATAINI PROVV='D' ANNO=#ANNO";
 | 
						||
  query << "\nTO DATADOC=#DATAFIN PROVV='D' ANNO=#ANNO";
 | 
						||
 | 
						||
  recset.set(query);
 | 
						||
 | 
						||
  //settaggio delle variabili
 | 
						||
  const TDate datafin = mask.get_date(F_DATAFIN);
 | 
						||
  TDate dataini = mask.get_date(F_DATAINI);
 | 
						||
 | 
						||
	//se la data iniziale <20> vuota deve coincidere con l'inizio dell'esercizio della data finale (obbligatoria!)
 | 
						||
  int esc = datafin.year();
 | 
						||
  if (!dataini.ok())
 | 
						||
    check_date(datafin, dataini);
 | 
						||
 | 
						||
  recset.set_var("#ANNO", long(esc));
 | 
						||
  recset.set_var("#DATAINI", dataini);
 | 
						||
  recset.set_var("#DATAFIN", datafin);
 | 
						||
  return recset.items();
 | 
						||
}
 | 
						||
 | 
						||
TFilename THardy_esselunga::scrivi_testata(const TMask& mask)
 | 
						||
{
 | 
						||
	const TString4 dipendenza = mask.get(F_DIPENDENZA);
 | 
						||
	TConfig config(CONFIG_DITTA, "ha");
 | 
						||
	TFilename file_privat = config.get("Esselunga_Path");
 | 
						||
	if (dipendenza[0] == 'D')
 | 
						||
		file_privat.add("CDMI");
 | 
						||
	else
 | 
						||
		file_privat.add("CDFI");
 | 
						||
	file_privat.ext("txt");
 | 
						||
  ofstream file_output(file_privat);
 | 
						||
	TString record(260);
 | 
						||
	// tipo record/filler/tot_record/progr_record
 | 
						||
	record = "PVT*?*001001";
 | 
						||
	// nome del file
 | 
						||
	record << file_privat.name();
 | 
						||
	// identificativo mittente
 | 
						||
	record.overwrite(config.get("Esselunga_PIvaHardy"), 85);
 | 
						||
	record.overwrite(config.get("Esselunga_TipoEmissione"), 120);
 | 
						||
	// identificativo destinatario
 | 
						||
	record.overwrite(config.get("Esselunga_PIvaEsselunga"), 138);
 | 
						||
	record.overwrite(config.get("Esselunga_TipoEmissione"), 173);
 | 
						||
	// formato (Ascii)
 | 
						||
	record.overwrite("A", 191);
 | 
						||
	// identificativo univoco del documento
 | 
						||
	record.overwrite("0000000000000001", 243);
 | 
						||
  file_output << record << endl;
 | 
						||
  file_output.close();
 | 
						||
	return file_privat;
 | 
						||
}
 | 
						||
 | 
						||
void THardy_esselunga::elabora(const TMask& mask)
 | 
						||
{
 | 
						||
	TLog_report log;
 | 
						||
	const TString4 dipendenza = mask.get(F_DIPENDENZA);
 | 
						||
	TFilename file_privat = scrivi_testata(mask);
 | 
						||
  TISAM_recordset recset("");
 | 
						||
  const long items = genera_recordset(mask, recset);
 | 
						||
  if (items == 0)
 | 
						||
    log.log(1, "Non esistono documenti che soddisfano i parametri selezionati.");
 | 
						||
	// lettura dei documenti da recordset
 | 
						||
  TProgind pi(recset.items(), TR("Elaborazione documenti in corso..."), true, true);
 | 
						||
	TPrivat_recordset privat(dipendenza);
 | 
						||
	TCodArtEsselunga_cache cache_ca;
 | 
						||
  for (bool ok = recset.move_first(); ok; ok = recset.move_next())
 | 
						||
	{
 | 
						||
    if (!pi.addstatus(1))
 | 
						||
      break;
 | 
						||
 | 
						||
    const long codcf = recset.get(DOC_CODCF).as_int();
 | 
						||
		// verificare se il cliente appartiene alla dipendenza selezionata e se ha tutti i parametri per poter essere inviato
 | 
						||
		const long codcf_esselunga = check_cliente(codcf, dipendenza);
 | 
						||
		if ( codcf_esselunga > 0)
 | 
						||
		{
 | 
						||
			TDocumento* doc = new TDocumento(recset.cursor()->curr());
 | 
						||
			//  passo tutte le righe del documento all'AS400recordset
 | 
						||
			TString16 numdoc;
 | 
						||
			const TString& num = doc->numerazione();
 | 
						||
			numdoc.format("%012d",doc->numero());
 | 
						||
			numdoc << cache().get("%NUM", num, "S7");
 | 
						||
			numdoc.strip("/");
 | 
						||
			numdoc = numdoc.right(12);
 | 
						||
			FOR_EACH_PHYSICAL_RDOC(*doc, r, rigadoc)
 | 
						||
			{			
 | 
						||
				const TString80& codart_esselunga = cache_ca.decode(rigadoc->get(RDOC_CODART));
 | 
						||
				privat.new_rec("");
 | 
						||
				privat.set("CDC", TVariant(codcf_esselunga));
 | 
						||
				privat.set("CODART", codart_esselunga);			
 | 
						||
				privat.set("NUMBOLLA", numdoc);
 | 
						||
				privat.set("DATABOLLA", recset.get(DOC_DATADOC));
 | 
						||
				real qta = rigadoc->get_real(RDOC_QTA);
 | 
						||
				TString16 qtastr = qta.string(8,2,'0');
 | 
						||
				qtastr.strip(".");
 | 
						||
				privat.set("QTACONS", qtastr);
 | 
						||
				privat.set("QTARESA", "0000000");
 | 
						||
			} //FOR_EACH...
 | 
						||
		} // if check_cliente...
 | 
						||
  } //for (bool ok = recset.move_first()...
 | 
						||
 | 
						||
	TFilename tempfile;
 | 
						||
	tempfile.temp();
 | 
						||
	privat.save_as(tempfile, fmt_text);
 | 
						||
	fcopy(tempfile, file_privat, true);
 | 
						||
	// memorizzo su campo virtuale che il doc. e' stato inviato
 | 
						||
	const bool definitivo = mask.get_bool(F_DEFINITIVO);
 | 
						||
  if (definitivo)
 | 
						||
  {
 | 
						||
	
 | 
						||
  }
 | 
						||
  log.print_or_preview();
 | 
						||
}
 | 
						||
 | 
						||
long THardy_esselunga::check_cliente(const long codcf, const TString4 dipendenza)
 | 
						||
{
 | 
						||
	long codcf_hardy = -1;
 | 
						||
	TString key;
 | 
						||
	key.format("%ld", codcf);
 | 
						||
	const TRectype rec_cliente = cache().get("&CEL", key);
 | 
						||
	const bool invio = rec_cliente.get_bool("B0");
 | 
						||
	if (invio)
 | 
						||
	{
 | 
						||
		const char dip_cliente = rec_cliente.get("S1")[0];
 | 
						||
		if (dip_cliente == dipendenza[0])
 | 
						||
			codcf_hardy = rec_cliente.get_long("I0");
 | 
						||
	}
 | 
						||
	return codcf_hardy;
 | 
						||
}
 | 
						||
 | 
						||
void THardy_esselunga::main_loop()
 | 
						||
{
 | 
						||
  THardy_esselunga_mask mask;
 | 
						||
  while (mask.run() == K_ENTER)
 | 
						||
    elabora(mask);
 | 
						||
}
 | 
						||
 | 
						||
bool THardy_esselunga::create()
 | 
						||
{
 | 
						||
  open_files(LF_DOC, LF_RIGHEDOC, 0);
 | 
						||
	return TSkeleton_application::create();
 | 
						||
}
 | 
						||
 | 
						||
int ha2100 (int argc, char* argv[])
 | 
						||
{
 | 
						||
  THardy_esselunga elabapp;
 | 
						||
	elabapp.run(argc, argv, APPNAME);
 | 
						||
  return 0;
 | 
						||
} |