campo-sirio/co/colib.cpp
alex 8700805497 Patch level : 10.0 225
Files correlati     :
Ricompilazione Demo : [ ]
Commento            :

Rportata la versione 3.2 patch 1314


git-svn-id: svn://10.65.10.50/trunk@18269 c028cbd2-c16b-5b4b-a496-9718f37d4682
2009-02-14 17:13:09 +00:00

226 lines
6.3 KiB
C++
Executable File

#include <config.h>
#include "../ve/velib.h"
#include "colib.h"
#include "socicoop.h"
#include "mercaticoop.h"
static bool add_socio(const TRelation& rel, void* pJolly)
{
TString_array& a = *(TString_array*)pJolly;
TString16 key, last_key;
const TRectype& rec = rel.curr();
key.format("%6d", rec.get_int(SC_CODCF));
const int last = a.items()-1;
if (last >= 0)
last_key = a.row(last);
if (key != last_key)
a.add(key);
return true;
}
static real get_perc_socio(const long codsocio, const TString& codcomp)
{
real perc = ZERO;
const TRectype& socio = cache().get(LF_SOCICOOP, codsocio);
if (socio.get(SC_COMPAGNIA1) == codcomp)
perc = socio.get_real(SC_QUOTA1);
else
if (socio.get(SC_COMPAGNIA2) == codcomp)
perc = socio.get_real(SC_QUOTA2);
else
if (socio.get(SC_COMPAGNIA3) == codcomp)
perc = socio.get_real(SC_QUOTA3);
return perc;
}
// funzione che restituisce il codice spesa data il nome della spesa in configurazione
static const TString& cod_spesa(const char* spesa)
{
static TAssoc_array _spese;
static long _ditta = 0;
if (prefix().get_codditta() != _ditta)
{
TConfig d(CONFIG_DITTA, "co");
_spese = d.list_variables();
_ditta = prefix().get_codditta();
}
TString* cod = (TString*) _spese.objptr(spesa);
if (cod != NULL)
return *cod;
return EMPTY_STRING;
}
// aggiorna le spese sul documento
void update_spese_doc(const long codmercato, TDocumento& doc)
{
TAssoc_array spese_doc;
const TRectype& mercato = cache().get(LF_MERCATICOOP, codmercato);
spese_doc.add(cod_spesa("SpesaRitAcc")); // spesa ritenuta accantonamento
real perc = mercato.get_real(MC_DIRITTI1);
if (!perc.is_zero())
spese_doc.add(cod_spesa("SpesaDiritti1")); // spesa diritti di mercato 1
perc = mercato.get_real(MC_DIRITTI2);
if (!perc.is_zero())
spese_doc.add(cod_spesa("SpesaDiritti2")); // spesa diritti di mercato 2
real spesa = mercato.get_real(MC_SPESEFACC);
if (!spesa.is_zero())
spese_doc.add(cod_spesa("SpesaFacc")); // spesa facchinaggio
spesa = mercato.get_real(MC_SPESECASSE);
if (!spesa.is_zero())
spese_doc.add(cod_spesa("SpesaCasse")); // spesa casse
// chiamo la funzione che aggiunge in automatico le spese
TString_array array_spese;
spese_doc.get_keys(array_spese);
doc.zero(DOC_SPESEUPD);
doc.update_spese_aut(array_spese);
// devo ora sistemare le % e qta/prezzo sulle spese
real totqta = ZERO;
real totcasse = ZERO;
int i;
for (i = 1; i <= doc.rows(); i++)
{
const TRiga_documento& riga_doc = doc[i];
if (riga_doc.is_merce())
{
totqta+=riga_doc.quantita();
totcasse+=riga_doc.get_long(DOC_NCOLLI);
}
}
for (i = 1; i <= doc.rows(); i++)
{
TRiga_documento& riga_doc = doc[i];
if (riga_doc.is_spese())
{
const char* codspesa = riga_doc.get(RDOC_CODART);
if (spese_doc.is_key(codspesa))
{
const TString& spesadiritti1 = cod_spesa("SpesaDiritti1");
if (spesadiritti1 == codspesa) // sistemo la qta/valore/codice iva
{
real perc = mercato.get_real(MC_DIRITTI1);
if (!perc.is_zero())
{
riga_doc.put(RDOC_QTA, perc);
riga_doc.put(RDOC_CODIVA, mercato.get(MC_CODIVA1));
}
}
const TString& spesadiritti2 = cod_spesa("SpesaDiritti2");
if (spesadiritti2 == codspesa) // sistemo la qta/valore/codice iva
{
real perc = mercato.get_real(MC_DIRITTI2);
if (!perc.is_zero())
{
riga_doc.put(RDOC_QTA, perc);
riga_doc.put(RDOC_CODIVA, mercato.get(MC_CODIVA2));
}
}
const TString& spesafacc = cod_spesa("SpesaFacc");
if (spesafacc == codspesa) // sistemo la qta/valore/codice iva
{
riga_doc.put(RDOC_QTA, totqta);
riga_doc.put(RDOC_PREZZO, mercato.get(MC_SPESEFACC));
riga_doc.put(RDOC_CODIVA, mercato.get(MC_CODIVAFACC));
}
const TString& spesacasse = cod_spesa("SpesaCasse");
if (spesacasse == codspesa) // sistemo la qta/valore/codice iva
{
riga_doc.put(RDOC_QTA, totcasse);
riga_doc.put(RDOC_PREZZO, mercato.get(MC_SPESECASSE));
riga_doc.put(RDOC_CODIVA, mercato.get(MC_CODIVACASS));
}
}
}
}
}
// crea una lista documenti a partire da un conferimento per compagnia
int compagnia2soci(const TDocumento& doc_orig, const TString& codcomp, const long codmercato, const long nfasta, TLista_documenti& listadoc)
{
TString_array listasoci;
TRelation relsoci(LF_SOCICOOP);
TString filtro = "(COMPAGNIA1=\"";
filtro << codcomp;
filtro << "\") || (COMPAGNIA2=\"";
filtro << codcomp;
filtro << "\") || (COMPAGNIA3=\"";
filtro << codcomp;
filtro << "\")";
TCursor cursoci(&relsoci, filtro);
cursoci.scan(add_socio, &listasoci);
FOR_EACH_ARRAY_ROW(listasoci, r, row)
{
long codsocio = row->get_long();
TDocumento docnew(doc_orig);
docnew.put(DOC_CODCF, codsocio);
docnew.put(DOC_TIPOCF, "F");
docnew.put("MERCATO", codmercato);
docnew.put("NFASTA", nfasta);
listadoc.add(docnew);
}
for (int i = 1; i <= doc_orig.rows(); i++)
{
const TRiga_documento& riga_doc = doc_orig[i];
if (riga_doc.is_merce())
{
const char avalore = riga_doc.get_char(RDOC_CODAGG1);
if (avalore == 'X')
{
TGeneric_distrib prezzo_dist(riga_doc.prezzo(false, false), 2);
for (int j = 0; j < listadoc.items(); j++)
{
long codsocio = listadoc[j].codcf();
real perc = get_perc_socio(codsocio, codcomp);
prezzo_dist.add(perc);
}
for (int k = 0; k < listadoc.items(); k++)
{
real prezzosocio = prezzo_dist.get();
listadoc[k][i].put(RDOC_PREZZO, prezzosocio);
}
}
TGeneric_distrib qta_dist(riga_doc.quantita(), 5);
int j;
for (j = 0; j < listadoc.items(); j++)
{
long codsocio = listadoc[j].codcf();
real perc = get_perc_socio(codsocio, codcomp);
qta_dist.add(perc);
}
for (j = 0; j < listadoc.items(); j++)
{
real qtasocio = qta_dist.get();
listadoc[j][i].put(RDOC_QTA, qtasocio);
}
TGeneric_distrib qtagg_dist(riga_doc.get_real(RDOC_QTAGG1), 5);
for (j = 0; j < listadoc.items(); j++)
{
long codsocio = listadoc[j].codcf();
real perc = get_perc_socio(codsocio, codcomp);
qtagg_dist.add(perc);
}
for (j = 0; j < listadoc.items(); j++)
{
real qtasocio = qtagg_dist.get();
listadoc[j][i].put(RDOC_QTAGG1, qtasocio);
}
}
}
for (int i = 0; i < listadoc.items(); i++)
{
listadoc[i].put(DOC_RAGGR, true);
update_spese_doc(codmercato, listadoc[i]);
}
return listadoc.items();
}