unit frecibos_s;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, ZDataset, Vcl.StdCtrls,
  Vcl.ExtCtrls, Vcl.Mask, Vcl.DBCtrls, Vcl.Grids, Vcl.DBGrids,
  ZAbstractRODataset, ZAbstractDataset, Vcl.ImgList, frxClass,
  frxExportBaseDialog, frxExportPDF, frxDBSet, Vcl.ComCtrls;

type
  Trecibos_s = class(TForm)
    formaspago: TZQuery;
    Panel12: TPanel;
    Panel34: TPanel;
    DBGrid11: TDBGrid;
    Panel35: TPanel;
    Label169: TLabel;
    Panel33: TPanel;
    DBGrid12: TDBGrid;
    Panel66: TPanel;
    Label170: TLabel;
    Panel27: TPanel;
    Label129: TLabel;
    todosclientesrecibos: TCheckBox;
    tbuscarclientesrecibos: TEdit;
    DBGrid10: TDBGrid;
    qalumnosclientes: TZQuery;
    qclientes: TZReadOnlyQuery;
    qgruposclientes: TZQuery;
    qgruposclienteside: TIntegerField;
    qgruposclientesidc: TIntegerField;
    qgruposclientesnomalumno: TWideStringField;
    qgruposclientesida: TIntegerField;
    qgruposclientesidg: TIntegerField;
    qgruposclientesnomgrupo: TWideStringField;
    qgruposclientespreciomensual: TFloatField;
    qgruposclientesnomprofesor: TWideStringField;
    qgruposclientesidcurso: TIntegerField;
    qreciboscliente: TZQuery;
    qreciboscliente2: TZQuery;
    recibos: TZQuery;
    recibosid: TIntegerField;
    reciboside: TIntegerField;
    recibosidc: TIntegerField;
    recibosida: TIntegerField;
    recibosidg: TIntegerField;
    recibosfecharecibo: TDateField;
    recibosfechacobro: TDateField;
    recibosconcepto: TWideStringField;
    recibosimporte: TFloatField;
    recibosentrega: TFloatField;
    recibospagado: TIntegerField;
    recibosdomiciliado: TIntegerField;
    recibosmaterial: TIntegerField;
    recibosforma_pago: TIntegerField;
    recibosdoc_pago: TWideStringField;
    recibosdescuento: TIntegerField;
    recibosimportefinal: TFloatField;
    recibosseleccionado: TIntegerField;
    recibosids: TWideStringField;
    recibosidf: TIntegerField;
    Panel1: TPanel;
    Panel2: TPanel;
    Label1: TLabel;
    Label2: TLabel;
    Label3: TLabel;
    precibosdatos: TPanel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    Label11: TLabel;
    Label12: TLabel;
    Label13: TLabel;
    Label14: TLabel;
    Label15: TLabel;
    Label16: TLabel;
    DBEdit1: TDBEdit;
    DBEdit2: TDBEdit;
    DBEdit3: TDBEdit;
    DBEdit4: TDBEdit;
    DBLookupComboBox1: TDBLookupComboBox;
    DBLookupComboBox2: TDBLookupComboBox;
    DBLookupComboBox3: TDBLookupComboBox;
    DBEdit5: TDBEdit;
    DBEdit6: TDBEdit;
    DBEdit7: TDBEdit;
    comboformapago: TDBLookupComboBox;
    DBEdit8: TDBEdit;
    DBCheckBox3: TDBCheckBox;
    DBCheckBox4: TDBCheckBox;
    chkpagado: TDBCheckBox;
    DBEdit9: TDBEdit;
    Button4: TButton;
    Button5: TButton;
    Button7: TButton;
    edconcepto: TEdit;
    edfecha: TMaskEdit;
    edimporte: TEdit;
    Button8: TButton;
    edmaterial: TCheckBox;
    Panel4: TPanel;
    Panel5: TPanel;
    RadioGroup2: TRadioGroup;
    sdelcliente: TRadioButton;
    ssincobrar: TRadioButton;
    sdomiciliados: TRadioButton;
    stodos: TRadioButton;
    DBGrid1: TDBGrid;
    Panel6: TPanel;
    Label17: TLabel;
    btrcancelar: TButton;
    btrmodificar: TButton;
    btrborrar: TButton;
    btrnuevo: TButton;
    btrguardar: TButton;
    Button14: TButton;
    btractualizar: TButton;
    dsqreciboscliente2: TDataSource;
    dsqreciboscliente: TDataSource;
    dsqgruposclientes: TDataSource;
    dsqalumnosclientes: TDataSource;
    dsqclientes: TDataSource;
    dsrecibos: TDataSource;
    dsformaspago: TDataSource;
    qclientesid: TIntegerField;
    qclientesnombre_completo: TWideStringField;
    qclienteside: TIntegerField;
    qclientesnif: TWideStringField;
    qalumnosclienteside: TIntegerField;
    qalumnosclientesid: TIntegerField;
    qalumnosclientesidc: TIntegerField;
    qalumnosclientesnombre_completo: TWideStringField;
    qalumnosclientesdescuento: TFloatField;
    qalumnosclientesactivo: TIntegerField;
    gcrpagado: TDBCheckBox;
    qreciboscliente2id: TIntegerField;
    qreciboscliente2ide: TIntegerField;
    qreciboscliente2idc: TIntegerField;
    qreciboscliente2ida: TIntegerField;
    qreciboscliente2idg: TIntegerField;
    qreciboscliente2fecharecibo: TDateField;
    qreciboscliente2fechacobro: TDateField;
    qreciboscliente2concepto: TWideStringField;
    qreciboscliente2importe: TFloatField;
    qreciboscliente2entrega: TFloatField;
    qreciboscliente2pagado: TIntegerField;
    qreciboscliente2domiciliado: TIntegerField;
    qreciboscliente2material: TIntegerField;
    qreciboscliente2forma_pago: TIntegerField;
    qreciboscliente2doc_pago: TWideStringField;
    qreciboscliente2descuento: TIntegerField;
    qreciboscliente2importefinal: TFloatField;
    qreciboscliente2seleccionado: TIntegerField;
    qreciboscliente2ids: TWideStringField;
    qreciboscliente2idf: TIntegerField;
    qreciboscliente2alumno: TWideStringField;
    qreciboscliente2cliente: TWideStringField;
    qrecibosclienteid: TIntegerField;
    qrecibosclienteide: TIntegerField;
    qrecibosclienteidc: TIntegerField;
    qrecibosclienteida: TIntegerField;
    qrecibosclienteidg: TIntegerField;
    qrecibosclientefecharecibo: TDateField;
    qrecibosclientefechacobro: TDateField;
    qrecibosclienteconcepto: TWideStringField;
    qrecibosclienteimporte: TFloatField;
    qrecibosclienteentrega: TFloatField;
    qrecibosclientepagado: TIntegerField;
    qrecibosclientedomiciliado: TIntegerField;
    qrecibosclientematerial: TIntegerField;
    qrecibosclienteforma_pago: TIntegerField;
    qrecibosclientedoc_pago: TWideStringField;
    qrecibosclientedescuento: TIntegerField;
    qrecibosclienteimportefinal: TFloatField;
    qrecibosclienteseleccionado: TIntegerField;
    qrecibosclienteids: TWideStringField;
    qrecibosclienteidf: TIntegerField;
    qrecibosclientealumno: TWideStringField;
    qrecibosclientecliente: TWideStringField;
    qclientes2: TZReadOnlyQuery;
    dsqclientes2: TDataSource;
    qalumnosclientes2: TZQuery;
    dsqalumnosclientes2: TDataSource;
    qgruposclientes2: TZQuery;
    dsqgruposclientes2: TDataSource;
    qclientes2id: TIntegerField;
    qclientes2nombre_completo: TWideStringField;
    qclientes2ide: TIntegerField;
    qclientes2nif: TWideStringField;
    qalumnosclientes2ide: TIntegerField;
    qalumnosclientes2id: TIntegerField;
    qalumnosclientes2idc: TIntegerField;
    qalumnosclientes2nombre_completo: TWideStringField;
    qalumnosclientes2descuento: TFloatField;
    qalumnosclientes2activo: TIntegerField;
    qgruposclientes2ide: TIntegerField;
    qgruposclientes2idc: TIntegerField;
    qgruposclientes2nomalumno: TWideStringField;
    qgruposclientes2ida: TIntegerField;
    qgruposclientes2idg: TIntegerField;
    qgruposclientes2nomgrupo: TWideStringField;
    qgruposclientes2preciomensual: TFloatField;
    qgruposclientes2nomprofesor: TWideStringField;
    qgruposclientes2idcurso: TIntegerField;
    ImageList1: TImageList;
    qaux: TZReadOnlyQuery;
    informedb: TfrxDBDataset;
    frxPDFExport1: TfrxPDFExport;
    informe: TfrxReport;
    qgrupos: TZReadOnlyQuery;
    qgruposid: TIntegerField;
    qgruposide: TIntegerField;
    qgruposidcurso: TIntegerField;
    qgruposnombre: TWideStringField;
    qgrupospreciomensual: TFloatField;
    qalumnos: TZReadOnlyQuery;
    qalumnoside: TIntegerField;
    qalumnosida: TIntegerField;
    qalumnosdescuento: TFloatField;
    qalumnosidc: TIntegerField;
    qclientesidfp: TIntegerField;
    qclientes3: TZReadOnlyQuery;
    qclientes3id: TIntegerField;
    qclientes3nombre_completo: TWideStringField;
    qclientes3ide: TIntegerField;
    qclientes3nif: TWideStringField;
    qclientes3idfp: TIntegerField;
    qaux2: TZReadOnlyQuery;
    qgruposclientes2preciomaterial: TFloatField;
    qgruposclientespreciomaterial: TFloatField;
    qfacturas: TZQuery;
    qfacturasdetalle: TZQuery;
    qfacturasserie: TWideStringField;
    qfacturasid: TIntegerField;
    qfacturasidempresa: TIntegerField;
    qfacturasidcliente: TIntegerField;
    qfacturasnif: TWideStringField;
    qfacturasdireccion: TWideStringField;
    qfacturaspoblacion: TWideStringField;
    qfacturasprovincia: TWideStringField;
    qfacturascodpost: TWideStringField;
    qfacturasfecha: TDateField;
    qfacturastelefono: TWideStringField;
    qfacturasnomcliente: TWideStringField;
    qfacturaspaiscliente: TWideStringField;
    qfacturasneto: TFloatField;
    qfacturastotal: TFloatField;
    qfacturascobrado: TIntegerField;
    qfacturasdocumento: TWideStringField;
    qfacturasdescuento_lin: TFloatField;
    qfacturasdescuento_com: TFloatField;
    qfacturasdescuento_pp: TFloatField;
    qfacturasdescuento_total: TFloatField;
    qfacturastotaliva: TFloatField;
    qfacturasobservaciones: TWideStringField;
    qfacturasdetalleid: TIntegerField;
    qfacturasdetalleidempresa: TIntegerField;
    qfacturasdetalleserie: TWideStringField;
    qfacturasdetalleidfactura: TIntegerField;
    qfacturasdetalledescripcion: TWideStringField;
    qfacturasdetallecantidad: TFloatField;
    qfacturasdetalleprecio: TFloatField;
    qfacturasdetalledescuento: TFloatField;
    qfacturasdetalletotaldescuento: TFloatField;
    qfacturasdetallebase: TFloatField;
    qfacturasdetalletipoiva: TFloatField;
    qfacturasdetalleiva: TFloatField;
    qfacturasdetalletotal: TFloatField;
    dsqfacturas: TDataSource;
    dsqfacturasdetalles: TDataSource;
    qseries: TZQuery;
    qclientes2nombre: TWideStringField;
    qclientes2apellidos: TWideStringField;
    qclientes2direccion: TWideStringField;
    qclientes2poblacion: TWideStringField;
    qclientes2codpost: TWideStringField;
    qclientes2provincia: TWideStringField;
    qclientes2telefono1: TWideStringField;
    qclientes2telefono2: TWideStringField;
    qclientes2email: TWideStringField;
    qclientes2formapago: TWideStringField;
    qclientes2entidad: TWideStringField;
    qclientes2iban: TWideStringField;
    qclientes2cuenta: TWideStringField;
    qclientes2swift: TWideStringField;
    qclientes2activo: TIntegerField;
    qclientes2descuento: TIntegerField;
    qclientes2idfp: TIntegerField;
    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;
    formaspagoid: TIntegerField;
    formaspagoide: TIntegerField;
    formaspagoids: TWideStringField;
    formaspagodescripcion: TWideStringField;
    formaspagoactivo: TIntegerField;
    formaspagodomiciliado: TIntegerField;
    qfacturasidformapago: TIntegerField;
    Label18: TLabel;
    DBText1: TDBText;
    DBText2: TDBText;
    qfacturastmp: TZQuery;
    qfacturasdetalletmp: TZQuery;
    qfacturastmpserie: TWideStringField;
    qfacturastmpid: TIntegerField;
    qfacturastmpidempresa: TIntegerField;
    qfacturastmpidcliente: TIntegerField;
    qfacturastmpnif: TWideStringField;
    qfacturastmpdireccion: TWideStringField;
    qfacturastmppoblacion: TWideStringField;
    qfacturastmpprovincia: TWideStringField;
    qfacturastmpcodpost: TWideStringField;
    qfacturastmpfecha: TDateField;
    qfacturastmptelefono: TWideStringField;
    qfacturastmpnomcliente: TWideStringField;
    qfacturastmppaiscliente: TWideStringField;
    qfacturastmpneto: TFloatField;
    qfacturastmptotal: TFloatField;
    qfacturastmpcobrado: TIntegerField;
    qfacturastmpdocumento: TWideStringField;
    qfacturastmpdescuento_lin: TFloatField;
    qfacturastmpdescuento_com: TFloatField;
    qfacturastmpdescuento_pp: TFloatField;
    qfacturastmpdescuento_total: TFloatField;
    qfacturastmptotaliva: TFloatField;
    qfacturastmpobservaciones: TWideStringField;
    qfacturastmpidformapago: TIntegerField;
    qfacturasdetalletmpid: TIntegerField;
    qfacturasdetalletmpidempresa: TIntegerField;
    qfacturasdetalletmpserie: TWideStringField;
    qfacturasdetalletmpidfactura: TIntegerField;
    qfacturasdetalletmpdescripcion: TWideStringField;
    qfacturasdetalletmpcantidad: TFloatField;
    qfacturasdetalletmpprecio: TFloatField;
    qfacturasdetalletmpdescuento: TFloatField;
    qfacturasdetalletmptotaldescuento: TFloatField;
    qfacturasdetalletmpbase: TFloatField;
    qfacturasdetalletmptipoiva: TFloatField;
    qfacturasdetalletmpiva: TFloatField;
    qfacturasdetalletmptotal: TFloatField;
    qformaspagocobros: TZReadOnlyQuery;
    qformaspagocobrosid: TIntegerField;
    qformaspagocobroside: TIntegerField;
    qformaspagocobrosids: TWideStringField;
    qformaspagocobrosdescripcion: TWideStringField;
    qformaspagocobrosactivo: TIntegerField;
    qformaspagocobrosdomiciliado: TIntegerField;
    Panel3: TPanel;
    DateTimePicker1: TDateTimePicker;
    DateTimePicker2: TDateTimePicker;
    Edit1: TEdit;
    Edit4: TEdit;
    Edit2: TEdit;
    procedure FormShow(Sender: TObject);
    procedure tbuscarclientesrecibosEnter(Sender: TObject);
    procedure tbuscarclientesrecibosExit(Sender: TObject);
    procedure DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure dsqclientesDataChange(Sender: TObject; Field: TField);
    procedure DBGrid11DrawColumnCell(Sender: TObject; const Rect: TRect;
      DataCol: Integer; Column: TColumn; State: TGridDrawState);
    procedure ssincobrarClick(Sender: TObject);
    procedure sdelclienteClick(Sender: TObject);
    procedure stodosClick(Sender: TObject);
    procedure sdomiciliadosClick(Sender: TObject);
    procedure DBGrid1TitleClick(Column: TColumn);
    procedure dsqrecibosclienteDataChange(Sender: TObject; Field: TField);
    procedure dsqreciboscliente2DataChange(Sender: TObject; Field: TField);
    procedure dsqclientes2DataChange(Sender: TObject; Field: TField);
    procedure btrnuevoClick(Sender: TObject);
    procedure btrborrarClick(Sender: TObject);
    procedure btrmodificarClick(Sender: TObject);
    procedure btrguardarClick(Sender: TObject);
    procedure btrcancelarClick(Sender: TObject);
    procedure btractualizarClick(Sender: TObject);
    procedure dsrecibosStateChange(Sender: TObject);
    procedure Button4Click(Sender: TObject);
    procedure Button5Click(Sender: TObject);
    procedure Button7Click(Sender: TObject);
    procedure Button14Click(Sender: TObject);
    procedure DBEdit3Exit(Sender: TObject);
    procedure DBEdit3KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure recibosfechacobroValidate(Sender: TField);
    procedure recibosfechareciboValidate(Sender: TField);
    procedure DBEdit4Change(Sender: TObject);
    procedure DBEdit4Exit(Sender: TObject);
    procedure DBEdit4KeyUp(Sender: TObject; var Key: Word; Shift: TShiftState);
    procedure DBEdit2Exit(Sender: TObject);
    procedure DBEdit5Enter(Sender: TObject);
    procedure DBEdit7Enter(Sender: TObject);
    procedure DBEdit6Enter(Sender: TObject);
    procedure DBCheckBox3Click(Sender: TObject);
    procedure chkpagadoClick(Sender: TObject);
    procedure dsqalumnosclientes2DataChange(Sender: TObject; Field: TField);
    procedure DBEdit4Enter(Sender: TObject);
    procedure dsqgruposclientes2DataChange(Sender: TObject; Field: TField);
    procedure FormKeyPress(Sender: TObject; var Key: Char);
  private
    { Private declarations }
    cobrando: Boolean; // Asegúrate de tener esta variable para controlar los Refresh

    // AÑADE ESTAS DOS LÍNEAS AQUÍ:
  //  procedure ProcesarFacturaCliente(AIdCliente: Integer; AListaIDs: TStringList; AFecha: TDate; AFormaPago: Integer);
    procedure GenerarFacturaAgrupada(AIdCliente: Integer; const AListaIDs: TStringList; AFecha: TDate; AFormaPago: Integer; ASerie: string; var VBalanceGlobal: Double);
  public
    { Public declarations }
  end;

