unit principal;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Menus, Vcl.ExtCtrls, Vcl.ImgList,
  Vcl.Grids, Vcl.DBGrids, Vcl.ComCtrls,dateutils,  Excel_TLB, Vcl.OleServer,  ComObj, Excel2000,
  Vcl.StdCtrls, Vcl.Mask, Vcl.DBCtrls, Data.DB, ZAbstractRODataset, ZDataset;

type
  Tfprincipal = class(TForm)
    listaiconos: TImageList;
    Panelmenu: TPanel;
    menu: TMainMenu;
    Panel2: TPanel;
    Panel3: TPanel;
    Panel4: TPanel;
    Button1: TButton;
    Button2: TButton;
    Button3: TButton;
    Button4: TButton;
    Button5: TButton;
    Button6: TButton;
    Empresa1: TMenuItem;
    DatosGenerales1: TMenuItem;
    Artculos1: TMenuItem;
    Clientes1: TMenuItem;
    Albaranes1: TMenuItem;
    Configuracinartculos1: TMenuItem;
    Configuracinclientes1: TMenuItem;
    Albaranes2: TMenuItem;
    Clientes2: TMenuItem;
    Proveedores1: TMenuItem;
    Facturas2: TMenuItem;
    Familias1: TMenuItem;
    Formasdepago1: TMenuItem;
    iposdeimpuestos1: TMenuItem;
    btusuarios: TButton;
    Panel1: TPanel;
    panelgestor: TPanel;
    panelempresa: TPanel;
    Panel7: TPanel;
    Label2: TLabel;
    panelestadisticas: TPanel;
    panelnotificaciones: TPanel;
    DBGrid1: TDBGrid;
    listaempresas: TDBLookupComboBox;
    DBImage1: TDBImage;
    DBImage2: TDBImage;
    Panel10: TPanel;
    Label3: TLabel;
    Panel11: TPanel;
    Label1: TLabel;
    qgestor: TZReadOnlyQuery;
    dsqgestor: TDataSource;
    DBEdit1: TDBEdit;
    DBEdit2: TDBEdit;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;
    DBEdit5: TDBEdit;
    DBEdit6: TDBEdit;
    procedure Clientes2Click(Sender: TObject);
    procedure Configuracinartculos1Click(Sender: TObject);
    procedure Proveedores1Click(Sender: TObject);
    procedure Configuracinclientes1Click(Sender: TObject);
    procedure Facturas2Click(Sender: TObject);
    procedure Albaranes2Click(Sender: TObject);
    procedure DatosGenerales1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button3Click(Sender: TObject);
    procedure Button6Click(Sender: TObject);
    procedure Familias1Click(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Formasdepago1Click(Sender: TObject);
    procedure iposdeimpuestos1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }

  end;

var
  fprincipal: Tfprincipal;
  administrador,gestor,usuarionormal,caducado,codgestor,codempresa:integer;


implementation

{$R *.dfm}

uses clientes, articulos, proveedores, albaranes, facturas, entradas, empresas,
  gruposfamilias, formaspago, tipos_impuestos, controlacceso, datos;
Function CantidadEnLetra(curCantidad: Currency; MonNal: integer): String;
var i: integer;
Cantidad, Centimos: Currency;
BloqueCero, NumeroBloques, Digito: Byte;
PrimerDigito, SegundoDigito, TercerDigito: Byte;
Resultado, Temp, strCentimos, Bloque: String;
Unidades: Array[0..28] of String;
Decenas: Array[0..9] of String;
Centenas: Array[0..9] of String;
begin

Unidades[0] := 'UN';
Unidades[1] := 'DOS';
Unidades[2] := 'TRES';
Unidades[3] := 'CUATRO';
Unidades[4] := 'CINCO';
Unidades[5] := 'SEIS';
Unidades[6] := 'SIETE';
Unidades[7] := 'OCHO';
Unidades[8] := 'NUEVE';
Unidades[9] := 'DIEZ';
Unidades[10] := 'ONCE';
Unidades[11] := 'DOCE';
Unidades[12] := 'TRECE';
Unidades[13] := 'CATORCE';
Unidades[14] := 'QUINCE';
Unidades[15] := 'DIECISEIS';
Unidades[16] := 'DIECISIETE';
Unidades[17] := 'DIECIOCHO';
Unidades[18] := 'DIECINUEVE';
Unidades[19] := 'VEINTE';
Unidades[20] := 'VEINTIUNO';
Unidades[21] := 'VEINTIDOS';
Unidades[22] := 'VEINTITRES';
Unidades[23] := 'VEINTICUATRO';
Unidades[24] := 'VEINTICINCO';
Unidades[25] := 'VEINTISEIS';
Unidades[26] := 'VEINTISIETE';
Unidades[27] := 'VEINTIOCHO';
Unidades[28] := 'VEINTINUEVE';

