Funcție pentru opțiuni selectabile la fereastră

<< 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;