var
  recibos_s: Trecibos_s;
  filtro,vertodos,tprinter,tprinter2:string;
  nuevorecibo,recibo,cliente,centro:integer;
  numcobros,x:integer;
  listarecibos:array of integer;
const
  rojo=$00AAAAFF;
  amarillo=$00B9FFFF;
  verde=$00C7FBAA;
  azul=$00FFFFBB;


implementation

{$R *.dfm}

uses CONSULTASINFORMES, ffacturas, fdlgcobros, DATOS;

procedure Trecibos_s.btrmodificarClick(Sender: TObject);
begin
    if recibos.MasterSource=dsqreciboscliente then nuevorecibo:=1;
    if recibos.MasterSource=dsqreciboscliente2 then nuevorecibo:=2;
    if qreciboscliente2.Active=false then qreciboscliente2.Open;
    recibo:=recibosid.AsInteger;
    cliente:=recibosidc.AsInteger;
    recibos.Edit;
    precibosdatos.Enabled:=true;
//    dbedit3.SetFocus;
end;

procedure Trecibos_s.btrborrarClick(Sender: TObject);
begin
   qaux.Close;
   qaux.SQL.Clear;
   qaux.SQL.Add('select * from cobros where seleccionado=1');
   qaux.Open;
   if qaux.RecordCount>0 then
   begin
       qaux.Close;
       qaux.SQL.Clear;
       qaux.SQL.Add('delete from cobros where seleccionado=1');
       qaux.execsql;
   end else
   begin
       qaux.Close;
       qaux.SQL.Clear;
       qaux.SQL.Add('delete from cobros where id='+recibosid.AsString);
       qaux.execsql;
   end;