Decenas[0] := 'DIEZ';
Decenas[1] := 'VEINTE';
Decenas[2] := 'TREINTA';
Decenas[3] := 'CUARENTA';
Decenas[4] := 'CINCUENTA';
Decenas[5] := 'SESENTA';
Decenas[6] := 'SETENTA';
Decenas[7] := 'OCHENTA';
Decenas[8] := 'NOVENTA';
Decenas[9] := 'CIEN';


Centenas[0] := 'CIENTO';
Centenas[1] := 'DOSCIENTOS';
Centenas[2] := 'TRESCIENTOS';
Centenas[3] := 'CUATROCIENTOS';
Centenas[4] := 'QUINIENTOS';
Centenas[5] := 'SEISCIENTOS';
Centenas[6] := 'SETECIENTOS';
Centenas[7] := 'OCHOCIENTOS';
Centenas[8] := 'NOVECIENTOS';

Cantidad := Trunc(curCantidad);
Centimos := (curCantidad - Cantidad) * 100;
NumeroBloques := 1;
Repeat
PrimerDigito := 0;
SegundoDigito := 0;
TercerDigito := 0;
Bloque := '';
BloqueCero := 0;
For i := 1 To 3 do
begin
    Digito := Round(Cantidad) Mod 10;
    If Digito <> 0 Then
    begin
        Case i of
        1:begin
            if numerobloques=2 then bloque:='' else Bloque := ' ' + Unidades[Digito - 1];
            PrimerDigito := Digito;
          end; //case 1
        2:begin
            If Digito <= 2 Then begin
            Bloque := ' ' + Unidades[(Digito * 10 + PrimerDigito - 1)];
          end Else
                begin
                  If PrimerDigito <> 0 then Temp := ' Y' else Temp := '';
                  Bloque := ' ' + Decenas[Digito - 1] + Temp + Bloque;
                End; //if
           SegundoDigito := Digito;
           end; //case 2
        3:begin
            If (Digito = 1) and (PrimerDigito = 0) and (SegundoDigito = 0) then
            Temp := 'CIEN' else Temp := Centenas[Digito-1];
            Bloque := ' ' + Temp + Bloque;
            TercerDigito := Digito;
          end; //case 3
        End; //case
    end else
         begin
            BloqueCero := BloqueCero + 1;
         End; // If Digito <>0
    Cantidad := Int(Cantidad / 10);
    If Cantidad = 0 Then
       begin
          Break;
       End; // If Cantidad=0
end; //for
Case NumeroBloques of
1:
Resultado := Bloque;
2: begin
if BloqueCero = 3 then
Temp := 'MIL' else Temp := ' MIL';
Resultado := Bloque + Temp + Resultado;
end; //case 2
3: begin
If (PrimerDigito = 1) and (SegundoDigito = 0) and (TercerDigito = 0) then
Temp := ' MILLON' else Temp := ' MILLONES';
Resultado := Bloque + Temp + Resultado;
end; //case 3
End; //case
NumeroBloques := NumeroBloques + 1;
Until Cantidad = 0; //repeat
case MonNal of
0: begin
If curCantidad > 1 then
Temp := ' CENTIMOS ***' else Temp := ' CENTIMO ***';
CantidadEnLetra := Resultado + Temp;

end;
1: begin
If curCantidad > 1 then
Temp := ' EUROS ' else Temp := ' EURO ';
if Centimos=0 then strCentimos := '' else strCentimos := 'CON '+CantidadEnLetra(Centimos, 0);
CantidadEnLetra := '***' + Resultado + Temp + strCentimos + '***';
end;
2: begin
If curCantidad > 1 then
Temp := ' DOLARS ' else Temp := ' DOLAR ';
if Centimos=0 then strCentimos := '' else strCentimos := 'CON '+CantidadEnLetra(Centimos, 0);
CantidadEnLetra := '***' + Resultado + Temp + strCentimos;
end;
end;
End;

