unit uProvAlbaranes;

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, uBaseForm, Data.DB,
     Vcl.Buttons, Vcl.Grids,
  Vcl.DBGrids, Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.StdCtrls, Vcl.Mask, Vcl.DBCtrls,
  datos;

type
  TfrmProvAlbaranes = class(TfrmBase)
    qMaster: TFDQuery;
    dsMaster: TDataSource;
    qDetail: TFDQuery;
    dsDetail: TDataSource;
    qProvList: TFDQuery;
    dsProvList: TDataSource;
    qSelectedProv: TFDQuery;
    dsSelectedProv: TDataSource;
    
    // Totals in Footer
    Label4: TLabel;
    dbBase: TDBEdit;
    Label5: TLabel;
    dbIVA: TDBEdit;
    Label6: TLabel;
    dbTotal: TDBEdit;

    // Header controls
    lblProveedor: TLabel;
    dbProv: TDBLookupComboBox;
    lblFecha: TLabel;
    dbFecha: TDBEdit;
    lblDoc: TLabel;
    dbDoc: TDBEdit;
    
    // New components for Supplier info (Replicated from Facturas)
    pnlDatosProveedor: TPanel;
    lblDatoNombre: TLabel;
    lblDatoDireccion: TLabel;
    lblDatoTelefono: TLabel;
    lblDatoEmail: TLabel;
    dbTextNombre: TDBText;
    dbTextDireccion: TDBText;
    dbTextTelefono: TDBText;
    dbTextEmail: TDBText;
    lbid: TLabel;
    DBText1: TDBText;
    lblCodigoPostal: TLabel;
    dbTextCP: TDBText;
    lblPoblacion: TLabel;
    DBTextPoblacion: TDBText;
    lblProvincia: TLabel;
    DBTextProvincia: TDBText;
    
    qSelectedProvDireccionCompleta: TWideStringField;
    qSelectedProvnombre: TWideStringField;
    qSelectedProvdireccion: TWideStringField;
    qSelectedProvpoblacion: TWideStringField;
    qSelectedProvcodpost: TWideStringField;
    qSelectedProvprovincia: TWideStringField;
    qSelectedProvtelefono: TWideStringField;
    qSelectedProvemail: TWideStringField;
    dbgListado: TDBGrid;

    procedure FormShow(Sender: TObject);
    procedure btnAnadirClick(Sender: TObject);
    procedure btnGuardarClick(Sender: TObject);
    procedure btnEliminarClick(Sender: TObject);
    procedure qMasterAfterScroll(DataSet: TDataSet);
    procedure qDetailAfterPost(DataSet: TDataSet);
    procedure qDetailBeforePost(DataSet: TDataSet);
    procedure qSelectedProvCalcFields(DataSet: TDataSet);
    procedure btnPrimeroClick(Sender: TObject);
    procedure btnAnteriorClick(Sender: TObject);
    procedure btnSiguienteClick(Sender: TObject);
    procedure btnUltimoClick(Sender: TObject);
  private
    procedure CalcularTotales;
  public
    { Public declarations }
  end;

var
  frmProvAlbaranes: TfrmProvAlbaranes;

implementation

{$R *.dfm}

procedure TfrmProvAlbaranes.FormShow(Sender: TObject);
var
  LEmpresa: Integer;
begin
  if DM.tempresaid.AsInteger > 0 then
    LEmpresa := DM.tempresaid.AsInteger
  else if DM.vempresa > 0 then
    LEmpresa := DM.vempresa
  else
    LEmpresa := 1;

  qProvList.Close;
  qProvList.ParamByName('Idempresa').AsInteger := LEmpresa;
  qProvList.Open;

  qMaster.Close;
  qMaster.ParamByName('Idempresa').AsInteger := LEmpresa;
  qMaster.Open;
  
  qDetail.Close;
  qSelectedProv.Close;
  qMasterAfterScroll(qMaster);
end;

procedure TfrmProvAlbaranes.qMasterAfterScroll(DataSet: TDataSet);
begin
  if (qMaster.State = dsBrowse) and (not qMaster.FieldByName('id').IsNull) then
  begin
    qDetail.Close;
    qDetail.ParamByName('id').AsInteger := qMaster.FieldByName('id').AsInteger;
    qDetail.ParamByName('Idempresa').AsInteger := qMaster.FieldByName('idempresa').AsInteger;
    qDetail.Open;
    
    qSelectedProv.Close;
    qSelectedProv.ParamByName('idproveedor').AsInteger := qMaster.FieldByName('idproveedor').AsInteger;
    qSelectedProv.ParamByName('Idempresa').AsInteger := qMaster.FieldByName('idempresa').AsInteger;
    qSelectedProv.Open;
  end
  else
  begin
    qDetail.Close;
    qSelectedProv.Close;
  end;
