#include <progind.h>

#include "../ve/ve6200.h"
#include "../ve/ve6200a.h"

#include <doc.h> 
class TFatturazione_cooperative : public TFatturazione_bolle
{ 
  virtual void campi_raggruppamento_righe(TToken_string& campi_riga) const;
	virtual void campi_raggruppamento(TToken_string& campi) const;
	virtual bool doc_raggruppabile(const TDocumento & doc) const { return true; }
	virtual bool doc_raggruppabile(const TDocumento & doc_in, const TDocumento & doc_out, TToken_string & campi) const;
	virtual void add_rows(TRiga_documento & rout, TRiga_documento & rin);
  virtual void create_row(TDocumento& doc_out, const TRiga_documento & rin);
	virtual const TString & get_tipo_out(const TDocumento & doc_out);


public:
 	TFatturazione_cooperative(const char* cod) : TFatturazione_bolle(cod) {}
  virtual ~TFatturazione_cooperative() { }
};

void TFatturazione_cooperative::campi_raggruppamento_righe(TToken_string& campi_riga) const
{
	campi_riga = "CODART|UMQTA";  // Uguali sempre
}

void TFatturazione_cooperative::campi_raggruppamento(TToken_string& campi) const
{
	campi = "TIPOCF|CODCF|CODVAL|CODLIN";
}

void TFatturazione_cooperative::add_rows(TRiga_documento & rout, TRiga_documento & rin)
{
	real valore = rout.get_real(RDOC_PREZZO);
	real qta = rout.get_real(RDOC_QTA);

	valore += rin.doc().get_real("TOTMER")+rin.doc().get_real("SPESMER");
	valore.round(2);
	rout.put(RDOC_PREZZO, valore);
	qta += rin.get_real(RDOC_QTA);
	rout.put(RDOC_QTA, qta);
}

bool TFatturazione_cooperative::doc_raggruppabile(const TDocumento & doc_in, const TDocumento & doc_out, TToken_string & campi) const
{
	if (doc_in.physical_rows() > 0 && doc_out.physical_rows() > 0)
	{
		const TRiga_documento & rout = doc_out[1];
		const TRiga_documento & rin = doc_in[1];
		const TString art_in = rin.get(RDOC_CODART);
		const TString art_out = rout.get(RDOC_CODART);
		bool raggruppa = art_in == art_out;

		if (raggruppa)
		{
			const TString & art =  rin.get(RDOC_CODARTMAG);
			const TString & iva_in = cache().get(LF_ANAMAG, art, ANAMAG_USER4);
			const TString iva_out = rout.get(RDOC_CODIVA);

			raggruppa = iva_in == iva_out;
		}
		return raggruppa;
	}
	return false;
}

void TFatturazione_cooperative::create_row(TDocumento& doc_out, const TRiga_documento & rin)
{
	if (rin.get_int(RDOC_NRIGA) == 1)
	{
		TFatturazione_bolle::create_row(doc_out, rin);
		TRiga_documento & rout = doc_out[1];
		real valore = rin.doc().get_real("TOTMER")+rin.doc().get_real("SPESMER");

		valore.round(2);
		rout.put(RDOC_PREZZO, valore);
		rout.zero(RDOC_SCONTO);
		rout.put(RDOC_CODAGG1, "X");

		const TString & art =  rout.get(RDOC_CODARTMAG);
		const TString & codiva= cache().get(LF_ANAMAG, art, ANAMAG_USER4);

		if (codiva.full())
			rout.put(RDOC_CODIVA, codiva);
	}
}

const TString & TFatturazione_cooperative::get_tipo_out(const TDocumento & doc_out)
{
	const TString & art = doc_out[1].get(RDOC_CODARTMAG);
	const TString & tipodoc = cache().get(LF_ANAMAG, art, ANAMAG_USER2);

	if (tipodoc.full() && !cache().get("%TIP", tipodoc).empty())
		return tipodoc;
	else
	 return get("S8");
};

class TFatturazione_cooperative_app : public TFatturazione_bolle_app
{ 
protected:
	virtual TFatturazione_bolle * elab(const TString & cod) const { return new TFatturazione_cooperative(cod);}
};

int co1400(int argc, char *argv[])
{
  TFatturazione_cooperative_app a;
  a.run (argc, argv, "Fatturazione Conferimenti");
  return TRUE;
}