unit uBizInventario; interface uses uDAInterfaces, uDADataTable, schInventarioClient_Intf, uBizArticulosProveedor, uDBSelectionListUtils; { uDAInterfaces, uDADataTable, schArticulosClient_Intf, Classes, DBGrids, uDBSelectionList, DB, uExceptions, Controls, uBizMontajes, uBizPedidosProveedor; } const BIZ_CLIENT_INVENTARIO = 'Client.Inventario'; type IBizInventario = interface(IInventario) ['{12051CDB-9BB1-43C5-AC89-181A27A35513}'] function GetIDAlmacenEntrada: Integer; procedure SetIDAlmacenEntrada(const Value: Integer); property IDAlmacenEntrada: Integer read GetIDAlmacenEntrada write SetIDAlmacenEntrada; function EsNuevo : Boolean; procedure Copiar(AArticulo: IBizArticuloProveedor); function GetSelectedRecords: ISelectedRecords; property SelectedRecords : ISelectedRecords read GetSelectedRecords; { procedure RecibirArticulos(Const APedido: IBizPedidosProveedor; Const CodigoAlmacenDes: Integer); overload; procedure RecibirArticulos(Const CodigoAlmacenDes: Integer); overload; procedure GuardarArticulosUnitarios; function Trasladar: Boolean; function Liberar: Boolean; function Reservar(Const AMontaje: IBizMontaje): Boolean; overload; function Reservar(Const CodigoMontaje: Integer): Boolean; overload; function Eliminar: Boolean; function GetCodigoAlmacenEntrada: Integer; procedure SetCodigoAlmacenEntrada(const Value: Integer); property CodigoAlmacenEntrada: Integer read GetCodigoAlmacenEntrada write SetCodigoAlmacenEntrada; function GetPedido : IBizPedidosProveedor; procedure SetPedido (Const Value: IBizPedidosProveedor); property Pedido: IBizPedidosProveedor read GetPedido write SetPedido; function Show: TModalResult; function ShowForSelect : TModalResult; // procedure ShowAll; // procedure Preview; } end; TBizInventario = class(TInventarioDataTableRules, IBizInventario, ISelectedRecords) private FIDAlmacenEntrada : Integer; function GetSelected: Boolean; procedure SetSelected(const Value: Boolean); // FPedido : IBizPedidosProveedor; procedure OnNewRecord(Sender: TDADataTable); override; // procedure OnPostError(DataTable: TDADataTable; Error: EDatabaseError; // var Action: TDataAction); override; protected FSelectedRecords : TSelectedRecords; // function GetPedido : IBizPedidosProveedor; // procedure SetPedido (Const Value: IBizPedidosProveedor); function GetIDAlmacenEntrada: Integer; procedure SetIDAlmacenEntrada(const Value: Integer); // function GetSelectedRows : TSelectedRowList; virtual; // procedure ShowApplyUpdateFailed (const Error: EDAApplyUpdateFailed); virtual; public property IDAlmacenEntrada: Integer read GetIDAlmacenEntrada write SetIDAlmacenEntrada; constructor Create(aDataTable: TDADataTable); override; destructor Destroy; override; { destructor Destroy; override; function Show: TModalResult; function ShowForSelect : TModalResult; procedure RecibirArticulos(Const APedido: IBizPedidosProveedor; Const CodigoAlmacenDes: Integer); overload; procedure RecibirArticulos(Const CodigoAlmacenDes: Integer); overload; procedure GuardarArticulosUnitarios; function Trasladar: Boolean; function Liberar: Boolean; function Reservar(Const AMontaje: IBizMontaje): Boolean; overload; function Reservar(Const CodigoMontaje: Integer): Boolean; overload; function Eliminar: Boolean; property SelectedRows : TSelectedRowList read GetSelectedRows; property Pedido: IBizPedidosProveedor read GetPedido write SetPedido; } function EsNuevo : Boolean; procedure Copiar(AArticulo: IBizArticuloProveedor); function GetSelectedRecords: ISelectedRecords; property SelectedRecords : ISelectedRecords read GetSelectedRecords implements ISelectedRecords; property Selected : Boolean read GetSelected write SetSelected; end; implementation uses Dialogs, uDACDSDataTable, SysUtils; { uDataModuleUsuarios, uEditorUtils, uDataModuleArticulos, Variants, uBizImportesDetalleBase, uDataModuleAlmacenes, uBizAlmacenes, schPedidosProveedorClient_Intf, uEditorSituacionPedido, Forms, wIndows, uDataModuleMontajes; } { TBizInventario } procedure TBizInventario.Copiar(AArticulo: IBizArticuloProveedor); begin if not AArticulo.DataTable.Active then AArticulo.DataTable.Active := True; with AArticulo.DataTable do begin First; while not EOF do begin Self.DataTable.Insert; Self.ID_ALMACEN := IDAlmacenEntrada; Self.ID_ARTICULO := AArticulo.ID; Self.DESCRIPCION := AArticulo.DESCRIPCION; Self.CANTIDAD := 1; Self.DataTable.Post; Next; end; end; end; constructor TBizInventario.Create(aDataTable: TDADataTable); begin inherited; // FPedido := NIL; IDAlmacenEntrada := -1; FSelectedRecords := TSelectedRecords.Create(aDataTable); end; destructor TBizInventario.Destroy; begin FreeAndNIL(FSelectedRecords); inherited; end; {destructor TBizInventario.Destroy; begin FPedido := NIL; FSelectedRows.Free; inherited; end; function TBizInventario.GetSelectedRows: TSelectedRowList; begin Result := FSelectedRows; end; procedure TBizInventario.RecibirArticulos(Const APedido: IBizPedidosProveedor; Const CodigoAlmacenDes: Integer); var AArticulos: IBizArticulosAlmacen; ADetalles: IBizDetallesPedidoProveedor; begin try if APedido.DataTable.FieldByName(fld_PedidosProveedorCODIGOALMACEN).IsNull then begin MessageBox(0, 'En el pedido que ha elegido no figura ningún almacén como destino.' + #10#13 + 'Si desea recibir este pedido en algún almacén' + #10#13 + 'modifique antes el pedido para indicarlo.', 'Atención', MB_ICONWARNING or MB_OK); Exit; end; AArticulos := dmArticulos.GetItem(-1); if not AArticulos.DataTable.Active then AArticulos.DataTable.Active := True; ADetalles := APedido.Detalles; if Assigned(ADetalles) then begin ADetalles.First; while not ADetalles.EOF do begin if (ADetalles.TIPO = TIPODETALLE_CONCEPTO) and (Length(Trim(ADetalles.DESCRIPCION)) <> 0) then begin AArticulos.Insert; if not APedido.DataTable.FieldByName(fld_PedidosProveedorCODIGOALMACEN).IsNull then AArticulos.CODIGOALMACEN := APedido.CODIGOALMACEN; if not APedido.DataTable.FieldByName(fld_PedidosProveedorCODIGO).IsNull then AArticulos.CODIGOPEDIDO := APedido.CODIGO; if not APedido.DataTable.FieldByName(fld_PedidosProveedorCODIGOMONTAJE).IsNull then AArticulos.CODIGOMONTAJE := APedido.CODIGOMONTAJE; AArticulos.DESCRIPCION := ADetalles.DESCRIPCION; AArticulos.CANTIDAD := ADetalles.CANTIDAD; AArticulos.Post; end; ADetalles.Next; end; end; if APedido.DataTable.FieldByName(fld_PedidosProveedorCODIGOALMACEN).IsNull then AArticulos.CodigoAlmacenEntrada := CodigoAlmacenDes else begin AArticulos.CodigoAlmacenEntrada := APedido.CODIGOALMACEN; AArticulos.Pedido := APedido; end; if AArticulos.show = mrOK then begin with TfEditorSituacionPedido.Create(Nil) do try if (ShowModal = mrOk) then begin if rdxSituacion1.checked then APedido.CambiarSituacion(SITUACION_RECIBIDO) else APedido.CambiarSituacion(SITUACION_PARCIAL); end else showmessage('Pedido quedará con la misma situación con la que estaba antes de ser elegido'); finally Free; end; Self.DataTable.Refresh; end; finally AArticulos := Nil; end; end; function TBizInventario.Show: TModalResult; begin Result := ShowEditor(IBizArticulosAlmacen, Self, etItem); end; procedure TBizInventario.ShowApplyUpdateFailed( const Error: EDAApplyUpdateFailed); begin if (Pos(AUF_FKVIOLATION, Error.Message) > 0) then MessageBox(0, 'No se puede borrar este artículo porque asociado a algo', 'Atención', MB_ICONWARNING or MB_OK); end; } procedure TBizInventario.OnNewRecord(Sender: TDADataTable); begin inherited; ID := GetRecNo; // -1, -2, -3... // ID_EMPRESA := dmUsuarios.IDEmpresaActual; // USUARIO := dmUsuarios.LoginInfo.Usuario; { DESCRIPCION := 'Escriba aquí la descripción del artículo'; CODIGO := dmArticulos.GetNextAutoinc; if CodigoAlmacenEntrada <> -1 then CODIGOALMACEN := CodigoAlmacenEntrada; CANTIDAD := 1; } end; {function TBizInventario.Trasladar: Boolean; var AAlmacen: IBizAlmacen; AObj: TSelectedRowList; i: Integer; begin try AAlmacen := dmAlmacenes.GetItems; if AAlmacen.ShowForSelect = mrOk then begin AObj := Self.GetSelectedRows; Self.DataTable.DisableControls; for i:=0 to (AObj.Count -1) do begin Self.DataTable.GotoBookmark(AObj.Items[i]); Self.Edit; Self.CODIGOALMACEN := AAlmacen.CODIGO; Self.Post; end; Self.DataTable.EnableControls; Self.DataTable.ApplyUpdates; end; AAlmacen := Nil; except on E: EDAApplyUpdateFailed do begin Self.DataTable.CancelUpdates; showmessage('Error en el traslado'); AAlmacen := Nil; end; end; end; function TBizInventario.Liberar: Boolean; var AObj: TSelectedRowList; i: Integer; begin try AObj := Self.GetSelectedRows; Self.DataTable.DisableControls; for i:=0 to (AObj.Count -1) do begin Self.DataTable.GotoBookmark(AObj.Items[i]); Self.Edit; Self.datatable.FieldByName(fld_ARTICULOSCODIGOMontaje).AsVariant := Null; Self.Post; end; Self.DataTable.EnableControls; Self.DataTable.ApplyUpdates; except on E: EDAApplyUpdateFailed do begin Self.DataTable.CancelUpdates; showmessage('Error al liberar los artículos'); end; end; end; function TBizInventario.Reservar(const AMontaje: IBizMontaje): Boolean; var AObj: TSelectedRowList; i: Integer; begin try AObj := Self.GetSelectedRows; Self.DataTable.DisableControls; for i:=0 to (AObj.Count -1) do begin Self.DataTable.GotoBookmark(AObj.Items[i]); Self.Edit; Self.CODIGOMontaje := AMontaje.CODIGO; Self.Post; end; Self.DataTable.EnableControls; Self.DataTable.ApplyUpdates; except on E: EDAApplyUpdateFailed do begin Self.DataTable.CancelUpdates; showmessage('Error al reservar para la Montaje'); end; end; end; procedure TBizInventario.RecibirArticulos(Const CodigoAlmacenDes: Integer); var AArticulos: IBizArticulosAlmacen; begin try AArticulos := dmArticulos.GetItem(-1); if not AArticulos.DataTable.Active then AArticulos.DataTable.Active := True; AArticulos.CodigoAlmacenEntrada := CodigoAlmacenDes; AArticulos.Show; Self.DataTable.Refresh; finally AArticulos := Nil; end; end; procedure TBizInventario.GuardarArticulosUnitarios; var AArticulosUnitarios: IBizArticulosAlmacen; i: Integer; begin AArticulosUnitarios := dmArticulos.getItem(-1); if not AArticulosUnitarios.DataTable.Active then AArticulosUnitarios.DataTable.Active := True; Self.First; while not Self.DataTable.EOF do begin for i:=0 to (Self.CANTIDAD - 1) do begin AArticulosUnitarios.Insert; AArticulosUnitarios.CODIGOALMACEN := Self.CODIGOALMACEN; if not Self.DataTable.FieldByName(fld_ARTICULOSCODIGOPEDIDO).IsNull then AArticulosUnitarios.CODIGOPEDIDO := Self.CODIGOPEDIDO; if not Self.DataTable.FieldByName(fld_ARTICULOSCODIGOMONTAJE).IsNull then AArticulosUnitarios.CODIGOMONTAJE := Self.CODIGOMONTAJE; AArticulosUnitarios.DESCRIPCION := Self.DESCRIPCION; AArticulosUnitarios.Post; end; Self.Next; end; Self.DataTable.CancelUpdates; AArticulosUnitarios.DataTable.ApplyUpdates; end; function TBizInventario.Eliminar: Boolean; var AObj: TSelectedRowList; i: Integer; begin try AObj := Self.GetSelectedRows; Self.DataTable.DisableControls; for i:=0 to (AObj.Count -1) do begin Self.DataTable.GotoBookmark(AObj.Items[i]); Self.DataTable.Delete; end; Self.DataTable.EnableControls; Self.DataTable.ApplyUpdates; // Self.SelectedRows.Clear; // Self.SelectedRows.CurrentRowSelected := True; except on E: EDAApplyUpdateFailed do begin Self.DataTable.CancelUpdates; showmessage('Error al eliminar los artículos'); end; end; end; procedure TBizInventario.OnPostError( DataTable: TDADataTable; Error: EDatabaseError; var Action: TDataAction); begin inherited; Action := daAbort; if (Pos(AUF_HAVEVALUE, Error.Message) > 0) then begin if (Pos('almacén', Error.Message) > 0) then MessageBox(0, 'Debe indicar el almacén de destino', 'Atención', MB_ICONWARNING or MB_OK) else raise Error; end else raise Error; end; } function TBizInventario.EsNuevo: Boolean; begin Result := (ID < 0); end; function TBizInventario.GetIDAlmacenEntrada: Integer; begin Result := FIDAlmacenEntrada; end; function TBizInventario.GetSelected: Boolean; begin Result := FSelectedRecords.CurrentRowSelected; end; function TBizInventario.GetSelectedRecords: ISelectedRecords; begin Result := FSelectedRecords; end; procedure TBizInventario.SetIDAlmacenEntrada(const Value: Integer); begin FIDAlmacenEntrada := Value; end; procedure TBizInventario.SetSelected(const Value: Boolean); begin FSelectedRecords.CurrentRowSelected := True; end; { function TBizInventario.ShowForSelect: TModalResult; begin Result := ShowEditor(IBizArticulosAlmacen, Self, etSelectItems); end; function TBizInventario.Reservar(const CodigoMontaje: Integer): Boolean; var AMontaje: IBizMontaje; begin try AMontaje := dmMontajes.GetItem(CodigoMontaje); AMontaje.DataTable.Active := True; Reservar(AMontaje); finally AMontaje := Nil; end; end; function TBizInventario.GetPedido: IBizPedidosProveedor; begin Result := FPedido; end; procedure TBizInventario.SetPedido(const Value: IBizPedidosProveedor); begin FPedido := Value; end; } initialization RegisterDataTableRules(BIZ_CLIENT_INVENTARIO, TBizInventario); finalization end.