﻿unit fgenerartratamientos;

interface

uses
  FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error, FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.Stan.Async, FireDAC.DApt, FireDAC.Comp.DataSet, FireDAC.Comp.Client, uFireDacHelper,
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.ComCtrls, Vcl.StdCtrls,
    Data.DB, Vcl.Grids, Vcl.DBGrids,
   Vcl.DBCtrls;

type
  // Interposer para detectar el redimensionamiento de columnas
  TDBGrid = class(Vcl.DBGrids.TDBGrid)
  protected
    procedure ColWidthsChanged; override;
  end;

  Tgenerartratamientos = class(TForm)
    BtGenerar: TButton;
    vfecha: TDateTimePicker;
    qrecomendaciones: TFDQuery;
    gridrecomendaciones: TDBGrid;
    Label1: TLabel;
    dsqrecomendaciones: TDataSource;
    qrecomendacionesid: TIntegerField;
    qrecomendacionesdescripcion: TWideStringField;
    qrecomendacionesobservaciones: TWideStringField;
    qrecomendacionesfecha: TDateField;
    qrecomendacionesvelocidad: TFloatField;
    qrecomendacionesnum_boquillas: TIntegerField;
    qrecomendacionestipo_boquilla: TWideStringField;
    qrecomendacioneslitros_hect: TIntegerField;
    qrecomendacionesdesc_boquilla: TWideStringField;
    qrecomendacioneslitros_minuto: TFloatField;
    qrecomendacionesidparcela: TWideStringField;
    qrecomendacionesparcela: TWideStringField;
    qrecomendacionessuperficie: TFloatField;
    qidtratamiento: TFDQuery;
    qtratamientos: TFDQuery;
    qidtratamientoid: TLargeintField;
    qrecomendacionesdetalle: TFDQuery;
    qrecomendacionesdetalleide: TIntegerField;
    qrecomendacionesdetalleidt: TIntegerField;
    qrecomendacionesdetalleidaf: TIntegerField;
    qrecomendacionesdetalleidma: TIntegerField;
    qrecomendacionesdetalledescripcion_af: TWideStringField;
    qrecomendacionesdetalledescripcion_ma: TWideStringField;
    qrecomendacionesdetallecantidad_base: TFloatField;
    qrecomendacionesdetalledosis: TFloatField;
    qrecomendacionesdetalleunidad_medida: TWideStringField;
    qrecomendacionesdetalleregistro: TWideStringField;
    qrecomendacionesdetalleplazo: TIntegerField;
    qrecomendacionesdetalleficha: TBlobField;
    qrecomendacionesdetallecantidad_mezcla: TIntegerField;
    qrecomendacionesdetallecantidad_materia: TFloatField;
