unit tiposdefinidos;

interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  DBCtrls, StdCtrls, Buttons, ExtCtrls, Menus, Mask, db, DBTables, Grids,
  DBGrids, DBClient,Variants,DATEUTILS;

CONST FILTRO = '-***#';
const ordenpresupuesto = ' order by id_presupuesto DESC,fecha DESC,id_cliente DESC';
const ordenarticulos = ' order by descripcion ASC';
const ordenalbaran = ' order by ID_SERIE,fecha DESC,id_albaran desc';
const ordenlinpresupuesto = ' order by linea ';
CONST ORDENLINEAALBARAN = ' ORDER BY LINEA';
CONST ORDENFACTURA = ' ORDER BY FECHA DESC,ID_FACTURA DESC';
CONST ORDENLINEAFACTURA = ' ORDER BY ID_FACTURA DESC, LINEA ';
const ordenTARIFAS = ' order by NOMBRE,GDESCRIPCION';
      ordenalmacen = ' order by DESCRIPCION ASC,MARCA ASC';
      ORDENSALIDA = ' order by id_salida DESC,fecha DESC';
      ORDENENTRADA = ' order by id_entrada DESC';
      ORDENLINEAENTRADA =' ORDER BY LINEA ';
      ORDENLISTADOENTRADA = ' order by FECHA DESC';      
      ORDENCOBRO = ' order by id_COBRO DESC';
      ORDENCOBROAUX = ' order by id_COBRO DESC,ANYO DESC';
      ORDENLINEASALIDA = ' order by descripcion,marca ';
      ORDENAVISO = ' ORDER BY NOMBRE_CONTACTO,ID_AVISO DESC';
      ORDENPENDIENTES = ' ORDER BY FECHA_NOTA DESC,NOMBRE_CONTACTO';
      ORDENTICKET = ' order by FECHA desc,id_TICKET DESC,HORA';
      ORDENLINEATICKET = ' order by LINEA ';
      Oordenfamilias = ' order by descripcion ASC,id_familia ASC,cod_familia ASC ';
      ORDENCLIENTE = ' ORDER BY NOMBRE ';
      ORDENPROVEEDOR = ' ORDER BY NOMBRE ';
      ORDENLINEACOBRO = ' order by LINEA ';
      ORDENFALBARANES = ' order ID_EMPRESA,ANYO,ID_SERIE,ID_FACTURA,ID_EMPRESA,ANYO,ID_SERIE,ID_ALBARAN ';
      ORDENARQUEO = ' ORDER BY AFECHA desc,AHORA ';
type
   t_codigoobra = record
        nombre,nif:string;
   end;
   t_codigopedido = record
        planta,area,sociedad,nif,obra:string;
        pedido:integer;
   end;
   t_codigoformula = record
          id_formula,designacion,suplemento,obra,nif:string;
          pedido:integer;
   end;
   T_Planta=record
       planta,area,sociedad:string[2];
   end;
   tcodigotar=record
                 id_planta,nif,codigo:string;
   end;
   Fichero=record
       camposorigen,camposdestino,indice,origen,destino:string[10];
       fieldorigen,fielddestino:string[60];
       id_proveedor:string[20];
       BASEDEDATOS:STRING[50];// nombre del archivo
   end;
   FicheroConfiguracion=record
      SERVIDOR,PATH,APLICACION:STRING[254];
   end;

   procedure COMPROBARNIFCIF(CIF:STRING; VAR ULTIMO:BOOLEAN;VAR VALIDO:BOOLEAN);
   function diadelasemana(aux:integer):string;
   FUNCTION OBTENERFECHA(AUX:STRING):STRING;
   FUNCTION OBTENERFECHAAMERICANA(AUX:STRING):STRING;
implementation
function OBTENERFECHA(aux:STRING):string;
VAR FECHA:TDATETIME;
begin
  if (trim(aux) <> '') then
  begin
     FECHA := STRTODATE(AUX);
