unit frecalculostock;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, ZAbstractRODataset, ZDataset,
  Vcl.ComCtrls, Vcl.StdCtrls, Vcl.ExtCtrls, Vcl.DBCtrls, ZAbstractDataset;

type
  Trecalculostock = class(TForm)
    Panel1: TPanel;
    Panel4: TPanel;
    Button1: TButton;
    Panel3: TPanel;
    Label1: TLabel;
    Label3: TLabel;
    qaux: TZReadOnlyQuery;
    qpesadaslotes: TZReadOnlyQuery;
    qpesadaslotesid: TIntegerField;
    qpesadasloteside: TIntegerField;
    qpesadaslotesidea: TIntegerField;
    qpesadaslotesidea2: TIntegerField;
    qpesadaslotescajas: TLargeintField;
    qpesadaslotesid_envase: TIntegerField;
    qpesadaslotesid_formato: TIntegerField;
    qmateriales: TZReadOnlyQuery;
    qmaterialesidaf: TIntegerField;
    qpesadaslotesmprima: TWideStringField;
    PBar: TProgressBar;
    fdesde: TDBLookupComboBox;
    qinventarios: TZReadOnlyQuery;
    qinventarioside: TIntegerField;
    qinventariosfecha: TDateField;
    qinventariosregularizado: TIntegerField;
    dsqinventarios: TDataSource;
    qstockdetalle: TZReadOnlyQuery;
    qstockdetalleide: TIntegerField;
    qstockdetallefecha: TDateField;
    qstockdetallecodigo: TWideStringField;
    qstockdetalledescripcion: TWideStringField;
    qstockdetallestock: TFloatField;
    qstockdetallestock_real: TFloatField;
    qauxentradas: TZQuery;
    qauxentradasid: TIntegerField;
    qauxentradasidempresa: TIntegerField;
    qauxentradasidproveedor: TIntegerField;
    qauxentradasfecha: TDateField;
    qauxentradasdocumento: TWideStringField;
    qauxentradasbase: TFloatField;
    qauxentradastotaliva: TFloatField;
    qauxentradastotalentrada: TFloatField;
    qauxentradasdetalle: TZQuery;
    qauxentradasdetalleid: TIntegerField;
    qauxentradasdetalleidempresa: TIntegerField;
    qauxentradasdetalleidentrada: TIntegerField;
    qauxentradasdetalleidproveedor: TIntegerField;
    qauxentradasdetallecodigo: TWideStringField;
    qauxentradasdetalleid_propio: TWideStringField;
    qauxentradasdetalledescripcion: TWideStringField;
    qauxentradasdetallelote: TWideStringField;
    qauxentradasdetallecantidad: TFloatField;
    qauxentradasdetallestock: TFloatField;
    qauxentradasdetalleprecio: TFloatField;
    qauxentradasdetalletipo_iva: TIntegerField;
    qauxentradasdetallebase: TFloatField;
    qauxentradasdetalletotal: TFloatField;
    qlotes: TZReadOnlyQuery;
    qpesadas: TZQuery;
    qpesadasid: TIntegerField;
    qpesadasidempresa: TIntegerField;
    qpesadasidea: TIntegerField;
    qpesadasid_palet: TWideStringField;
    qpesadasnum_palets: TIntegerField;
    qpesadasid_envase: TWideStringField;
    qpesadasnum_envases: TIntegerField;
    qpesadasmprima: TWideStringField;
    qpesadastara: TFloatField;
    qpesadascosto_materiales: TFloatField;
    qaux2: TZQuery;
    lid: TLabel;
    qpesadasrecuperar_envases: TIntegerField;
    qborrarmateriales: TZReadOnlyQuery;
    qactualizarentradasdetalle: TZReadOnlyQuery;
    qactualizarentradasdetalle2: TZReadOnlyQuery;
    qactualizarentradasdetalle3: TZReadOnlyQuery;
    Label2: TLabel;
    Label4: TLabel;
    qinsertarmateriales: TZReadOnlyQuery;
    qactualizarfitos: TZReadOnlyQuery;
    qactualizar_pesada: TZReadOnlyQuery;
    borrar_trigger: TZReadOnlyQuery;
    crear_trigger: TZReadOnlyQuery;
    procedure Button1Click(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure dsqinventariosDataChange(Sender: TObject; Field: TField);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  recalculostock: Trecalculostock;

implementation

{$R *.dfm}

procedure Trecalculostock.Button1Click(Sender: TObject);
var dia,mes,anyo:word;
    tdia,tmes,tanyo,tdesde,fecha,tdesde2,thasta2,tmultiplicador:string;
    vide,videa,videa2,vnum_palets,vnum_envases,vidpalet,videnvase,vidformato,vidaf:string;
    vcantidad,vpeso,vcoste,id:string;
    vmultiplicador,resto:real;
    vescompuesta:integer;
begin
    decodedate(qinventariosfecha.AsDateTime,anyo,mes,dia);
    tdesde:=''''+floattostr(anyo)+'-'+floattostr(mes)+'-'+floattostr(dia)+'''';
    qpesadas.close;
    qpesadas.prepare;
    qpesadas.ParamByName('FECHA').AsDateTime:=qinventariosfecha.AsDateTime;//('select idempresa,id,idea,id_palet,num_palets,id_envase,num_envases,mprima,tara,costo_materiales,recuperar_envases from ea_pesadas where fecha>'+tdesde+' order by fecha,id');
    qpesadas.Open;
    pbar.Visible:=true;
    pbar.Min:=0;
    pbar.Max:=qpesadas.RecordCount;
    LABEL2.Caption:='Nº DE REGISTROS: '+INTTOSTR(QPESADAS.RecordCount);
    label4.Caption:='BORRANDO MATERIALES';
    panel3.Repaint;
    borrar_trigger.ExecSQL;
    while not qpesadas.eof do
    begin
      qborrarmateriales.Prepare;
      qborrarmateriales.ParamByName('EMPRESA').Asinteger:=qpesadasidempresa.asinteger;
      qborrarmateriales.ParamByName('ID').Asinteger:=qpesadasid.asinteger;
      qborrarmateriales.ParamByName('IDEA').Asinteger:=qpesadasidea.asinteger;
      qborrarmateriales.ExecSQL;
      pbar.marqueeInterval:=round(qpesadas.RecordCount/100);
      pbar.StepIt;
      qpesadas.Next;
    end;
    crear_trigger.ExecSQL;

{    qactualizarentradasdetalle.Prepare;
    qactualizarentradasdetalle.ParamByName('FECHA').AsDateTime:=qinventariosfecha.AsDateTime;
    qactualizarentradasdetalle.ParamByName('EMPRESA').asINTEGER:=qinventarioside.AsInteger;
    qactualizarentradasdetalle.ExecSQL;   }
{    qaux.Close;
    qaux.sql.Clear;
    qaux.SQL.Create.Add('delete from ea_materiales where (ide,idea,idea2) in (select idempresa,id,idea from ea_pesadas where fecha>'+tdesde+')');
    qaux.ExecSQL;

    qaux.Close;
    qaux.sql.Clear;
    qaux.sql.Add('update entradas_detalle set stock=cantidad where id_propio not in (select codigo from control_stock_detalle where fecha='+tdesde+' and ide='+qinventarioside.asstring+' ) and identrada in (select id from entradas where fecha>='+tdesde+')');
    qaux.ExecSQL;}

  {  try
       while not qstockdetalle.eof do
       begin
         qactualizarentradasdetalle2.Prepare;
         qactualizarentradasdetalle2.ParamByName('FECHA').AsDateTime:=qstockdetallefecha.AsDateTime;
         qactualizarentradasdetalle2.ParamByName('EMPRESA').asINTEGER:=qstockdetalleide.asinteger;
         qactualizarentradasdetalle2.ParamByName('CODIGO').AsString:=qstockdetallecodigo.asstring;
         qactualizarentradasdetalle2.ExecSQL;
         qactualizarentradasdetalle3.Prepare;
         qactualizarentradasdetalle3.ParamByName('FECHA').AsDateTime:=qstockdetallefecha.AsDateTime;
         qactualizarentradasdetalle3.ParamByName('EMPRESA').asINTEGER:=qstockdetalleide.asinteger;
         qactualizarentradasdetalle3.ParamByName('CODIGO').AsString:=qstockdetallecodigo.asstring;
         qactualizarentradasdetalle3.ExecSQL;
         decodedate(qstockdetallefecha.AsDateTime,anyo,mes,dia);
         fecha:=''''+floattostr(anyo)+'-'+floattostr(mes)+'-'+floattostr(dia)+'''';
         resto:=qstockdetallestock_real.AsFloat;
         qaux.Close;
         qaux.sql.Clear;
         qaux.sql.Add('select * from entradas_detalle where id_propio='+''''+qstockdetallecodigo.asstring+''''+' and idempresa='+qstockdetalleide.asstring+' order by id desc');
         qaux.open;
         if qaux.RecordCount>0 then     // if 1
         begin
             qaux2.Close;
             qaux2.sql.Clear;
             qaux2.sql.Add('select * from entradas_detalle where id_propio='+''''+qstockdetallecodigo.asstring+''''+' and idempresa='+qstockdetalleide.asstring+' and identrada in (select id from entradas where fecha>'+fecha+') order by id desc');
             qaux2.open;
             if qaux2.RecordCount>0 then
             begin
                 qaux.Close;
                 qaux.sql.Clear;
                 qaux.sql.Add('update entradas_detalle set stock=cantidad where id_propio='+''''+qstockdetallecodigo.asstring+''''+' and idempresa='+qstockdetalleide.asstring+' and identrada in (select id from entradas where fecha>'+fecha+')');
                 qaux.ExecSQL;
             end;

             qaux.Close;
             qaux.sql.Clear;
             qaux.sql.Add('update entradas_detalle set stock=0 where id_propio='+''''+qstockdetallecodigo.asstring+''''+' and idempresa='+qstockdetalleide.asstring+' and identrada in (select id from entradas where fecha<='+fecha+')');
             qaux.ExecSQL;
             qaux.Close;
             qaux.sql.Clear;
             qaux.sql.Add('select id,idempresa,fecha from entradas where fecha<'+fecha+' and (id,idempresa) in (select identrada,idempresa from entradas_detalle where cantidad>=0 and id_propio='+''''+qstockdetallecodigo.asstring+''''+' and idempresa='+qstockdetalleide.asstring+') order by fecha desc,id desc');
             qaux.open;
             if qaux.recordcount=0 then
             begin
                 qaux.sql.Clear;
                 qaux.sql.Add('select id,idempresa,fecha from entradas where fecha>='+fecha+' and (id,idempresa) in (select identrada,idempresa from entradas_detalle where cantidad>=0 and id_propio='+''''+qstockdetallecodigo.asstring+''''+' and idempresa='+qstockdetalleide.asstring+') order by fecha desc');
                 qaux.open;
             end;
             while resto>0 do   // while 1
             begin
               qaux2.Close;
               qaux2.sql.Clear;
               qaux2.sql.Add('select * from entradas_detalle where idempresa='+qaux.fields[1].AsString+' and identrada='+qaux.fields[0].AsString+' and id_propio='+''''+qstockdetallecodigo.asstring+''''+' order by id desc');
               qaux2.open;
               if qaux2.fields[8].asfloat>=resto then
               begin
                  if not qaux.Eof then
                  begin
                    qaux2.edit;
                    qaux2.Fields[9].Value:=resto;
                    qaux2.post;
                    resto:=0;
                  end else
                  begin
                    qaux2.edit;
                    qaux2.Fields[9].Value:=qaux2.Fields[9].asfloat+resto;
                    qaux2.post;
                    resto:=0;
                  end;
               end;
               if qaux2.fields[8].asfloat<=resto then
               begin
                  if not qaux.Eof then
                  begin
                    qaux2.edit;
                    resto:=resto-qaux2.fields[8].asfloat;
                    qaux2.Fields[9].Value:=qaux2.fields[8].asfloat;
                    qaux2.post;
                  end else
                  begin
                    qaux2.edit;
                    qaux2.Fields[9].Value:=qaux2.Fields[9].asfloat+resto;
                    qaux2.post;
                    resto:=0;
                  end;
               end;
               qaux.Next;
             end;   // end while 1
         end;
       if qaux.RecordCount=0 then
       begin
          decodedate(qstockdetallefecha.AsDateTime,anyo,mes,dia);
          fecha:=''''+floattostr(anyo)+'/'+floattostr(mes)+'/'+floattostr(dia)+'''';

          qaux2.close;
          qaux2.SQL.Clear;
          qaux2.SQL.Add('select * from entradas where idproveedor=0 and fecha='+fecha+' and idempresa='+qstockdetalleide.asstring);
          qaux2.Open;
          if qaux2.RecordCount=0 then
          begin
            qauxentradas.Open;
            qauxentradas.Append;
            qauxentradasidempresa.Value:=qstockdetalleide.asinteger;
            qauxentradasidproveedor.Value:=0;
            qauxentradasfecha.Value:=qstockdetallefecha.AsDateTime;
            qauxentradasdocumento.Value:='INV.'+qstockdetallefecha.AsSTRING;
            qauxentradas.Post;
          end else
               begin
                   qauxentradas.Open;
                   qauxentradas.Locate('documento','INV.'+qstockdetallefecha.AsSTRING,[locaseinsensitive]);
               end;
          qauxentradasdetalle.Open;
          qauxentradasdetalle.Append;
          qauxentradasdetalleidempresa.Value:=qauxentradasidempresa.AsInteger;
          qauxentradasdetalleidentrada.Value:=qauxentradasid.AsInteger;
          qauxentradasdetalleidproveedor.Value:=qauxentradasidproveedor.AsInteger;
          qauxentradasdetallecodigo.Value:=qstockdetallecodigo.asstring;
          qauxentradasdetalleid_propio.Value:=qstockdetallecodigo.asstring;
          qauxentradasdetalledescripcion.Value:=qstockdetalledescripcion.asstring;
          qauxentradasdetallelote.Value:=qauxentradasdocumento.asstring;
          qauxentradasdetallecantidad.Value:=qstockdetallestock_real.asfloat;
          qauxentradasdetallestock.Value:=qstockdetallestock_real.asfloat;
          qauxentradasdetalleprecio.Value:=0;
          qauxentradasdetalletipo_iva.Value:=0;
          qauxentradasdetalle.Post;
         end;
         qstockdetalle.next;
       end;

    except
        showmessage('error en el codigo '+qstockdetallecodigo.AsString);
    end;     }
{     qaux.Close;
     qaux.SQL.Clear;
     qaux.SQL.Add('update articulosf af set stock=(select sum(stock) as stock from entradas_detalle where id_propio=af.codigo and idempresa=af.idempresa group by id_propio )');
     qaux.ExecSQL;
     qaux.SQL.Clear;
     qaux.SQL.Add('update articulosf af set preciocoste=(SELECT SUM((SELECT PRECIO*STOCK FROM entradas_detalle WHERE ID=ed.id))/sum(stock) FROM `entradas_detalle` ed  where id_propio=af.codigo) where idempresa=af.idempresa and codigo=af.codigo');
     qaux.ExecSQL;
     qaux.SQL.Clear;
     qaux.SQL.Add('select * from articulosf where stock_minimo>stock and avisar_stock=1');
     qaux.Open;     }

/////
///
    qpesadas.First;
    pbar.Visible:=true;
    pbar.Min:=0;
    pbar.Max:=qpesadas.RecordCount;
    label4.Caption:='INSERTANDO MATERIALES';
    panel3.Repaint;
    while not qpesadas.Eof do
    begin
    qaux.SQL.Clear;
    qaux.SQL.Add('select compuesto from materias_primas where idempresa='+qpesadasidempresa.asstring+' and id='+''''+qpesadasmprima.asstring+'''');
    qaux.Open;
    if qaux.Fields[0].AsInteger=0 then vmultiplicador:=1 else vmultiplicador:=0.5;
    tmultiplicador:=floattostr(vmultiplicador);
    tmultiplicador:=StringReplace(tmultiplicador, ',', '.',[rfReplaceAll, rfIgnoreCase]);
       pbar.StepIt;
       id:=qpesadasid.AsString;
{       if id='6939' then
       begin
         showmessage('6939');
       end; }
       lid.Caption:='ID: '+id;
       lid.Repaint;
             qlotes.Close;
             qlotes.Prepare;
             qlotes.ParamByName('EMPRESA').Asinteger:=qpesadasidempresa.asinteger;
             qlotes.ParamByName('ID').Asinteger:=qpesadasid.asinteger;
             qlotes.ParamByName('IDEA').Asinteger:=qpesadasidea.asinteger;
             qlotes.open;

             if qlotes.RecordCount>0 then
             begin
                  qinsertarmateriales.prepare;
                  qinsertarmateriales.ParamByName('EMPRESA').AsInteger:=qpesadasidempresa.AsInteger;
                  qinsertarmateriales.ParamByName('IDEA').AsInteger:=qpesadasid.AsInteger;
                  qinsertarmateriales.ParamByName('IDEA2').AsInteger:=qpesadasidea.AsInteger;
                  qinsertarmateriales.ParamByName('NUMPALETS').AsInteger:=qpesadasnum_palets.AsInteger;
                  qinsertarmateriales.ParamByName('MULTIPLICADOR').AsFLOAT:=vmultiplicador;
                  qinsertarmateriales.ParamByName('IDPALET').AsString:=qpesadasid_palet.AsString;
                  qinsertarmateriales.ExecSQL;

{                  qaux.Close;
                  qaux.SQL.Clear;
                  qaux.SQL.Add('insert into ea_materiales ');
                  qaux.SQL.Add('select idempresa,'+qpesadasid.AsString+' as idea,'+qpesadasidea.AsString+' as idea2,idarticulof,sum(cantidadtotal) as cantidadtotal,sum(pesototal) as pesototal,null,sum(preciototal) as preciototal,0 as recuperado,null as identrada from ');
                                            //// materiales de los envases
                  qaux.SQL.Add('(SELECT ac.idempresa,ac.idarticuloalmacen,ac.idarticulof,(ac.cantidad*lp.cajas*'+tmultiplicador+') as cantidadtotal,(ac.peso*lp.cajas*'+tmultiplicador+') as pesototal,(ac.preciocoste*lp.cajas*'+tmultiplicador+') as preciototal ');
                  qaux.SQL.Add(' FROM articulos_componentes ac,(SELECT lp.ide,lp.idea,lp.idea2,sum(cajas) as cajas,aa.id as id_envase FROM lotes_pesadas lp,articulos_almacen aa where aa.ide=lp.ide and aa.codigo=lp.id_envase ');
                  qaux.SQL.Add(' and lp.ide='+qpesadasidempresa.AsString+' and lp.idea='+qpesadasid.AsString+' and lp.idea2='+qpesadasidea.AsString+' group by lp.id_envase ) as lp ');
                  qaux.SQL.Add(' where ac.idempresa=lp.ide and ac.idarticuloalmacen=lp.id_envase ');
                  qaux.SQL.Add(' union ALL');  // materiales de los formatos
                  qaux.SQL.Add(' SELECT ac.ide,ac.idcfg,ac.idaf,(ac.cantidad*lp.cajas*'+tmultiplicador+') as cantidadtotal,(ac.peso*lp.cajas*'+tmultiplicador+') as pesototal,(ac.coste*lp.cajas*'+tmultiplicador+') as preciototal FROM ');
                  qaux.SQL.Add(' configuraciones_detalle ac,(SELECT lp.ide,lp.idea,lp.idea2,sum(cajas) as cajas,aa.id as id_envase FROM lotes_pesadas lp, ');
                  qaux.SQL.Add(' configuraciones aa where aa.ide=lp.ide and aa.id=lp.id_formato and lp.ide='+qpesadasidempresa.AsString+' and lp.idea='+qpesadasid.AsString+' and lp.idea2='+qpesadasidea.AsString+' group by lp.id_envase ) as lp ');
                  qaux.SQL.Add(' where ac.ide=lp.ide and ac.idcfg=lp.id_envase ');
                  qaux.SQL.Add(' union ALL');  //// materiales de los palets
                  qaux.SQL.Add(' SELECT ac.idempresa,ac.idarticuloalmacen,ac.idarticulof,(ac.cantidad*'+qpesadasnum_palets.AsString+') as cantidadtotal,(ac.peso*'+qpesadasnum_palets.AsString+') as pesototal,(ac.coste*'+qpesadasnum_palets.AsString+') as preciototal');
                  qaux.SQL.Add(' FROM articulos_componentes ac where ac.idempresa='+qpesadasidempresa.AsString+' and ac.idarticuloalmacen=(select id from articulos_almacen where codigo='+''''+qpesadasid_palet.AsString+''''+' )');
                  qaux.SQL.Add(' ) as ea_materiales_tmp group by idarticulof');
                  qaux.execsql;    }
             end;
             if qpesadasrecuperar_envases.AsInteger=1 then
             begin
                qaux.SQL.Clear;
                qaux.SQL.Add('update ea_materiales ea set recuperado=-1 where ea.ide='+qpesadasidempresa.asstring+' and ea.idea='+qpesadasid.AsString+' and ea.idea2='+qpesadasidea.AsString);
                qaux.execsql;
             end else
                begin
                  qaux.SQL.Clear;
                  qaux.SQL.Add('update ea_materiales ea set recuperado=0 where ea.ide='+qpesadasidempresa.asstring+' and ea.idea='+qpesadasid.AsString+' and ea.idea2='+qpesadasidea.AsString);
                  qaux.execsql;
                end;
             qaux.sql.clear;
             qaux.sql.Add('select sum(peso),sum(precio) from ea_materiales where ide='+qpesadasidempresa.AsString+' and idea='+qpesadasid.AsString+' and idea2='+qpesadasidea.AsString);
             qaux.open;
             qactualizar_pesada.close;
             qactualizar_pesada.prepare;
             qactualizar_pesada.ParamByName('EMPRESA').AsInteger:=qpesadasidempresa.Asinteger;
             qactualizar_pesada.ParamByName('IDEA').AsInteger:=qpesadasid.Asinteger;
             qactualizar_pesada.ParamByName('IDEA2').AsInteger:=qpesadasidea.Asinteger;
             qactualizar_pesada.ParamByName('COSTO').Asfloat:=qaux.Fields[1].AsFloat;;
             qactualizar_pesada.ExecSQL;
{             qpesadas.Edit;
             qpesadastara.Value:=qaux.Fields[0].AsFloat;
             qpesadascosto_materiales.Value:=qaux.Fields[1].AsFloat;
             qpesadas.Post;}
             qpesadas.next
    end;
    pbar.Visible:=false;

    showmessage('¡¡¡Actualización realizada¡¡¡¡¡');
{     qaux.Close;
     qaux.SQL.Clear;
     qaux.SQL.Add('update articulosf af set stock=(select sum(stock) as stock from entradas_detalle where id_propio=af.codigo and idempresa=af.idempresa group by id_propio )');
     qaux.ExecSQL;
     qaux.SQL.Clear;
     qaux.SQL.Add('update articulosf af set preciocoste=(SELECT SUM((SELECT PRECIO*STOCK FROM entradas_detalle WHERE ID=ed.id))/sum(stock) FROM `entradas_detalle` ed  where id_propio=af.codigo) where idempresa=af.idempresa and codigo=af.codigo');
     qaux.ExecSQL;
     qaux.SQL.Clear;
     qaux.SQL.Add('select * from articulosf where stock_minimo>stock and avisar_stock=1');
     qaux.Open;   }
//     qactualizarfitos.execsql;

end;

procedure Trecalculostock.dsqinventariosDataChange(Sender: TObject;
  Field: TField);
begin
  qstockdetalle.Close;
  qstockdetalle.ParamByName('FECHA').AsDateTime:=qinventariosfecha.AsDateTime;
  qstockdetalle.ParamByName('EMPRESA').AsInteger:=qinventarioside.AsInteger;
  qstockdetalle.Open;
end;

procedure Trecalculostock.FormKeyPress(Sender: TObject; var Key: Char);
begin
    if (key=#13) then
    begin
        Perform(WM_NextDLGCtl,0,0);
        key:=#0;
    end;
end;

procedure Trecalculostock.FormShow(Sender: TObject);
begin
   qinventarios.Open;
//   qstockdetalle.Open;
end;

end.
