unit principalsrv;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, Data.Win.ADODB,
  ZAbstractConnection, ZConnection, Vcl.ExtCtrls, ZAbstractRODataset, ZDataset,
  ZAbstractDataset, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    dmgesticom: TADOConnection;
    DBproduccgest: TZConnection;
    sqlcabpedidos: TADOQuery;
    sqlpedpendientes: TADOQuery;
    pedpendientes: TZQuery;
    sqlpedpendientescodemp: TStringField;
    sqlpedpendientescodser: TStringField;
    sqlpedpendientescodeje: TIntegerField;
    sqlpedpendientescodped: TFloatField;
    sqlpedpendienteslinped: TFloatField;
    sqlpedpendientescodart: TWideStringField;
    sqlpedpendientescantidad: TFloatField;
    sqlpedpendientesdesart: TStringField;
    sqlpedpendientesnumlin: TFloatField;
    sqlcabpedidoscodemp: TStringField;
    sqlcabpedidoscodser: TStringField;
    sqlcabpedidoscodeje: TIntegerField;
    sqlcabpedidoscodped: TFloatField;
    sqlcabpedidosfecped: TDateTimeField;
    sqlcabpedidosfecser: TDateTimeField;
    sqlcabpedidosnomcli: TStringField;
    sqlcabpedidosDirEnvio: TStringField;
    sqlcabpedidosCpoEnvio: TStringField;
    sqlcabpedidosPobEnvio: TStringField;
    sqlcabpedidosCodProvincia: TStringField;
    sqlcabpedidosobservaciones: TWideStringField;
    pedidostmp: TZQuery;
    linped: TZQuery;
    pedidostmpide: TWideStringField;
    pedidostmpidser: TWideStringField;
    pedidostmpanyo: TIntegerField;
    pedidostmpid: TIntegerField;
    pedidostmpfechapedido: TDateField;
    pedidostmpfechaentrega: TDateField;
    pedidostmpnomcliente: TWideStringField;
    pedidostmpdirenvio: TWideStringField;
    pedidostmpcodpostenvio: TWideStringField;
    pedidostmppoblacionenvio: TWideStringField;
    pedidostmpprovinciaenvio: TWideStringField;
    pedidostmpobservaciones: TWideStringField;
    qaux: TZQuery;
    sqlpedpendientesObsLin: TWideStringField;
    linpedide: TWideStringField;
    linpedidser: TWideStringField;
    linpedanyo: TIntegerField;
    linpedidp: TIntegerField;
    linpedid: TIntegerField;
    linpedida: TWideStringField;
    linpeddesarticulo: TWideStringField;
    linpedcantidad: TFloatField;
    linpednumlinea: TIntegerField;
    linpedobservaciones: TWideStringField;
    pedpendienteside: TWideStringField;
    pedpendientesids: TWideStringField;
    pedpendientesidanyo: TIntegerField;
    pedpendientesidped: TIntegerField;
    pedpendientesidlinped: TIntegerField;
    pedpendientesnumlinea: TIntegerField;
    pedpendientesidart: TWideStringField;
    pedpendientesdesart: TWideStringField;
    pedpendientescantidad: TFloatField;
    pedpendientesobservaciones: TWideStringField;
    llineas: TLabel;
    Button1: TButton;
    lresto: TLabel;
    Timer1: TTimer;
    pedidostmpactivo: TIntegerField;
    linpedactivo: TIntegerField;
    pedpendientesactivo: TIntegerField;
    sqlcabpedidosfecha: TDateTimeField;
    pedidostmpfechaservicio: TDateField;
    sqlpedpendientesServidos: TFloatField;
    sqlpedpendientesAnulados: TFloatField;
    pedpendientesservidos: TFloatField;
    pedpendientesanulados: TFloatField;
    procedure temporizadorTimer(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure Timer1Timer(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;
  tiemporestante:integer;
Const
  DAY         = 1.0;
  HOUR        = DAY / 24.0;
  MINUTE      = HOUR / 60.0;
  SECOND      = MINUTE / 60.0;
  MILLISECOND = SECOND / 1000.0;
implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var numpedidospend:integer;
begin
    pedpendientes.Close;
    sqlpedpendientes.Close;
    sqlpedpendientes.open;
    if sqlpedpendientes.RecordCount>0 then
    begin
      timer1.Enabled:=false;
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('delete from pedidospendientes');
      qaux.ExecSQL;
      numpedidospend:=0;
      while not sqlpedpendientes.Eof do
      begin
        pedpendientes.Open;
        pedpendientes.Append;
        pedpendienteside.Value:=sqlpedpendientescodEmp.AsString;
        pedpendientesids.Value:=sqlpedpendientescodser.AsString;
        pedpendientesidanyo.Value:=sqlpedpendientescodeje.Asinteger;
        pedpendientesidped.Value:=sqlpedpendientescodped.Asinteger;
        pedpendientesidlinped.Value:=sqlpedpendienteslinped.Asinteger;
        pedpendientesnumlinea.Value:=sqlpedpendienteslinped.Asinteger;
        pedpendientesidart.Value:=sqlpedpendientescodart.AsString;
        pedpendientesdesart.Value:=sqlpedpendientesdesart.AsString;
        pedpendientescantidad.Value:=sqlpedpendientescantidad.Asfloat;
        pedpendientesservidos.Value:=sqlpedpendientesservidos.Asfloat;
        pedpendientesanulados.Value:=sqlpedpendientesanulados.Asfloat;
        pedpendientesobservaciones.Value:=sqlpedpendientesobslin.Asstring;
        pedpendientesactivo.Value:=1;
        pedpendientes.Post;
        sqlpedpendientes.Next;
        numpedidospend:=numpedidospend+1;
      end;
      llineas.Caption:='Número de lineas de pedidos pendientes de servir:'+inttostr(numpedidospend);
////  insert  articulos nuevos
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('SELECT DISTINCT ide,idart,desart,'+''''+''''+' as observaciones FROM pedidospendientes where (ide,idart) not in (select ide,id from articulos) order by idart');
      qaux.open;
      if qaux.RecordCount>0 then
      begin
        qaux.Close;
        qaux.SQL.Clear;
        qaux.SQL.Add('insert into articulos SELECT DISTINCT ide,idart,desart,'+''''+''''+' as observaciones,0 FROM pedidospendientes where (ide,idart) not in (select ide,id from articulos) order by idart');
        qaux.ExecSQL;
      end;
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('update articulos a set a.descripcion=(SELECT desart FROM pedidospendientes p where a.ide=p.ide and a.id=p.idart limit 1) where (a.ide,a.id) in (select DISTINCT ide,idart from pedidospendientes)');
      qaux.ExecSQL;

////   inserto pedidos pendientes

      sqlcabpedidos.Close;
      sqlcabpedidos.open;
      if sqlcabpedidos.RecordCount>0 then
      begin
        qaux.Close;
        qaux.SQL.Clear;
        qaux.SQL.Add('delete from pedidostmp');
        qaux.ExecSQL;
        while not sqlcabpedidos.Eof do
        begin
          pedidostmp.Open;
          pedidostmp.Append;
          pedidostmpide.Value:=sqlcabpedidoscodEmp.AsString;
          pedidostmpidser.Value:=sqlcabpedidoscodser.AsString;
          pedidostmpanyo.Value:=sqlcabpedidoscodeje.Asinteger;
          pedidostmpid.Value:=sqlcabpedidoscodped.Asinteger;
          pedidostmpfechapedido.Value:=sqlcabpedidosfecped.Asdatetime;
          pedidostmpfechaentrega.Value:=sqlcabpedidosfecser.Asdatetime;
          pedidostmpnomcliente.Value:=sqlcabpedidosnomcli.AsString;
          pedidostmpdirenvio.Value:=sqlcabpedidosdirenvio.AsString;
          pedidostmpcodpostenvio.Value:=sqlcabpedidoscpoenvio.asstring;
          pedidostmppoblacionenvio.Value:=sqlcabpedidospobenvio.Asstring;
          pedidostmpprovinciaenvio.Value:=sqlcabpedidoscodprovincia.Asstring;
          pedidostmpobservaciones.Value:=sqlcabpedidosobservaciones.Asstring;
          pedidostmpactivo.Value:=1;
          pedidostmpfechaservicio.Value:=sqlcabpedidosfecha.Asdatetime;
          pedidostmp.Post;
          sqlcabpedidos.Next;
        end;
      end;

      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('SELECT DISTINCT ide,idser,anyo,id FROM pedidostmp where (ide,idser,anyo,id) not in (select ide,idser,anyo,id from pedidos)');
      qaux.open;
      if qaux.RecordCount>0 then
      begin
        qaux.Close;
        qaux.SQL.Clear;
        qaux.SQL.Add('insert into pedidos SELECT * FROM pedidostmp where (ide,idser,anyo,id) not in (select ide,idser,anyo,id from pedidos)');
        qaux.ExecSQL;
      end;
////   inserto lineas de pedidos pendientes
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('select * from pedidospendientes');
      qaux.open;
      if qaux.RecordCount>0 then
      begin
        qaux.Close;
        qaux.SQL.Clear;
        qaux.SQL.Add('insert into lineaspedidos (ide,idser,anyo,idp,id,ida,desarticulo,cantidad,numlinea,observaciones,activo,servidos,anulados,resto) ');
        qaux.SQL.Add('SELECT ide,ids,idanyo,idped,idlinped,idart,desart,cantidad,numlinea,observaciones,activo,servidos,anulados,resto FROM pedidospendientes where (ide,ids,idanyo,idped,idlinped)');
        qaux.SQL.Add('not in (select ide,idser,anyo,idp,id from lineaspedidos)');
        qaux.ExecSQL;

      end;

      qaux.SQL.Clear;
      qaux.SQL.Add('update lineaspedidos l set cantidad=(select cantidad from pedidospendientes p where l.ide=p.ide and l.idser=p.ids and l.anyo=p.idanyo and l.idp=p.idped and l.id=p.idlinped),');
      qaux.SQL.Add(' servidos=(select servidos from pedidospendientes p where l.ide=p.ide and l.idser=p.ids and l.anyo=p.idanyo and l.idp=p.idped and l.id=p.idlinped),');
      qaux.SQL.Add(' anulados=(select anulados from pedidospendientes p where l.ide=p.ide and l.idser=p.ids and l.anyo=p.idanyo and l.idp=p.idped and l.id=p.idlinped),');
      qaux.SQL.Add(' resto=(select resto from pedidospendientes p where l.ide=p.ide and l.idser=p.ids and l.anyo=p.idanyo and l.idp=p.idped and l.id=p.idlinped) ');
      qaux.SQL.Add(' where (l.ide,l.idser,l.anyo,l.idp,l.id) in (select ide,ids,idanyo,idped,idlinped from pedidospendientes) ');
      qaux.execsql;
      qaux.SQL.Clear;
      qaux.SQL.Add('update lineaspedidos l set servidos=cantidad where (l.ide,l.idser,l.anyo,l.idp,l.id) not in (select ide,ids,idanyo,idped,idlinped from pedidospendientes) ');
      qaux.execsql;
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('update lineaspedidos set activo=1 where resto>0');
      qaux.execsql;
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('update lineaspedidos set activo=0 where resto<=0');
      qaux.execsql;
      qaux.Close;

      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('update pedidos set activo=0 where (ide,idser,anyo,id) not in (select ide,idser,anyo,id from pedidostmp)');
      qaux.execsql;

      tiemporestante:=7200;
      timer1.Enabled:=true;
    end;

end;

procedure TForm1.FormShow(Sender: TObject);
var F: TextFile;
    sLinea,thost,tuser,tpass,tconection,tlimitado: String;
    hora2,hora3:ttime;
    configuracion:array of string;
    linea,x:integer;
begin
  inherited;
  AssignFile( F, ExtractFilePath( Application.ExeName ) + 'config.ini' );
  Reset( F );
  linea:=1;
  setlength (configuracion,500);
  for x:=1 to 7 do
  begin
    ReadLn( F, sLinea );
    configuracion[linea]:=sLinea;
    linea:=linea+1;
  end;

  CloseFile( F );
    thost:=configuracion[1];
    tuser:=configuracion[2];
    tpass:=configuracion[3];
    tlimitado:=configuracion[4];
    tconection:=configuracion[5];
    tconection:=tconection+configuracion[6];
    tconection:=tconection+configuracion[7];
    DBproduccgest.Connected:=false;
    DBproduccgest.HostName:=thost;
    DBproduccgest.User:=tuser;
    DBproduccgest.Password:=tpass;
    DBproduccgest.connected:=true;
    dmgesticom.Connected:=false;
    dmgesticom.ConnectionString:=tconection;
//    dmgesticom.Connected:=true;
    tiemporestante:=60;
end;

procedure TForm1.temporizadorTimer(Sender: TObject);
var numpedidospend:integer;
begin
    pedpendientes.Close;
    sqlpedpendientes.Close;
    sqlpedpendientes.open;
    if sqlpedpendientes.RecordSize>0 then
    begin
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('delete from pedidospendientes');
      qaux.ExecSQL;
      numpedidospend:=0;
      while not sqlpedpendientes.Eof do
      begin
        pedpendientes.Open;
        pedpendientes.Append;
        pedpendienteside.Value:=sqlpedpendientescodEmp.AsString;
        pedpendientesids.Value:=sqlpedpendientescodser.AsString;
        pedpendientesidanyo.Value:=sqlpedpendientescodeje.Asinteger;
        pedpendientesidped.Value:=sqlpedpendientescodped.Asinteger;
        pedpendientesidlinped.Value:=sqlpedpendienteslinped.Asinteger;
        pedpendientesnumlinea.Value:=sqlpedpendienteslinped.Asinteger;
        pedpendientesidart.Value:=sqlpedpendientescodart.AsString;
        pedpendientesdesart.Value:=sqlpedpendientesdesart.AsString;
        pedpendientescantidad.Value:=sqlpedpendientescantidad.Asfloat;
        pedpendientesobservaciones.Value:=sqlpedpendientesobslin.Asstring;
        pedpendientesactivo.Value:=1;
        pedpendientes.Post;
        sqlpedpendientes.Next;
        numpedidospend:=numpedidospend+1;
      end;
      llineas.Caption:='Número de lineas de pedidos pendientes de servir:'+inttostr(numpedidospend);
////  insert  articulos nuevos
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('SELECT DISTINCT ide,idart,desart,'+''''+''''+' as observaciones FROM pedidospendientes where (ide,idart) not in (select ide,idart from articulos) order by idart');
      qaux.open;
      if qaux.RecordCount>0 then
      begin
        qaux.Close;
        qaux.SQL.Clear;
        qaux.SQL.Add('insert into articulos SELECT DISTINCT ide,idart,desart,'+''''+''''+' as observaciones FROM pedidospendientes where (ide,idart) not in (select ide,idart from articulos) order by idart');
        qaux.ExecSQL;
      end;
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('update articulos a set a.descripcion=(SELECT desart FROM pedidospendientes p where a.ide=p.ide and a.id=p.idart limit 1) where (a.ide,a.id) in (select DISTINCT ide,idart from pedidospendientes)');
      qaux.ExecSQL;

////   inserto pedidos pendientes

      sqlcabpedidos.Close;
      sqlcabpedidos.open;
      if sqlcabpedidos.RecordCount>0 then
      begin
        qaux.Close;
        qaux.SQL.Clear;
        qaux.SQL.Add('delete from pedidostmp');
        qaux.ExecSQL;
        while not sqlcabpedidos.Eof do
        begin
          pedidostmp.Open;
          pedidostmp.Append;
          pedidostmpide.Value:=sqlcabpedidoscodEmp.AsString;
          pedidostmpidser.Value:=sqlcabpedidoscodser.AsString;
          pedidostmpanyo.Value:=sqlcabpedidoscodeje.Asinteger;
          pedidostmpid.Value:=sqlcabpedidoscodped.Asinteger;
          pedidostmpfechapedido.Value:=sqlcabpedidosfecped.Asdatetime;
          pedidostmpfechaentrega.Value:=sqlcabpedidosfecser.Asdatetime;
          pedidostmpnomcliente.Value:=sqlcabpedidosnomcli.AsString;
          pedidostmpdirenvio.Value:=sqlcabpedidosdirenvio.AsString;
          pedidostmpcodpostenvio.Value:=sqlcabpedidoscpoenvio.asstring;
          pedidostmppoblacionenvio.Value:=sqlcabpedidospobenvio.Asstring;
          pedidostmpprovinciaenvio.Value:=sqlcabpedidoscodprovincia.Asstring;
          pedidostmpobservaciones.Value:=sqlcabpedidosobservaciones.Asstring;
          pedidostmpactivo.Value:=1;
          pedidostmp.Post;
          sqlcabpedidos.Next;
        end;
      end;
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('SELECT DISTINCT ide,idser,anyo,id FROM pedidostmp where (ide,idser,anyo,id) not in (select ide,idser,anyo,id from pedidos)');
      qaux.open;
      if qaux.RecordCount>0 then
      begin
        qaux.Close;
        qaux.SQL.Clear;
        qaux.SQL.Add('insert into pedidos SELECT * FROM pedidostmp where (ide,idser,anyo,id) not in (select ide,idser,anyo,id from pedidos)');
        qaux.ExecSQL;
      end;
////   inserto lineas de pedidos pendientes
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('select * from pedidospendientes');
      qaux.open;
      if qaux.RecordCount>0 then
      begin
        qaux.Close;
        qaux.SQL.Clear;
        qaux.SQL.Add('insert into lineaspedidos (ide,idser,anyo,idp,id,ida,desarticulo,cantidad,numlinea,observaciones,activo) ');
        qaux.SQL.Add('SELECT ide,ids,idanyo,idped,idlinped,idart,desart,cantidad,numlinea,observaciones,activo FROM pedidospendientes where (ide,ids,idanyo,idped,idlinped)');
        qaux.SQL.Add('not in (select ide,idser,anyo,idp,id from lineaspedidos)');
        qaux.ExecSQL;


      end;
      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('update lineaspedidos set activo=0 where (ide,idser,anyo,idp,id) not in (select ide,idser,anyo,idp,id from pedidospendientes)');
      qaux.execsql;

      qaux.Close;
      qaux.SQL.Clear;
      qaux.SQL.Add('update pedidos set activo=0 where (ide,idser,anyo,id) not in (select ide,idser,anyo,id from pedidostmp)');
      qaux.execsql;

      tiemporestante:=7200;
      timer1.Enabled:=true;
    end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
var hora:ttime;
begin
    tiemporestante:=tiemporestante-1;
    hora:=strtotime('00:00:00')-(tiemporestante*second);
    lresto.Caption:='Tiempo para la siguiente actualización: '+timetostr(hora);
    if tiemporestante=0 then button1.Click;
end;

end.