//   dm.recibos.Delete;
   qreciboscliente.Refresh;
   qreciboscliente2.Refresh;
  if dbgrid1.DataSource=dsqreciboscliente then
  begin
    recibo:=qrecibosclienteid.AsInteger;
       recibos.Prepare;
       recibos.ParamByName('PRECIBO').AsInteger:=recibo;
       recibos.Refresh;
  end;
  if dbgrid1.DataSource=dsqreciboscliente2 then
  begin
    recibo:=qreciboscliente2id.AsInteger;
       recibos.Prepare;
       recibos.ParamByName('PRECIBO').AsInteger:=recibo;
       recibos.Refresh;
  end;

end;

procedure Trecibos_s.btrnuevoClick(Sender: TObject);
begin
     nuevorecibo:=1;

    recibos.MasterSource:=nil;
    recibos.Append;
    recibosdomiciliado.Value:=0;
    recibosmaterial.Value:=0;
    recibospagado.Value:=0;
    reciboside.value:=centro;
    recibosidc.Value:=qclientesid.AsInteger;

    precibosdatos.Enabled:=true;
    dbedit3.SetFocus;
end;

procedure Trecibos_s.Button14Click(Sender: TObject);
begin
  close;
end;
procedure Trecibos_s.Button4Click(Sender: TObject);
var
  i: Integer;
  dsGrid: TDataSet;
  ListaIDs, ClientesSeleccionados: TStringList;
  vTotalSuma, vEntregaRestante: Double;
  vSeriePago: string;
begin
  if dbgrid1.SelectedRows.Count = 0 then
  begin
    ShowMessage('Debe seleccionar al menos un recibo');
    Exit;
  end;

  dsGrid := dbgrid1.DataSource.DataSet;
  ListaIDs := TStringList.Create;
  ClientesSeleccionados := TStringList.Create;
  ClientesSeleccionados.Sorted := True;
  ClientesSeleccionados.Duplicates := dupIgnore;
  vTotalSuma := 0;

  dsGrid.DisableControls;
  try
    for i := 0 to dbgrid1.SelectedRows.Count - 1 do
    begin
      dsGrid.GotoBookmark(Pointer(dbgrid1.SelectedRows[i]));
      // Formato interno: ID_RECIBO=ID_CLIENTE
      ListaIDs.Add(dsGrid.FieldByName('id').AsString + '=' + dsGrid.FieldByName('idc').AsString);
      ClientesSeleccionados.Add(dsGrid.FieldByName('idc').AsString);
      vTotalSuma := vTotalSuma + dsGrid.FieldByName('importefinal').AsFloat;
    end;
  finally
    dsGrid.EnableControls;
  end;

  dlgcobros := Tdlgcobros.Create(Self);
  try
    dlgcobros.vfecha.Date := Date;
    dlgcobros.lentrega.Text := FloatToStr(vTotalSuma);
    qformaspagocobros.Open;

    if dlgcobros.ShowModal = mrOk then
    begin
      vSeriePago := qformaspagocobrosids.AsString; // Serie de la forma de pago [cite: 608]
      vEntregaRestante := StrToFloatDef(dlgcobros.lentrega.Text, vTotalSuma);

      cobrando := True;
      try
        for i := 0 to ClientesSeleccionados.Count - 1 do
        begin
          // Llamamos a la generación pasando el saldo restante por referencia
          GenerarFacturaAgrupada(
            StrToInt(ClientesSeleccionados[i]),
            ListaIDs,
            dlgcobros.vfecha.Date,
            qformaspagocobrosid.AsInteger,
            vSeriePago,
            vEntregaRestante // Este valor se irá restando dentro del método
          );
        end;

        // Tras el cobro, preparamos la impresión masiva para Button5
        qaux.Close;
        qaux.SQL.Text := 'UPDATE cobros SET seleccionado = 0';
        qaux.ExecSQL;
        for i := 0 to ListaIDs.Count - 1 do
        begin
           qaux.SQL.Text := 'UPDATE cobros SET seleccionado = 1 WHERE id = ' + ListaIDs.Names[i];
           qaux.ExecSQL;
        end;

        // Llamamos a la impresión [cite: 95]
        Button5.Click;
      finally
        cobrando := False;
      end;
    end;
  finally
    qformaspagocobros.Close;
    dlgcobros.Free;
    ListaIDs.Free;
    ClientesSeleccionados.Free;
    dsGrid.Refresh;
    dbgrid1.SelectedRows.Clear;
  end;
end;
procedure Trecibos_s.GenerarFacturaAgrupada(AIdCliente: Integer; const AListaIDs: TStringList; AFecha: TDate; AFormaPago: Integer; ASerie: string; var VBalanceGlobal: Double);
var
  j, k, vIdEmpresa, vNumFac, vUltimoIndice: Integer;
  vNetoTotal, vFinalTotal, vAcuenta: Double;
  vIDRecibo, vIdC: string;
