#include <applicat.h>
#include <automask.h>
#include <defmask.h>
#include <relation.h>
#include <reprint.h>

#include "ps0920.h"
#include "ps0920100a.h"

#include <rdoc.h>

class TMaskPs09201 : public TAutomask
{
  TCursor_sheet  * _sht;
	bool           _select_changed;

protected:
  virtual bool on_field_event(TOperable_field& o, TField_event e, long jolly);
	void update_sheet();

public:
	TCursor_sheet& sheet() const;
  TMaskPs09201();
  virtual ~TMaskPs09201();
};

TCursor_sheet& TMaskPs09201::sheet() const 
{ 
  if (_sht == NULL) // Non si sa mai!
    ((TMaskPs09201*)this)->update_sheet();
  return *_sht;
}


TMaskPs09201::TMaskPs09201()
            : TAutomask("ps0920100a"), _sht(NULL)
{
	((TButton_field&) field(DLG_SELECT)).set_exit_key(0);
	_select_changed = true;
}

TMaskPs09201::~TMaskPs09201()
{  
	if (_sht != NULL)
		delete _sht;
}             

bool TMaskPs09201::on_field_event(TOperable_field& o, TField_event e, long jolly)
{
	const int id = o.dlg();
	switch (id)
	{
		case F_NUM:
		case F_ANNO:
		case F_CODCLI:
			_select_changed = true;
			break;
		case DLG_SELECT:
			if (e == fe_button)
			{
				if (_select_changed)
					update_sheet();
				_select_changed = false;
				_sht->run();
			}
			break;
		default:
			break;
	}
  return TRUE;
}

void TMaskPs09201::update_sheet()
{
	
	if (_sht != NULL)
	{
		delete _sht;
		_sht = NULL;
	}
	
	_select_changed = false;

	TRelation * r = new TRelation(LF_RIGHEDOC);
	TRectype from(r->curr());
	const long codcli = get_long(F_CODCLI);
	TString codartfrom; codartfrom.format("%03ld", codcli);

	from.put(RDOC_CODNUM, get(F_NUM));
	from.put(RDOC_ANNO, get(F_ANNO));
	from.put(RDOC_PROVV, "D");
	from.put(RDOC_CODART, codartfrom);

	TRectype to(from);
	
	TString codartto; codartto.format("%03ld", codcli + 1);
	to.put(RDOC_CODART, codartto);
	TCursor * c = new TSorted_cursor(r, "CODNUM|NDOC|NRIGA", "RIGAEVASA!=\"X\"", 2, &from, &to);
  _sht = new TCursor_sheet(c, " |CODNUM|NDOC|NRIGA|DATACONS|CODART|DESCR", "Selezione articoli",
		                                    "@1|Ordine@6|N.Doc.@7|N.Riga@6|Data\nConsegna@10|Articolo@20|Descr@50",0,1);
	_sht->uncheck(-1);
}

class TStampaProduzionePs0920 : public TSkeleton_application  
{
  virtual bool check_autorization() const { return false; }
  virtual const char * extra_modules() const {return "ve";}


protected:
  virtual void main_loop();
  virtual bool create();

public:
  virtual ~TStampaProduzionePs0920();
};

void TStampaProduzionePs0920::main_loop()
{
  TMaskPs09201 m;

  while (m.run() == K_ENTER)
  {
		TCursor_sheet& s = m.sheet();
		
		if (s.one_checked())
		{
		  TReport_book book;
			TCursor & cur = *s.cursor();
			TReport rep;

			if (m.get_bool(F_PAGEBREAK))
				rep.load("OrdineProdSP.rep"); 
			else
				rep.load("OrdineProd.rep"); 
			const long items = cur.items();

			for (long pos = 0L; pos < items; pos++)
			{
				if (s.checked(pos))
				{
					cur = pos;
					const TRectype & rec = cur.curr();
					TRecordset & r = *rep.recordset();
					TVariant var;

					var = rec.get(RDOC_CODNUM);
					r.set_var("#S_NUM", var);
					var = rec.get(RDOC_ANNO);
					r.set_var("#S_ANNO", var);
					var = rec.get(RDOC_NDOC);
					r.set_var("#S_NDOC", var);
					var = rec.get(RDOC_NRIGA);
					r.set_var("#S_NRIGA", var);
					var = rec.get(RDOC_IDRIGA);
					r.set_var("#S_IDRIGA", var);
					book.add(rep);
				}
			}
			book.print_or_preview();
		}
  }
}

bool TStampaProduzionePs0920::create()
{
	return TSkeleton_application:: create();
}

TStampaProduzionePs0920::~TStampaProduzionePs0920()
{
}

TStampaProduzionePs0920 & app() { return (TStampaProduzionePs0920&) main_app();}

int ps0920100(int argc, char* argv[])
{
  TStampaProduzionePs0920 a;
  a.run(argc, argv, "Stampa ordini di produzione");
  return 0;
}