end;

procedure TfrmProvAlbaranes.qSelectedProvCalcFields(DataSet: TDataSet);
var
  FullAddr: string;
begin
  FullAddr := DataSet.FieldByName('direccion').AsString;
  if DataSet.FieldByName('poblacion').AsString <> '' then
    FullAddr := FullAddr + ', ' + DataSet.FieldByName('poblacion').AsString;
  if DataSet.FieldByName('codpost').AsString <> '' then
    FullAddr := FullAddr + ' (' + DataSet.FieldByName('codpost').AsString + ')';
  if DataSet.FieldByName('provincia').AsString <> '' then
    FullAddr := FullAddr + ' - ' + DataSet.FieldByName('provincia').AsString;
    
  DataSet.FieldByName('DireccionCompleta').AsString := FullAddr;
end;

procedure TfrmProvAlbaranes.btnPrimeroClick(Sender: TObject);
begin
  qMaster.First;
end;

procedure TfrmProvAlbaranes.btnAnteriorClick(Sender: TObject);
begin
  qMaster.Prior;
end;

procedure TfrmProvAlbaranes.btnSiguienteClick(Sender: TObject);
begin
  qMaster.Next;
end;

procedure TfrmProvAlbaranes.btnUltimoClick(Sender: TObject);
begin
  qMaster.Last;
end;

procedure TfrmProvAlbaranes.btnAnadirClick(Sender: TObject);
begin
  qMaster.Append;
  qMaster.FieldByName('idempresa').AsInteger := DM.tempresaid.AsInteger;
  qMaster.FieldByName('fecha').AsDateTime := Date;
  dbProv.SetFocus;
end;

procedure TfrmProvAlbaranes.btnGuardarClick(Sender: TObject);
begin
  if qMaster.State in [dsInsert, dsEdit] then
    qMaster.Post;
  if qDetail.State in [dsInsert, dsEdit] then
    qDetail.Post;
end;

procedure TfrmProvAlbaranes.btnEliminarClick(Sender: TObject);
begin
  if MessageDlg('¿Desea eliminar este albarán?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    qMaster.Delete;
  end;
end;

procedure TfrmProvAlbaranes.qDetailBeforePost(DataSet: TDataSet);
begin
  qDetail.FieldByName('idempresa').AsInteger := qMaster.FieldByName('idempresa').AsInteger;
  qDetail.FieldByName('idalbaran').AsInteger := qMaster.FieldByName('id').AsInteger;
  qDetail.FieldByName('idproveedor').AsInteger := qMaster.FieldByName('idproveedor').AsInteger;
  
  // Calculate line total
  qDetail.FieldByName('base').AsFloat := qDetail.FieldByName('cantidad').AsFloat * qDetail.FieldByName('precio').AsFloat;
  qDetail.FieldByName('total').AsFloat := qDetail.FieldByName('base').AsFloat * (1 + (qDetail.FieldByName('tipo_iva').AsInteger / 100));
end;

procedure TfrmProvAlbaranes.qDetailAfterPost(DataSet: TDataSet);
begin
  CalcularTotales;
end;

procedure TfrmProvAlbaranes.CalcularTotales;
var
  LBase, LIVA, LTotal: Double;
  Bookmark: TBookmark;
begin
  LBase := 0;
  LIVA := 0;
  LTotal := 0;
  
  Bookmark := qDetail.GetBookmark;
  qDetail.DisableControls;
  try
    qDetail.First;
    while not qDetail.Eof do
    begin
      LBase := LBase + qDetail.FieldByName('base').AsFloat;
      LTotal := LTotal + qDetail.FieldByName('total').AsFloat;
      qDetail.Next;
    end;
    LIVA := LTotal - LBase;
    
    if qMaster.State = dsbrowse then qMaster.Edit;
    qMaster.FieldByName('base').AsFloat := LBase;
    qMaster.FieldByName('totaliva').AsFloat := LIVA;
    qMaster.FieldByName('totalentrada').AsFloat := LTotal;
    qMaster.Post;
  finally
    qDetail.GotoBookmark(Bookmark);
    qDetail.FreeBookmark(Bookmark);
    qDetail.EnableControls;
  end;
end;

end.