begin
  vNetoTotal := 0; vFinalTotal := 0; vIdEmpresa := 0;
  vUltimoIndice := -1;

  // 1. Identificar el ÚLTIMO recibo de este cliente en la lista seleccionada
  for k := 0 to AListaIDs.Count - 1 do
  begin
    if StrToInt(AListaIDs.ValueFromIndex[k]) = AIdCliente then
      vUltimoIndice := k;
  end;

  // 2. Cálculo previo de totales para la cabecera
  for j := 0 to AListaIDs.Count - 1 do
  begin
    if StrToInt(AListaIDs.ValueFromIndex[j]) = AIdCliente then
    begin
      recibos.Close;
      recibos.ParamByName('PRECIBO').AsInteger := StrToInt(AListaIDs.Names[j]);
      recibos.Open;
      if not recibos.IsEmpty then
      begin
        vNetoTotal := vNetoTotal + recibosimporte.AsFloat;
        vFinalTotal := vFinalTotal + recibosimportefinal.AsFloat;
        vIdEmpresa := reciboside.AsInteger;
      end;
    end;
  end;

  if (vIdEmpresa = 0) or (vFinalTotal = 0) then Exit;

  // 3. Cabecera de Factura
  qseries.Close;
  qseries.ParamByName('EMPRESA').AsInteger := vIdEmpresa;
  qseries.ParamByName('SERIE').AsString := ASerie;
  qseries.Open;
  vNumFac := qseriesnum_factura.AsInteger;

  qfacturas.Open;
  qfacturas.Append;
  qfacturasserie.Value := ASerie;
  qfacturasid.Value := vNumFac;
  qfacturasidempresa.Value := vIdEmpresa;
  qfacturasidcliente.Value := AIdCliente;
  qfacturasfecha.AsDateTime := AFecha;
  qfacturasidformapago.AsInteger := AFormaPago;
  qfacturasneto.AsFloat := vNetoTotal;
  qfacturastotal.AsFloat := vFinalTotal;
  if qclientes2.Locate('id', AIdCliente, []) then
  begin
    qfacturasnif.Value := qclientes2nif.AsString;
    qfacturasnomcliente.Value := qclientes2apellidos.AsString + ' ' + qclientes2nombre.AsString;
    qfacturaspoblacion.value:=qclientes2poblacion.AsString;
    qfacturasprovincia.value:=qclientes2provincia.AsString;
    qfacturascodpost.value:=qclientes2codpost.AsString;
    qfacturastelefono.value:=qclientes2telefono1.AsString;
    qfacturasdireccion.value:=qclientes2direccion.AsString;
  end;
  qfacturas.Post;

  // 4. Detalles y lógica de Entrega (Tu modificación solicitada)
  qfacturasdetalle.Open;
  for j := 0 to AListaIDs.Count - 1 do
  begin
    if StrToInt(AListaIDs.ValueFromIndex[j]) = AIdCliente then
    begin
      recibos.Close;
      recibos.ParamByName('PRECIBO').AsInteger := StrToInt(AListaIDs.Names[j]);
      recibos.Open;

      if not recibos.IsEmpty then
      begin
        // Línea de detalle
        qfacturasdetalle.Append;
        qfacturasdetalleid.value:=j+1;
        qfacturasdetalleserie.Value := ASerie;
        qfacturasdetalleidfactura.Value := vNumFac;
        qfacturasdetalleidempresa.Value := vIdEmpresa;
        qfacturasdetalledescripcion.Value := 'Recibo Nº: ' + recibosid.AsString + ' - ' + recibosconcepto.AsString;
        qfacturasdetallecantidad.Value := 1;
        qfacturasdetalleprecio.Value := recibosimporte.AsFloat;
        qfacturasdetallebase.Value := recibosimportefinal.AsFloat;
        qfacturasdetalletotal.Value := recibosimportefinal.AsFloat;
        qfacturasdetalletotaldescuento.value:=recibosdescuento.AsFloat/100*recibosimporte.AsFloat;
        qfacturasdetalledescuento.value:=recibosdescuento.AsFloat;
        qfacturasdetalletipoiva.value:=0;
        qfacturasdetalleiva.value:=0;
        qfacturasdetalle.Post;

        // --- LÓGICA DE CANTIDAD ENTREGADA ---
        if j = vUltimoIndice then
        begin
          // REGLA: Si es el último y el resto es mayor que el importe del recibo, ponemos TODO el resto
          if VBalanceGlobal > recibosimportefinal.AsFloat then
            vAcuenta := VBalanceGlobal
          else
            vAcuenta := VBalanceGlobal; // Cubre exactamente o menos
        end
        else
        begin
          // Recibos intermedios: cubrimos el total del recibo si hay saldo, si no, lo que quede
          if VBalanceGlobal >= recibosimportefinal.AsFloat then
            vAcuenta := recibosimportefinal.AsFloat
          else
            vAcuenta := VBalanceGlobal;
        end;

        if vAcuenta < 0 then vAcuenta := 0;

        // Actualización del recibo
        recibos.Edit;
        recibospagado.AsInteger := 1;
        recibosfechacobro.AsDateTime := AFecha;
        recibosforma_pago.AsInteger := AFormaPago;
        recibosentrega.AsFloat := vAcuenta; // Aplicamos la cantidad calculada
        recibosids.Value := ASerie;
        recibosidf.Value := vNumFac;
        recibos.Post;

        // Restamos del saldo global lo entregado
        VBalanceGlobal := VBalanceGlobal - vAcuenta;
      end;
    end;
  end;

  // 5. Cerrar serie
  qseries.Edit;
  qseriesnum_factura.AsInteger := vNumFac + 1;
  qseries.Post;
end;

procedure Trecibos_s.Button5Click(Sender: TObject);
var recibo:string;
     i:integer;
begin
   if dbgrid1.Selectedrows.Count>0 then
   begin
   if dbgrid1.Selectedrows.Count>1 then
   begin
     qaux.SQL.Clear;
     qaux.SQL.Add('update cobros set seleccionado=0 where seleccionado=1');
     qaux.ExecSQL;
     for i := 0 to dbgrid1.Selectedrows.Count - 1 do
     begin
       if dbgrid1.DataSource=dsqreciboscliente then
       begin
         qreciboscliente.GotoBookmark (pointer (dbgrid1.selectedrows[i]));
         qaux.SQL.Clear;
         qaux.SQL.Add('update cobros set seleccionado=1 where id='+qrecibosclienteid.asstring);
         qaux.ExecSQL;
       end;
       if dbgrid1.DataSource=dsqreciboscliente2 then
       begin
         qreciboscliente2.GotoBookmark (pointer (dbgrid1.selectedrows[i]));
         qaux.SQL.Clear;
         qaux.SQL.Add('update cobros set seleccionado=1 where id='+qreciboscliente2id.asstring);
         qaux.ExecSQL;
       end;
     end;
    dminf.qinfrecibo.close;
    dminf.qinfrecibo.SQL.Clear;
    dminf.qinfrecibo.SQL.Add('select c.*,cli.nif,cli.nombre_completo as nomcliente,a.nombre_completo as nomalumno,g.nombre as nomgrupo ');
    dminf.qinfrecibo.SQL.Add(',(select descripcion from formas_pago where ide=c.ide and id=c.forma_pago) as descpago from cobros c,clientes cli,alumnos a,grupos g');
    dminf.qinfrecibo.SQL.Add(' where c.ide=cli.ide and c.idc=cli.id and c.ide=a.ide and c.ida=a.id and ');
    dminf.qinfrecibo.SQL.Add(' c.ide=g.ide and c.idg=g.id and cli.ide=a.ide and cli.id=a.idc and c.seleccionado=1');
    dminf.qinfrecibo.Open;
   end;
   if dbgrid1.Selectedrows.Count=1 then
   begin
        recibo:=recibosid.Asstring;
        dminf.qinfrecibo.close;
        dminf.qinfrecibo.SQL.Clear;
        dminf.qinfrecibo.SQL.Add('select c.*,cli.nif,cli.nombre_completo as nomcliente,a.nombre_completo as nomalumno,g.nombre as nomgrupo ');
        dminf.qinfrecibo.SQL.Add(',(select descripcion from formas_pago where ide=c.ide and id=c.forma_pago) as descpago from cobros c,clientes cli,alumnos a,grupos g');
        dminf.qinfrecibo.SQL.Add(' where c.ide=cli.ide and c.idc=cli.id and c.ide=a.ide and c.ida=a.id and ');
        dminf.qinfrecibo.SQL.Add(' c.ide=g.ide and c.idg=g.id and cli.ide=a.ide and cli.id=a.idc and c.id='+recibo);
        dminf.qinfrecibo.Open;
    end;

    informedb.Datasource:=dminf.dsqinfrecibo;
    informe.Report.Clear;
    informe.LoadFromFile('c:\formagest\informes\tiquet.fr3');

//    informes.Report.FileName:=TMES.Text+' ' + qjornalestrabajador.asstring;
    informe.PrintOptions.Printer:=tprinter;
    informe.ShowReport();

    informe.Clear;
   end else
         begin
           showmessage('¡¡¡ ATENCION DEBE SELECCIONAR AL MENOS UN RECIBO ¡¡¡');
         end;


     qaux.SQL.Clear;
     qaux.SQL.Add('update cobros set seleccionado=0 where seleccionado=1');
     qaux.ExecSQL;
 //    qreciboscliente.Refresh;
 //    qreciboscliente2.Refresh;


end;