Function strFormatDecimal(strNum: String): String; // FUNCIÓN PARA AGREGAR UNA COMA Y EVITAR EL ERROR DE EXCEPCION
begin
if (AnsiPos('.', strNum) <> 0) then
strNum := Copy(strNum, 0, AnsiPos('.', strNum)-1) + ',' +
Copy(strNum, AnsiPos('.', strNum) + 1, Length(strNum)-AnsiPos('.', strNum));
if strNum = '' then strNum := '0';
strFormatDecimal := strNum;
end;

function Letra(Numero: Integer): string;
begin
  Result:= copy('TRWAGMYFPDXBNJZSQVHLCKET',1 + numero mod 23,1);
end;

function EsNif(NIF: String): Boolean;
var
  Numero: Integer;
begin
   Result:= FALSE;
   if TryStrToInt(Copy(NIF,1,Length(NIF)-1),Numero) then
      Result:= Uppercase(Copy(NIF,Length(NIF),1)) = Letra(Numero);
end;

function EsNumero(Num: Char): Boolean;
begin
  try
    StrToInt(Num);
    Result:=True;
  Except
    result:=False;
  end;
end;

function CadCambioCar(Cadena, CarOrig, CarCambio : String) : String;
var
 i : Integer;
 Temp : String;
begin
 Temp := '';
 for i := 1 to Length(Cadena) do
 if Copy(Cadena, i, 1) = CarOrig then
 Temp := Temp + CarCambio
 else
 Temp := Temp + Copy(Cadena, i, 1);
 Result := Temp;
end;
function EsCif(Cif : String) : Boolean;
var
 Suma, Control : Integer;
 n : Byte;
begin
 Result := False;
 {Se pasa todo a mayúsculas limpio de espacios y de caracteres especiales}
 Cif := UpperCase(Trim(Cif));
 {Se limpia de los caracteres '-' y '/'. }
 Cif := CadCambioCar(Cif,'-','');
 Cif := CadCambioCar(Cif,'/','');
 {El cif debe ser de 9 cifras}
 if Length(Cif) = 9 then
 begin
 {Comprobamos que sea un NIF}
 if EsNumero(Cif[1]) then
 Result := EsNif(Cif)
 else
 {Se comprueba que la letra que designa el tipo de cif sea correcta}
 if (Pos(Cif[1], 'ABCDEFGHPQSKLMX') = 0) then
 Result := False
 else
 {Se comprueba si es un extranjero,
 en ese caso se calcula el nif, cambiando la X, por 0}
 if Cif[1] = 'X' then
 Result := EsNif('0'+Copy(Cif,2,8))
 else
 begin
 Suma:= StrToInt(Cif[3])+StrToInt(Cif[5])+StrToInt(Cif[7]);
 for n := 1 to 4 do
 Suma := Suma + ((2*StrToInt(Cif[2*n])) mod 10)+((2*StrToInt(Cif[2*n])));
 Control := 10 - (Suma mod 10);
 {Se comprueba si es de tipo 'P' o 'S', es decir,
 Corporaciones Locales (Ayuntamientos, etc.)
 y Organismos públicos.}
 if Pos(Cif[1],'PS')<>0 then
 {Control tipo letra}
 Result := (Cif[9] = Chr(64+Control))
 else
 {Resto de tipos de CIF}
 begin
 {Control tipo número}
 if Control = 10 then
 Control := 0;
 Result:= ( StrToInt(Cif[9]) = Control);
 end;
 end;
 end;
end;

procedure Tfprincipal.Albaranes2Click(Sender: TObject);
begin
    fentradas := Tfentradas.Create(nil);
    try
      fentradas.showmodal();
    finally
      fentradas.Free;
    end;
end;

procedure Tfprincipal.Button1Click(Sender: TObject);
begin
    ExitProcess(0);
end;

procedure Tfprincipal.Button2Click(Sender: TObject);
begin
    ffacturas := Tffacturas.Create(nil);
    try
      ffacturas.showmodal();
    finally
      ffacturas.Free;
    end;
end;

procedure Tfprincipal.Button3Click(Sender: TObject);
begin
    falbaranes := Tfalbaranes.Create(nil);
    try
      falbaranes.showmodal();
    finally
      falbaranes.Free;
    end;
end;

