unit fcrearalbaran;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Data.DB, ZAbstractRODataset, ZDataset,
  Vcl.StdCtrls, Vcl.Mask, Vcl.DBCtrls, Vcl.ExtCtrls, Vcl.Grids, Vcl.DBGrids,
  Vcl.ComCtrls;

type
  Tcrearalbaran = class(TForm)
    qtipoiva: TZReadOnlyQuery;
    qactualizarserie: TZReadOnlyQuery;
    qlineasalbaran: TZReadOnlyQuery;
    qinsertaralbaran: TZReadOnlyQuery;
    qdestinos: TZReadOnlyQuery;
    qclientes: TZReadOnlyQuery;
    DBGrid1: TDBGrid;
    Panel1: TPanel;
    comboserie: TDBLookupComboBox;
    Label1: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    dsqseries: TDataSource;
    qseries: TZReadOnlyQuery;
    qserieside: TIntegerField;
    qseriesid: TWideStringField;
    qseriesfechainicio: TDateField;
    qseriesfechafin: TDateField;
    qseriesnum_pedcliente: TIntegerField;
    qseriesnum_albaran: TIntegerField;
    qseriesnum_factura: TIntegerField;
    qseriesnum_expedicion: TIntegerField;
    qseriesnum_pedproveedor: TIntegerField;
    qseriesimp_albaran: TWideStringField;
    qseriesimp_factura: TWideStringField;
    qseriesactivo: TIntegerField;
    qseriesnum_presupuesto: TIntegerField;
    qseriesseriecontable: TWideStringField;
    vfecha: TDateTimePicker;
    qclientesid: TIntegerField;
    qclientesIdempresa: TIntegerField;
    qclientesnif: TWideStringField;
    qclientesnombre: TWideStringField;
    qclientesnombre_corto: TWideStringField;
    qclientesdireccion: TWideStringField;
    qclientespoblacion: TWideStringField;
    qclientescodpost: TWideStringField;
    qclientesprovincia: TWideStringField;
    qclientestelefono: TWideStringField;
    qclientestelefono2: TWideStringField;
    qclientesmovil: TWideStringField;
    qclientesemail: TWideStringField;
    qclientespersonacontacto: TWideStringField;
    qclientescodigomercado: TIntegerField;
    qclientesactivo: TIntegerField;
    qclientesobservaciones: TWideStringField;
    qclientesccontable: TIntegerField;
    qclientesdescuento: TFloatField;
    qclientespais: TWideStringField;
    qclientesidformapago: TIntegerField;
    qclientesexento_iva: TIntegerField;
    qclientescomision: TFloatField;
    qclientesidcp: TIntegerField;
    qclientestipocliente: TWideStringField;
    qclientesusa_re: TIntegerField;
    qclientesean: TWideStringField;
    qdestinoscodigo: TWideStringField;
    qdestinosidcliente: TIntegerField;
    qdestinosidempresa: TIntegerField;
    qdestinosdescripcion: TWideStringField;
    qdestinosseleccionado: TIntegerField;
    qdestinosactivo: TIntegerField;
    qdestinosdireccion: TWideStringField;
    qdestinospoblacion: TWideStringField;
    qdestinoscodpost: TWideStringField;
    qdestinosprovincia: TWideStringField;
    qdestinospais: TWideStringField;
    qdestinosean: TWideStringField;
    Button1: TButton;
    Edit1: TEdit;
    qtipoivatipo: TIntegerField;
    dsqlineasalbaran: TDataSource;
    qlineasalbaranidempresa: TIntegerField;
    qlineasalbarandescripcion: TWideStringField;
    qlineasalbarancal: TWideStringField;
    qlineasalbaranlote: TIntegerField;
    qlineasalbaranbultos: TIntegerField;
    qlineasalbarancantidad: TFloatField;
    qlineasalbarandescuento: TWideStringField;
    qlineasalbarantotaldescuento: TWideStringField;
    qlineasalbaranbase: TWideStringField;
    qlineasalbaraniva: TWideStringField;
    qlineasalbarantotal: TWideStringField;
    qlineasalbaransscc: TWideStringField;
    qlineasalbaranidea: TIntegerField;
    qlineasalbaranpalets: TIntegerField;
    qpalets: TZReadOnlyQuery;
    qpaletspalets: TLargeintField;
    qinsertarlineasalbaran: TZReadOnlyQuery;
    qactualizaridnumalbaran: TZReadOnlyQuery;
    qactualizarlinpedidonumalbaran: TZReadOnlyQuery;
    qactualizaralbaran: TZReadOnlyQuery;
    qtotalesalbaran: TZReadOnlyQuery;
    qtotalesalbaranpesobruto: TFloatField;
    qtotalesalbaranpesoneto: TFloatField;
    qtotalesalbaranpesonetoteorico: TFloatField;
    qtotalesalbarannumpalets: TLargeintField;
    qlineasalbaranprecio: TFloatField;
    qlineaspedido: TZReadOnlyQuery;
    dsqlineaspedido: TDataSource;
    qlineaspedidoidempresa: TIntegerField;
    qlineaspedidopalets: TIntegerField;
    qlineaspedidoidea: TWideStringField;
    qlineaspedidodescripcion: TWideStringField;
    qlineaspedidocal: TWideStringField;
    qlineaspedidolote: TWideStringField;
    qlineaspedidobultos: TFloatField;
    qlineaspedidocantidad: TFloatField;
    qlineaspedidoprecio: TFloatField;
    qlineaspedidodescuento: TWideStringField;
    qlineaspedidototaldescuento: TWideStringField;
    qlineaspedidobase: TWideStringField;
    qlineaspedidotipoiva: TWideStringField;
    qlineaspedidoiva: TWideStringField;
    qlineaspedidototal: TWideStringField;
    qlineaspedidosscc: TWideStringField;
    qlineaspedidopesobruto: TFloatField;
    qlineasalbarantipoiva: TWideStringField;
    qlineasalbaranidalbaran: TWideStringField;
    qlineasalbaranidfactura: TWideStringField;
    qlineasalbaranpeso_bruto: TFloatField;
    qtotalespedido: TZReadOnlyQuery;
    qtotalespedidopesobruto: TFloatField;
    qtotalespedidopesoneto: TFloatField;
    qtotalespedidopesonetoteorico: TFloatField;
    qtotalespedidonumpalets: TFloatField;
    qlineaspedidodesc_envase: TWideStringField;
    qlineaspedidoref: TWideStringField;
    qlineaspedidoean: TWideStringField;
    qlineaspedidodesc_pais: TWideStringField;
    qlineaspedidounidadescaja: TIntegerField;
    insertarlotes: TZReadOnlyQuery;
    insertarpalets: TZReadOnlyQuery;
    qlineaspedidoidalbaran: TWideStringField;
    qlineaspedidoidfactura: TWideStringField;
    qlineaspedidoid: TIntegerField;
    borrarlineaalbaran: TZReadOnlyQuery;
    procedure FormShow(Sender: TObject);
    procedure Button1Click(Sender: TObject);
    procedure dsqseriesDataChange(Sender: TObject; Field: TField);
  private
    { Private declarations }
  public
    { Public declarations }
    var vidempresa,vidcliente,vpedido:integer;
        viddestino:string;
  end;