//    qrecomendacionesdetallecalle: TIntegerField;
    qrecomendacionesdetalleorden: TIntegerField;
    qtratamientosdetalle: TFDQuery;
    qtratamientosdetalleide: TIntegerField;
    qtratamientosdetalleidt: TIntegerField;
    qtratamientosdetalleidaf: TIntegerField;
    qtratamientosdetalleidma: TIntegerField;
    qtratamientosdetalledescripcion_af: TWideStringField;
    qtratamientosdetalledescripcion_ma: TWideStringField;
    qtratamientosdetallecantidad_base: TFloatField;
    qtratamientosdetalledosis: TFloatField;
    qtratamientosdetalleunidad_medida: TWideStringField;
    qtratamientosdetalleregistro: TWideStringField;
    qtratamientosdetalleplazo: TIntegerField;
    qtratamientosdetalleficha: TBlobField;
    qtratamientosdetallecantidad_mezcla: TFloatField;
    qtratamientosdetallecantidad_materia: TFloatField;
    qtratamientosdetalleen_cuaderno: TIntegerField;
    qtratamientosdetalleidconsumo: TIntegerField;
    qtratamientosdetalleorden: TIntegerField;
    qtratamientosdetalleidentrada: TIntegerField;
    qtratamientosdetallefecha: TDateField;
    qtratamientoside: TIntegerField;
    qtratamientosid: TIntegerField;
    qtratamientosfecha: TDateField;
    qtratamientosidcc: TWideStringField;
    qtratamientosdesc_cc: TWideStringField;
    qtratamientosresponsable: TWideStringField;
    qtratamientosidrecomendacion: TIntegerField;
    qtratamientoscontabilizado: TIntegerField;
    qtratamientosnif_responsable: TWideStringField;
    qtratamientosobservaciones: TWideStringField;
    qtratamientosoperario: TWideStringField;
    qtratamientosidjustificacion: TIntegerField;
    qtratamientoscondiciones_metereologicas: TWideStringField;
    qtratamientoshora_fin: TTimeField;
    qtratamientostractor: TWideStringField;
    qtratamientosdeposito: TWideStringField;
    qtratamientosvelocidad: TFloatField;
    qtratamientosboquilla: TWideStringField;
    qtratamientosventilador: TWideStringField;
    qtratamientosmostrar: TIntegerField;
    qtratamientosvariedad: TWideStringField;
    qtratamientosnum_boquillas: TIntegerField;
    qtratamientoslitros_hect: TIntegerField;
    qtratamientosdesc_boquilla: TWideStringField;
    qtratamientoslitros_minutos: TFloatField;
    qtratamientossuperficie: TFloatField;
    qtratamientosfecha_fin: TDateField;
    qtratamientoshora_inicio: TTimeField;
    qtratamientosfecha_inicio: TDateField;
    qtratamientosancho_calle: TFloatField;
    qrecomendacionesvariedad: TWideStringField;
    qrecomendacioneside: TIntegerField;
    qrecomendacionesidtb: TIntegerField;
    qtratamientosdetallecantidadprevista_mezcla: TFloatField;
    qtratamientosdetallecantidadprevista_materia: TFloatField;
    qrecomendacionescodpar: TWideStringField;
    qresponsables: TFDQuery;
    dsqresponsables: TDataSource;
    qresponsablesnombre: TWideStringField;
    comboresponsables: TDBLookupComboBox;
    Label2: TLabel;
    qresponsablesnif: TWideStringField;
    qrecomendacionesdistancialineal: TIntegerField;
    qrecomendacionesancho_calle_1: TFloatField;
    qrecomendacionestipo: TWideStringField;
    qrecomendacioneslitroshectarea: TFloatField;
    qrecomendacionesancho_calle: TFloatField;
    qrecomendacionesventilador: TWideStringField;
    qrecomendacionesya_generado: TLargeintField;
    qexistentes: TFDQuery;
    qrecomendacionespresion: TFloatField;
    qrecomendacionesresponsable: TWideStringField;
    qrecomendacionesnif_responsable: TWideStringField;
    qrecomendacionesfirma: TBlobField;
    qrecomendacionesid_1: TIntegerField;
    qrecomendacioneside_1: TIntegerField;
    qtratamientospresion: TFloatField;
    procedure BtGenerarClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure gridrecomendacionesDrawColumnCell(Sender: TObject; const Rect: TRect; DataCol: Integer;
      Column: TColumn; State: TGridDrawState);
    procedure gridrecomendacionesMouseUp(Sender: TObject; Button: TMouseButton;
      Shift: TShiftState; X, Y: Integer);
  private
    { Private declarations }
  public
    { Public declarations }
          vrecomendacion,vempresa:integer;
          procedure AjustarAnchoFormulario;
  end;

var
  generartratamientos: Tgenerartratamientos;

implementation

{$R *.dfm}

{ TDBGrid }

procedure TDBGrid.ColWidthsChanged;
begin
  inherited;
  if (Owner is Tgenerartratamientos) then
    Tgenerartratamientos(Owner).AjustarAnchoFormulario;
end;

{ Tgenerartratamientos }

procedure Tgenerartratamientos.AjustarAnchoFormulario;
var
  i, TotalWidth: Integer;
begin
  TotalWidth := 0;
  if dgIndicator in gridrecomendaciones.Options then
    TotalWidth := TotalWidth + 12;

  for i := 0 to gridrecomendaciones.Columns.Count - 1 do
  begin
    if gridrecomendaciones.Columns[i].Visible then
      TotalWidth := TotalWidth + gridrecomendaciones.Columns[i].Width + 1;
  end;

  TotalWidth := TotalWidth + GetSystemMetrics(SM_CXVSCROLL) + 2;
  Self.ClientWidth := TotalWidth;
end;