//     RESULT := INTTOSTR(MONTHOF(FECHA)) +'-'+ INTTOSTR(DAYOF(FECHA))+'-'+INTTOSTR(YEAROF(FECHA));
     RESULT := INTTOSTR(YEAROF(FECHA))+'-'+ INTTOSTR(MONTHOF(FECHA)) +'-'+ INTTOSTR(DAYOF(FECHA));
  end
  else
     result := '-1';
end;

function OBTENERFECHAAMERICANA(aux:STRING):string;
VAR FECHA:TDATETIME;
begin
  if (trim(aux) <> '') then
  begin
     FECHA := STRTODATE(AUX);
     RESULT := INTTOSTR(YEAROF(FECHA)) +'-'+ INTTOSTR(MONTHOF(FECHA))+'-'+INTTOSTR(DAYOF(FECHA));
  end
  else
     result := '-1';
end;


procedure COMPROBARNIFCIF(CIF:STRING; VAR ULTIMO:BOOLEAN;VAR VALIDO:BOOLEAN);
VAR numeros,letra:STRING;
    x,numero,resto,a,b,c,d: integer;
BEGIN
    IF ((CIF[1] IN ['A','B','C','D','E','F','G','H','K','L','M','P','Q','S','X']) OR (CIF[1] IN ['0','1','2','3','4','5','6','7','8','9'])) AND (LENGTH(CIF)=9) THEN
    BEGIN
// Comprobacion de cif correcto
        if cif[1] in ['A','B','C','D','E','F','G','H','K','L','M','P','Q','S','X'] then
        begin
           if (cif[1] in ['X','P']) and (cif[9] in ['A'..'Z']) then
           begin
// extranjeros
              if (cif[1] in ['X']) then
              begin
                numeros:='0';
                for x:=2 to 8 do
                begin
                   numeros:=numeros+cif[x];
                end;
                numero:=strtoint(numeros);
                resto:=numero mod 23;
                case resto of
                    0: letra:='T';
                    1: letra:='R';
                    2: letra:='W';
                    3: letra:='A';
                    4: letra:='G';
                    5: letra:='M';
                    6: letra:='Y';
                    7: letra:='F';
                    8: letra:='P';
                    9: letra:='D';
                    10: letra:='X';
                    11: letra:='B';
                    12: letra:='N';
                    13: letra:='J';
                    14: letra:='Z';
                    15: letra:='S';
                    16: letra:='Q';
                    17: letra:='V';
                    18: letra:='H';
                    19: letra:='L';
                    20: letra:='C';
                    21: letra:='K';
                    22: letra:='E';
                 end;
                 if letra<>cif[9] then
                 begin
//                    showmessage('El Codigo introducido es erroneo, introduzcalo correctamente');
//                    if dm.clientes.State in [dsinsert] then dbedit1.setfocus;
                      valido:= false;
                      exit;
                 end;

             end;
//extranjeros
//OTROS
              if (cif[1] in ['P']) then
              begin

               a:=0;
               b:=0;
               numeros:='';
               for x:=2 to 8 do
               begin
                   numeros:=numeros+cif[x];
               end;
               a:=a+strtoint(numeros[2]);
               a:=a+strtoint(numeros[4]);
               a:=a+strtoint(numeros[6]);
               c:=strtoint(numeros[1])*2;
               if c>=10 then
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   x:=x+strtoint(letra[2]);
                   b:=b+x;
               end
               else
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   b:=b+x;
               end;
               c:=strtoint(numeros[3])*2;
               if c>=10 then
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   x:=x+strtoint(letra[2]);
                   b:=b+x;
               end
               else
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   b:=b+x;
               end;
               c:=strtoint(numeros[5])*2;
               if c>=10 then
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   x:=x+strtoint(letra[2]);
                   b:=b+x;
               end
               else
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   b:=b+x;
               end;
               c:=strtoint(numeros[7])*2;
               if c>=10 then
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   x:=x+strtoint(letra[2]);
                   b:=b+x;
               end
               else
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   b:=b+x;
               end;
               c:=a+b;
               letra:=inttostr(c);
               d:=10-strtoint(letra[length(letra)]);
               case d of
                   1: letra:='A';
                   2: letra:='B';
                   3: letra:='C';
                   4: letra:='D';
                   5: letra:='E';
                   6: letra:='F';
                   7: letra:='G';
                   8: letra:='H';
                   9: letra:='I';
                   10: letra:='J';
               end;
               if letra<>cif[9] then
               begin