var
  crearalbaran: Tcrearalbaran;

implementation

{$R *.dfm}

uses fpedidos;

procedure Tcrearalbaran.Button1Click(Sender: TObject);
var vsscc,albaran:string;
    vpalets,num_palet,posicion,id:integer;
    vtipo_iva, vbase_lin, viva_lin: Double;
begin
  try
    if qlineaspedidoidalbaran.AsString='' then
    begin
    albaran:=edit1.Text;
    qinsertaralbaran.Prepare;
    qinsertaralbaran.ParamByName('serie').AsString:=qseriesid.AsString;
    qinsertaralbaran.ParamByName('id').Asinteger:=strtoint(albaran);
    qinsertaralbaran.ParamByName('idempresa').Asinteger:=vidempresa;
    qinsertaralbaran.ParamByName('iddestino').Asstring:=viddestino;
    qinsertaralbaran.ParamByName('idcliente').Asinteger:=vidcliente;
    qinsertaralbaran.ParamByName('nif').AsString:=qclientesnif.AsString;
    qinsertaralbaran.ParamByName('direccion').AsString:=qclientesdireccion.AsString;
    qinsertaralbaran.ParamByName('poblacion').AsString:=qclientespoblacion.AsString;
    qinsertaralbaran.ParamByName('provincia').AsString:=qclientesprovincia.AsString;
    qinsertaralbaran.ParamByName('codpost').AsString:=qclientescodpost.AsString;
    qinsertaralbaran.ParamByName('fecha').Asdate:=pedidos.dtpedidosfecha_carga.AsDateTime;//vfecha.Date;
    qinsertaralbaran.ParamByName('nomcliente').AsString:=qclientesnombre.AsString;
    qinsertaralbaran.ParamByName('paiscliente').AsString:=qclientespais.AsString;
    qinsertaralbaran.ParamByName('nomdestino').AsString:=qdestinosdescripcion.asstring;
    qinsertaralbaran.ParamByName('direcciondestino').AsString:=qdestinosdireccion.asstring;
    qinsertaralbaran.ParamByName('poblaciondestino').AsString:=qdestinospoblacion.asstring;
    qinsertaralbaran.ParamByName('codpostdestino').AsString:=qdestinoscodpost.asstring;
    qinsertaralbaran.ParamByName('provinciadestino').AsString:=qdestinosprovincia.asstring;
    qinsertaralbaran.ParamByName('paisdestino').AsString:=qdestinospais.asstring;
    qinsertaralbaran.ParamByName('pedido').AsString:=pedidos.dtpedidospedidocliente.asstring;
    qinsertaralbaran.ExecSQL;
    end else
    begin
       albaran:=qlineaspedidoidalbaran.AsString;
       posicion:= pos('/',albaran);
       if posicion>0 then
       begin
         albaran:= copy(albaran,posicion +1 ,length(albaran));
       end;

    end;
  finally

    if qseriesnum_albaran.AsInteger=strtoint(albaran) then
    begin
      qactualizarserie.Prepare;
      qactualizarserie.ParamByName('IDEMPRESA').AsInteger:=qserieside.Asinteger;
      qactualizarserie.ParamByName('IDSERIE').Asstring:=qseriesid.AsString;
      qactualizarserie.ExecSQL;
    end;

  end;
  try
    qpalets.Prepare;
    qpalets.ParamByName('IDEMPRESA').AsInteger:=vidempresa;
    qpalets.ParamByName('IDPEDIDO').AsInteger:=vpedido;
    qpalets.Open;
    num_palet:=1;
    vpalets:=qpaletspalets.asinteger;
    vsscc:=qlineasalbaransscc.AsString;
    if (qtipoiva.Active) and (not qtipoiva.IsEmpty) and (not qtipoivatipo.IsNull) then
      vtipo_iva := qtipoivatipo.AsFloat
    else
      vtipo_iva := 0;

    if qlineasalbaran.RecordCount>0 then
    begin
    id:=0;
    while not qlineasalbaran.Eof do
    begin
      qinsertarlineasalbaran.Prepare;
      qinsertarlineasalbaran.ParamByName('vserie').AsString:=qseriesid.AsString;
      qinsertarlineasalbaran.ParamByName('vidempresa').Asinteger:=vidempresa;
      qinsertarlineasalbaran.ParamByName('vidalbaran').Asinteger:=strtoint(albaran);
      qinsertarlineasalbaran.ParamByName('vidarticulo').Asinteger:=qlineasalbaranidea.AsInteger;
      qinsertarlineasalbaran.ParamByName('vdescripcion').AsString:=qlineasalbarandescripcion.Asstring;
      qinsertarlineasalbaran.ParamByName('vcal').AsString:=qlineasalbarancal.Asstring;
      qinsertarlineasalbaran.ParamByName('vlote').AsString:=qlineasalbaranlote.Asstring;
      if vsscc<>qlineasalbaransscc.AsString then
      begin
       num_palet:=num_palet+1;
       vsscc:=qlineasalbaransscc.AsString;
      end;
      qinsertarlineasalbaran.ParamByName('vpalets').Asinteger:=num_palet;
      if id<>qlineasalbaranidea.AsInteger then
      begin
        qinsertarlineasalbaran.ParamByName('vbultos').Asinteger:=qlineasalbaranbultos.Asinteger;
      end else qinsertarlineasalbaran.ParamByName('vbultos').Asinteger:=0;
      qinsertarlineasalbaran.ParamByName('vcantidad').asfloat:=qlineasalbarancantidad.Asfloat;
      qinsertarlineasalbaran.ParamByName('vpesobruto').asfloat:=qlineasalbaranpeso_bruto.Asfloat;
      qinsertarlineasalbaran.ParamByName('vprecio').Asfloat:=qlineasalbaranprecio.Asfloat;
      qinsertarlineasalbaran.ParamByName('vdescuento').Asfloat:=0;
      qinsertarlineasalbaran.ParamByName('vtotaldescuento').Asfloat:=0;
      vbase_lin := qlineasalbarancantidad.AsFloat * qlineasalbaranprecio.AsFloat;
      viva_lin := vbase_lin * (vtipo_iva / 100.0);
      qinsertarlineasalbaran.ParamByName('vbase').AsFloat := vbase_lin;
      qinsertarlineasalbaran.ParamByName('vtipoiva').AsFloat := vtipo_iva;
      qinsertarlineasalbaran.ParamByName('viva').AsFloat := viva_lin;
      qinsertarlineasalbaran.ParamByName('vtotal').AsFloat := vbase_lin;
      qinsertarlineasalbaran.ParamByName('venvase').Asstring:='';
      qinsertarlineasalbaran.ParamByName('vreferencia').Asstring:='';
      qinsertarlineasalbaran.ParamByName('vean').Asstring:='';
      qinsertarlineasalbaran.ParamByName('vpais').Asstring:='';
      qinsertarlineasalbaran.ParamByName('vunidadescaja').AsInteger:=0;
      qinsertarlineasalbaran.ExecSQL;
      id:=qlineasalbaranidea.AsInteger;
      qlineasalbaran.Next;
      end;
      qlineaspedido.First;
      while not qlineaspedido.Eof do
      begin
        borrarlineaalbaran.prepare;
        borrarlineaalbaran.ParamByName('serie').AsString:=qseriesid.AsString;
        borrarlineaalbaran.ParamByName('albaran').AsInteger:=strtoint(albaran);
        borrarlineaalbaran.ParamByName('id').Asstring:=qlineaspedidoid.AsString;
        borrarlineaalbaran.execsql;
        qlineaspedido.Next;
      end;

    end;
    if qlineasalbaran.RecordCount=0 then
    begin
    while not qlineaspedido.Eof do
    begin
      qinsertarlineasalbaran.Prepare;
      qinsertarlineasalbaran.ParamByName('vserie').AsString:=qseriesid.AsString;
      qinsertarlineasalbaran.ParamByName('vidempresa').Asinteger:=vidempresa;
      qinsertarlineasalbaran.ParamByName('vidalbaran').Asinteger:=strtoint(albaran);
      qinsertarlineasalbaran.ParamByName('vidarticulo').Asinteger:=qlineaspedidoid.AsInteger;
      qinsertarlineasalbaran.ParamByName('vdescripcion').AsString:=qlineaspedidodescripcion.Asstring;
      qinsertarlineasalbaran.ParamByName('vcal').AsString:='';
      qinsertarlineasalbaran.ParamByName('vlote').AsString:='';
      if vsscc<>qlineaspedidosscc.AsString then
      begin
       num_palet:=num_palet+1;
       vsscc:=qlineaspedidosscc.AsString;
      end;
      qinsertarlineasalbaran.ParamByName('vpalets').Asinteger:=qlineaspedidopalets.Asinteger;
      qinsertarlineasalbaran.ParamByName('vbultos').Asinteger:=qlineaspedidobultos.Asinteger;
      qinsertarlineasalbaran.ParamByName('vcantidad').asfloat:=qlineaspedidocantidad.Asfloat;
      qinsertarlineasalbaran.ParamByName('vpesobruto').asfloat:=qlineaspedidopesobruto.Asfloat+qlineaspedidocantidad.Asfloat;
      qinsertarlineasalbaran.ParamByName('vprecio').Asfloat:=qlineaspedidoprecio.Asfloat;
      qinsertarlineasalbaran.ParamByName('vdescuento').Asfloat:=0;
      qinsertarlineasalbaran.ParamByName('vtotaldescuento').Asfloat:=0;
      vbase_lin := qlineaspedidocantidad.AsFloat * qlineaspedidoprecio.AsFloat;
      viva_lin := vbase_lin * (vtipo_iva / 100.0);
      qinsertarlineasalbaran.ParamByName('vbase').AsFloat := vbase_lin;
      qinsertarlineasalbaran.ParamByName('vtipoiva').AsFloat := vtipo_iva;
      qinsertarlineasalbaran.ParamByName('viva').AsFloat := viva_lin;
      qinsertarlineasalbaran.ParamByName('vtotal').AsFloat := vbase_lin;
      qinsertarlineasalbaran.ParamByName('venvase').Asstring:=qlineaspedidodesc_envase.asstring;
      qinsertarlineasalbaran.ParamByName('vreferencia').Asstring:=qlineaspedidoref.asstring;
      qinsertarlineasalbaran.ParamByName('vean').Asstring:=qlineaspedidoean.Asstring;
      qinsertarlineasalbaran.ParamByName('vpais').Asstring:=qlineaspedidodesc_pais.asstring;
      qinsertarlineasalbaran.ParamByName('vunidadescaja').AsInteger:=qlineaspedidounidadescaja.asInteger;
      qinsertarlineasalbaran.ExecSQL;
      qlineaspedido.Next;
      end;
    end;

  finally
    qpalets.Close;
    qactualizaridnumalbaran.Prepare;
    qactualizaridnumalbaran.ParamByName('IDALBARAN').AsString:=qseriesid.AsString+'/'+albaran;
    qactualizaridnumalbaran.ParamByName('PEDIDO').AsInteger:=vpedido;
    qactualizaridnumalbaran.ExecSQL;
    qactualizarlinpedidonumalbaran.Prepare;
    qactualizarlinpedidonumalbaran.ParamByName('IDALBARAN').AsString:=qseriesid.AsString+'/'+albaran;
    qactualizarlinpedidonumalbaran.ParamByName('PEDIDO').AsInteger:=vpedido;
    qactualizarlinpedidonumalbaran.ExecSQL;
    if qlineasalbaran.RecordCount>0 then
    begin
    qtotalesalbaran.Close;
    qtotalesalbaran.Prepare;
    qtotalesalbaran.ParamByName('albaran').AsString:=qseriesid.AsString+'/'+albaran;
    qtotalesalbaran.ParamByName('empresa').AsInteger:=vidempresa;
    qtotalesalbaran.Open;
    qactualizaralbaran.Prepare;
    qactualizaralbaran.ParamByName('pesobruto').AsFloat:=qtotalesalbaranpesobruto.asfloat;
    qactualizaralbaran.ParamByName('kilos').AsFloat:=qtotalesalbaranpesoneto.asfloat;
    qactualizaralbaran.ParamByName('kilosventa').AsFloat:=qtotalesalbaranpesonetoteorico.asfloat;
    qactualizaralbaran.ParamByName('numpalets').Asinteger:=qtotalesalbarannumpalets.asinteger;
    qactualizaralbaran.ParamByName('serie').Asstring:=qseriesid.AsString;
    qactualizaralbaran.ParamByName('albaran').Asinteger:=strtoint(albaran);
    qactualizaralbaran.ParamByName('empresa').Asinteger:=vidempresa;
    qactualizaralbaran.ExecSQL;
    end;
    if qlineasalbaran.RecordCount=0 then
    begin
    qtotalespedido.Close;
    qtotalespedido.Prepare;
    qtotalespedido.ParamByName('serie').AsString:=qseriesid.AsString;
    qtotalespedido.ParamByName('albaran').AsString:=edit1.Text;
    qtotalespedido.ParamByName('empresa').AsInteger:=vidempresa;
    qtotalespedido.Open;

    qactualizaralbaran.Prepare;
    qactualizaralbaran.ParamByName('pesobruto').AsFloat:=qtotalespedidopesobruto.asfloat;
    qactualizaralbaran.ParamByName('kilos').AsFloat:=qtotalespedidopesoneto.asfloat;
    qactualizaralbaran.ParamByName('kilosventa').AsFloat:=qtotalespedidopesonetoteorico.asfloat;
    qactualizaralbaran.ParamByName('numpalets').Asinteger:=qtotalespedidonumpalets.asinteger;
    qactualizaralbaran.ParamByName('serie').Asstring:=qseriesid.AsString;
    qactualizaralbaran.ParamByName('albaran').Asinteger:=strtoint(albaran);
    qactualizaralbaran.ParamByName('empresa').Asinteger:=vidempresa;
    qactualizaralbaran.ExecSQL;
    end;

  end;

  if qlineasalbaran.RecordCount=0 then
  begin
    insertarlotes.Prepare;
    insertarlotes.ParamByName('serie').AsString:=qseriesid.AsString;
    insertarlotes.ParamByName('albaran').AsString:=albaran;
    insertarlotes.ParamByName('empresa').AsInteger:=vidempresa;
    insertarlotes.ExecSQL;
    insertarpalets.Prepare;
    insertarpalets.ParamByName('serie').AsString:=qseriesid.AsString;
    insertarpalets.ParamByName('albaran').AsString:=albaran;
    insertarpalets.ParamByName('empresa').AsInteger:=vidempresa;
    insertarpalets.ExecSQL;
  end;
  qlineasalbaran.Refresh;
  showmessage('EL ALBARAN '+QSERIESID.AsString+'/'+albaran+' HA SIDO CREADO CORRECTAMENTE');
