﻿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,
  ZAbstractRODataset, ZAbstractDataset, ZDataset, Vcl.Buttons, Vcl.Grids,
  Vcl.DBGrids, Vcl.ExtCtrls, Vcl.ComCtrls, Vcl.StdCtrls, Vcl.Mask, Vcl.DBCtrls,
  datos;

type
  TfrmProvFacturas = class(TfrmBase)
    qMaster: TZQuery;
    dsMaster: TDataSource;
    qDetail: TZQuery;
    dsDetail: TDataSource;
    qProvList: TZQuery;
    dsProvList: TDataSource;
    qSelectedProv: TZQuery;
    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;

    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: 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 TfrmProvFacturas.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 TfrmProvFacturas.btnAnadirClick(Sender: TObject);
begin
  qMaster.Append;
  qMaster.FieldByName('idempresa').AsInteger := DM.tempresaid.AsInteger;
  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').AsInteger := qMaster.FieldByName('idempresa').AsInteger;
  qDetail.FieldByName('idfactura').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 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.