procedure Tfprincipal.Button4Click(Sender: TObject);
begin
    fclientes := Tfclientes.Create(nil);
    try
      fclientes.showmodal();
    finally
      fclientes.Free;
    end;
end;

procedure Tfprincipal.Button5Click(Sender: TObject);
begin
    farticulos := Tfarticulos.Create(nil);
    try
      farticulos.showmodal();
    finally
      farticulos.Free;
    end;
end;

procedure Tfprincipal.Button6Click(Sender: TObject);
begin
    fempresas := Tfempresas.Create(nil);
    try
      fempresas.showmodal();
    finally
      fempresas.Free;
    end;
end;

procedure Tfprincipal.Clientes2Click(Sender: TObject);
begin
    fclientes := Tfclientes.Create(nil);
    try
      fclientes.showmodal();
    finally
      fclientes.Free;
    end;
end;

procedure Tfprincipal.Configuracinartculos1Click(Sender: TObject);
begin
    farticulos := Tfarticulos.Create(nil);
    try
      farticulos.showmodal();
    finally
      farticulos.Free;
    end;
end;

procedure Tfprincipal.Configuracinclientes1Click(Sender: TObject);
begin
    falbaranes := Tfalbaranes.Create(nil);
    try
      falbaranes.showmodal();
    finally
      falbaranes.Free;
    end;
end;

procedure Tfprincipal.DatosGenerales1Click(Sender: TObject);
begin
    fempresas := Tfempresas.Create(nil);
    try
      fempresas.showmodal();
    finally
      fempresas.Free;
    end;
end;

procedure Tfprincipal.Facturas2Click(Sender: TObject);
begin
    ffacturas := Tffacturas.Create(nil);
    try
      ffacturas.showmodal();
    finally
      ffacturas.Free;
    end;
end;

procedure Tfprincipal.Familias1Click(Sender: TObject);
begin
    fgruposfamilias := Tfgruposfamilias.Create(nil);
    try
      fgruposfamilias.showmodal();
    finally
      fgruposfamilias.Free;
    end;
end;

procedure Tfprincipal.Formasdepago1Click(Sender: TObject);
begin
    fformaspago := Tfformaspago.Create(nil);
    try
      fformaspago.showmodal();
    finally
      fformaspago.Free;
    end;
end;

procedure Tfprincipal.FormShow(Sender: TObject);
begin
    fcontrolacceso := Tfcontrolacceso.Create(nil);
    try
      fcontrolacceso.showmodal();
    finally
      fcontrolacceso.Free;
    end;
    panelmenu.Visible:=true;
    panelgestor.Visible:=true;
    panelempresa.Visible:=true;
    panelestadisticas.Visible:=false;
    panelnotificaciones.Visible:=true;
    if administrador=1 then
    begin
       dm.qempresas.Close;
       dm.qempresas.SQL.Clear;
       dm.qempresas.SQL.Add('select * from empresas order by nombre');
       dm.qempresas.Open;
       listaempresas.KeyValue:=dm.qempresasid.AsInteger;
    end;
    if gestor=1 then
    begin
       dm.qempresas.Close;
       dm.qempresas.SQL.Clear;
       dm.qempresas.SQL.Add('select * from empresas where gestor='+inttostr(codgestor)+' order by nombre');
       dm.qempresas.Open;
       listaempresas.KeyValue:=dm.qempresasid.AsInteger;
       btusuarios.Visible:=false;
    end;
    if usuarionormal=1 then
    begin
       dm.qempresas.Close;
       dm.qempresas.SQL.Clear;
       dm.qempresas.SQL.Add('select * from empresas where id='+inttostr(codempresa)+' order by nombre');
       dm.qempresas.Open;
       listaempresas.KeyValue:=dm.qempresasid.AsInteger;
       panelgestor.Visible:=false;
       btusuarios.Visible:=false;
    end;

end;

procedure Tfprincipal.iposdeimpuestos1Click(Sender: TObject);
begin
    ftipos_impuestos := Tftipos_impuestos.Create(nil);
    try
      ftipos_impuestos.showmodal();
    finally
      ftipos_impuestos.Free;
    end;
end;

procedure Tfprincipal.Proveedores1Click(Sender: TObject);
begin
    fproveedores := Tfproveedores.Create(nil);
    try
      fproveedores.showmodal();
    finally
      fproveedores.Free;
    end;
end;

end.