end;

procedure Tcrearalbaran.dsqseriesDataChange(Sender: TObject; Field: TField);
begin
   edit1.Text:=qseriesnum_albaran.AsString;
   qlineasalbaran.Close;
   qlineasalbaran.Prepare;
   qlineasalbaran.ParamByName('PEDIDO').AsInteger:=vpedido;
   qlineasalbaran.Open;
   qlineaspedido.Close;
   qlineaspedido.Prepare;
   qlineaspedido.ParamByName('PEDIDO').AsInteger:=vpedido;
   qlineaspedido.Open;
   if qlineasalbaran.RecordCount=0 then
   begin
     dsqlineasalbaran.DataSet:=qlineaspedido;
   end;

end;

procedure Tcrearalbaran.FormShow(Sender: TObject);
begin
  vfecha.Date:=date();
  qseries.Prepare;
  qseries.ParamByName('IDEMPRESA').AsInteger:=vidempresa;
  qseries.Open;
  comboserie.KeyValue:=qseriesid.AsString;
  qclientes.Prepare;
  qclientes.ParamByName('IDEMPRESA').AsInteger:=vidempresa;
  qclientes.ParamByName('IDCLIENTE').AsInteger:=vidcliente;
  qclientes.Open;
  qdestinos.Prepare;
  qdestinos.ParamByName('IDEMPRESA').AsInteger:=vidempresa;
  qdestinos.ParamByName('IDCLIENTE').AsInteger:=vidcliente;
  qdestinos.ParamByName('IDDESTINO').Asstring:=viddestino;
  qdestinos.Open;
  qtipoiva.Close;
  qtipoiva.Prepare;
  qtipoiva.ParamByName('IDEMPRESA').AsInteger:=vidempresa;
  qtipoiva.ParamByName('IDCLIENTE').AsInteger:=vidcliente;
  qtipoiva.Open;
end;

end.
