unit uProvFacturas;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes,
  Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, uBaseForm, Data.DB,
  FireDAC.Stan.Intf, FireDAC.Stan.Option, FireDAC.Stan.Param, FireDAC.Stan.Error,
  FireDAC.DatS, FireDAC.Phys.Intf, FireDAC.DApt.Intf, FireDAC.DApt,
  FireDAC.Comp.Client, Vcl.Buttons, Vcl.Grids, Vcl.DBGrids, Vcl.ExtCtrls,
  Vcl.ComCtrls, Vcl.StdCtrls, Vcl.Mask, Vcl.DBCtrls, dmg_Main;

type
  TfrmProvFacturas = 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
    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 qDetailAfterPost(DataSet: TDataSet);
    procedure qDetailBeforePost(DataSet: TDataSet);
    procedure qMasterAfterScroll(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
  frmProvFacturas: TfrmProvFacturas;

implementation

{$R *.dfm}

procedure TfrmProvFacturas.FormShow(Sender: TObject);
var
  LEmpresa: string;
begin
  LEmpresa := dmgMain.CurrentCompanyId;

  qProvList.Close;
  qProvList.Open;

  qMaster.Close;
  qMaster.ParamByName('Idempresa').AsString := LEmpresa;
  qMaster.Open;
  
  qDetail.Close;
  qSelectedProv.Close;
  qMasterAfterScroll(qMaster);
end;

procedure TfrmProvFacturas.qMasterAfterScroll(DataSet: TDataSet);
begin
  if (qMaster.State = dsBrowse) and (not qMaster.FieldByName('id').IsNull) then
  begin
    qDetail.Close;
    qDetail.ParamByName('id').AsString := qMaster.FieldByName('id').AsString;
    qDetail.ParamByName('Idempresa').AsString := qMaster.FieldByName('idempresa').AsString;
    qDetail.Open;
    
    qSelectedProv.Close;
    qSelectedProv.ParamByName('idproveedor').AsString := qMaster.FieldByName('idproveedor').AsString;
    qSelectedProv.Open;
  end
  else
  begin
    qDetail.Close;
    qSelectedProv.Close;
  end;
end;

procedure TfrmProvFacturas.btnAnadirClick(Sender: TObject);
begin
  qMaster.Append;
  qMaster.FieldByName('idempresa').AsString := dmgMain.CurrentCompanyId;
  qMaster.FieldByName('fecha').AsDateTime := Date;
  dbProv.SetFocus;
end;

procedure TfrmProvFacturas.btnGuardarClick(Sender: TObject);
begin
  if qMaster.State in [dsInsert, dsEdit] then
    qMaster.Post;
  if qDetail.State in [dsInsert, dsEdit] then
    qDetail.Post;
end;

procedure TfrmProvFacturas.btnEliminarClick(Sender: TObject);
begin
  if MessageDlg('¿Desea eliminar esta factura?', mtConfirmation, [mbYes, mbNo], 0) = mrYes then
  begin
    qMaster.Delete;
  end;
end;

procedure TfrmProvFacturas.qDetailBeforePost(DataSet: TDataSet);
begin
  qDetail.FieldByName('idempresa').AsString := qMaster.FieldByName('idempresa').AsString;
  qDetail.FieldByName('idfactura').AsString := qMaster.FieldByName('id').AsString;
  qDetail.FieldByName('idproveedor').AsString := qMaster.FieldByName('idproveedor').AsString;
  
  // 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 TfrmProvFacturas.qDetailAfterPost(DataSet: TDataSet);
begin
  CalcularTotales;
end;

procedure TfrmProvFacturas.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;

procedure TfrmProvFacturas.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 TfrmProvFacturas.btnPrimeroClick(Sender: TObject);
begin
  qMaster.First;
end;

procedure TfrmProvFacturas.btnAnteriorClick(Sender: TObject);
begin
  qMaster.Prior;
end;

procedure TfrmProvFacturas.btnSiguienteClick(Sender: TObject);
begin
  qMaster.Next;
end;

procedure TfrmProvFacturas.btnUltimoClick(Sender: TObject);
begin
  qMaster.Last;
end;

end.
