<< Click to Display Table of Contents >> Navigation: WinArhi > Fereastra principala > Oferte si Comenzi deschise > Meniu > Optiuni > Editare Script funcții > Funcții speciale > Funcție pentru opțiuni selectabile la fereastră |
Funcția AdaugaTaxaInfolierePerFereastra se va folosi în "Funcții apelate la final" din opțiunile selectabile ale ferestrei.
Această funcție va adăuga la fiecare fereastră cate un articol
function PozitiePanouPePrimaFereastra(Poz: Integer): String;
begin
if (Poz mod 1000 > 0) then
Result := IntToStr(Poz)
else
Result := IntToStr(Poz + 1);
end;
function CalculeazaTotalTaxaInfoliere: Boolean;
const
//Suprafata minima folie pentru pret unic
SupMinFolie = 20;
//Pretul daca suprafata este sub SupMinFolie
//in valuta accesoriului adaugat in funcția AdaugaTaxaInfolierePerFereastra
PretUnicSupMin = 40;
LListaSerii = [
'Cortizo 3500 BT',
'Cortizo 2000 Glisanta'];
LListaCatCulFolie = [
'Folie1',
'Folie2',
'a doua categorie...'];
LListaCatCulCLASIC = [
'Folie1',
'a doua categorie...'];
LListaCatCulPREMIUM = [
'Folie2',
'a doua categorie...'];
//restul sunt ELITE
// LListaCatCulELITE = [
// 'RAL-Structurat',
// 'a doua categorie...'];
PretCLASIC = [33.10, 31.95, 29.63, 25.00, 22.70, 21.55];
PretPREMIUM = [35.41, 34.25, 31.95, 27.32, 25.00, 22.75];
PretELITE = [37.72, 36.56, 34.25, 29.63, 27.32, 25.00];
var
//Toate listele incep de la 0 si ordinea va fi aceeasi in toate
//deoarece toate listele au aceeasi lungime si pot fi considerate capete de tabel, tabelul fiind lista de profile
// ListaProfile: TStringList;//Cod+Culoare
ListaCatCul: TStringList;
ListaLung: TStringList;
// ListaSupFolie: array of Double;
ListaCodCulSup: TStringList;//Cod+Culoare. Cod---Culoare=Suprafata. Ex. 12345---Alb=3,5
ListaCodCulPretMP: TStringList;//Cod+Culoare. Cod---Culoare=PretMP. Ex. 12345---Alb=1,5
ListaPozCodCulSup: TStringList;//Pozitie+Cod+Culoare. Doar ferestrele, fara panouri. Pozitie---Cod---Culoare=Suprafata. Ex. 1---12345---Alb=3,5
CodPlusCul: String;
Cul: String;
i, iMetri: Integer;
sPoz: String;
TotalSupFolieFU: Double;
SupVopsire: Double;
Lung: Double;
begin
Result := True;
if not(WA_GetPersistentVal('Infoliere_Calculat') = Null) then
Exit;
ListaCatCul := TStringList.Create;
ListaLung := TStringList.Create;
ListaCodCulSup := TStringList.Create;
ListaCodCulPretMP := TStringList.Create;
ListaPozCodCulSup := TStringList.Create;
try
//Parcurgem tabelul de debitare pentru a determina lista de profile separat pe culori (Cod+Culoare)
cdsCutDim.First;
while not cdsCutDim.Eof do begin
CodPlusCul := cdsCutDim.FieldByName('CodP').AsString + '---' + cdsCutDim.FieldByName('CuloareP').AsString;
if (cdsCutDim.FieldByName('TipProfilSimplu').AsInteger > 0)
and WA_StrInArray(cdsCutDim.FieldByName('SerieProfile').AsString, LListaSerii)
and WA_StrInArray(cdsCutDim.FieldByName('CatCuloareP').AsString, LListaCatCulFolie) then begin
if (ListaCodCulSup.IndexOfName(CodPlusCul) < 0) then begin
ListaCodCulSup.Add(CodPlusCul + '=0');
ListaCatCul.Add(cdsCutDim.FieldByName('CatCuloareP').AsString);
end;
//Adaugam unic doar daca este fereastra/usa si nu panou
//cele de la panou le punem la prima fereastra... daca exista...
sPoz := PozitiePanouPePrimaFereastra(cdsCutDim.FieldByName('PozFerUsa').AsInteger);
sPoz := sPoz + '---' + CodPlusCul;
if ListaPozCodCulSup.IndexOfName(sPoz) < 0 then begin
ListaPozCodCulSup.Add(sPoz + '=0');
ListaCodCulPretMP.Add(CodPlusCul + '=0');
ListaLung.Add('0');
end;
end;
cdsCutDim.Next;
end;
//Parcurgem tabelul de consum pentru a insuma cantitatiile pe fiecare Pozitie+Cod+Culoare separat
cdsConsElm.First;
while not cdsConsElm.Eof do begin
CodPlusCul := cdsConsElm.FieldByName('CodSimplu').AsString + '---' + cdsConsElm.FieldByName('Culoare').AsString;
i := ListaCodCulSup.IndexOfName(CodPlusCul);
if (i >= 0) then begin
ListaLung[i] := FloatToStr(StrToFloat(ListaLung[i]) + cdsConsElm.FieldByName('Cantitate').AsFloat);
//Total suprafata pe Cod+Culoare
SupVopsire := cdsConsElm.FieldByName('PerimetruVopsire').AsFloat * cdsConsElm.FieldByName('Cantitate').AsFloat;
ListaCodCulSup.Values[CodPlusCul] := FloatToStr(StrToFloat(ListaCodCulSup.Values[CodPlusCul]) + SupVopsire);
//Adaugam si pentru fiecare fereastra in parte pe cod+culoare
//iar la panouri pe prima fereastra din panou... daca exista...
sPoz := PozitiePanouPePrimaFereastra(cdsConsElm.FieldByName('PozitieFerUsa').AsInteger);
sPoz := sPoz + '---' + CodPlusCul;
ListaPozCodCulSup.Values[sPoz] := FloatToStr(StrToFloat(ListaPozCodCulSup.Values[sPoz]) + SupVopsire);
end;
cdsConsElm.Next;
end;
for i := 0 to ListaCodCulSup.Count - 1 do begin
CodPlusCul := ListaCodCulSup.Names[i];
SupVopsire := StrToFloat(ListaCodCulSup.Values[CodPlusCul]);
if SupVopsire < SupMinFolie then begin
ListaCodCulPretMP.Values[CodPlusCul] := FloatToStr(PretUnicSupMin);
end
else begin
Lung := StrToFloat(ListaLung[i]);
//Stabileste coloana in tabel
if Lung <= 20 then iMetri := 0
else if Lung <= 60 then iMetri := 1
else if Lung <= 120 then iMetri := 2
else if Lung <= 300 then iMetri := 3
else if Lung <= 600 then iMetri := 4
else iMetri := 5;
//Extrage pretul
if WA_StrInArray(ListaCatCul[i], LListaCatCulCLASIC) then ListaCodCulPretMP.Values[CodPlusCul] := FloatToStr(PretCLASIC[iMetri])
else if WA_StrInArray(ListaCatCul[i], LListaCatCulPREMIUM) then ListaCodCulPretMP.Values[CodPlusCul] := FloatToStr(PretPREMIUM[iMetri])
else ListaCodCulPretMP.Values[CodPlusCul] := FloatToStr(PretELITE[iMetri]);
end;
end;
//Calculam totalul de suprafata a foliei ferestrelor
//Deoarece mai sus nu adaugam panourile la TotalSupFolie ci doar ferestrele din panou ar trebui ca TotalSupFolie sa fie egal cu TotalSupFolieFU
//Dar este mai sigur sa calculam aici totalul
TotalSupFolieFU := 0;
for i := 0 to ListaPozCodCulSup.Count - 1 do
TotalSupFolieFU := TotalSupFolieFU + StrToFloat(ListaPozCodCulSup.Values[ListaPozCodCulSup.Names[i]]);
WA_SetPersistentVal('Infoliere_Calculat', 1);
WA_SetPersistentVal('Infoliere_ListaLung', ListaLung.Text);
WA_SetPersistentVal('Infoliere_ListaCodCulPretMP', ListaCodCulPretMP.Text);
WA_SetPersistentVal('Infoliere_ListaPozCodCulSup', ListaPozCodCulSup.Text);
finally
ListaCatCul.Free;
ListaLung.Free;
ListaCodCulSup.Free;
ListaCodCulPretMP.Free;
ListaPozCodCulSup.Free;
end;
end;
function AdaugaTaxaInfolierePerFereastra: Boolean;
var
//ListaLung: TStringList;
ListaCodCulPretMP: TStringList;//Cod+Culoare. Cod---Culoare=PretMP. Ex. 12345---Alb=1,5
ListaPozCodCulSup: TStringList;//Pozitie+Cod+Culoare. Doar ferestrele, fara panouri. Pozitie---Cod---Culoare=Suprafata. Ex. 1---12345---Alb=3,5
Pret, SupFolie: Double;
i: Integer;
sPozFerUsa: String;
Denumire: String;
lst: array of String;
NrPr: Integer;
begin
Result := True;
//ListaLung := TStringList.Create;
ListaCodCulPretMP := TStringList.Create;
ListaPozCodCulSup := TStringList.Create;
try
CalculeazaTotalTaxaInfoliere;
//ListaLung.Text := WA_GetPersistentVal('Infoliere_ListaLung');
ListaCodCulPretMP.Text := WA_GetPersistentVal('Infoliere_ListaCodCulPretMP');
ListaPozCodCulSup.Text := WA_GetPersistentVal('Infoliere_ListaPozCodCulSup');
sPozFerUsa := IntToStr(Val.WindowDoor.Number);
NrPr := 0;
for i := 0 to ListaPozCodCulSup.Count - 1 do begin
lst := WA_SplitString(ListaPozCodCulSup.Names[i], '---');
if lst[0] = sPozFerUsa then begin
Pret := StrToFloat(ListaCodCulPretMP.Values[ListaCodCulPretMP.Names[i]]);
SupFolie := StrToFloat(ListaPozCodCulSup.Values[ListaPozCodCulSup.Names[i]]);
Denumire := 'Infoliere ' + lst[1] + ', ' + lst[2];
WA_AddItem('TaxaFoliere', SupFolie / Val.WindowQty, 0, '', '', '', '', Pret, Denumire);
Inc(NrPr);
end;
end;
if NrPr > 0 then
WA_AddItem('TaxaTransportFoliere', NrPr / ListaPozCodCulSup.Count / Val.WindowQty);//per fereastra si se va inmulti intern cu numarul de bucati de fereastra
finally
//ListaLung.Free;
ListaCodCulPretMP.Free;
ListaPozCodCulSup.Free;
end;
end;