procedure Trecibos_s.Button7Click(Sender: TObject);
begin

    qgrupos.Open;
    qgrupos.first;
    while not qgrupos.Eof do
    begin
        qalumnos.Close;
        qalumnos.SQL.Clear;
        qalumnos.SQL.Add('select a.ide,a.ida,al.idc,al.descuento from asistir a,alumnos al where al.automatico=1 and a.fechabaja is null and a.ide=al.ide and a.ida=al.id');
        qalumnos.SQL.Add(' and a.ide='+qgruposide.AsString+' and a.idg='+qgruposid.asstring);
        qalumnos.Open;
        if qalumnos.RecordCount>0 then
        begin
           while not qalumnos.Eof do
           begin
             qclientes3.close;
             qclientes3.Prepare;
             qclientes3.ParamByName('NOMBRE').AsString:=' ';
             qclientes3.ParamByName('IDC').AsInteger:= qalumnosidc.AsInteger;
             qclientes3.ParamByName('ACTIVO').AsString:='1';
             qclientes3.Open;


             recibos.MasterSource:=nil;
             recibos.Append;
             recibospagado.Value:=0;
             reciboside.Value:=qalumnoside.AsInteger;
             recibosidc.Value:=qalumnosidc.AsInteger;
             recibosida.Value:=qalumnosida.AsInteger;
             recibosidg.Value:=qgruposid.AsInteger;
             recibosfecharecibo.Value:=strtodate(edfecha.Text);
             recibosconcepto.Value:=edconcepto.Text;
             if edimporte.Text='' then
             begin
                 if edmaterial.Checked then recibosmaterial.Value:=1 else recibosmaterial.Value:=0;
                 recibosimporte.Value:=qgrupospreciomensual.AsFloat;
                 recibosdescuento.Value:=qalumnosdescuento.Asinteger;
                 recibosimportefinal.Value:=qgrupospreciomensual.AsFloat-((qgrupospreciomensual.AsFloat*qalumnosdescuento.AsFloat)/100);
             end else
             begin
                 if edmaterial.Checked then recibosmaterial.Value:=1 else recibosmaterial.Value:=0;
                 recibosimporte.Value:=strtofloat(edimporte.text);
                 recibosdescuento.Value:=0;
                 recibosimportefinal.Value:=strtofloat(edimporte.text);
             end;
             recibosforma_pago.value:=qclientes3idfp.AsInteger;
             qaux.SQL.Clear;
             qaux.SQL.Add('select domiciliado from formas_pago where ide='+reciboside.asstring+' and id='+recibosforma_pago.asstring);
             qaux.Open;
             recibosdomiciliado.Value:=qaux.Fields[0].asinteger;

             recibos.Post;
             qalumnos.Next;
           end;
        end;
        qgrupos.Next;
    end;
    dbgrid1.DataSource:=dsqreciboscliente2;
    dbgrid1.Columns[3].FieldName:='cliente';
    dbgrid1.Columns[3].Title.caption :='Cliente';
    qreciboscliente2.close;
    qreciboscliente2.Prepare;
    qreciboscliente2.ParamByName('EMPRESA').AsInteger:=1;
    qreciboscliente2.ParamByName('PAGADO').AsString:='0';
    qreciboscliente2.ParamByName('DOMICILIADO').AsString:='%';
    qreciboscliente2.open;
    qreciboscliente.Refresh;
    qgrupos.Close;

end;

procedure Trecibos_s.btrguardarClick(Sender: TObject);
var recibo:integer;

begin
    recibo:=recibosid.AsInteger;
    recibosdomiciliado.Value:=formaspagodomiciliado.asinteger;
    cliente:=recibosidc.AsInteger;
    recibosidg.Value:=qgruposclientes2idg.asinteger;
    reciboside.Value:=qclientes2ide.asinteger;
    recibos.Post;
    if (recibospagado.AsInteger=0) and ((recibosidf.asstring<>'') or (recibosidf.asstring<>'-1')) and (cobrando=true) then
    begin
         qseries.Close;
         qseries.Prepare;
         qseries.ParamByName('EMPRESA').AsInteger:=reciboside.AsInteger;
         qseries.ParamByName('SERIE').Asstring:=formaspagoids.AsString;
         qseries.Open;
         qfacturastmp.Close;
         qfacturastmp.Prepare;
         qfacturastmp.ParamByName('EMPRESA').AsInteger:=reciboside.AsInteger;
         qfacturastmp.ParamByName('SERIE').AsString:=recibosids.AsString;
         qfacturastmp.ParamByName('ID').AsInteger:=recibosidf.AsInteger;
         qfacturastmp.Open;
         qfacturas.Open;
         qfacturas.Append;
         qfacturasserie.Value:=qfacturastmpserie.AsString;
         qfacturasidempresa.Value:=qfacturastmpidempresa.AsInteger;
         qfacturasid.Value:=qseriesnum_factura.AsInteger;
         qfacturasidcliente.Value:=qfacturastmpidcliente.AsInteger;
         qfacturasnif.Value:=qfacturastmpnif.Asstring;
         qfacturasnomcliente.value:=qfacturastmpnomcliente.AsString;
         qfacturaspoblacion.value:=qfacturastmppoblacion.AsString;
         qfacturasprovincia.value:=qfacturastmpprovincia.AsString;
         qfacturascodpost.value:=qfacturastmpcodpost.AsString;
         qfacturastelefono.value:=qfacturastmptelefono.AsString;
         qfacturasdireccion.value:=qfacturastmpdireccion.AsString;
         qfacturasfecha.value:=date();
         qfacturasneto.value:=qfacturastmpneto.Asfloat*-1;
         qfacturasdescuento_total.value:=qfacturastmpdescuento_total.AsFloat*-1;
         qfacturastotal.value:=qfacturastmptotal.Asfloat*-1;
         qfacturasidformapago.value:=qfacturastmpidformapago.asinteger;
         qfacturas.Post;
         qfacturasdetalletmp.Close;
         qfacturasdetalletmp.Prepare;
         qfacturasdetalletmp.ParamByName('EMPRESA').AsInteger:=reciboside.AsInteger;
         qfacturasdetalletmp.ParamByName('SERIE').AsString:=recibosids.AsString;
         qfacturasdetalletmp.ParamByName('ID').AsInteger:=recibosidf.AsInteger;
         qfacturasdetalletmp.Open;
         qfacturasdetalle.Open;
         qfacturasdetalle.Append;
         qfacturasdetalleid.value:=1;
         qfacturasdetalleidempresa.value:=qfacturasidempresa.AsInteger;
         qfacturasdetalleserie.value:=qfacturasserie.AsString;
         qfacturasdetalleidfactura.value:=qfacturasid.AsInteger;
         qfacturasdetalledescripcion.value:='Anulacion factura: '+qfacturasdetalletmpserie.asstring+'/'+qfacturasdetalletmpidfactura.AsString;
         qfacturasdetallecantidad.value:=-1;
         qfacturasdetalleprecio.value:=qfacturasdetalletmpprecio.AsFloat;
         qfacturasdetalletotaldescuento.value:=qfacturasdetalletmptotaldescuento.AsFloat*-1;
         qfacturasdetalledescuento.value:=qfacturasdetalletmpdescuento.AsFloat;
         qfacturasdetallebase.value:=qfacturasdetalletmpbase.asfloat*-1;
         qfacturasdetalletipoiva.value:=0;
         qfacturasdetalleiva.value:=0;
         qfacturasdetalletotal.value:=qfacturasdetalletmptotal.AsFloat*-1;
         qfacturasdetalle.post;
         qseries.Edit;
         qseriesnum_factura.Value:=qseriesnum_factura.AsInteger+1;
         qseries.Post;

         recibos.Edit;
         recibosids.Value:='';
         recibosidf.Value:=-1;
         recibosentrega.Value:=0;
         recibos.Post;
         cobrando:=false;
//         qreciboscliente2.Locate('id',recibosid.AsInteger,[locaseinsensitive]);
    end;

//    recibo:=recibosid.AsInteger;
//    recibos.last;
    if cobrando= false then
    begin
       qreciboscliente2.refresh;
       qreciboscliente.refresh;
       qreciboscliente2.Locate('id',recibo,[locaseinsensitive]);
       qreciboscliente.Locate('id',recibo,[locaseinsensitive]);
       qreciboscliente.First;
       qreciboscliente2.First;
       if nuevorecibo=1 then recibos.MasterSource:=dsqreciboscliente;
       if nuevorecibo=2 then recibos.MasterSource:=dsqreciboscliente2;
       dbedit9.Visible:=TRUE;
       label16.Visible:=TRUE;
       precibosdatos.Enabled:=false;
       tbuscarclientesrecibos.Text:=qrecibosclientecliente.asstring;
   //    qreciboscliente.Locate('id',recibo,[locaseinsensitive]);
   //    qreciboscliente2.Locate('id',recibo,[locaseinsensitive]);
       recibos.Prepare;
       recibos.ParamByName('PRECIBO').AsInteger:=recibo;
       recibos.Refresh;
    end;

end;