//                  showmessage('El Codigo introducido es erroneo, introduzcalo correctamente');
//                  if dm.clientes.State in [dsinsert] then dbedit1.setfocus;
                  valido := false;
                  exit;
               end;
           end;
        END;
           if (cif[1] in ['A','B','C','D','E','F','G','H','K','L','M','Q','S']) and (cif[9] in ['0'..'9']) then
           begin
               a:=0;
               b:=0;
               c:=0;
               numeros:='';
               for x:=2 to 8 do
               begin
                   numeros:=numeros+cif[x];
               end;
               a:=a+strtoint(numeros[2]);
               a:=a+strtoint(numeros[4]);
               a:=a+strtoint(numeros[6]);
               c:=strtoint(numeros[1])*2;
               if c>=10 then
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   x:=x+strtoint(letra[2]);
                   b:=b+x;
               end
               else
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   b:=b+x;
               end;
               c:=strtoint(numeros[3])*2;
               if c>=10 then
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   x:=x+strtoint(letra[2]);
                   b:=b+x;
               end
               else
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   b:=b+x;
               end;
               c:=strtoint(numeros[5])*2;
               if c>=10 then
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   x:=x+strtoint(letra[2]);
                   b:=b+x;
               end
               else
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   b:=b+x;
               end;
               c:=strtoint(numeros[7])*2;
               if c>=10 then
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   x:=x+strtoint(letra[2]);
                   b:=b+x;
               end
               else
               begin
                   letra:=inttostr(c);
                   x:=0;
                   x:=x+strtoint(letra[1]);
                   b:=b+x;
               end;
               c:=a+b;
               letra:=inttostr(c);
               d:=10-strtoint(letra[length(letra)]);
               case d of
                   1: letra:='1';
                   2: letra:='2';
                   3: letra:='3';
                   4: letra:='4';
                   5: letra:='5';
                   6: letra:='6';
                   7: letra:='7';
                   8: letra:='8';
                   9: letra:='9';
                   10: letra:='0';
               end;
               if letra<>cif[9] then
               begin
//                  showmessage('El Codigo introducido es erroneo, introduzcalo correctamente');
                  valido:=false;
//                  dbedit1.setfocus;

               end;
               ultimo:=true;
           end
        end
// Comprobacion de nif
        else
        begin

            numeros:='';
            for x:=1 to 8 do
            begin
               numeros:=numeros+cif[x];
            end;
            numero:=strtoint(numeros);
            resto:=numero mod 23;
            case resto of
                0: letra:='T';
                1: letra:='R';
                2: letra:='W';
                3: letra:='A';
                4: letra:='G';
                5: letra:='M';
                6: letra:='Y';
                7: letra:='F';
                8: letra:='P';
                9: letra:='D';
                10: letra:='X';
                11: letra:='B';
                12: letra:='N';
                13: letra:='J';
                14: letra:='Z';
                15: letra:='S';
                16: letra:='Q';
                17: letra:='V';
                18: letra:='H';
                19: letra:='L';
                20: letra:='C';
                21: letra:='K';
                22: letra:='E';
             end;
             IF cif[9]<>letra then
                begin
//                    showmessage('El Codigo introducido es erroneo, introduzcalo correctamente');
                    valido:=false;
//                    dbedit1.setfocus;
                end
        end
    END
    ELSE
    begin
//        showmessage('El Codigo introducido es erroneo, introduzcalo correctamente');
        valido:=false;
//        dbedit1.setfocus;
    end;
END;
function diadelasemana(aux:integer):string;
begin
 case aux of
   1: result := 'LUNES';
   2: result := 'MARTES';
   3: result := 'MIERCOLES';
   4: result := 'JUEVES';
   5: result := 'VIERNES';
   6: result := 'SABADO';
   7: result := 'DOMINGO';
 END;
end;


END.



