unit uViewPedidosCliente; interface uses uViewGrid, cxStyles, cxCustomData, cxGraphics, cxFilter, cxData, cxDataStorage, cxEdit, DB, cxDBData, dxPSGlbl, dxPSUtl, dxPSEngn, dxPrnPg, dxBkgnd, dxWrap, dxPrnDev, dxPSCompsProvider, dxPSFillPatterns, dxPSEdgePatterns, cxImageComboBox, ImgList, Controls, PngImageList, cxGridCustomTableView, cxGridTableView, cxGridDBTableView, cxGridCustomPopupMenu, cxGridPopupMenu, dxPSCore, dxPScxCommon, dxPScxGrid6Lnk, uDADataTable, cxGridLevel, cxClasses, cxControls, cxGridCustomView, Classes, cxGrid, uBizPedidosCliente, cxCurrencyEdit, Forms, uViewFiltroBase, ActnList, TB2Item, cxLookAndFeelPainters, dxPSPDFExportCore, dxPSPDFExport, cxDrawTextUtils, dxPSPrVwStd, dxPSPrVwAdv, dxPScxEditorProducers, dxPScxExtEditorProducers, dxPScxPageControlProducer, uDAInterfaces, SpTBXItem, SpTBXDkPanels, uCustomView, uViewBase, cxLookAndFeels, cxTextEdit, TB2Toolbar, TB2Dock; type IViewPedidosCliente = interface(IViewGrid) ['{96821714-55CF-4BC1-A0C1-16E027B2EF16}'] function GetPedidos: IBizPedidoCliente; procedure SetPedidos(const Value: IBizPedidoCliente); property Pedidos: IBizPedidoCliente read GetPedidos write SetPedidos; end; TfrViewPedidosCliente = class(TfrViewGrid, IViewPedidosCliente) cxGridDBTableView1: TcxGridDBTableView; PngImageList: TPngImageList; cxGridViewREFERENCIA: TcxGridDBColumn; cxGridViewINCIDENCIASACTIVAS: TcxGridDBColumn; cxGridViewNOMBRE: TcxGridDBColumn; cxGridViewSITUACION: TcxGridDBColumn; cxGridViewFECHA_PEDIDO: TcxGridDBColumn; cxGridViewCALLE: TcxGridDBColumn; cxGridViewCODIGO_POSTAL: TcxGridDBColumn; cxGridViewPOBLACION: TcxGridDBColumn; cxGridViewPROVINCIA: TcxGridDBColumn; cxGridViewPERSONA_CONTACTO: TcxGridDBColumn; cxGridViewTELEFONO: TcxGridDBColumn; cxGridViewIMPORTE_TOTAL: TcxGridDBColumn; cxGridLevelPendientes: TcxGridLevel; cxGridLevelEnProceso: TcxGridLevel; cxGridLevelServidor: TcxGridLevel; cxStylePENDIENTES: TcxStyle; cxStyleENPROCESO: TcxStyle; cxStyleSERVIDOS: TcxStyle; actCliente: TAction; actProvincia: TAction; cxGridViewTIENDAWEB: TcxGridDBColumn; cxGridViewFECHA_ENTREGA: TcxGridDBColumn; cxGridViewNUM_COPIAS: TcxGridDBColumn; cxGridViewNUM_CORREOS: TcxGridDBColumn; procedure cxGridActiveTabChanged(Sender: TcxCustomGrid; ALevel: TcxGridLevel); procedure cxGridViewCODIGOCustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); procedure cxGridViewStylesGetContentStyle(Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem; out AStyle: TcxStyle); procedure actClienteExecute(Sender: TObject); procedure actClienteUpdate(Sender: TObject); procedure actProvinciaExecute(Sender: TObject); procedure actProvinciaUpdate(Sender: TObject); procedure cxGridViewTIENDAWEBCustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); procedure cxGridViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); procedure cxGridViewNUM_CORREOSCustomDrawHeader(Sender: TcxGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean); procedure cxGridViewNUM_COPIASCustomDrawHeader(Sender: TcxGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean); procedure frViewFiltroBase1actQuitarFiltroExecute(Sender: TObject); procedure CustomViewShow(Sender: TObject); procedure CustomViewDestroy(Sender: TObject); procedure OnFiltroListaPropertiesChange(Sender: TObject); procedure OnFiltroListaPropertiesInitPopup(Sender: TObject); procedure CustomViewCreate(Sender: TObject); private //Filtros relativos a la vista procedure AnadirFiltroSituaciones; procedure AnadirFiltroFechas; procedure AnadirFiltroProvincia; protected FProvincias : TStringList; FPedidos: IBizPedidoCliente; function GetPedidos: IBizPedidoCliente; procedure SetPedidos(const Value: IBizPedidoCliente); procedure CargarProvincias; public procedure AnadirOtrosFiltros; override; property Pedidos: IBizPedidoCliente read GetPedidos write SetPedidos; end; implementation uses SysUtils, variants, windows, uDataModulePedidosCliente, schPedidosClienteClient_Intf, uViewGridBase, uProvinciasPoblacionesController, uStringsUtils; {$R *.dfm} procedure TfrViewPedidosCliente.actClienteExecute(Sender: TObject); begin if (cxGridViewNOMBRE.GroupIndex < 0) then begin cxGridViewNOMBRE.GroupIndex := cxGridView.GroupedColumnCount; cxGridViewNOMBRE.Visible := False; end else begin cxGridViewNOMBRE.GroupIndex := -1; cxGridViewNOMBRE.Visible := True; end; end; procedure TfrViewPedidosCliente.actClienteUpdate(Sender: TObject); begin inherited; (Sender as TAction).Checked := not (cxGridViewNOMBRE.GroupIndex < 0); end; procedure TfrViewPedidosCliente.actProvinciaExecute(Sender: TObject); begin if (cxGridViewPROVINCIA.GroupIndex < 0) then begin cxGridViewPROVINCIA.GroupIndex := cxGridView.GroupedColumnCount; cxGridViewPROVINCIA.Visible := False; end else begin cxGridViewPROVINCIA.GroupIndex := -1; cxGridViewPROVINCIA.Visible := True; end; end; procedure TfrViewPedidosCliente.actProvinciaUpdate(Sender: TObject); begin inherited; (Sender as TAction).Checked := not (cxGridViewPROVINCIA.GroupIndex < 0); end; procedure TfrViewPedidosCliente.AnadirFiltroFechas; var Columna: TcxGridDBColumn; Fecha1, Fecha2: Variant; FFiltro : TcxFilterCriteriaItemList; begin Fecha1 := frViewFiltroBase1.edtFechaIniFiltro.EditValue; Fecha2 := frViewFiltroBase1.edtFechaFinFiltro.EditValue; if not VarIsNull(Fecha1) and not VarIsNull(Fecha2) then begin cxGridView.DataController.Filter.Options := [fcoCaseInsensitive, fcoSoftCompare]; FFiltro := AddFilterGrid(fboAnd); Columna := (cxGridView as TcxGridDBTableView).GetColumnByFieldName('FECHA_PEDIDO'); FFiltro.AddItem(Columna, foBetween, varArrayOf([Fecha1, Fecha2]), VarToStr(Fecha1) + ' and ' + VarToStr(Fecha2)); end; end; procedure TfrViewPedidosCliente.AnadirFiltroProvincia; var FFiltro : TcxFilterCriteriaItemList; begin //Solo se aplica este filtro en el caso de tener activo el panel de detalle de filtro //y sobre la lista de pedidos if frViewFiltroBase1.Visible then begin if (VarToStr(frViewFiltroBase1.eLista.EditValue) <> 'Todos') then begin FFiltro := AddFilterGrid(fboAnd); FFiltro.AddItem(cxGridViewPROVINCIA, foEqual, VarToStr(frViewFiltroBase1.eLista.EditValue), VarToStr(frViewFiltroBase1.eLista.EditValue)); end; end; end; procedure TfrViewPedidosCliente.AnadirFiltroSituaciones; var FFiltro : TcxFilterCriteriaItemList; begin FFiltro := AddFilterGrid(fboAnd); case cxGrid.ActiveLevel.Index of 1 : FFiltro.AddItem(cxGridViewSITUACION, foEqual, SITUACION_PEDIDO_PENDIENTE, SITUACION_PEDIDO_PENDIENTE); 2 : FFiltro.AddItem(cxGridViewSITUACION, foEqual, SITUACION_PEDIDO_ENPROCESO, SITUACION_PEDIDO_ENPROCESO); 3 : FFiltro.AddItem(cxGridViewSITUACION, foEqual, SITUACION_PEDIDO_SERVIDO, SITUACION_PEDIDO_SERVIDO); end; end; procedure TfrViewPedidosCliente.AnadirOtrosFiltros; begin inherited; AnadirFiltroSituaciones; AnadirFiltroFechas; AnadirFiltroProvincia; //Finalmente activamos el filtro si tenemos algo if cxGridView.DataController.Filter.IsEmpty then cxGridView.DataController.Filter.Active := False else cxGridView.DataController.Filter.Active := True; cxGrid.ActiveLevel.GridView := cxGridView; end; procedure TfrViewPedidosCliente.CargarProvincias; var i : integer; begin with TProvinciasPoblacionesController.Create do try FProvincias := DarListaProvincias; with frViewFiltroBase1.eLista.Properties.Items do begin BeginUpdate; try Clear; Add('Todos'); //Case 0 for i := 0 to FProvincias.Count - 1 do Add(FProvincias.Names[i]); frViewFiltroBase1.eLista.ItemIndex := 0; finally EndUpdate; end; end; finally Free; end; end; procedure TfrViewPedidosCliente.CustomViewCreate(Sender: TObject); begin inherited; FProvincias := NIL; end; procedure TfrViewPedidosCliente.CustomViewDestroy(Sender: TObject); begin frViewFiltroBase1.eLista.Properties.OnChange := Nil; frViewFiltroBase1.eLista.Properties.OnInitPopup := Nil; if Assigned(FProvincias) then FreeANDNIL(FProvincias); inherited; end; procedure TfrViewPedidosCliente.CustomViewShow(Sender: TObject); begin inherited; frViewFiltroBase1.eLista.Properties.OnChange := OnFiltroListaPropertiesChange; frViewFiltroBase1.eLista.Properties.OnInitPopup := OnFiltroListaPropertiesInitPopup; end; procedure TfrViewPedidosCliente.cxGridActiveTabChanged(Sender: TcxCustomGrid; ALevel: TcxGridLevel); begin inherited; RefrescarFiltro; end; procedure TfrViewPedidosCliente.cxGridViewCODIGOCustomDrawCell(Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); var R: TRect; begin inherited; R := AViewInfo.ContentBounds; ACanvas.FillRect(R); ACanvas.DrawImage(PngImageList, R.Left, R.Top, 2); ADone := True; end; procedure TfrViewPedidosCliente.cxGridViewMouseMove(Sender: TObject; Shift: TShiftState; X, Y: Integer); var Site : TcxGridSite; HitTest : TcxCustomGridHitTest; Item : TcxCustomGridTableItem; Rec : TcxCustomGridRecord; sNewHint : string; begin {Este método desaparecerá cuando se migre la aplicación, es para sacar la causa de la incidencia sin necesidad de entrar en el documento} Site := Sender as TcxGridSite; HitTest := Site.GridView.ViewInfo.GetHitTest(X, Y); if HitTest is TcxGridRecordCellHitTest then begin Item := TcxGridRecordCellHitTest(HitTest).Item; Rec := TcxGridRecordCellHitTest(HitTest).GridRecord; if (Item.Index = cxGridView.GetColumnByFieldName(fld_PedidosClienteINCIDENCIAS_ACTIVAS).Index) and (Rec.Selected) and (Pedidos.DataTable.FieldByName(fld_PedidosClienteINCIDENCIAS_ACTIVAS).AsInteger = 1) then begin sNewHint := Pedidos.DataTable.FieldByName(fld_PedidosClienteINCIDENCIAS).AsString; if (cxGrid.Hint <> sNewHint) then begin cxGrid.ShowHint := false; cxGrid.Hint := sNewHint; end else cxGrid.ShowHint := true; end else begin cxGrid.ShowHint := false; end; end; end; procedure TfrViewPedidosCliente.cxGridViewNUM_COPIASCustomDrawHeader( Sender: TcxGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean); var R : TRect; begin inherited; { with AViewInfo do begin LookAndFeelPainter.DrawHeader(ACanvas, Bounds, TextAreaBounds, Neighbors, Borders, ButtonState, AlignmentHorz, AlignmentVert, MultiLine, False, '', Params.Font, Params.TextColor, Params.Color); R := AViewInfo.ContentBounds; ACanvas.FillRect(R); ACanvas.DrawImage(PngImageList10, R.Left + 2, R.Top, 0); end; ADone := True; } end; procedure TfrViewPedidosCliente.cxGridViewNUM_CORREOSCustomDrawHeader( Sender: TcxGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridColumnHeaderViewInfo; var ADone: Boolean); var R : TRect; begin inherited; { with AViewInfo do begin LookAndFeelPainter.DrawHeader(ACanvas, Bounds, TextAreaBounds, Neighbors, Borders, ButtonState, AlignmentHorz, AlignmentVert, MultiLine, False, '', Params.Font, Params.TextColor, Params.Color); R := AViewInfo.ContentBounds; ACanvas.FillRect(R); ACanvas.DrawImage(PngImageList10, R.Left + 2, R.Top, 1); end; ADone := True; } end; procedure TfrViewPedidosCliente.cxGridViewStylesGetContentStyle(Sender: TcxCustomGridTableView; ARecord: TcxCustomGridRecord; AItem: TcxCustomGridTableItem; out AStyle: TcxStyle); var IndiceCol: Integer; ASituacion: string; begin inherited; if Assigned(ARecord) then begin IndiceCol := (Sender as TcxGridDBTableView).GetColumnByFieldName(fld_PedidosClienteSITUACION).Index; ASituacion := VarToStr(ARecord.DisplayTexts[IndiceCol]); if ASituacion = SITUACION_PEDIDO_PENDIENTE then AStyle := cxStylePENDIENTES else if ASituacion = SITUACION_PEDIDO_ENPROCESO then AStyle := cxStyleENPROCESO else if ASituacion = SITUACION_PEDIDO_SERVIDO then AStyle := cxStyleSERVIDOS; end; end; procedure TfrViewPedidosCliente.cxGridViewTIENDAWEBCustomDrawCell( Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); var R : TRect; begin inherited; if (AViewInfo.GridRecord.DisplayTexts[cxGridViewTIENDAWEB.Index] <> '') then begin R := AViewInfo.ContentBounds; ACanvas.FillRect(R); ACanvas.DrawImage(PngImageList, R.Left, R.Top, 4); ADone := True; end; end; procedure TfrViewPedidosCliente.frViewFiltroBase1actQuitarFiltroExecute( Sender: TObject); begin frViewFiltroBase1.LimpiarCampos; end; function TfrViewPedidosCliente.GetPedidos: IBizPedidoCliente; begin Result := FPedidos; end; procedure TfrViewPedidosCliente.OnFiltroListaPropertiesChange(Sender: TObject); begin inherited; RefrescarFiltro; end; procedure TfrViewPedidosCliente.OnFiltroListaPropertiesInitPopup(Sender: TObject); begin inherited; ShowHourglassCursor; try if not Assigned(FProvincias) then CargarProvincias; finally HideHourglassCursor; end; end; procedure TfrViewPedidosCliente.SetPedidos(const Value: IBizPedidoCliente); begin FPedidos := Value; if Assigned(FPedidos) then dsDataSource.DataTable := FPedidos.DataTable; end; end.