procedure Tgenerartratamientos.BtGenerarClick(Sender: TObject);
var vid, i:integer;
begin
   if gridrecomendaciones.SelectedRows.Count = 0 then
   begin
     showmessage('Por favor, seleccione los tratamientos que desea generar');
     exit;
   end;

   qidtratamiento.Close;
   qidtratamiento.Open;
   vid:=qidtratamientoid.asinteger;
   qtratamientos.Open;
   qtratamientosdetalle.Open;

   qrecomendaciones.DisableControls;
   try
     for i := 0 to gridrecomendaciones.SelectedRows.Count - 1 do
     begin
       qrecomendaciones.GotoBookmark(gridrecomendaciones.SelectedRows[i]);

       qtratamientos.Append;
       qtratamientoside.value:=qrecomendacioneside.Asinteger;
       qtratamientosid.value:=vid;
       qtratamientosidcc.value:=qrecomendacionescodpar.Asstring;
       qtratamientosdesc_cc.value:=qrecomendacionesparcela.Asstring;
       qtratamientosfecha.value:=vfecha.Date;
       qtratamientosidrecomendacion.value:=qrecomendacionesid.Asinteger;
       qtratamientosobservaciones.value:=qrecomendacionesobservaciones.Asstring;
       qtratamientosvelocidad.value:=qrecomendacionesvelocidad.Asfloat;
       qtratamientospresion.value:=qrecomendacionespresion.Asinteger;
       qtratamientosboquilla.value:=qrecomendacionesdesc_boquilla.Asstring;
       qtratamientosvariedad.value:=qrecomendacionesvariedad.Asstring;
       qtratamientosnum_boquillas.value:=qrecomendacionesnum_boquillas.Asinteger;
       qtratamientoslitros_hect.value:=trunc(qrecomendacioneslitroshectarea.AsFloat);
       qtratamientosdesc_boquilla.value:=qrecomendacionesdesc_boquilla.Asstring;
       qtratamientosnif_responsable.value:=qresponsablesnif.asstring;
       qtratamientosresponsable.value:=qresponsablesnombre.AsString;
       qtratamientoslitros_minutos.value:=qrecomendacioneslitros_minuto.Asfloat;
       qtratamientosancho_calle.value:=qrecomendacionesancho_calle_1.Asfloat;
       qtratamientossuperficie.value:=qrecomendacionessuperficie.Asfloat;
       qtratamientosventilador.value:=qrecomendacionesventilador.Asstring;
       qtratamientos.post;

       qrecomendacionesdetalle.First;
       while not qrecomendacionesdetalle.Eof do
       begin
         qtratamientosdetalle.append;
         qtratamientosdetalleide.value:=qrecomendacionesdetalleide.Asinteger;
         qtratamientosdetalleidt.value:=vid;
         qtratamientosdetalleidaf.value:=qrecomendacionesdetalleidaf.Asinteger;
         qtratamientosdetalleidma.value:=qrecomendacionesdetalleidma.Asinteger;
         qtratamientosdetalledescripcion_af.value:=qrecomendacionesdetalledescripcion_af.Asstring;
         qtratamientosdetalledescripcion_ma.value:=qrecomendacionesdetalledescripcion_ma.Asstring;
         qtratamientosdetallecantidad_base.value:=qrecomendacionesdetallecantidad_base.Asfloat;
         qtratamientosdetalledosis.value:=qrecomendacionesdetalledosis.Asfloat;
         qtratamientosdetalleunidad_medida.value:=qrecomendacionesdetalleunidad_medida.Asstring;
         qtratamientosdetalleregistro.value:=qrecomendacionesdetalleregistro.Asstring;
         qtratamientosdetalleplazo.value:=qrecomendacionesdetalleplazo.Asinteger;
         qtratamientosdetallecantidadprevista_mezcla.value:=TRUNC(qrecomendacioneslitroshectarea.Asinteger*qrecomendacionessuperficie.AsFloat);
         qtratamientosdetallecantidadprevista_materia.value:=((qrecomendacioneslitros_hect.Asinteger*qrecomendacionessuperficie.AsFloat)/qrecomendacionesdetallecantidad_base.asfloat)*qrecomendacionesdetalledosis.asfloat;
         qtratamientosdetalleen_cuaderno.value:=1;
         qtratamientosdetalleorden.value:=qrecomendacionesdetalleorden.Asinteger;
         qtratamientosdetallefecha.value:=vfecha.Date;
         qtratamientosdetalle.post;
         qrecomendacionesdetalle.Next;
       end;
       vid:=vid+1;
     end;
   finally
     qrecomendaciones.EnableControls;
   end;
   qrecomendaciones.Close;
   qrecomendaciones.Open;
   showmessage(' ¡¡ TRATAMIENTOS GENERADOS CORRECTAMENTE ¡¡');