procedure Trecibos_s.btractualizarClick(Sender: TObject);
begin
    facturas := Tfacturas.Create(nil);
    try
      facturas.gserie:=recibosids.AsString;
      facturas.gfactura:=recibosidf.AsInteger;
      facturas.pagina:='0';
      facturas.showmodal();

    finally
      facturas.Free;
    end;
end;

procedure Trecibos_s.btrcancelarClick(Sender: TObject);
begin

    recibos.cancel;
    {btRactualizar.Click;
    qclientes.Locate('id',cliente,[locaseinsensitive,lopartialkey]);
    if nuevorecibo=1 then recibos.MasterSource:=dsqreciboscliente;
    if nuevorecibo=2 then recibos.MasterSource:=dsqreciboscliente2;
    qreciboscliente.CLOSE;
    qreciboscliente.Open;
    qreciboscliente.Locate('id',recibo,[locaseinsensitive,lopartialkey]);

    qreciboscliente2.Locate('id',recibo,[locaseinsensitive,lopartialkey]);
    recibos.MasterFields:='id;ide';
    recibos.LinkedFields:='id;ide';
    recibos.Open;
     }
    precibosdatos.Enabled:=false;
end;

procedure Trecibos_s.DBCheckBox3Click(Sender: TObject);
begin
   if recibos.State in [dsedit,dsinsert] then
   begin
       if dbcheckbox3.Checked then
       begin
         qaux2.SQL.Clear;
         qaux2.SQL.Add('select precio_material from cursos where ide=:PIDE and id=:PID');
         qaux2.prepare;
         qaux2.ParamByName('PIDE').asinteger:=qgruposclientes2ide.AsInteger;
         qaux2.ParamByName('PID').asinteger:=qgruposclientes2idcurso.AsInteger;
         qaux2.Open;
         recibosimporte.Value:=qaux2.fields[0].asfloat;
       end else recibosimporte.Value:=qgruposclientespreciomensual.asfloat;
       dbedit7.SetFocus;
   end;

end;

procedure Trecibos_s.chkpagadoClick(Sender: TObject);
begin
  if recibos.State  in [dsedit,dsinsert] then
  begin
    cobrando:=true;
    if chkpagado.Checked then recibosfechacobro.Value:=date();
  end;
end;

procedure Trecibos_s.DBEdit2Exit(Sender: TObject);
begin
    recibosconcepto.Value:=recibosconcepto.asstring;
end;

procedure Trecibos_s.DBEdit3Exit(Sender: TObject);
begin
    If DBEdit3.Text = '  /  /  ' then
    begin
      recibosfecharecibo.EditMask   := '';
      recibosfecharecibo.OnValidate := nil;
      DBEDIT3.Text:='';
    end;

    recibosfecharecibo.editmask   := '!99/99/99;1;_';
    recibosfecharecibo.OnValidate := recibosfecharecibovalidate;
end;

procedure Trecibos_s.DBEdit3KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    If (Key = VK_BACK) or (Key = VK_DELETE) then
    If DBEdit3.Text = '  /  /  ' then
    begin
      recibosfecharecibo.EditMask   := '';
      recibosfecharecibo.OnValidate := nil;
      DBEdit3.Text := '';
    end;
end;

procedure Trecibos_s.DBEdit4Change(Sender: TObject);
begin
    If DBEdit4.Text = '' then
    begin
    recibosfechacobro.editmask   := '!99/99/99;1;_';
    recibosfechacobro.OnValidate := recibosfechacobrovalidate;
    end;
end;

procedure Trecibos_s.DBEdit4Enter(Sender: TObject);
begin
    recibosfechacobro.editmask   := '!99/99/99;1;_';
end;

procedure Trecibos_s.DBEdit4Exit(Sender: TObject);
begin
    If DBEdit4.Text = '  /  /  ' then
    begin
      recibosfechacobro.EditMask   := '';
      recibosfechacobro.OnValidate := nil;
      DBEDIT4.Text:='';
    end;

    recibosfechacobro.editmask   := '!99/99/99;1;_';
    recibosfechacobro.OnValidate := recibosfechacobrovalidate;
end;

procedure Trecibos_s.DBEdit4KeyUp(Sender: TObject; var Key: Word;
  Shift: TShiftState);
begin
    If (Key = VK_BACK) or (Key = VK_DELETE) then
    If DBEdit4.Text = '  /  /  ' then
    begin
      recibosfechacobro.EditMask   := '';
      recibosfechacobro.OnValidate := nil;
      DBEdit4.Text := '';

    end;
end;

procedure Trecibos_s.DBEdit5Enter(Sender: TObject);
begin
   if (dbedit5.Text='') and (not dbcheckbox3.Checked) then recibosimporte.Value:=qgruposclientes2preciomensual.asfloat;
end;

procedure Trecibos_s.DBEdit6Enter(Sender: TObject);
begin
   if dbedit6.Text='' then recibosdescuento.Value:=qalumnosclientes2descuento.asinteger;
end;

procedure Trecibos_s.DBEdit7Enter(Sender: TObject);
begin
    recibosimportefinal.Value:=recibosimporte.AsFloat-((recibosimporte.AsFloat*recibosdescuento.AsFloat)/100);
    recibosentrega.Value:=recibosimportefinal.AsFloat;
end;

