unit ffacturas;

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.Grids,
  Vcl.DBGrids, Vcl.DBCtrls, Vcl.Mask, Vcl.ExtCtrls, ZDataset, Data.DB, math,
  ZAbstractRODataset, ZAbstractDataset, frxClass, frxDBSet;

type
  Tfacturas = class(TForm)
    PageControl2: TPageControl;
    TabSheet3: TTabSheet;
    Panel8: TPanel;
    Panel9: TPanel;
    btfcancelar: TButton;
    btfmodificar: TButton;
    btfborrar: TButton;
    btfnuevo: TButton;
    btfguardar: TButton;
    btfimprimir: TButton;
    btfsiguiente: TButton;
    btfanterior: TButton;
    Button6: TButton;
    Panel10: TPanel;
    Label16: TLabel;
    DBText1: TDBText;
    DBText16: TDBText;
    DBText17: TDBText;
    DBText18: TDBText;
    DBText19: TDBText;
    DBText20: TDBText;
    DBText21: TDBText;
    paneldatos: TPanel;
    Label18: TLabel;
    Label19: TLabel;
    Label21: TLabel;
    Label22: TLabel;
    Label23: TLabel;
    Label31: TLabel;
    comboseries: TDBLookupComboBox;
    DBEdit10: TDBEdit;
    DBEdit11: TDBEdit;
    DBMemo4: TDBMemo;
    comboformapago: TDBLookupComboBox;
    DBCheckBox2: TDBCheckBox;
    Panel12: TPanel;
    Label28: TLabel;
    Label29: TLabel;
    Label30: TLabel;
    Panel13: TPanel;
    DBGrid4: TDBGrid;
    DBEdit16: TDBEdit;
    DBEdit17: TDBEdit;
    DBEdit18: TDBEdit;
    DBGrid5: TDBGrid;
    tablistado: TTabSheet;
    DBGridacumulados: TDBGrid;
    gridfacturasaexcel: TDBGrid;
    gridfacturasaexcel2: TDBGrid;
    DBGrid6: TDBGrid;
    Panel11: TPanel;
    Panel2: TPanel;
    Label34: TLabel;
    Label35: TLabel;
    Label32: TLabel;
    fdesde: TDateTimePicker;
    fhasta: TDateTimePicker;
    combolistcliente: TDBLookupComboBox;
    Button7: TButton;
    Panel3: TPanel;
    Panel4: TPanel;
    Label2: TLabel;
    comboserie2: TDBLookupComboBox;
    dsfacturasdetalle: TDataSource;
    dsfacturas: TDataSource;
    facturas: TZQuery;
    facturasdetalle: TZQuery;
    qseries: TZQuery;
    dsqseries: TDataSource;
    qclientes: TZQuery;
    dsqclientes: TDataSource;
    qformaspago: TZQuery;
    dsqformaspago: TDataSource;
    qfacturasiva: TZQuery;
    dsqfacturasiva: TDataSource;
    facturasserie: TWideStringField;
    facturasid: TIntegerField;
    facturasidempresa: TIntegerField;
    facturasidcliente: TIntegerField;
    facturasnif: TWideStringField;
    facturasdireccion: TWideStringField;
    facturaspoblacion: TWideStringField;
    facturasprovincia: TWideStringField;
    facturascodpost: TWideStringField;
    facturasfecha: TDateField;
    facturastelefono: TWideStringField;
    facturasnomcliente: TWideStringField;
    facturaspaiscliente: TWideStringField;
    facturasneto: TFloatField;
    facturastotal: TFloatField;
    facturascobrado: TIntegerField;
    facturasdocumento: TWideStringField;
    facturasdescuento_lin: TFloatField;
    facturasdescuento_com: TFloatField;
    facturasdescuento_pp: TFloatField;
    facturasdescuento_total: TFloatField;
    facturastotaliva: TFloatField;
    facturasobservaciones: TWideStringField;
    facturasdetalleid: TIntegerField;
    facturasdetalleidempresa: TIntegerField;
    facturasdetalleserie: TWideStringField;
    facturasdetalleidfactura: TIntegerField;
    facturasdetalledescripcion: TWideStringField;
    facturasdetallecantidad: TFloatField;
    facturasdetalleprecio: TFloatField;
    facturasdetalledescuento: TFloatField;
    facturasdetalletotaldescuento: TFloatField;
    facturasdetallebase: TFloatField;
    facturasdetalletipoiva: TFloatField;
    facturasdetalleiva: TFloatField;
    facturasdetalletotal: TFloatField;
    qseriesid: TWideStringField;
    qserieside: TIntegerField;
    qseriesdescripcion: TWideStringField;
    qseriesnum_presupuesto: TIntegerField;
    qseriesnum_albaran: TIntegerField;
    qseriesnum_factura: TIntegerField;
    qseriesdefecto: TIntegerField;
    qseriesfechainicio: TDateField;
    qseriesfechafin: TDateField;
    qseriesplantillaalbaran: TWideStringField;
    qseriesplantillapresupuesto: TWideStringField;
    qseriesplantillafactura: TWideStringField;
    qformaspagoid: TIntegerField;
    qformaspagoide: TIntegerField;
    qformaspagoids: TWideStringField;
    qformaspagodescripcion: TWideStringField;
    qformaspagoactivo: TIntegerField;
    qformaspagodomiciliado: TIntegerField;
    qfacturasivaserie: TWideStringField;
    qfacturasivaidfactura: TIntegerField;
    qfacturasivaide: TIntegerField;
    qfacturasivabase: TFloatField;
    qfacturasivatipo: TFloatField;
    qfacturasivaiva: TFloatField;
    qclientesid: TIntegerField;
    qclienteside: TIntegerField;
    qclientesnif: TWideStringField;
    qclientesnombre: TWideStringField;
    qaux: TZQuery;
    dsqseries2: TDataSource;
    qseries2: TZReadOnlyQuery;
    dslistacliente: TDataSource;
    qlistaclientes: TZQuery;
    qlistaclientesnif: TWideStringField;
    qlistaclientesnomcliente: TWideStringField;
    qseries2id: TWideStringField;
    qseries2ide: TIntegerField;
    qseries2descripcion: TWideStringField;
    qseries2num_presupuesto: TIntegerField;
    qseries2num_albaran: TIntegerField;
    qseries2num_factura: TIntegerField;
    qseries2defecto: TIntegerField;
    qseries2fechainicio: TDateField;
    qseries2fechafin: TDateField;
    qseries2plantillaalbaran: TWideStringField;
    qseries2plantillapresupuesto: TWideStringField;
    qseries2plantillafactura: TWideStringField;
    infdetallefactura: TfrxDBDataset;
    inffactura: TfrxDBDataset;
    informe: TfrxReport;
    infempresa: TfrxDBDataset;
    Panel14: TPanel;
    Button16: TButton;
    qclientesdireccion: TWideStringField;
    qclientesprovincia: TWideStringField;
    qclientespoblacion: TWideStringField;
    qclientescodpost: TWideStringField;
    qempresa: TZReadOnlyQuery;
    dsempresa: TDataSource;
    qempresaid: TIntegerField;
    qempresacif: TWideStringField;
    qempresanombre: TWideStringField;
    qempresadireccion: TWideStringField;
    qempresacodpost: TWideStringField;
    qempresapoblacion: TWideStringField;
    qempresaprovincia: TWideStringField;
    qempresaemail: TWideStringField;
    qempresatelefono1: TWideStringField;
    qempresatelefono2: TWideStringField;
    qempresacontacto: TWideStringField;
    qempresabanco: TWideStringField;
    qempresacciban: TWideStringField;
    qempresaccentidad: TWideStringField;
    qempresaccoficina: TWideStringField;
    qempresaccdc: TWideStringField;
    qempresacccc: TWideStringField;
    qempresaactiva: TIntegerField;
    qempresatipo_iva: TFloatField;
    qempresalogo: TBlobField;
    DBEdit1: TDBEdit;
    DBText2: TDBText;
    facturasidformapago: TIntegerField;
    facturasseleccionada: TIntegerField;
    qseleccionarfacturas: TZReadOnlyQuery;
    qunselectfacturas: TZReadOnlyQuery;
    procedure btfnuevoClick(Sender: TObject);
    procedure FormShow(Sender: TObject);
    procedure dsqseries2DataChange(Sender: TObject; Field: TField);
    procedure FormKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
    procedure btfborrarClick(Sender: TObject);
    procedure btfmodificarClick(Sender: TObject);
    procedure btfguardarClick(Sender: TObject);
    procedure btfcancelarClick(Sender: TObject);
    procedure btfanteriorClick(Sender: TObject);
    procedure btfsiguienteClick(Sender: TObject);
    procedure btfimprimirClick(Sender: TObject);
    procedure comboseriesCloseUp(Sender: TObject);
    procedure dsqclientesDataChange(Sender: TObject; Field: TField);
    procedure dsfacturasStateChange(Sender: TObject);
    procedure dsfacturasDataChange(Sender: TObject; Field: TField);
    procedure facturasdetalleBeforePost(DataSet: TDataSet);
    procedure Button16Click(Sender: TObject);
    procedure facturasdetalleAfterPost(DataSet: TDataSet);
    procedure DBEdit1Enter(Sender: TObject);
    procedure qclientesBeforeRefresh(DataSet: TDataSet);
    procedure qclientesBeforeOpen(DataSet: TDataSet);
    procedure fdesdeChange(Sender: TObject);
    procedure combolistclienteCloseUp(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  gserie:string;
  gfactura:integer;
  pagina:string;
  end;

var
  facturas: Tfacturas;


implementation

{$R *.dfm}

uses DATOS, fdlgclientes;

procedure Tfacturas.btfanteriorClick(Sender: TObject);
begin
   facturas.Next;
end;

procedure Tfacturas.btfborrarClick(Sender: TObject);
begin
    facturasdetalle.open;
    if facturas.recordcount>0 then
    begin
        facturas.Delete;
        facturasdetalle.Refresh;
        qfacturasiva.refresh;
    end;
end;

procedure Tfacturas.btfcancelarClick(Sender: TObject);
begin
    facturas.Cancel;
    paneldatos.Enabled:=false;
end;

procedure Tfacturas.btfguardarClick(Sender: TObject);
var empresa,serie,id:string;
begin
    empresa:=facturasidempresa.AsString;
    serie:=facturasserie.AsString;
    qaux.sql.clear;
    facturas.Post;
    comboserie2.KeyValue:=facturasserie.AsString;
    qaux.sql.clear;
    qaux.SQL.Add('select max(id) from facturas where idempresa='+empresa+' and serie='+''''+serie+'''');
    qaux.Open;
    qseries.edit;
    qseriesnum_factura.Value:=qaux.Fields[0].AsInteger+1;
    qseries.Post;

    facturasdetalle.open;
    qfacturasiva.open;
    facturas.Refresh;
    facturasdetalle.Refresh;
    facturas.Locate('serie,id',vararrayof([serie,id]),[locaseinsensitive]);

    qfacturasiva.Open;
    qfacturasiva.Refresh;
    panel3.Enabled:=false;
    comboserie2.keyvalue:=qseriesid.AsString;
    facturas.Close;
    facturas.Prepare;
    facturas.ParamByName('SERIE').AsString:=qseries2id.AsString;
    facturas.ParamByName('SELECCIONADA').AsString:='%';
    facturas.ParamByName('NIF').AsString:='%';
    facturas.ParamByName('FDESDE').AsDate:=fdesde.date;
    facturas.ParamByName('FHASTA').AsDate:=fhasta.Date;
    facturas.Open;
    facturas.Locate('serie,id',vararrayof([serie,id]),[locaseinsensitive]);

    qfacturasiva.Refresh;
    paneldatos.Enabled:=false;

end;

procedure Tfacturas.btfimprimirClick(Sender: TObject);
var filtro,documento,formapago,vnif:string;
    desg_ivas,tipo,base,iva:string;
    x,i:integer;
    fecha:tdate;
begin
    qunselectfacturas.ExecSQL;
    if dbgrid6.SelectedRows.Count>0 then
      for i := 0 to dbgrid6.Selectedrows.Count - 1 do
      begin
        facturas.GotoBookmark ((dbgrid6.selectedrows[i]));
        qseleccionarfacturas.Prepare;
        qseleccionarfacturas.ParamByName('IDEMPRESA').AsInteger:=facturasidempresa.AsInteger;
        qseleccionarfacturas.ParamByName('IDFACTURA').AsInteger:=facturasid.AsInteger;
        qseleccionarfacturas.ParamByName('SERIE').AsString:=facturasserie.AsString;
        qseleccionarfacturas.Execsql;
      end
    else
    begin
        qseleccionarfacturas.Prepare;
        qseleccionarfacturas.ParamByName('IDEMPRESA').AsInteger:=facturasidempresa.AsInteger;
        qseleccionarfacturas.ParamByName('IDFACTURA').AsInteger:=facturasid.AsInteger;
        qseleccionarfacturas.ParamByName('SERIE').AsString:=facturasserie.AsString;
        qseleccionarfacturas.Execsql;
    end;
    facturas.Close;
    facturas.Prepare;
    facturas.ParamByName('SERIE').AsString:=qseries2id.AsString;
    facturas.ParamByName('SELECCIONADA').AsString:='1';
    facturas.ParamByName('NIF').AsString:='%';
    facturas.ParamByName('FDESDE').AsDate:=fdesde.date;
    facturas.ParamByName('FHASTA').AsDate:=fhasta.Date;
    facturas.open;
    inffactura.Datasource:=dsfacturas;
    infdetallefactura.Datasource:=dsfacturasdetalle;
    informe.Report.Clear;
    informe.LoadFromFile('c:\formagest\informes\facturaja2022.fr3');
    informe.ShowReport();
    informe.Clear;
    facturas.close;
    facturas.Prepare;
    facturas.ParamByName('SERIE').AsString:=qseries2id.AsString;
    facturas.ParamByName('SELECCIONADA').AsString:='%';
    facturas.ParamByName('NIF').AsString:='%';
    facturas.ParamByName('FDESDE').AsDate:=fdesde.date;
    facturas.ParamByName('FHASTA').AsDate:=fhasta.Date;
    facturas.open;
    facturasdetalle.Close;
    facturasdetalle.SQL.Clear;
    facturasdetalle.SQL.Add('select * from facturas_detalles order by id');
    facturasdetalle.open;


end;

procedure Tfacturas.btfmodificarClick(Sender: TObject);
begin
    pagecontrol2.TabIndex:=0;
    paneldatos.Enabled:=true;
    facturas.Edit;
end;

procedure Tfacturas.btfnuevoClick(Sender: TObject);
begin
    pagecontrol2.TabIndex:=0;
    paneldatos.Enabled:=true;
    comboseries.SetFocus;
    comboseries.KeyValue:=qseriesid.Asstring;
    facturas.Append;
    facturasdetalle.Close;
    qfacturasiva.close;
    facturasfecha.Value:=date;
end;

procedure Tfacturas.btfsiguienteClick(Sender: TObject);
begin
  facturas.Prior;
end;

procedure Tfacturas.Button16Click(Sender: TObject);
begin
   facturasdetalle.Delete;
   facturas.Refresh;
   qfacturasiva.Refresh;
end;

procedure Tfacturas.combolistclienteCloseUp(Sender: TObject);
begin
      facturas.Close;
      facturas.Prepare;
      facturas.ParamByName('SERIE').AsString:=qseries2id.AsString;
      facturas.ParamByName('SELECCIONADA').AsString:='%';
      facturas.ParamByName('NIF').AsString:=qlistaclientesnif.AsString;
      facturas.ParamByName('FDESDE').Asdate:=fdesde.Date;
      facturas.ParamByName('FHASTA').Asdate:=fhasta.Date;
      facturas.Open;
end;

procedure Tfacturas.comboseriesCloseUp(Sender: TObject);
begin
    facturasid.value:=qseriesnum_factura.AsInteger;
end;

procedure Tfacturas.DBEdit1Enter(Sender: TObject);
begin
    dlgclientes := Tdlgclientes.Create(nil);
    try
      dlgclientes.qclientes.Open;
      dlgclientes.showmodal();

    finally
      facturasidcliente.Value:=dlgclientes.qclientesid.AsInteger;
      qclientes.Refresh;
      dlgclientes.Free;
    end;
end;

procedure Tfacturas.dsfacturasDataChange(Sender: TObject; Field: TField);
begin
if (facturas.State in [dsbrowse]) and (facturas.recordcount>0) then
begin
    if qclientes.Active then qclientes.Refresh else qclientes.Open;

end;
end;

procedure Tfacturas.dsfacturasStateChange(Sender: TObject);
begin
    if facturas.State in [dsedit,dsinsert] then
    begin
        btfnuevo.Enabled:=false;
        btfmodificar.Enabled:=false;
        btfborrar.Enabled:=false;
        btfcancelar.Enabled:=true;
        btfguardar.Enabled:=true;
        btfanterior.Enabled:=false;
        btfsiguiente.Enabled:=false;
        btfimprimir.Enabled:=false;
    end else
    begin
        btfnuevo.Enabled:=true;
        btfmodificar.Enabled:=true;
        btfborrar.Enabled:=true;
        btfcancelar.Enabled:=false;
        btfguardar.Enabled:=false;
        btfanterior.Enabled:=true;
        btfsiguiente.Enabled:=true;
        btfimprimir.Enabled:=true;
    end;
end;

procedure Tfacturas.dsqclientesDataChange(Sender: TObject; Field: TField);
begin
   if facturas.State in [dsedit,dsinsert] then
   begin
      facturasnomcliente.value:=qclientesnombre.Asstring;
      facturasnif.value:=qclientesnif.Asstring;
      facturasdireccion.value:=qclientesdireccion.Asstring;
      facturasprovincia.value:=qclientesprovincia.Asstring;
      facturaspoblacion.Value:=qclientespoblacion.AsString;
      facturascodpost.value:=qclientescodpost.Asstring;
      facturasidempresa.value:=qserieside.AsInteger;;
   end else
   begin

   end;
end;

procedure Tfacturas.dsqseries2DataChange(Sender: TObject; Field: TField);
var vnif:string;
begin
   if combolistcliente.KeyValue=null then vnif:='%' else vnif:=qlistaclientesnif.AsString;

   facturas.Close;
   facturas.Prepare;
   facturas.ParamByName('SERIE').AsString:=qseries2id.AsString;
    facturas.ParamByName('SELECCIONADA').AsString:='%';
    facturas.ParamByName('NIF').AsString:=vnif;
    facturas.ParamByName('FDESDE').Asdate:=fdesde.Date;
    facturas.ParamByName('FHASTA').Asdate:=fhasta.Date;
   facturas.Open;
end;

procedure Tfacturas.facturasdetalleAfterPost(DataSet: TDataSet);
begin
   facturas.Refresh;
   qfacturasiva.Refresh;
end;

procedure Tfacturas.facturasdetalleBeforePost(DataSet: TDataSet);
var iva,descuento:real;
begin
    if facturasdetalletipoiva.AsString='' then facturasdetalletipoiva.Value:=0;
    if facturasdetalledescuento.AsString='' then facturasdetalledescuento.Value:=0;
    facturasdetalleserie.Value:=facturasserie.Asstring;
    facturasdetallebase.Value:=roundto(facturasdetalleprecio.AsFloat*facturasdetallecantidad.AsFloat,-2);

    descuento:=roundto(facturasdetallebase.AsFloat*(facturasdetalledescuento.AsFloat/100),-2);
    facturasdetalletotaldescuento.value:=descuento;
    facturasdetalletotal.Value:=roundto(facturasdetallebase.Asfloat-descuento,-2);
    iva:=roundto(facturasdetalletotal.AsFloat*(facturasdetalletipoiva.AsFloat/100),-2);
    facturasdetalleiva.Value:=iva;
end;

procedure Tfacturas.fdesdeChange(Sender: TObject);
var vnif:string;
begin
   if combolistcliente.KeyValue=null then vnif:='%' else vnif:=qlistaclientesnif.AsString;
      facturas.Close;
      facturas.Prepare;
      facturas.ParamByName('SERIE').AsString:=qseries2id.AsString;
      facturas.ParamByName('SELECCIONADA').AsString:='%';
      facturas.ParamByName('NIF').AsString:=vnif;//qlistaclientesnif.AsString;
      facturas.ParamByName('FDESDE').Asdate:=fdesde.Date;
      facturas.ParamByName('FHASTA').Asdate:=fhasta.Date;
      facturas.Open;
end;

procedure Tfacturas.FormKeyDown(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    if (activecontrol is tdbgrid) then
    begin
        if Key = 13 then Key :=9;
    end;

end;

procedure Tfacturas.FormKeyPress(Sender: TObject; var Key: Char);
var formatos:tformatsettings;
punto:string;
begin
    GetLocaleFormatSettings(LOCALE_SYSTEM_DEFAULT, formatos);
    punto:=formatos.DecimalSeparator;
    if punto=',' then
    begin
        key:=upcase(key);
        if (key='.') and (activecontrol is tdbedit) then
        begin
           if  (activecontrol as tdbedit).Field.DataType in [ftfloat,ftCurrency,ftbcd,ftfmtbcd] then key:=','
        end;
        if (key='.') and (activecontrol is tdbgrid) then
        begin
            key:=',';
        end;
    end;
    if (activecontrol is tdbgrid) then
    begin
        if Key = #13 then Key :=#9;
    end;

    if (key=#13) then
    begin
        Perform(WM_NextDLGCtl,0,0);
        key:=#0;
    end;
end;

procedure Tfacturas.FormShow(Sender: TObject);
begin
    fdesde.Date:=strtodate('01/01/2000');
    fhasta.Date:=DATE;
    qempresa.close;
    qseries.Close;
    qseries2.close;
    qclientes.Close;

    facturasdetalle.Close;
    qfacturasiva.Close;
    qformaspago.Close;
    qfacturasiva.Close;
//    qformularios.Close;

    qempresa.Open;
    qseries.open;
    qseries2.open;
    qclientes.open;
    qlistaclientes.Open;
    if gserie='' then gserie:=qseries2id.AsString;
    comboserie2.KeyValue:=gserie;
    facturas.Close;
    facturas.Prepare;
    facturas.ParamByName('SERIE').AsString:=gserie;
    facturas.ParamByName('SELECCIONADA').AsString:='%';
    facturas.ParamByName('NIF').AsString:='%';
    facturas.ParamByName('FDESDE').Asdate:=fdesde.Date;
    facturas.ParamByName('FHASTA').Asdate:=fhasta.Date;
    facturas.Open;
    facturas.Locate('serie,id',vararrayof([gserie,gfactura]),[locaseinsensitive]);
    facturasdetalle.open;
    qfacturasiva.open;
    qformaspago.open;
//    qformularios.Open;
    if pagina='' then pagecontrol2.TabIndex:=1 else pagecontrol2.TabIndex:=strtoint(pagina);
//    comboformulario.KeyValue:=null;

end;

procedure Tfacturas.qclientesBeforeOpen(DataSet: TDataSet);
begin
      qclientes.Prepare;
      qclientes.ParamByName('PCLIENTE').AsInteger:=facturasidcliente.AsInteger;
end;

procedure Tfacturas.qclientesBeforeRefresh(DataSet: TDataSet);
begin
      qclientes.Prepare;
      qclientes.ParamByName('PCLIENTE').AsInteger:=facturasidcliente.AsInteger;
end;

end.