end;

procedure Tgenerartratamientos.FormShow(Sender: TObject);
begin
   vfecha.Date:=date();
   qrecomendaciones.Prepare;
   qrecomendaciones.ParamByName('EMPRESA').AsInteger:=vempresa;
   qrecomendaciones.ParamByName('RECOMENDACION').AsInteger:=vrecomendacion;
   qrecomendaciones.Open;
   qrecomendacionesdetalle.Prepare;
   qrecomendacionesdetalle.ParamByName('EMPRESA').AsInteger:=vempresa;
   qrecomendacionesdetalle.ParamByName('RECOMENDACION').AsInteger:=vrecomendacion;
   qrecomendacionesdetalle.Open;
   qresponsables.Open;
   comboresponsables.KeyValue:=qresponsablesnif.AsString;
   
   AjustarAnchoFormulario;
end;

procedure Tgenerartratamientos.gridrecomendacionesDrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
begin
  if qrecomendacionesya_generado.AsInteger > 0 then
  begin
    gridrecomendaciones.Canvas.Brush.Color := clYellow;
  end;

  if gdSelected in State then
  begin
    gridrecomendaciones.Canvas.Brush.Color := clHighlight;
    gridrecomendaciones.Canvas.Font.Color := clHighlightText;
  end;

  gridrecomendaciones.DefaultDrawColumnCell(Rect, DataCol, Column, State);

  if (Trim(Column.Title.Caption) = 'Info') and (qrecomendacionesya_generado.AsInteger > 0) then
  begin
    gridrecomendaciones.Canvas.Font.Color := clBlue;
    gridrecomendaciones.Canvas.Font.Style := [fsBold];
    gridrecomendaciones.Canvas.TextOut(Rect.Left + (Rect.Width div 2) - 4, Rect.Top + 2, 'ⓘ');
  end;
end;

procedure Tgenerartratamientos.gridrecomendacionesMouseUp(Sender: TObject;
  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
var
  Cell: TGridCoord;
  Col, Row: Integer;
  msg: string;
begin
  Cell := gridrecomendaciones.MouseCoord(X, Y);
  Col := Cell.X;
  Row := Cell.Y;
  
  // En XE3, MouseCoord devuelve índices visibles (incluyendo indicador si existe)
  if (Row >= 0) and (Col >= 0) then
  begin
    // Verificamos si la columna pulsada es 'Info'
    // Restamos 1 al índice si hay indicador (dgIndicator)
    if dgIndicator in gridrecomendaciones.Options then
      Dec(Col);

    if (Col >= 0) and (Col < gridrecomendaciones.Columns.Count) then
    begin
      if (Trim(gridrecomendaciones.Columns[Col].Title.Caption) = 'Info') and 
         (qrecomendacionesya_generado.AsInteger > 0) then
      begin
        qexistentes.Close;
        qexistentes.ParamByName('EMPRESA').AsInteger := qrecomendacioneside.AsInteger;
        qexistentes.ParamByName('IDRECO').AsInteger := qrecomendacionesidtb.AsInteger;
        qexistentes.ParamByName('IDCC').AsWideString := qrecomendacionescodpar.AsString;
        qexistentes.Open;

        msg := 'Tratamientos ya generados para esta parcela:' + sLineBreak + sLineBreak;
        while not qexistentes.Eof do
        begin
          msg := msg + '- ID: ' + qexistentes.FieldByName('id').AsString + 
                       ' | Fecha: ' + qexistentes.FieldByName('fecha').AsString + 
                       ' | Resp: ' + qexistentes.FieldByName('responsable').AsString + sLineBreak;
          qexistentes.Next;
        end;
        
        if qexistentes.RecordCount > 0 then
          ShowMessage(msg)
        else
          ShowMessage('No se encontraron los detalles de los tratamientos generados.');
      end;
    end;
  end;
end;

end.
