﻿unit flistado_ifg;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls, Vcl.ComCtrls, Vcl.ExtCtrls,
  Data.DB, ZAbstractRODataset, ZDataset, Vcl.Grids, Vcl.DBGrids, System.Win.ComObj, System.Math;

type
  Tlistado_ifg = class(TForm)
    PanelSuperior: TPanel;
    LabelTitulo: TLabel;
    LabelDesde: TLabel;
    LabelHasta: TLabel;
    LabelObtentor: TLabel;
    fdesde: TDateTimePicker;
    fhasta: TDateTimePicker;
    comboObtentor: TComboBox;
    btnBuscar: TButton;
    btnExportar: TButton;
    btnCerrar: TButton;
    GridDatos: TDBGrid;
    qifg: TZReadOnlyQuery;
    dsqifg: TDataSource;
    SaveDialog1: TSaveDialog;
    qobtentores: TZReadOnlyQuery;
    procedure FormShow(Sender: TObject);
    procedure btnCerrarClick(Sender: TObject);
    procedure btnBuscarClick(Sender: TObject);
    procedure btnExportarClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  listado_ifg: Tlistado_ifg;

implementation

uses datos, principal;

{$R *.dfm}

procedure Tlistado_ifg.FormShow(Sender: TObject);
begin
    fdesde.Date := Date() - 30;
    fhasta.Date := Date();
    
    // Cargar obtentores de forma única para el filtro
    qobtentores.Close;
    qobtentores.SQL.Clear;
    qobtentores.SQL.Add('SELECT DISTINCT obtentor FROM materias_primas WHERE obtentor IS NOT NULL AND obtentor <> '''' ORDER BY obtentor');
    qobtentores.Open;
    
    comboObtentor.Items.Clear;
    comboObtentor.Items.Add('[TODOS]');
    while not qobtentores.Eof do
    begin
        comboObtentor.Items.Add(qobtentores.FieldByName('obtentor').AsString);
        qobtentores.Next;
    end;
    comboObtentor.ItemIndex := 0;
    
    btnBuscar.Click;
end;

procedure Tlistado_ifg.btnCerrarClick(Sender: TObject);
begin
    Close;
end;

procedure Tlistado_ifg.btnBuscarClick(Sender: TObject);
var
  vObtentor: string;
begin
    if (comboObtentor.ItemIndex <= 0) or (comboObtentor.Text = '') then
        vObtentor := '%'
    else
        vObtentor := comboObtentor.Text;

    qifg.Close;
    qifg.ParamByName('FECHADESDE').AsDate := fdesde.Date;
    qifg.ParamByName('FECHAHASTA').AsDate := fhasta.Date;
    qifg.ParamByName('OBTENTOR').AsString := vObtentor;
    qifg.Open;
end;

procedure Tlistado_ifg.btnExportarClick(Sender: TObject);
var
  Excel, WorkBook, WorkSheet: OleVariant;
  TemplatePath, SavePath: string;
  Fila: Integer;
begin
    if qifg.IsEmpty then
    begin
        ShowMessage('No hay datos para exportar.');
        Exit;
    end;

    SaveDialog1.FileName := 'Listado_IFG.xlsx';
    if not SaveDialog1.Execute then Exit;
    SavePath := SaveDialog1.FileName;

    TemplatePath := ExtractFilePath(Application.ExeName) + 'template_grapes_es_mod.xlsx';
    if not FileExists(TemplatePath) then
    begin
        // Intentar buscar en la ruta del código
        TemplatePath := 'c:\AGRIGEST\INFORMES\template_grapes_es_mod.xlsx';
        if not FileExists(TemplatePath) then
        begin
            ShowMessage('No se encuentra la plantilla template_grapes_es_mod.xlsx.');
            Exit;
        end;
    end;

    // Copiar la plantilla al destino antes de abrirla para no sobreescribir el original
    if FileExists(SavePath) then DeleteFile(SavePath);
    if not CopyFile(PChar(TemplatePath), PChar(SavePath), False) then
    begin
        ShowMessage('No se pudo crear el archivo de destino.');
        Exit;
    end;

    try
        Excel := CreateOleObject('Excel.Application');
        Excel.DisplayAlerts := False;
        WorkBook := Excel.Workbooks.Open(SavePath);
        WorkSheet := WorkBook.WorkSheets[1];
        
        qifg.First;
        Fila := 5; // Empezar a rellenar en la fila 5
        
        while not qifg.Eof do
        begin
            // Escribir únicamente en las columnas verdes correspondientes
            WorkSheet.Cells[Fila, 5]  := qifg.FieldByName('materia_prima').AsString;                // Columna E: Variedad / Materia Prima
            WorkSheet.Cells[Fila, 8]  := qifg.FieldByName('parcela').AsString;                     // Columna H: Parcela
            WorkSheet.Cells[Fila, 12] := RoundTo(qifg.FieldByName('peso_caja').AsFloat, -2);        // Columna L: Peso por caja
            WorkSheet.Cells[Fila, 13] := qifg.FieldByName('cajas').AsInteger;                      // Columna M: Nº de cajas
            WorkSheet.Cells[Fila, 14] := RoundTo(qifg.FieldByName('precio_caja').AsFloat, -2);      // Columna N: Precio caja
            WorkSheet.Cells[Fila, 24] := qifg.FieldByName('pais_destino').AsString;                // Columna X: País de destino
            WorkSheet.Cells[Fila, 25] := qifg.FieldByName('importador').AsString;                  // Columna Y: Importador
            WorkSheet.Cells[Fila, 27] := qifg.FieldByName('fecha_salida').AsDateTime;              // Columna AA: Fecha salida
            WorkSheet.Cells[Fila, 28] := qifg.FieldByName('fecha_salida').AsDateTime + 3;          // Columna AB: Fecha llegada (salida + 3)
            WorkSheet.Cells[Fila, 29] := RoundTo(qifg.FieldByName('kilos').AsFloat, -2);            // Columna AC: Kilos
            WorkSheet.Cells[Fila, 30] := RoundTo(qifg.FieldByName('precio_kilo').AsFloat, -2);      // Columna AD: Precio Kilo LC
            WorkSheet.Cells[Fila, 32] := RoundTo(qifg.FieldByName('venta_bruta').AsFloat, -2);      // Columna AF: Ventas Brutas LC
            
            Fila := Fila + 1;
            qifg.Next;
        end;
        
        WorkBook.Save;
        WorkBook.Close;
        Excel.Quit;
        ShowMessage('Listado exportado correctamente a Excel.');
    except
        on E: Exception do
        begin
            if not VarIsEmpty(Excel) then Excel.Quit;
            ShowMessage('Error al exportar a Excel: ' + E.Message);
        end;
    end;
end;

end.