procedure Trecibos_s.DBGrid11DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const IsChecked : array[Boolean] of Integer =
 (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
var
  DrawState: Integer;
  DrawRect: TRect;
begin
    if qalumnosclientesactivo.Asinteger=0 then
    begin
        DBGrid11.Canvas.brush.Color := rojo;
    end;
    DBGrid11.DefaultDrawColumnCell(Rect, DataCol, Column, State);
// dibujar check

if (gdFocused in State) then
begin
    if (Column.Field.FieldName = 'activo') then
     begin
       gcrpagado.Left := Rect.Left + DBGrid11.Left + 2;
       gcrpagado.Top := Rect.Top + DBGrid11.top + 2;
       gcrpagado.Width := Rect.Right - Rect.Left;
       gcrpagado.Height := Rect.Bottom - Rect.Top;
       gcrpagado.Visible := True;
     end;
end else
     begin
       if (Column.Field.FieldName = 'activo') then
       begin
         DrawRect:=Rect;
         InflateRect(DrawRect,-1,-1);
         if column.Field.Asinteger=0  then DrawState := ischecked[false];
         if column.Field.Asinteger=1  then DrawState := ischecked[true];
      //   DrawState := ISChecked[Column.Field.Asboolean];
         DBGrid11.Canvas.FillRect(Rect);
         DrawFrameControl(DBGrid11.Canvas.Handle, DrawRect,
         DFC_BUTTON, DrawState);
       end;

     end;




end;

procedure Trecibos_s.DBGrid1DrawColumnCell(Sender: TObject; const Rect: TRect;
  DataCol: Integer; Column: TColumn; State: TGridDrawState);
const IsChecked : array[Boolean] of Integer =
 (DFCS_BUTTONCHECK, DFCS_BUTTONCHECK or DFCS_CHECKED);
var
  DrawState: Integer;
  DrawRect: TRect;
begin
//    dm.recibos.MasterSource:=nil;
if qreciboscliente2.Active=false then qreciboscliente2.Open;
    if dbgrid1.DataSource=dsqreciboscliente then
        begin
        if qrecibosclientepagado.Asinteger=0 then
        begin
            DBgrid1.Canvas.brush.Color := rojo;
        end;
        DBgrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
        if qrecibosclienteseleccionado.Asinteger=1 then
        begin
            DBgrid1.Canvas.brush.Color := amarillo;
        end;
        DBgrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
    end;
    if dbgrid1.DataSource=dsqreciboscliente2 then
        begin
        if qreciboscliente2pagado.Asinteger=0 then
        begin
            DBgrid1.Canvas.brush.Color := rojo;
        end;
        DBgrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
        if qreciboscliente2seleccionado.Asinteger=1 then
        begin
            DBgrid1.Canvas.brush.Color := amarillo;
        end;
        DBgrid1.DefaultDrawColumnCell(Rect, DataCol, Column, State);
    end;

// dibujar check

if (gdFocused in State) then
begin

    if (Column.Field.FieldName = 'pagado') then
     begin
       gcrpagado.Left := Rect.Left + DBgrid1.Left + 2;
       gcrpagado.Top := Rect.Top + DBgrid1.top + 2;
       gcrpagado.Width := Rect.Right - Rect.Left;
       gcrpagado.Height := Rect.Bottom - Rect.Top;
       gcrpagado.Visible := True;
     end;

    if (Column.Field.FieldName = 'domiciliado') then
    begin
      gcrpagado.Left := Rect.Left + DBgrid1.Left + 2;
      gcrpagado.Top := Rect.Top + DBgrid1.top + 2;
      gcrpagado.Width := Rect.Right - Rect.Left;
      gcrpagado.Height := Rect.Bottom - Rect.Top;
      gcrpagado.Visible := True;
    end;
    if (Column.Field.FieldName = 'material') then
    begin
      gcrpagado.Left := Rect.Left + DBgrid1.Left + 2;
      gcrpagado.Top := Rect.Top + DBgrid1.top + 2;
      gcrpagado.Width := Rect.Right - Rect.Left;
      gcrpagado.Height := Rect.Bottom - Rect.Top;
      gcrpagado.Visible := True;
    end;

end else
     begin

       if (Column.Field.FieldName = 'pagado') then
       begin
         DrawRect:=Rect;
         InflateRect(DrawRect,-1,-1);
         if column.Field.Asinteger=0  then DrawState := ischecked[false];
         if column.Field.Asinteger=1  then DrawState := ischecked[true];
      //   DrawState := ISChecked[Column.Field.Asboolean];
         DBgrid1.Canvas.FillRect(Rect);
         DrawFrameControl(DBgrid1.Canvas.Handle, DrawRect,
         DFC_BUTTON, DrawState);
       end;

       if (Column.Field.FieldName = 'domiciliado') then
       begin
         DrawRect:=Rect;
         InflateRect(DrawRect,-1,-1);
         if column.Field.Asinteger=0  then DrawState := ischecked[false];
         if column.Field.Asinteger=1  then DrawState := ischecked[true];
      //   DrawState := ISChecked[Column.Field.Asboolean];
         DBgrid1.Canvas.FillRect(Rect);
         DrawFrameControl(DBgrid1.Canvas.Handle, DrawRect,
         DFC_BUTTON, DrawState);
       end;
       if (Column.Field.FieldName = 'material') then
       begin
         DrawRect:=Rect;
         InflateRect(DrawRect,-1,-1);
         if column.Field.Asinteger=0  then DrawState := ischecked[false];
         if column.Field.Asinteger=1  then DrawState := ischecked[true];
      //   DrawState := ISChecked[Column.Field.Asboolean];
         DBgrid1.Canvas.FillRect(Rect);
         DrawFrameControl(DBgrid1.Canvas.Handle, DrawRect,
         DFC_BUTTON, DrawState);
       end;

     end;
//    if nuevorecibo=1 then recibos.MasterSource:=dsqreciboscliente;
//    if nuevorecibo=2 then recibos.MasterSource:=dsqreciboscliente2;

end;

procedure Trecibos_s.DBGrid1TitleClick(Column: TColumn);
var
  st,ST2:ZAbstractRODataset.TSortType;
  ORDEN:STRING;
begin
    if sdelcliente.Checked then
    begin
      st:=qreciboscliente.SortType;
      If st = stAscending then
      begin
       ORDEN:='DESC';
       qreciboscliente.sorttype:=stDescending;
      end else
      begin
        ORDEN:='ASC';
        qreciboscliente.sorttype:=stAscending;
      end;
      qreciboscliente.close;
      qreciboscliente.SQL.Clear;
      qreciboscliente.SQL.Add('select co.*,a.nombre_completo as alumno,c.nombre_completo as cliente from cobros co,alumnos a,clientes c where co.ida=a.id and co.idc=c.id and c.id like(:CLIENTE) and c.ide=:EMPRESA ');
      qreciboscliente.sql.Add('order by pagado asc,'+column.FieldName+' '+ORDEN+',cliente');
      qreciboscliente.Prepare;
      qreciboscliente.ParamByName('CLIENTE').Asstring:=qclientesid.Asstring;
      qreciboscliente.ParamByName('EMPRESA').Asinteger:=qclienteside.AsInteger;
      qreciboscliente.open;
//      qreciboscliente.refresh;
     { st:=qreciboscliente.SortType;
      qreciboscliente.SortedFields:='PAGADO,'+Column.FieldName+',CLIENTE';
      If st = stAscending then qreciboscliente.SortType:=stDescending else qreciboscliente.SortType:=stAscending;
      dsqreciboscliente.DataSet.First;}
    end;
    if ssincobrar.Checked then
    begin
      st:=qreciboscliente2.SortType;
      If st = stAscending then
      begin
       ORDEN:='DESC';
       qreciboscliente2.sorttype:=stDescending;
      end else
      begin
        ORDEN:='ASC';
        qreciboscliente2.sorttype:=stAscending;
      end;
      qreciboscliente2.Close;
      qreciboscliente2.SQL.Clear;
      qreciboscliente2.SQL.Add('select co.*,a.nombre_completo as alumno,c.nombre_completo as cliente from cobros co,alumnos a,clientes c where co.ida=a.id and co.idc=c.id and co.ide=:EMPRESA and pagado like(:PAGADO) and domiciliado like(:DOMICILIADO) ');
      qreciboscliente2.sql.Add('order by pagado asc,'+column.FieldName+' '+ORDEN+',cliente');
      qreciboscliente2.Prepare;
      qreciboscliente2.ParamByName('EMPRESA').AsInteger:=1;
      qreciboscliente2.ParamByName('PAGADO').AsString:='0';
      qreciboscliente2.ParamByName('DOMICILIADO').AsString:='%';
      qreciboscliente2.open;
    end;
    if sdomiciliados.Checked then
    begin
      st:=qreciboscliente2.SortType;
      If st = stAscending then
      begin
       ORDEN:='DESC';
       qreciboscliente2.sorttype:=stDescending;
      end else
      begin
        ORDEN:='ASC';
        qreciboscliente2.sorttype:=stAscending;
      end;
      qreciboscliente2.Close;
      qreciboscliente2.SQL.Clear;
      qreciboscliente2.SQL.Add('select co.*,a.nombre_completo as alumno,c.nombre_completo as cliente from cobros co,alumnos a,clientes c where co.ida=a.id and co.idc=c.id and co.ide=:EMPRESA and pagado like(:PAGADO) and domiciliado like(:DOMICILIADO) ');
      qreciboscliente2.sql.Add('order by pagado asc,'+column.FieldName+' '+ORDEN+',cliente');
      qreciboscliente2.Prepare;
      qreciboscliente2.ParamByName('EMPRESA').AsInteger:=1;
      qreciboscliente2.ParamByName('PAGADO').AsString:='%';
      qreciboscliente2.ParamByName('DOMICILIADO').AsString:='1';
      qreciboscliente2.open;
    end;
    if stodos.Checked then
    begin
      st:=qreciboscliente2.SortType;
      If st = stAscending then
      begin
       ORDEN:='DESC';
       qreciboscliente2.sorttype:=stDescending;
      end else
      begin
        ORDEN:='ASC';
        qreciboscliente2.sorttype:=stAscending;
      end;
      qreciboscliente2.Close;
      qreciboscliente2.SQL.Clear;
      qreciboscliente2.SQL.Add('select co.*,a.nombre_completo as alumno,c.nombre_completo as cliente from cobros co,alumnos a,clientes c where co.ida=a.id and co.idc=c.id and co.ide=:EMPRESA and pagado like(:PAGADO) and domiciliado like(:DOMICILIADO) ');
      qreciboscliente2.sql.Add('order by pagado asc,'+column.FieldName+' '+ORDEN+',cliente');
      qreciboscliente2.Prepare;
      qreciboscliente2.ParamByName('EMPRESA').AsInteger:=1;
      qreciboscliente2.ParamByName('PAGADO').AsString:='%';
      qreciboscliente2.ParamByName('DOMICILIADO').AsString:='%';
      qreciboscliente2.open;
    end;

      //qreciboscliente2.refresh;
{      st:=qreciboscliente2.SortType;
      qreciboscliente2.SortedFields:='PAGADO asc,'+Column.FieldName+',CLIENTE, id desc';
      If st = stAscending then qreciboscliente2.SortType:=stDescending else qreciboscliente2.SortType:=stAscending;
      dsqreciboscliente2.DataSet.First;}
end;

procedure Trecibos_s.dsqalumnosclientes2DataChange(Sender: TObject;
  Field: TField);
begin
   if recibos.State in [dsedit,dsinsert] then recibosdescuento.value:=qalumnosclientes2descuento.AsInteger;
end;

procedure Trecibos_s.dsqclientes2DataChange(Sender: TObject; Field: TField);
var activo:string;
begin
   if recibos.State in [dsbrowse,dsedit] then activo:='%' else activo:='1';

   qalumnosclientes2.close;
   qalumnosclientes2.ParamByName('CLIENTE').AsInteger:=qclientes2id.AsInteger;
   qalumnosclientes2.ParamByName('EMPRESA').AsInteger:=qclientes2ide.AsInteger;
   qalumnosclientes2.open;
   qgruposclientes2.close;
   qgruposclientes2.ParamByName('CLIENTE').Asinteger:=qclientes2id.AsInteger;
   qgruposclientes2.ParamByName('EMPRESA').Asinteger:=qclientes2ide.AsInteger;
   qgruposclientes2.ParamByName('ACTIVO').AsString:=activo;
   qgruposclientes2.open;
end;

procedure Trecibos_s.dsqclientesDataChange(Sender: TObject; Field: TField);
begin
   qalumnosclientes.Prepare;
   qalumnosclientes.ParamByName('CLIENTE').AsInteger:=qclientesid.AsInteger;
   qalumnosclientes.ParamByName('EMPRESA').AsInteger:=qclienteside.AsInteger;
   qalumnosclientes.Refresh;
   qgruposclientes.Prepare;
   qgruposclientes.ParamByName('CLIENTE').Asinteger:=qclientesid.AsInteger;
   qgruposclientes.ParamByName('EMPRESA').Asinteger:=qclienteside.AsInteger;
   qgruposclientes.refresh;
   qreciboscliente.Prepare;
   qreciboscliente.ParamByName('CLIENTE').Asstring:=qclientesid.Asstring;
   qreciboscliente.ParamByName('EMPRESA').Asinteger:=qclienteside.AsInteger;
   qreciboscliente.refresh;
end;

procedure Trecibos_s.dsqgruposclientes2DataChange(Sender: TObject;
  Field: TField);
begin
  if recibos.State in [dsedit,dsinsert] then
  begin
     recibosimporte.Value:=qgruposclientes2preciomensual.asfloat;
     recibosimportefinal.Value:=recibosimporte.AsFloat-((recibosimporte.AsFloat*recibosdescuento.AsFloat)/100);
     recibosentrega.Value:=recibosimportefinal.AsFloat;
  end;

end;

procedure Trecibos_s.dsqreciboscliente2DataChange(Sender: TObject;
  Field: TField);
begin
    if recibos.State in [dsedit,dsinsert] then btrguardar.Click;
    recibos.Prepare;
    recibos.ParamByName('PRECIBO').AsInteger:=qreciboscliente2id.asinteger;
    recibos.Refresh;

end;

procedure Trecibos_s.dsqrecibosclienteDataChange(Sender: TObject;
  Field: TField);
begin
    if recibos.State in [dsedit,dsinsert] then btrguardar.Click;

    recibos.Prepare;
    recibos.ParamByName('PRECIBO').AsInteger:=qrecibosclienteid.asinteger;
    recibos.Refresh;
   // tbuscarclientesrecibos.Text:=qrecibosclientecliente.asstring;
end;

procedure Trecibos_s.dsrecibosStateChange(Sender: TObject);
begin
   if recibos.State in [dsedit,dsinsert] then
   begin
       btrnuevo.Enabled:=false;
       btrborrar.Enabled:=false;
       btrmodificar.Enabled:=false;
       btrguardar.Enabled:=true;
       btrcancelar.Enabled:=true;
       Precibosdatos.Enabled:=true;
       panel12.Enabled:=false;
   end else
   begin
       btrnuevo.Enabled:=true;
       btrborrar.Enabled:=true;
       btrmodificar.Enabled:=true;
       btrguardar.Enabled:=false;
       btrcancelar.Enabled:=false;
       Precibosdatos.Enabled:=false;
       panel12.Enabled:=true;
   end;
end;

procedure Trecibos_s.FormKeyPress(Sender: TObject; var Key: Char);
begin
    if not (activecontrol is tdbMemo) then
    begin
      key:=upcase(key);

    end;
    if (key='.') and (activecontrol is tdbedit) then
    begin
       key:=','
    end;
    if (key='.') and (activecontrol is tdbgrid) then
    begin
        key:=',';
    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;

    if (key ='.')
    //and (DMGS.CDSQ_mdalbaran.State in [dsedit,dsinsert])
    and (activecontrol is tdbedit)
    then
      if (activecontrol is tdbedit) then
          key := ',';
    if (ActiveControl=nil) and (key=#13) then
    begin
        Perform(WM_NextDLGCtl, 0, 0);
        key:=#0;
    end;

end;

procedure Trecibos_s.FormShow(Sender: TObject);
var F: TextFile;
    sLinea,thost,tuser,tpass: String;
    hora1,hora2,hora3:ttime;
    configuracion:array of string;
    linea,x:integer;

begin
  inherited;
  AssignFile( F, ExtractFilePath( Application.ExeName ) + 'config.ini' );
  Reset( F );
  linea:=1;
  setlength (configuracion,6);
  for x:=1 to 5 do
  begin
    ReadLn( F, sLinea );
    configuracion[linea]:=sLinea;
    linea:=linea+1;
  end;

  CloseFile( F );
    thost:=configuracion[1];
    tuser:=configuracion[2];
    tpass:=configuracion[3];
    tprinter:=configuracion[4];
    tprinter2:=configuracion[5];

   if todosclientesrecibos.Checked then vertodos:='%' else vertodos:='1';
   qalumnosclientes.Open;
   qgruposclientes.Open;
   qalumnosclientes2.Open;
   qgruposclientes2.Open;
   qclientes2.Open;
   recibos.Open;
   qreciboscliente.open;
   qreciboscliente2.open;
   formaspago.Open;
   qclientes.Open;

end;

procedure Trecibos_s.sdelclienteClick(Sender: TObject);
begin
    tbuscarclientesrecibos.SetFocus;
    tbuscarclientesrecibos.Text:=qrecibosclientecliente.AsString;
end;

procedure Trecibos_s.ssincobrarClick(Sender: TObject);
var recibo:integer;
begin
    dbgrid1.DataSource:=dsqreciboscliente2;
    dbgrid1.Columns[3].FieldName:='cliente';
    dbgrid1.Columns[3].Title.caption :='Cliente';
    recibo:=recibosid.AsInteger ;
    qreciboscliente2.close;
    qreciboscliente2.ParamByName('EMPRESA').AsInteger:=1;
    qreciboscliente2.ParamByName('PAGADO').AsString:='0';
    qreciboscliente2.ParamByName('DOMICILIADO').AsString:='%';
    qreciboscliente2.open;
    qreciboscliente2.Locate('id',recibo,[locaseinsensitive]);
end;

procedure Trecibos_s.sdomiciliadosClick(Sender: TObject);
begin
    dbgrid1.DataSource:=dsqreciboscliente2;
    dbgrid1.Columns[3].FieldName:='cliente';
    dbgrid1.Columns[3].Title.caption :='Cliente';
    qreciboscliente2.Prepare;
    qreciboscliente2.ParamByName('EMPRESA').AsInteger:=1;
    qreciboscliente2.ParamByName('PAGADO').AsString:='%';
    qreciboscliente2.ParamByName('DOMICILIADO').AsString:='1';
    qreciboscliente2.Refresh;

end;

procedure Trecibos_s.stodosClick(Sender: TObject);
begin
    dbgrid1.DataSource:=dsqreciboscliente2;
    dbgrid1.Columns[3].FieldName:='cliente';
    dbgrid1.Columns[3].Title.caption :='Cliente';
    qreciboscliente2.Prepare;
    qreciboscliente2.ParamByName('EMPRESA').AsInteger:=1;
    qreciboscliente2.ParamByName('PAGADO').AsString:='%';
    qreciboscliente2.ParamByName('DOMICILIADO').AsString:='%';
    qreciboscliente2.Refresh;

end;

procedure Trecibos_s.recibosfechacobroValidate(Sender: TField);
begin
   if recibosfechacobro.asstring='  /  /  ' then
   begin
      recibosfechacobro.value := null;
   end;
end;

procedure Trecibos_s.recibosfechareciboValidate(Sender: TField);
begin
   if recibosfecharecibo.asstring='  /  /  ' then
   begin
      recibosfecharecibo.value := null;
   end;
end;

procedure Trecibos_s.tbuscarclientesrecibosEnter(Sender: TObject);
begin
    tbuscarclientesrecibos.Text:='';
end;

procedure Trecibos_s.tbuscarclientesrecibosExit(Sender: TObject);
begin
    if tbuscarclientesrecibos.text<>'' then
    begin
        filtro:='%'+tbuscarclientesrecibos.Text+'%';

    end else filtro:='%';
   if todosclientesrecibos.Checked then vertodos:='%' else vertodos:='1';
//   qclientes.Close;
   qclientes.Prepare;
   qclientes.ParamByName('NOMBRE').AsString:=filtro;
   qclientes.ParamByName('ACTIVO').AsString:=VERTODOS;
   qclientes.ParamByName('IDC').AsInteger:=-1;
   qclientes.refresh;
   dbgrid1.DataSource:=dsqreciboscliente;
   dbgrid1.Columns[3].FieldName:='alumno';
   dbgrid1.Columns[3].Title.caption :='Alumno';
   //sdelcliente.Checked:=true;
end;

end.
