From 2b38fa1aa686b6700b11a67abf592c3e8d7ffcc4 Mon Sep 17 00:00:00 2001 From: roberto Date: Fri, 13 Apr 2012 11:33:18 +0000 Subject: [PATCH] =?UTF-8?q?Se=20a=C3=B1ade=20el=20incorporar=20una=20image?= =?UTF-8?q?n=20en=20los=20articulos?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit git-svn-id: https://192.168.0.254/svn/Proyectos.Acana_FactuGES2/trunk@551 f4e31baf-9722-1c47-927c-6f952f962d4b --- Build/Build.fbpInf | 4 +- Build/Build.fbz6 | Bin 58276 -> 58264 bytes Database/scripts/factuges.sql | 3 + Source/Base/Base.dproj | 96 +-- Source/Base/Base.res | Bin 384 -> 4748 bytes Source/FactuGES.inc | 2 +- Source/GUIBase/GUIBase.dproj | 56 +- .../AlbaranesCliente_Group.groupproj | 16 +- .../uDetallesAlbaranClienteController.pas | 3 +- .../uViewElegirArticulosAlbaranesCliente.dfm | 24 +- .../uViewElegirArticulosAlbaranesCliente.pas | Bin 1056 -> 1097 bytes .../Articulos/Articulos_Group.groupproj | 16 +- .../Controller/uArticulosController.pas | 58 +- .../Articulos/Data/Articulos_data.dproj | 2 +- .../Articulos/Data/uDataModuleArticulos.dfm | 16 +- .../Articulos/Data/uDataModuleArticulos.pas | 12 + .../Articulos/Model/Articulos_model.RES | Bin 384 -> 4748 bytes .../Articulos/Model/Articulos_model.dproj | 4 +- .../Model/Data/uIDataModuleArticulos.pas | 2 + .../Model/schArticulosClient_Intf.pas | 100 ++- .../Model/schArticulosServer_Intf.pas | 106 +++- .../Modulos/Articulos/Model/uBizArticulos.pas | 30 +- .../Articulos/Plugin/uPluginArticulos.dfm | 4 +- .../Articulos/Servidor/srvArticulos_Impl.dfm | 190 +++++- .../Articulos/Servidor/srvArticulos_Impl.pas | 74 ++- .../Articulos/Views/Articulos_view.RES | Bin 384 -> 4748 bytes .../Articulos/Views/Articulos_view.dproj | 10 +- .../Articulos/Views/uEditorArticulo.dfm | 57 +- .../Articulos/Views/uEditorArticulo.pas | 12 +- .../Views/uEditorElegirArticulos.dfm | 11 +- .../Modulos/Articulos/Views/uViewArticulo.dfm | 37 +- .../Modulos/Articulos/Views/uViewArticulo.pas | 96 +-- .../Articulos/Views/uViewArticulos.dfm | 24 +- .../Articulos/Views/uViewArticulos.pas | 1 + .../Views/uViewDetallesArticulos.dfm | 3 +- .../uContratosClienteController.pas | 2 +- .../uDetallesContratoClienteController.pas | 5 +- .../uDetallesFacturaClienteController.pas | 3 +- .../Familias/Plugin/uPluginFamilias.dfm | 2 +- .../Controller/Inventario_controller.rc | 22 + .../Controller/uInventarioController.pas | 8 +- .../Inventario/Data/Inventario_data.rc | 22 + .../Inventario/Model/Inventario_model.rc | 22 + .../Inventario/Plugin/Inventario_plugin.dproj | 9 +- .../Inventario/Views/Inventario_view.dproj | 10 +- .../uDetallesPresupuestoClienteController.pas | 5 +- ...ditorElegirArticulosPresupuestoCliente.dfm | 10 +- ...ditorElegirArticulosPresupuestoCliente.pas | 10 +- .../Views/uEditorPresupuestoCliente.dfm | 40 +- ...ViewElegirArticulosPresupuestosCliente.dfm | 24 + ...ViewElegirArticulosPresupuestosCliente.pas | 2 +- Source/Servicios/FactuGES.RODL | 18 + Source/Servicios/FactuGES_Intf.pas | 39 ++ Source/Servicios/FactuGES_Invk.pas | 44 ++ Source/Servicios/RODLFile.res | Bin 43432 -> 44053 bytes Source/Servidor/FactuGES_Server.dpr | 6 +- Source/Servidor/FactuGES_Server.dproj | 587 +++++++++--------- Source/Servidor/FactuGES_Server.rc | 2 +- Source/Servidor/FactuGES_Server.res | Bin 23356 -> 23344 bytes 59 files changed, 1351 insertions(+), 610 deletions(-) diff --git a/Build/Build.fbpInf b/Build/Build.fbpInf index 2a3bdc4a..36e7b215 100644 --- a/Build/Build.fbpInf +++ b/Build/Build.fbpInf @@ -14,8 +14,8 @@ - 00:00:00 - 30/12/1899 + 00:03:10 + 11/04/2012 12:05:34 True diff --git a/Build/Build.fbz6 b/Build/Build.fbz6 index 07fa09486a729856b68ae8fe9827b28a0d24b508..56f97843b67c7daf16bd546db20f874f78568988 100644 GIT binary patch delta 23568 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 MainSource + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
fConfigurarConexion
TForm diff --git a/Source/Base/Base.res b/Source/Base/Base.res index 8b251f312bcccec5485024f6fe8d80e1cdf25746..1641339fcc482e7e3492d1b45813a86619622c33 100644 GIT binary patch literal 4748 zcmbW5&ub)A5XUPdpe&2#;C*uNAUVhgd+&(4um@dnom`vXF9g}ZuHJ;se=<3UNdFJg zbCw+UD9j$byGIXV`~6hC>h4S?F|k9X-j90q{Z_qtZ<;nUJCO8!h?p${kR>3GhM`oH*q zk=UsjOCIgA_4!`B+Gb&`I84R)bT4dy-BQV<-SyFz?R8ILEQ(+JB$u{sEXE@j@B*7W zT;iZH#|OJ<&DO$RCkM6VbK3(B(k{nbdv1lpc;E$xz9as|v3uE1V{hw2w~g3eD0an7 z{BT%G%irdMe*|oDJmgvJaA2`9B<6Xi*?M~Q;)@Sbfwf3uf zVaWkbUjU=;sL{BlYemIZXv%qZ{SZw{-TCU+;!nH6KDDIJumU+9{E0zXW4>7T)y|>$DQlv zRJe?TjSp{c!DqeayAnSMTtZZT;>LN7J0Rls+5m@q)MbyB*eL%Eu@(+$Cw}Pd@q7N| z%Q0*AHpCP^b9v`@jx-l_FD>khpW2W8(OU2&V5TrnoAY-m_hlcV?zq3;7{2gF{J#Hc z6R+o~mVenX?>@W0@_DVzyOFs(5464CY{!q9ChoF#_*eXi@4gFuV8?vhl=_w5$iKL0 zEV0nMBcN08xtRmsgJrqjh@s#|{?*ssnsG)mH*wa6{efF0JFWHok@kA5%b661{B38= zCcgJ|*ZFTpV$8<-&+AWpa)Q8*`wL&hMeNQ^v6I7$HSdLZhZ^&+6<@Uw_Zsml9^v3W zVvPDBKHh;i=RU4J_ta3E;)Mn>Y+L zKLZ0UQ+*km9FO-b?U4gmn-62iwzH6&*duKGo~aUV)bYDla8wWZ9+^7p-F<8lP@i!m z@vhbD_${F}h>^T;C(?(b*OJDk?{dEXB?nuehoON3HAb!7Mr7-ls!84-5V-jJugbu<_$}mU=Yd9!?TOX;|B-#B)+0x#9q*yqJiqS!`49d=7ztk$O+9=1i;?K_|J<8T z?0b7=-`Z3A#vV$4XJ5(lQ~TOZHUFdA%oWvK5zg&_IKXIbughQBA8XAsd#=@|TFLXC zy(^m((;DnQmDQKatmw!@c`| G?EMQ&4NnpP delta 11 ScmeBCZD5|Duvteife`=|>;pCc diff --git a/Source/FactuGES.inc b/Source/FactuGES.inc index 72603a0d..bf434910 100644 --- a/Source/FactuGES.inc +++ b/Source/FactuGES.inc @@ -1,4 +1,4 @@ {$DEFINE MULTIEMPRESA} -{DEFINE ALMACEN} +{$DEFINE ALMACEN} {DEFINE PEDIDOSPROVEEDOR} {$DEFINE CONTABILIDAD} \ No newline at end of file diff --git a/Source/GUIBase/GUIBase.dproj b/Source/GUIBase/GUIBase.dproj index f44e3be7..e1b15b8e 100644 --- a/Source/GUIBase/GUIBase.dproj +++ b/Source/GUIBase/GUIBase.dproj @@ -58,34 +58,34 @@ MainSource - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + +
fDialogBase
diff --git a/Source/Modulos/Albaranes de cliente/AlbaranesCliente_Group.groupproj b/Source/Modulos/Albaranes de cliente/AlbaranesCliente_Group.groupproj index 2451b83c..6480e68e 100644 --- a/Source/Modulos/Albaranes de cliente/AlbaranesCliente_Group.groupproj +++ b/Source/Modulos/Albaranes de cliente/AlbaranesCliente_Group.groupproj @@ -12,6 +12,7 @@ + @@ -141,14 +142,23 @@ + + + + + + + + + - + - + - + \ No newline at end of file diff --git a/Source/Modulos/Albaranes de cliente/Controller/uDetallesAlbaranClienteController.pas b/Source/Modulos/Albaranes de cliente/Controller/uDetallesAlbaranClienteController.pas index f9dc9107..1d17cd80 100644 --- a/Source/Modulos/Albaranes de cliente/Controller/uDetallesAlbaranClienteController.pas +++ b/Source/Modulos/Albaranes de cliente/Controller/uDetallesAlbaranClienteController.pas @@ -149,8 +149,9 @@ end; procedure TDetallesAlbaranClienteController.RellenarImportes(ADetalles: IDAStronglyTypedDataTable; AArticulos: IBizArticulo); begin +//Para acana el importa a cargar en la lista será siempre el precio PVP if Assigned(AArticulos) then - ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := AArticulos.PRECIO_COSTE + ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := AArticulos.PRECIO_PVP else ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := Null; end; diff --git a/Source/Modulos/Albaranes de cliente/Views/uViewElegirArticulosAlbaranesCliente.dfm b/Source/Modulos/Albaranes de cliente/Views/uViewElegirArticulosAlbaranesCliente.dfm index 82ceb37b..3109609c 100644 --- a/Source/Modulos/Albaranes de cliente/Views/uViewElegirArticulosAlbaranesCliente.dfm +++ b/Source/Modulos/Albaranes de cliente/Views/uViewElegirArticulosAlbaranesCliente.dfm @@ -1,26 +1,28 @@ inherited frViewElegirArticulosAlbaranesCliente: TfrViewElegirArticulosAlbaranesCliente - inherited cxGrid: TcxGrid - inherited cxGridView: TcxGridDBTableView - inherited cxGridViewPRECIO_NETO: TcxGridDBColumn - Visible = False - end - inherited cxGridViewPRECIO_PORTE: TcxGridDBColumn - Visible = False - end - end - end inherited frViewFiltroBase1: TfrViewFiltroBase - inherited TBXDockablePanel1: TTBXDockablePanel + inherited TBXDockablePanel1: TTBXDockablePanel inherited dxLayoutControl1: TdxLayoutControl inherited txtFiltroTodo: TcxTextEdit + Style.LookAndFeel.SkinName = '' + StyleDisabled.LookAndFeel.SkinName = '' + StyleFocused.LookAndFeel.SkinName = '' + StyleHot.LookAndFeel.SkinName = '' ExplicitWidth = 273 Width = 273 end inherited edtFechaIniFiltro: TcxDateEdit + Style.LookAndFeel.SkinName = '' + StyleDisabled.LookAndFeel.SkinName = '' + StyleFocused.LookAndFeel.SkinName = '' + StyleHot.LookAndFeel.SkinName = '' ExplicitWidth = 121 Width = 121 end inherited edtFechaFinFiltro: TcxDateEdit + Style.LookAndFeel.SkinName = '' + StyleDisabled.LookAndFeel.SkinName = '' + StyleFocused.LookAndFeel.SkinName = '' + StyleHot.LookAndFeel.SkinName = '' ExplicitWidth = 121 Width = 121 end diff --git a/Source/Modulos/Albaranes de cliente/Views/uViewElegirArticulosAlbaranesCliente.pas b/Source/Modulos/Albaranes de cliente/Views/uViewElegirArticulosAlbaranesCliente.pas index 8bbb1964b9a152854f168095063d469285f9a615..e9bb88cca7d00729631c08adfe3297ca832c5eed 100644 GIT binary patch delta 50 zcmZ3$agt*JvziVsmx4m6i=$^=NorAAVsdJ+jzXz(X>mz@Zdhh&IgkUQHveH#W&{9} C=Mc;Q delta 13 UcmX@fv4CR%^JXn(c}7MC03G`S9smFU diff --git a/Source/Modulos/Articulos/Articulos_Group.groupproj b/Source/Modulos/Articulos/Articulos_Group.groupproj index 3f402ca4..ae024535 100644 --- a/Source/Modulos/Articulos/Articulos_Group.groupproj +++ b/Source/Modulos/Articulos/Articulos_Group.groupproj @@ -9,6 +9,7 @@ + @@ -48,6 +49,15 @@ + + + + + + + + + @@ -112,13 +122,13 @@ - + - + - + \ No newline at end of file diff --git a/Source/Modulos/Articulos/Controller/uArticulosController.pas b/Source/Modulos/Articulos/Controller/uArticulosController.pas index 6be3eb06..c4b0d127 100644 --- a/Source/Modulos/Articulos/Controller/uArticulosController.pas +++ b/Source/Modulos/Articulos/Controller/uArticulosController.pas @@ -4,7 +4,7 @@ interface uses - Classes, SysUtils, uDADataTable, uControllerBase, uEditorDBItem, + Classes, uDADataTable, uControllerBase, uEditorDBItem, uIDataModuleArticulos, uBizArticulos, uProveedoresController, uBizContactos; @@ -41,6 +41,10 @@ type function GetProveedoresController: IProveedoresController; property ProveedoresController: IProveedoresController read GetProveedoresController; + + procedure QuitarImagen(AArticulo : IBizArticulo); + procedure PonerImagen(AArticulo : IBizArticulo; const AFileName: String); + function SalvarImagen(AArticulo : IBizArticulo): Boolean; end; TArticulosController = class(TControllerBase, IArticulosController) @@ -67,7 +71,7 @@ type function Eliminar(const ID : Integer): Boolean; overload; function Eliminar(AArticulo : IBizArticulo): Boolean; overload; - function Guardar(AArticulo : IBizArticulo): Boolean; + function Guardar(AArticulo : IBizArticulo): Boolean; procedure DescartarCambios(AArticulo : IBizArticulo); virtual; function Existe(const ID: Integer) : Boolean; virtual; procedure Anadir(AArticulo : IBizArticulo); virtual; @@ -92,15 +96,19 @@ type procedure ElegirProveedor(AArticulo : IBizArticulo); procedure AnadirProveedor(AArticulo : IBizArticulo); procedure VerProveedor(AArticulo : IBizArticulo); + + procedure QuitarImagen(AArticulo : IBizArticulo); + procedure PonerImagen(AArticulo : IBizArticulo; const AFileName: String); + function SalvarImagen(AArticulo : IBizArticulo): Boolean; end; implementation uses - cxControls, DB, uEditorRegistryUtils, schArticulosClient_Intf, uFactuGES_App, - uIEditorArticulos, uIEditorArticulo, uIEditorElegirArticulos, + SysUtils, cxControls, uDataTableUtils, DB, uEditorRegistryUtils, schArticulosClient_Intf, uFactuGES_App, + uIEditorArticulos, uIEditorArticulo, uIEditorElegirArticulos, uSistemaFunc, uDataModuleArticulos, uDataModuleUsuarios, uDAInterfaces, - uDataTableUtils, uDateUtils, uROTypes, DateUtils, Controls, Windows; + uDateUtils, uROTypes, DateUtils, Controls, Windows; { TArticulosController } @@ -537,6 +545,21 @@ begin // end; +function TArticulosController.SalvarImagen(AArticulo: IBizArticulo): Boolean; +var + aAux : String; +begin + if not AArticulo.HayImagen then + Result := FDataModule.EliminarImagen(AArticulo.ID) + else + begin + aAux := DarFicheroJPGTemporal; + AArticulo.DataTable.FieldByName(fld_ArticulosIMAGEN).SaveToFile(aAux); + if FDataModule.AnadirImagen(AArticulo.ID, aAux) then + SysUtils.DeleteFile(aAux); + end; +end; + function TArticulosController.Existe(const ID: Integer): Boolean; var AArticulo : IBizArticulo; @@ -594,7 +617,7 @@ begin ShowHourglassCursor; try AArticulo.DataTable.ApplyUpdates; - + SalvarImagen(AArticulo); Result := True; finally HideHourglassCursor; @@ -613,6 +636,19 @@ begin Result := AArticulo; end; +procedure TArticulosController.PonerImagen(AArticulo: IBizArticulo; const AFileName: String); +begin + if FileExists(AFileName) then + begin + DesconectarTabla(AArticulo.DataTable); + if not AArticulo.DataTable.Editing then + AArticulo.Edit; + AArticulo.DataTable.FieldByName(fld_ArticulosIMAGEN).LoadFromFile(AFileName); + AArticulo.Post; + ConectarTabla(AArticulo.DataTable); + end; +end; + procedure TArticulosController.Preview(AArticulo: IBizArticulo); //var // AReportController : IArticulosReportController; @@ -639,4 +675,14 @@ begin } end; +procedure TArticulosController.QuitarImagen(AArticulo : IBizArticulo); +begin + DesconectarTabla(AArticulo.DataTable); + if not AArticulo.DataTable.Editing then + AArticulo.Edit; + AArticulo.IMAGENIsNull := True; + AArticulo.Post; + ConectarTabla(AArticulo.DataTable); +end; + end. diff --git a/Source/Modulos/Articulos/Data/Articulos_data.dproj b/Source/Modulos/Articulos/Data/Articulos_data.dproj index 126ef528..6f5c6a79 100644 --- a/Source/Modulos/Articulos/Data/Articulos_data.dproj +++ b/Source/Modulos/Articulos/Data/Articulos_data.dproj @@ -54,7 +54,7 @@ MainSource - +
DataModuleArticulos
diff --git a/Source/Modulos/Articulos/Data/uDataModuleArticulos.dfm b/Source/Modulos/Articulos/Data/uDataModuleArticulos.dfm index edf41a27..f94095a1 100644 --- a/Source/Modulos/Articulos/Data/uDataModuleArticulos.dfm +++ b/Source/Modulos/Articulos/Data/uDataModuleArticulos.dfm @@ -14,12 +14,12 @@ inherited DataModuleArticulos: TDataModuleArticulos Top = 84 end object rda_Articulos: TDARemoteDataAdapter + DataStreamer = Bin2DataStreamer GetSchemaCall.RemoteService = RORemoteService GetDataCall.RemoteService = RORemoteService UpdateDataCall.RemoteService = RORemoteService GetScriptsCall.RemoteService = RORemoteService RemoteService = RORemoteService - DataStreamer = Bin2DataStreamer Left = 51 Top = 151 end @@ -64,8 +64,8 @@ inherited DataModuleArticulos: TDataModuleArticulos item Name = 'IMAGEN' DataType = datBlob + BlobType = dabtGraphic DisplayLabel = 'Foto' - DictionaryEntry = 'Articulos_IMAGEN' end item Name = 'COMISIONABLE' @@ -119,6 +119,10 @@ inherited DataModuleArticulos: TDataModuleArticulos DataType = datCurrency DictionaryEntry = 'Articulos_PRECIO_NETO' end + item + Name = 'PRECIO_PVP' + DataType = datCurrency + end item Name = 'INVENTARIABLE' DataType = datSmallInt @@ -143,8 +147,6 @@ inherited DataModuleArticulos: TDataModuleArticulos Params = <> StreamingOptions = [soDisableEventsWhileStreaming] RemoteDataAdapter = rda_Articulos - DetailOptions = [dtCascadeOpenClose, dtCascadeApplyUpdates, dtAutoFetch, dtCascadeDelete, dtCascadeUpdate, dtDisableLogOfCascadeDeletes, dtDisableLogOfCascadeUpdates, dtIncludeInAllInOneFetch] - MasterOptions = [moCascadeOpenClose, moCascadeApplyUpdates, moCascadeDelete, moCascadeUpdate, moDisableLogOfCascadeDeletes, moDisableLogOfCascadeUpdates] LogicalName = 'Articulos' IndexDefs = <> Left = 232 @@ -225,6 +227,10 @@ inherited DataModuleArticulos: TDataModuleArticulos Name = 'PRECIO_NETO' DataType = datCurrency end + item + Name = 'PRECIO_PVP' + DataType = datCurrency + end item Name = 'INVENTARIABLE' DataType = datSmallInt @@ -251,8 +257,6 @@ inherited DataModuleArticulos: TDataModuleArticulos end> StreamingOptions = [soDisableEventsWhileStreaming] RemoteDataAdapter = rda_Articulos - DetailOptions = [dtCascadeOpenClose, dtCascadeApplyUpdates, dtAutoFetch, dtCascadeDelete, dtCascadeUpdate, dtDisableLogOfCascadeDeletes, dtDisableLogOfCascadeUpdates, dtIncludeInAllInOneFetch] - MasterOptions = [moCascadeOpenClose, moCascadeApplyUpdates, moCascadeDelete, moCascadeUpdate, moDisableLogOfCascadeDeletes, moDisableLogOfCascadeUpdates] LogicalName = 'ArticulosParaCliente' IndexDefs = <> Left = 400 diff --git a/Source/Modulos/Articulos/Data/uDataModuleArticulos.pas b/Source/Modulos/Articulos/Data/uDataModuleArticulos.pas index b7ac930d..1c10c47e 100644 --- a/Source/Modulos/Articulos/Data/uDataModuleArticulos.pas +++ b/Source/Modulos/Articulos/Data/uDataModuleArticulos.pas @@ -29,6 +29,8 @@ type function GetItems (IDCliente: Integer) : IBizArticulo; overload; function GetItem(const ID : Integer; AClienteID: Integer = -1) : IBizArticulo; function NewItem : IBizArticulo; + function EliminarImagen(const ID: Integer): Boolean; + function AnadirImagen(const ID: Integer; const AFileName: String): Boolean; end; implementation @@ -41,6 +43,11 @@ uses { TdmArticulos } +function TDataModuleArticulos.AnadirImagen(const ID: Integer; const AFileName: String): Boolean; +begin + Result := (RORemoteService as IsrvArticulos).AnadirImagen(ID, AFileName); +end; + procedure TDataModuleArticulos.AsignarClaseNegocio(AArticulo: TDADataTable); begin AArticulo.BusinessRulesID := BIZ_CLIENT_ARTICULO; @@ -52,6 +59,11 @@ begin RORemoteService.Message := dmConexion.Message; end; +function TDataModuleArticulos.EliminarImagen(const ID: Integer): Boolean; +begin + Result := (RORemoteService as IsrvArticulos).EliminarImagen(ID); +end; + function TDataModuleArticulos.NewItem: IBizArticulo; begin Result := GetItem(ID_NULO) diff --git a/Source/Modulos/Articulos/Model/Articulos_model.RES b/Source/Modulos/Articulos/Model/Articulos_model.RES index 8b251f312bcccec5485024f6fe8d80e1cdf25746..1641339fcc482e7e3492d1b45813a86619622c33 100644 GIT binary patch literal 4748 zcmbW5&ub)A5XUPdpe&2#;C*uNAUVhgd+&(4um@dnom`vXF9g}ZuHJ;se=<3UNdFJg zbCw+UD9j$byGIXV`~6hC>h4S?F|k9X-j90q{Z_qtZ<;nUJCO8!h?p${kR>3GhM`oH*q zk=UsjOCIgA_4!`B+Gb&`I84R)bT4dy-BQV<-SyFz?R8ILEQ(+JB$u{sEXE@j@B*7W zT;iZH#|OJ<&DO$RCkM6VbK3(B(k{nbdv1lpc;E$xz9as|v3uE1V{hw2w~g3eD0an7 z{BT%G%irdMe*|oDJmgvJaA2`9B<6Xi*?M~Q;)@Sbfwf3uf zVaWkbUjU=;sL{BlYemIZXv%qZ{SZw{-TCU+;!nH6KDDIJumU+9{E0zXW4>7T)y|>$DQlv zRJe?TjSp{c!DqeayAnSMTtZZT;>LN7J0Rls+5m@q)MbyB*eL%Eu@(+$Cw}Pd@q7N| z%Q0*AHpCP^b9v`@jx-l_FD>khpW2W8(OU2&V5TrnoAY-m_hlcV?zq3;7{2gF{J#Hc z6R+o~mVenX?>@W0@_DVzyOFs(5464CY{!q9ChoF#_*eXi@4gFuV8?vhl=_w5$iKL0 zEV0nMBcN08xtRmsgJrqjh@s#|{?*ssnsG)mH*wa6{efF0JFWHok@kA5%b661{B38= zCcgJ|*ZFTpV$8<-&+AWpa)Q8*`wL&hMeNQ^v6I7$HSdLZhZ^&+6<@Uw_Zsml9^v3W zVvPDBKHh;i=RU4J_ta3E;)Mn>Y+L zKLZ0UQ+*km9FO-b?U4gmn-62iwzH6&*duKGo~aUV)bYDla8wWZ9+^7p-F<8lP@i!m z@vhbD_${F}h>^T;C(?(b*OJDk?{dEXB?nuehoON3HAb!7Mr7-ls!84-5V-jJugbu<_$}mU=Yd9!?TOX;|B-#B)+0x#9q*yqJiqS!`49d=7ztk$O+9=1i;?K_|J<8T z?0b7=-`Z3A#vV$4XJ5(lQ~TOZHUFdA%oWvK5zg&_IKXIbughQBA8XAsd#=@|TFLXC zy(^m((;DnQmDQKatmw!@c`| G?EMQ&4NnpP delta 11 ScmeBCZD5|Duvteife`=|>;pCc diff --git a/Source/Modulos/Articulos/Model/Articulos_model.dproj b/Source/Modulos/Articulos/Model/Articulos_model.dproj index a28e6795..cb1ddfab 100644 --- a/Source/Modulos/Articulos/Model/Articulos_model.dproj +++ b/Source/Modulos/Articulos/Model/Articulos_model.dproj @@ -54,8 +54,8 @@ MainSource - - + + diff --git a/Source/Modulos/Articulos/Model/Data/uIDataModuleArticulos.pas b/Source/Modulos/Articulos/Model/Data/uIDataModuleArticulos.pas index dc6976eb..7789526e 100644 --- a/Source/Modulos/Articulos/Model/Data/uIDataModuleArticulos.pas +++ b/Source/Modulos/Articulos/Model/Data/uIDataModuleArticulos.pas @@ -12,6 +12,8 @@ type function GetItems (IDCliente: Integer) : IBizArticulo; overload; function GetItem(const ID : Integer; AClienteID: Integer = -1) : IBizArticulo; function NewItem : IBizArticulo; + function EliminarImagen(const ID: Integer): Boolean; + function AnadirImagen(const ID: Integer; const AFileName: String): Boolean; end; implementation diff --git a/Source/Modulos/Articulos/Model/schArticulosClient_Intf.pas b/Source/Modulos/Articulos/Model/schArticulosClient_Intf.pas index cce2efba..c829ea7c 100644 --- a/Source/Modulos/Articulos/Model/schArticulosClient_Intf.pas +++ b/Source/Modulos/Articulos/Model/schArticulosClient_Intf.pas @@ -3,14 +3,14 @@ unit schArticulosClient_Intf; interface uses - Classes, DB, schBase_Intf, SysUtils, uROClasses, uDADataTable, FmtBCD, uROXMLIntf; + Classes, DB, SysUtils, uROClasses, uDAInterfaces, uDADataTable, FmtBCD, uROXMLIntf; const { Data table rules ids Feel free to change them to something more human readable but make sure they are unique in the context of your application } - RID_Articulos = '{9F6189A0-1B2F-4ED3-8DCC-540C38366485}'; - RID_ArticulosParaCliente = '{84BC0DB1-97F7-438D-B161-7564778ED6D8}'; + RID_Articulos = '{F53C14ED-C343-42D8-8A25-6BB3A141FD22}'; + RID_ArticulosParaCliente = '{B1D54489-E268-483E-AF01-6E441FBF6DC0}'; { Data table names } nme_Articulos = 'Articulos'; @@ -32,6 +32,7 @@ const fld_ArticulosPRECIO_PORTE = 'PRECIO_PORTE'; fld_ArticulosDESCUENTO = 'DESCUENTO'; fld_ArticulosPRECIO_NETO = 'PRECIO_NETO'; + fld_ArticulosPRECIO_PVP = 'PRECIO_PVP'; fld_ArticulosINVENTARIABLE = 'INVENTARIABLE'; fld_ArticulosID_PROVEEDOR = 'ID_PROVEEDOR'; fld_ArticulosNOMBRE_PROVEEDOR = 'NOMBRE_PROVEEDOR'; @@ -53,10 +54,11 @@ const idx_ArticulosPRECIO_PORTE = 12; idx_ArticulosDESCUENTO = 13; idx_ArticulosPRECIO_NETO = 14; - idx_ArticulosINVENTARIABLE = 15; - idx_ArticulosID_PROVEEDOR = 16; - idx_ArticulosNOMBRE_PROVEEDOR = 17; - idx_ArticulosELIMINADO = 18; + idx_ArticulosPRECIO_PVP = 15; + idx_ArticulosINVENTARIABLE = 16; + idx_ArticulosID_PROVEEDOR = 17; + idx_ArticulosNOMBRE_PROVEEDOR = 18; + idx_ArticulosELIMINADO = 19; { ArticulosParaCliente fields } fld_ArticulosParaClienteID = 'ID'; @@ -74,6 +76,7 @@ const fld_ArticulosParaClientePRECIO_PORTE = 'PRECIO_PORTE'; fld_ArticulosParaClienteDESCUENTO = 'DESCUENTO'; fld_ArticulosParaClientePRECIO_NETO = 'PRECIO_NETO'; + fld_ArticulosParaClientePRECIO_PVP = 'PRECIO_PVP'; fld_ArticulosParaClienteINVENTARIABLE = 'INVENTARIABLE'; fld_ArticulosParaClienteID_PROVEEDOR = 'ID_PROVEEDOR'; fld_ArticulosParaClienteNOMBRE_PROVEEDOR = 'NOMBRE_PROVEEDOR'; @@ -95,15 +98,16 @@ const idx_ArticulosParaClientePRECIO_PORTE = 12; idx_ArticulosParaClienteDESCUENTO = 13; idx_ArticulosParaClientePRECIO_NETO = 14; - idx_ArticulosParaClienteINVENTARIABLE = 15; - idx_ArticulosParaClienteID_PROVEEDOR = 16; - idx_ArticulosParaClienteNOMBRE_PROVEEDOR = 17; - idx_ArticulosParaClienteELIMINADO = 18; + idx_ArticulosParaClientePRECIO_PVP = 15; + idx_ArticulosParaClienteINVENTARIABLE = 16; + idx_ArticulosParaClienteID_PROVEEDOR = 17; + idx_ArticulosParaClienteNOMBRE_PROVEEDOR = 18; + idx_ArticulosParaClienteELIMINADO = 19; type { IArticulos } IArticulos = interface(IDAStronglyTypedDataTable) - ['{55AA5752-BC15-4FD7-A39A-97867A837A69}'] + ['{7AB1F398-443E-4F30-BBD4-AA8BD49A1C0B}'] { Property getters and setters } function GetIDValue: Integer; procedure SetIDValue(const aValue: Integer); @@ -164,6 +168,10 @@ type procedure SetPRECIO_NETOValue(const aValue: Currency); function GetPRECIO_NETOIsNull: Boolean; procedure SetPRECIO_NETOIsNull(const aValue: Boolean); + function GetPRECIO_PVPValue: Currency; + procedure SetPRECIO_PVPValue(const aValue: Currency); + function GetPRECIO_PVPIsNull: Boolean; + procedure SetPRECIO_PVPIsNull(const aValue: Boolean); function GetINVENTARIABLEValue: SmallInt; procedure SetINVENTARIABLEValue(const aValue: SmallInt); function GetINVENTARIABLEIsNull: Boolean; @@ -213,6 +221,8 @@ type property DESCUENTOIsNull: Boolean read GetDESCUENTOIsNull write SetDESCUENTOIsNull; property PRECIO_NETO: Currency read GetPRECIO_NETOValue write SetPRECIO_NETOValue; property PRECIO_NETOIsNull: Boolean read GetPRECIO_NETOIsNull write SetPRECIO_NETOIsNull; + property PRECIO_PVP: Currency read GetPRECIO_PVPValue write SetPRECIO_PVPValue; + property PRECIO_PVPIsNull: Boolean read GetPRECIO_PVPIsNull write SetPRECIO_PVPIsNull; property INVENTARIABLE: SmallInt read GetINVENTARIABLEValue write SetINVENTARIABLEValue; property INVENTARIABLEIsNull: Boolean read GetINVENTARIABLEIsNull write SetINVENTARIABLEIsNull; property ID_PROVEEDOR: Integer read GetID_PROVEEDORValue write SetID_PROVEEDORValue; @@ -224,7 +234,7 @@ type end; { TArticulosDataTableRules } - TArticulosDataTableRules = class(TIntfObjectDADataTableRules, IArticulos) + TArticulosDataTableRules = class(TDADataTableRules, IArticulos) private f_IMAGEN: IROStream; procedure IMAGEN_OnChange(Sender: TObject); @@ -289,6 +299,10 @@ type procedure SetPRECIO_NETOValue(const aValue: Currency); virtual; function GetPRECIO_NETOIsNull: Boolean; virtual; procedure SetPRECIO_NETOIsNull(const aValue: Boolean); virtual; + function GetPRECIO_PVPValue: Currency; virtual; + procedure SetPRECIO_PVPValue(const aValue: Currency); virtual; + function GetPRECIO_PVPIsNull: Boolean; virtual; + procedure SetPRECIO_PVPIsNull(const aValue: Boolean); virtual; function GetINVENTARIABLEValue: SmallInt; virtual; procedure SetINVENTARIABLEValue(const aValue: SmallInt); virtual; function GetINVENTARIABLEIsNull: Boolean; virtual; @@ -337,6 +351,8 @@ type property DESCUENTOIsNull: Boolean read GetDESCUENTOIsNull write SetDESCUENTOIsNull; property PRECIO_NETO: Currency read GetPRECIO_NETOValue write SetPRECIO_NETOValue; property PRECIO_NETOIsNull: Boolean read GetPRECIO_NETOIsNull write SetPRECIO_NETOIsNull; + property PRECIO_PVP: Currency read GetPRECIO_PVPValue write SetPRECIO_PVPValue; + property PRECIO_PVPIsNull: Boolean read GetPRECIO_PVPIsNull write SetPRECIO_PVPIsNull; property INVENTARIABLE: SmallInt read GetINVENTARIABLEValue write SetINVENTARIABLEValue; property INVENTARIABLEIsNull: Boolean read GetINVENTARIABLEIsNull write SetINVENTARIABLEIsNull; property ID_PROVEEDOR: Integer read GetID_PROVEEDORValue write SetID_PROVEEDORValue; @@ -354,7 +370,7 @@ type { IArticulosParaCliente } IArticulosParaCliente = interface(IDAStronglyTypedDataTable) - ['{F46994FF-67BE-4892-BE35-890D5A779CB9}'] + ['{358932C8-FF5E-41C2-B0C9-A4C7423A57B8}'] { Property getters and setters } function GetIDValue: Integer; procedure SetIDValue(const aValue: Integer); @@ -415,6 +431,10 @@ type procedure SetPRECIO_NETOValue(const aValue: Currency); function GetPRECIO_NETOIsNull: Boolean; procedure SetPRECIO_NETOIsNull(const aValue: Boolean); + function GetPRECIO_PVPValue: Currency; + procedure SetPRECIO_PVPValue(const aValue: Currency); + function GetPRECIO_PVPIsNull: Boolean; + procedure SetPRECIO_PVPIsNull(const aValue: Boolean); function GetINVENTARIABLEValue: SmallInt; procedure SetINVENTARIABLEValue(const aValue: SmallInt); function GetINVENTARIABLEIsNull: Boolean; @@ -464,6 +484,8 @@ type property DESCUENTOIsNull: Boolean read GetDESCUENTOIsNull write SetDESCUENTOIsNull; property PRECIO_NETO: Currency read GetPRECIO_NETOValue write SetPRECIO_NETOValue; property PRECIO_NETOIsNull: Boolean read GetPRECIO_NETOIsNull write SetPRECIO_NETOIsNull; + property PRECIO_PVP: Currency read GetPRECIO_PVPValue write SetPRECIO_PVPValue; + property PRECIO_PVPIsNull: Boolean read GetPRECIO_PVPIsNull write SetPRECIO_PVPIsNull; property INVENTARIABLE: SmallInt read GetINVENTARIABLEValue write SetINVENTARIABLEValue; property INVENTARIABLEIsNull: Boolean read GetINVENTARIABLEIsNull write SetINVENTARIABLEIsNull; property ID_PROVEEDOR: Integer read GetID_PROVEEDORValue write SetID_PROVEEDORValue; @@ -475,7 +497,7 @@ type end; { TArticulosParaClienteDataTableRules } - TArticulosParaClienteDataTableRules = class(TIntfObjectDADataTableRules, IArticulosParaCliente) + TArticulosParaClienteDataTableRules = class(TDADataTableRules, IArticulosParaCliente) private f_IMAGEN: IROStream; procedure IMAGEN_OnChange(Sender: TObject); @@ -540,6 +562,10 @@ type procedure SetPRECIO_NETOValue(const aValue: Currency); virtual; function GetPRECIO_NETOIsNull: Boolean; virtual; procedure SetPRECIO_NETOIsNull(const aValue: Boolean); virtual; + function GetPRECIO_PVPValue: Currency; virtual; + procedure SetPRECIO_PVPValue(const aValue: Currency); virtual; + function GetPRECIO_PVPIsNull: Boolean; virtual; + procedure SetPRECIO_PVPIsNull(const aValue: Boolean); virtual; function GetINVENTARIABLEValue: SmallInt; virtual; procedure SetINVENTARIABLEValue(const aValue: SmallInt); virtual; function GetINVENTARIABLEIsNull: Boolean; virtual; @@ -588,6 +614,8 @@ type property DESCUENTOIsNull: Boolean read GetDESCUENTOIsNull write SetDESCUENTOIsNull; property PRECIO_NETO: Currency read GetPRECIO_NETOValue write SetPRECIO_NETOValue; property PRECIO_NETOIsNull: Boolean read GetPRECIO_NETOIsNull write SetPRECIO_NETOIsNull; + property PRECIO_PVP: Currency read GetPRECIO_PVPValue write SetPRECIO_PVPValue; + property PRECIO_PVPIsNull: Boolean read GetPRECIO_PVPIsNull write SetPRECIO_PVPIsNull; property INVENTARIABLE: SmallInt read GetINVENTARIABLEValue write SetINVENTARIABLEValue; property INVENTARIABLEIsNull: Boolean read GetINVENTARIABLEIsNull write SetINVENTARIABLEIsNull; property ID_PROVEEDOR: Integer read GetID_PROVEEDORValue write SetID_PROVEEDORValue; @@ -944,6 +972,27 @@ begin DataTable.Fields[idx_ArticulosPRECIO_NETO].AsVariant := Null; end; +function TArticulosDataTableRules.GetPRECIO_PVPValue: Currency; +begin + result := DataTable.Fields[idx_ArticulosPRECIO_PVP].AsCurrency; +end; + +procedure TArticulosDataTableRules.SetPRECIO_PVPValue(const aValue: Currency); +begin + DataTable.Fields[idx_ArticulosPRECIO_PVP].AsCurrency := aValue; +end; + +function TArticulosDataTableRules.GetPRECIO_PVPIsNull: boolean; +begin + result := DataTable.Fields[idx_ArticulosPRECIO_PVP].IsNull; +end; + +procedure TArticulosDataTableRules.SetPRECIO_PVPIsNull(const aValue: Boolean); +begin + if aValue then + DataTable.Fields[idx_ArticulosPRECIO_PVP].AsVariant := Null; +end; + function TArticulosDataTableRules.GetINVENTARIABLEValue: SmallInt; begin result := DataTable.Fields[idx_ArticulosINVENTARIABLE].AsSmallInt; @@ -1366,6 +1415,27 @@ begin DataTable.Fields[idx_ArticulosParaClientePRECIO_NETO].AsVariant := Null; end; +function TArticulosParaClienteDataTableRules.GetPRECIO_PVPValue: Currency; +begin + result := DataTable.Fields[idx_ArticulosParaClientePRECIO_PVP].AsCurrency; +end; + +procedure TArticulosParaClienteDataTableRules.SetPRECIO_PVPValue(const aValue: Currency); +begin + DataTable.Fields[idx_ArticulosParaClientePRECIO_PVP].AsCurrency := aValue; +end; + +function TArticulosParaClienteDataTableRules.GetPRECIO_PVPIsNull: boolean; +begin + result := DataTable.Fields[idx_ArticulosParaClientePRECIO_PVP].IsNull; +end; + +procedure TArticulosParaClienteDataTableRules.SetPRECIO_PVPIsNull(const aValue: Boolean); +begin + if aValue then + DataTable.Fields[idx_ArticulosParaClientePRECIO_PVP].AsVariant := Null; +end; + function TArticulosParaClienteDataTableRules.GetINVENTARIABLEValue: SmallInt; begin result := DataTable.Fields[idx_ArticulosParaClienteINVENTARIABLE].AsSmallInt; diff --git a/Source/Modulos/Articulos/Model/schArticulosServer_Intf.pas b/Source/Modulos/Articulos/Model/schArticulosServer_Intf.pas index 34c79f0e..f9318e63 100644 --- a/Source/Modulos/Articulos/Model/schArticulosServer_Intf.pas +++ b/Source/Modulos/Articulos/Model/schArticulosServer_Intf.pas @@ -9,13 +9,13 @@ const { Delta rules ids Feel free to change them to something more human readable but make sure they are unique in the context of your application } - RID_ArticulosDelta = '{82298E75-82C9-4852-A33B-491F6C1C22B6}'; - RID_ArticulosParaClienteDelta = '{CD4567F1-5B6C-4215-BED9-48EC27CE653D}'; + RID_ArticulosDelta = '{EF3BCE84-BF72-4D25-B5C4-02DC99E2C0B2}'; + RID_ArticulosParaClienteDelta = '{E180507C-4070-490C-A07F-A5047BD0F477}'; type { IArticulosDelta } IArticulosDelta = interface(IArticulos) - ['{82298E75-82C9-4852-A33B-491F6C1C22B6}'] + ['{EF3BCE84-BF72-4D25-B5C4-02DC99E2C0B2}'] { Property getters and setters } function GetOldIDValue : Integer; function GetOldID_EMPRESAValue : Integer; @@ -32,6 +32,7 @@ type function GetOldPRECIO_PORTEValue : Currency; function GetOldDESCUENTOValue : Float; function GetOldPRECIO_NETOValue : Currency; + function GetOldPRECIO_PVPValue : Currency; function GetOldINVENTARIABLEValue : SmallInt; function GetOldID_PROVEEDORValue : Integer; function GetOldNOMBRE_PROVEEDORValue : String; @@ -53,6 +54,7 @@ type property OldPRECIO_PORTE : Currency read GetOldPRECIO_PORTEValue; property OldDESCUENTO : Float read GetOldDESCUENTOValue; property OldPRECIO_NETO : Currency read GetOldPRECIO_NETOValue; + property OldPRECIO_PVP : Currency read GetOldPRECIO_PVPValue; property OldINVENTARIABLE : SmallInt read GetOldINVENTARIABLEValue; property OldID_PROVEEDOR : Integer read GetOldID_PROVEEDORValue; property OldNOMBRE_PROVEEDOR : String read GetOldNOMBRE_PROVEEDORValue; @@ -155,6 +157,12 @@ type function GetOldPRECIO_NETOIsNull: Boolean; virtual; procedure SetPRECIO_NETOValue(const aValue: Currency); virtual; procedure SetPRECIO_NETOIsNull(const aValue: Boolean); virtual; + function GetPRECIO_PVPValue: Currency; virtual; + function GetPRECIO_PVPIsNull: Boolean; virtual; + function GetOldPRECIO_PVPValue: Currency; virtual; + function GetOldPRECIO_PVPIsNull: Boolean; virtual; + procedure SetPRECIO_PVPValue(const aValue: Currency); virtual; + procedure SetPRECIO_PVPIsNull(const aValue: Boolean); virtual; function GetINVENTARIABLEValue: SmallInt; virtual; function GetINVENTARIABLEIsNull: Boolean; virtual; function GetOldINVENTARIABLEValue: SmallInt; virtual; @@ -241,6 +249,10 @@ type property PRECIO_NETOIsNull : Boolean read GetPRECIO_NETOIsNull write SetPRECIO_NETOIsNull; property OldPRECIO_NETO : Currency read GetOldPRECIO_NETOValue; property OldPRECIO_NETOIsNull : Boolean read GetOldPRECIO_NETOIsNull; + property PRECIO_PVP : Currency read GetPRECIO_PVPValue write SetPRECIO_PVPValue; + property PRECIO_PVPIsNull : Boolean read GetPRECIO_PVPIsNull write SetPRECIO_PVPIsNull; + property OldPRECIO_PVP : Currency read GetOldPRECIO_PVPValue; + property OldPRECIO_PVPIsNull : Boolean read GetOldPRECIO_PVPIsNull; property INVENTARIABLE : SmallInt read GetINVENTARIABLEValue write SetINVENTARIABLEValue; property INVENTARIABLEIsNull : Boolean read GetINVENTARIABLEIsNull write SetINVENTARIABLEIsNull; property OldINVENTARIABLE : SmallInt read GetOldINVENTARIABLEValue; @@ -266,7 +278,7 @@ type { IArticulosParaClienteDelta } IArticulosParaClienteDelta = interface(IArticulosParaCliente) - ['{CD4567F1-5B6C-4215-BED9-48EC27CE653D}'] + ['{E180507C-4070-490C-A07F-A5047BD0F477}'] { Property getters and setters } function GetOldIDValue : Integer; function GetOldID_EMPRESAValue : Integer; @@ -283,6 +295,7 @@ type function GetOldPRECIO_PORTEValue : Currency; function GetOldDESCUENTOValue : Float; function GetOldPRECIO_NETOValue : Currency; + function GetOldPRECIO_PVPValue : Currency; function GetOldINVENTARIABLEValue : SmallInt; function GetOldID_PROVEEDORValue : Integer; function GetOldNOMBRE_PROVEEDORValue : String; @@ -304,6 +317,7 @@ type property OldPRECIO_PORTE : Currency read GetOldPRECIO_PORTEValue; property OldDESCUENTO : Float read GetOldDESCUENTOValue; property OldPRECIO_NETO : Currency read GetOldPRECIO_NETOValue; + property OldPRECIO_PVP : Currency read GetOldPRECIO_PVPValue; property OldINVENTARIABLE : SmallInt read GetOldINVENTARIABLEValue; property OldID_PROVEEDOR : Integer read GetOldID_PROVEEDORValue; property OldNOMBRE_PROVEEDOR : String read GetOldNOMBRE_PROVEEDORValue; @@ -406,6 +420,12 @@ type function GetOldPRECIO_NETOIsNull: Boolean; virtual; procedure SetPRECIO_NETOValue(const aValue: Currency); virtual; procedure SetPRECIO_NETOIsNull(const aValue: Boolean); virtual; + function GetPRECIO_PVPValue: Currency; virtual; + function GetPRECIO_PVPIsNull: Boolean; virtual; + function GetOldPRECIO_PVPValue: Currency; virtual; + function GetOldPRECIO_PVPIsNull: Boolean; virtual; + procedure SetPRECIO_PVPValue(const aValue: Currency); virtual; + procedure SetPRECIO_PVPIsNull(const aValue: Boolean); virtual; function GetINVENTARIABLEValue: SmallInt; virtual; function GetINVENTARIABLEIsNull: Boolean; virtual; function GetOldINVENTARIABLEValue: SmallInt; virtual; @@ -492,6 +512,10 @@ type property PRECIO_NETOIsNull : Boolean read GetPRECIO_NETOIsNull write SetPRECIO_NETOIsNull; property OldPRECIO_NETO : Currency read GetOldPRECIO_NETOValue; property OldPRECIO_NETOIsNull : Boolean read GetOldPRECIO_NETOIsNull; + property PRECIO_PVP : Currency read GetPRECIO_PVPValue write SetPRECIO_PVPValue; + property PRECIO_PVPIsNull : Boolean read GetPRECIO_PVPIsNull write SetPRECIO_PVPIsNull; + property OldPRECIO_PVP : Currency read GetOldPRECIO_PVPValue; + property OldPRECIO_PVPIsNull : Boolean read GetOldPRECIO_PVPIsNull; property INVENTARIABLE : SmallInt read GetINVENTARIABLEValue write SetINVENTARIABLEValue; property INVENTARIABLEIsNull : Boolean read GetINVENTARIABLEIsNull write SetINVENTARIABLEIsNull; property OldINVENTARIABLE : SmallInt read GetOldINVENTARIABLEValue; @@ -539,7 +563,7 @@ end; procedure TArticulosBusinessProcessorRules.IMAGEN_OnChange(Sender: TObject); begin - BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosIMAGEN] := VariantBinaryFromBinary((TROStream(Sender) as IROStream).Stream); + BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosIMAGEN] := BinaryToBlobVariant((TROStream(Sender) as IROStream).Stream); end; function TArticulosBusinessProcessorRules.GetIDValue: Integer; @@ -702,7 +726,7 @@ begin result := f_IMAGEN; result.Position := 0; if not Result.InUpdateMode then begin - WriteVariantBinaryToBinary(BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosIMAGEN], result.Stream); + BlobVariantToBinary(BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosIMAGEN], result.Stream); result.Position := 0; end; end; @@ -715,7 +739,7 @@ end; function TArticulosBusinessProcessorRules.GetOldIMAGENValue: IROStream; begin result := NewROStream(); - WriteVariantBinaryToBinary(BusinessProcessor.CurrentChange.OldValueByName[fld_ArticulosIMAGEN], result.Stream); + BlobVariantToBinary(BusinessProcessor.CurrentChange.OldValueByName[fld_ArticulosIMAGEN], result.Stream); end; function TArticulosBusinessProcessorRules.GetOldIMAGENIsNull: Boolean; @@ -1008,6 +1032,37 @@ begin BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosPRECIO_NETO] := Null; end; +function TArticulosBusinessProcessorRules.GetPRECIO_PVPValue: Currency; +begin + result := BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosPRECIO_PVP]; +end; + +function TArticulosBusinessProcessorRules.GetPRECIO_PVPIsNull: Boolean; +begin + result := VarIsNull(BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosPRECIO_PVP]); +end; + +function TArticulosBusinessProcessorRules.GetOldPRECIO_PVPValue: Currency; +begin + result := BusinessProcessor.CurrentChange.OldValueByName[fld_ArticulosPRECIO_PVP]; +end; + +function TArticulosBusinessProcessorRules.GetOldPRECIO_PVPIsNull: Boolean; +begin + result := VarIsNull(BusinessProcessor.CurrentChange.OldValueByName[fld_ArticulosPRECIO_PVP]); +end; + +procedure TArticulosBusinessProcessorRules.SetPRECIO_PVPValue(const aValue: Currency); +begin + BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosPRECIO_PVP] := aValue; +end; + +procedure TArticulosBusinessProcessorRules.SetPRECIO_PVPIsNull(const aValue: Boolean); +begin + if aValue then + BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosPRECIO_PVP] := Null; +end; + function TArticulosBusinessProcessorRules.GetINVENTARIABLEValue: SmallInt; begin result := BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosINVENTARIABLE]; @@ -1152,7 +1207,7 @@ end; procedure TArticulosParaClienteBusinessProcessorRules.IMAGEN_OnChange(Sender: TObject); begin - BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosParaClienteIMAGEN] := VariantBinaryFromBinary((TROStream(Sender) as IROStream).Stream); + BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosParaClienteIMAGEN] := BinaryToBlobVariant((TROStream(Sender) as IROStream).Stream); end; function TArticulosParaClienteBusinessProcessorRules.GetIDValue: Integer; @@ -1315,7 +1370,7 @@ begin result := f_IMAGEN; result.Position := 0; if not Result.InUpdateMode then begin - WriteVariantBinaryToBinary(BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosParaClienteIMAGEN], result.Stream); + BlobVariantToBinary(BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosParaClienteIMAGEN], result.Stream); result.Position := 0; end; end; @@ -1328,7 +1383,7 @@ end; function TArticulosParaClienteBusinessProcessorRules.GetOldIMAGENValue: IROStream; begin result := NewROStream(); - WriteVariantBinaryToBinary(BusinessProcessor.CurrentChange.OldValueByName[fld_ArticulosParaClienteIMAGEN], result.Stream); + BlobVariantToBinary(BusinessProcessor.CurrentChange.OldValueByName[fld_ArticulosParaClienteIMAGEN], result.Stream); end; function TArticulosParaClienteBusinessProcessorRules.GetOldIMAGENIsNull: Boolean; @@ -1621,6 +1676,37 @@ begin BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosParaClientePRECIO_NETO] := Null; end; +function TArticulosParaClienteBusinessProcessorRules.GetPRECIO_PVPValue: Currency; +begin + result := BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosParaClientePRECIO_PVP]; +end; + +function TArticulosParaClienteBusinessProcessorRules.GetPRECIO_PVPIsNull: Boolean; +begin + result := VarIsNull(BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosParaClientePRECIO_PVP]); +end; + +function TArticulosParaClienteBusinessProcessorRules.GetOldPRECIO_PVPValue: Currency; +begin + result := BusinessProcessor.CurrentChange.OldValueByName[fld_ArticulosParaClientePRECIO_PVP]; +end; + +function TArticulosParaClienteBusinessProcessorRules.GetOldPRECIO_PVPIsNull: Boolean; +begin + result := VarIsNull(BusinessProcessor.CurrentChange.OldValueByName[fld_ArticulosParaClientePRECIO_PVP]); +end; + +procedure TArticulosParaClienteBusinessProcessorRules.SetPRECIO_PVPValue(const aValue: Currency); +begin + BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosParaClientePRECIO_PVP] := aValue; +end; + +procedure TArticulosParaClienteBusinessProcessorRules.SetPRECIO_PVPIsNull(const aValue: Boolean); +begin + if aValue then + BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosParaClientePRECIO_PVP] := Null; +end; + function TArticulosParaClienteBusinessProcessorRules.GetINVENTARIABLEValue: SmallInt; begin result := BusinessProcessor.CurrentChange.NewValueByName[fld_ArticulosParaClienteINVENTARIABLE]; diff --git a/Source/Modulos/Articulos/Model/uBizArticulos.pas b/Source/Modulos/Articulos/Model/uBizArticulos.pas index 9ad2485f..015dd5d1 100644 --- a/Source/Modulos/Articulos/Model/uBizArticulos.pas +++ b/Source/Modulos/Articulos/Model/uBizArticulos.pas @@ -15,7 +15,7 @@ type function HayImagen: Boolean; procedure SalvarImagen(const AFileName: String); procedure CargarImagen(const AFileName: String); - procedure QuitarImagen; +// procedure QuitarImagen; end; TBizArticulo = class(TArticulosDataTableRules, IBizArticulo, ISeleccionable) @@ -23,11 +23,11 @@ type FSeleccionableInterface : ISeleccionable; procedure OnNewRecord(Sender: TDADataTable); override; public - procedure IniciarValoresArticuloNuevo; virtual; + procedure IniciarValoresArticuloNuevo; virtual; function HayImagen: Boolean; procedure SalvarImagen(const AFileName: String); procedure CargarImagen(const AFileName: String); - procedure QuitarImagen; +// procedure QuitarImagen; function EsNuevo : Boolean; constructor Create(aDataTable: TDADataTable); override; destructor Destroy; override; @@ -44,10 +44,10 @@ uses procedure TBizArticulo.CargarImagen(const AFileName: String); begin -{ inherited; + inherited; DataTable.Edit; DataTable.FieldByName(fld_ArticulosIMAGEN).LoadFromFile(AFileName); - DataTable.Post;} + DataTable.Post; end; constructor TBizArticulo.Create(aDataTable: TDADataTable); @@ -68,11 +68,11 @@ begin end; function TBizArticulo.HayImagen: Boolean; -{var +var AStream : TMemoryStream; - AROStream : IROStream;} + AROStream : IROStream; begin -{ AStream := TMemoryStream.Create; + AStream := TMemoryStream.Create; AROStream := TROStream.Create(AStream, False); try DataTable.FieldByName(fld_ArticulosIMAGEN).SaveToStream(AROStream); @@ -80,7 +80,7 @@ begin finally AROStream := NIL; FreeAndNIL(AStream); - end;} + end; end; procedure TBizArticulo.IniciarValoresArticuloNuevo; @@ -103,16 +103,16 @@ begin IniciarValoresArticuloNuevo; end; -procedure TBizArticulo.QuitarImagen; +{procedure TBizArticulo.QuitarImagen; begin -{ DataTable.Edit; - DataTable.Fields[idx_ArticulosIMAGEN].Clear; - DataTable.Post;} -end; +// DataTable.Edit; +// DataTable.Fields[idx_ArticulosIMAGEN].Clear; +// DataTable.Post; +end;} procedure TBizArticulo.SalvarImagen(const AFileName: String); begin -// DataTable.FieldByName(fld_ArticulosIMAGEN).SaveToFile(AFileName); + DataTable.FieldByName(fld_ArticulosIMAGEN).SaveToFile(AFileName); end; initialization diff --git a/Source/Modulos/Articulos/Plugin/uPluginArticulos.dfm b/Source/Modulos/Articulos/Plugin/uPluginArticulos.dfm index 4144b60d..3118cf1c 100644 --- a/Source/Modulos/Articulos/Plugin/uPluginArticulos.dfm +++ b/Source/Modulos/Articulos/Plugin/uPluginArticulos.dfm @@ -53,9 +53,9 @@ object PluginArticulos: TPluginArticulos Left = 40 Top = 16 object N1: TMenuItem - Caption = 'Log'#237'stica' + Caption = 'Datos' object Articulos1: TMenuItem - Tag = 101 + Tag = 1000 Action = actArticulos end end diff --git a/Source/Modulos/Articulos/Servidor/srvArticulos_Impl.dfm b/Source/Modulos/Articulos/Servidor/srvArticulos_Impl.dfm index 1ddce252..1dc6eaaa 100644 --- a/Source/Modulos/Articulos/Servidor/srvArticulos_Impl.dfm +++ b/Source/Modulos/Articulos/Servidor/srvArticulos_Impl.dfm @@ -120,6 +120,33 @@ object srvArticulos: TsrvArticulos DataDictionary = DataDictionary Diagrams = Diagrams Datasets = < + item + Params = < + item + Name = 'id' + Value = '' + end> + Statements = < + item + Connection = 'IBX' + ConnectionType = 'Interbase' + Default = True + Name = 'IBX' + SQL = 'select id'#10'from articulos'#10'where id = :id'#10 + StatementType = stSQL + ColumnMappings = < + item + DatasetField = 'ID' + TableField = 'ID' + end> + end> + Name = 'ExisteImagen' + Fields = < + item + Name = 'ID' + DataType = datInteger + end> + end item Params = <> Statements = < @@ -203,6 +230,10 @@ object srvArticulos: TsrvArticulos item DatasetField = 'ELIMINADO' TableField = 'ELIMINADO' + end + item + DatasetField = 'PRECIO_PVP' + TableField = 'PRECIO_PVP' end> end> Name = 'Articulos' @@ -241,7 +272,8 @@ object srvArticulos: TsrvArticulos item Name = 'IMAGEN' DataType = datBlob - DictionaryEntry = 'Articulos_IMAGEN' + BlobType = dabtGraphic + DisplayLabel = 'Foto' end item Name = 'COMISIONABLE' @@ -290,6 +322,10 @@ object srvArticulos: TsrvArticulos DataType = datCurrency DictionaryEntry = 'Articulos_PRECIO_NETO' end + item + Name = 'PRECIO_PVP' + DataType = datCurrency + end item Name = 'INVENTARIABLE' DataType = datSmallInt @@ -330,11 +366,12 @@ object srvArticulos: TsrvArticulos ' V_ARTICULOS.REFERENCIA_PROV,'#10' V_ARTICULOS.PRECIO_COST' + 'E,'#10' V_ARTICULOS.PRECIO_PORTE,'#10' CLIENTES_DTOS_PROVEED' + 'ORES.DESCUENTO,'#10' V_ARTICULOS.PRECIO_NETO,'#10' V_ARTICUL' + - 'OS.INVENTARIABLE,'#10' V_ARTICULOS.ID_PROVEEDOR,'#10' V_ARTI' + - 'CULOS.NOMBRE_PROVEEDOR,'#10' V_ARTICULOS.ELIMINADO'#10'FROM V_ARTI' + - 'CULOS'#10'LEFT OUTER JOIN CLIENTES_DTOS_PROVEEDORES'#10'ON ((CLIENTES_DT' + - 'OS_PROVEEDORES.ID_PROVEEDOR = V_ARTICULOS.ID_PROVEEDOR)'#10'AND (CLI' + - 'ENTES_DTOS_PROVEEDORES.ID_CLIENTE = :ID_CLIENTE))'#10'where {where}'#10 + 'OS.PRECIO_PVP,'#10' V_ARTICULOS.INVENTARIABLE,'#10' V_ARTICU' + + 'LOS.ID_PROVEEDOR,'#10' V_ARTICULOS.NOMBRE_PROVEEDOR,'#10' V_' + + 'ARTICULOS.ELIMINADO'#10'FROM V_ARTICULOS'#10'LEFT OUTER JOIN CLIENTES_DT' + + 'OS_PROVEEDORES'#10'ON ((CLIENTES_DTOS_PROVEEDORES.ID_PROVEEDOR = V_A' + + 'RTICULOS.ID_PROVEEDOR)'#10'AND (CLIENTES_DTOS_PROVEEDORES.ID_CLIENTE' + + ' = :ID_CLIENTE))'#10'where {where}'#10 StatementType = stSQL ColumnMappings = < item @@ -413,6 +450,10 @@ object srvArticulos: TsrvArticulos item DatasetField = 'ELIMINADO' TableField = 'ELIMINADO' + end + item + DatasetField = 'PRECIO_PVP' + TableField = 'PRECIO_PVP' end> end> Name = 'ArticulosParaCliente' @@ -483,6 +524,10 @@ object srvArticulos: TsrvArticulos Name = 'PRECIO_NETO' DataType = datCurrency end + item + Name = 'PRECIO_PVP' + DataType = datCurrency + end item Name = 'INVENTARIABLE' DataType = datSmallInt @@ -515,70 +560,92 @@ object srvArticulos: TsrvArticulos end item Name = 'ID_EMPRESA' + DataType = datInteger Value = '' end item Name = 'REFERENCIA' + DataType = datString + Size = 255 Value = '' end item Name = 'DESCRIPCION' + DataType = datString + Size = 255 Value = '' end item Name = 'FAMILIA' - Value = '' - end - item - Name = 'IMAGEN' + DataType = datString + Size = 255 Value = '' end item Name = 'COMISIONABLE' + DataType = datSmallInt Value = '' end item Name = 'FECHA_ALTA' + DataType = datDateTime Value = '' end item Name = 'FECHA_MODIFICACION' + DataType = datDateTime Value = '' end item Name = 'USUARIO' + DataType = datString + Size = 30 Value = '' end item Name = 'PRECIO_COSTE' + DataType = datCurrency Value = '' end item Name = 'PRECIO_PORTE' + DataType = datCurrency Value = '' end item Name = 'DESCUENTO' + DataType = datFloat Value = '' end item Name = 'ID_PROVEEDOR' + DataType = datInteger Value = '' end item Name = 'PRECIO_NETO' + DataType = datCurrency + Value = '' + end + item + Name = 'PRECIO_PVP' + DataType = datCurrency Value = '' end item Name = 'REFERENCIA_PROV' + DataType = datString + Size = 255 Value = '' end item Name = 'INVENTARIABLE' + DataType = datSmallInt Value = '' end item Name = 'ELIMINADO' + DataType = datSmallInt Value = '' end> Statements = < @@ -587,19 +654,60 @@ object srvArticulos: TsrvArticulos TargetTable = 'ARTICULOS' SQL = 'INSERT'#10' INTO ARTICULOS'#10' (ID, ID_EMPRESA, REFERENCIA, DESCRIP' + - 'CION, FAMILIA, IMAGEN, '#10' COMISIONABLE, FECHA_ALTA, FECHA_MOD' + - 'IFICACION, USUARIO, '#10' PRECIO_COSTE, PRECIO_PORTE, DESCUENTO,' + - ' ID_PROVEEDOR, '#10' PRECIO_NETO, REFERENCIA_PROV, INVENTARIABLE' + - ', ELIMINADO)'#10' VALUES'#10' (:ID, :ID_EMPRESA, :REFERENCIA, :DESCR' + - 'IPCION, :FAMILIA, '#10' :IMAGEN, :COMISIONABLE, :FECHA_ALTA, :FE' + - 'CHA_MODIFICACION, '#10' :USUARIO, :PRECIO_COSTE, :PRECIO_PORTE, ' + - ':DESCUENTO, '#10' :ID_PROVEEDOR, :PRECIO_NETO, :REFERENCIA_PROV,' + - #10' :INVENTARIABLE, :ELIMINADO)' + 'CION, FAMILIA,'#10' COMISIONABLE, FECHA_ALTA, FECHA_MODIFICACION' + + ', USUARIO, '#10' PRECIO_COSTE, PRECIO_PORTE, DESCUENTO, ID_PROVE' + + 'EDOR, '#10' PRECIO_NETO, PRECIO_PVP, REFERENCIA_PROV, INVENTARIA' + + 'BLE, ELIMINADO)'#10' VALUES'#10' (:ID, :ID_EMPRESA, :REFERENCIA, :DE' + + 'SCRIPCION, :FAMILIA, '#10' :COMISIONABLE, :FECHA_ALTA, :FECHA_MO' + + 'DIFICACION,'#10' :USUARIO, :PRECIO_COSTE, :PRECIO_PORTE, :DESCUE' + + 'NTO, '#10' :ID_PROVEEDOR, :PRECIO_NETO, :PRECIO_PVP, :REFERENCIA' + + '_PROV,'#10' :INVENTARIABLE, :ELIMINADO)'#10 StatementType = stSQL ColumnMappings = <> end> Name = 'Insert_Articulos' end + item + Params = < + item + Name = 'IMAGEN' + DataType = datBlob + Value = '' + end + item + Name = 'ID' + Value = '' + end> + Statements = < + item + Connection = 'IBX' + ConnectionType = 'Interbase' + Default = True + Name = 'IBX' + SQL = 'update articulos'#10'set IMAGEN = :IMAGEN'#10'where ID = :ID'#10 + StatementType = stSQL + ColumnMappings = <> + end> + Name = 'ModificarImagen' + end + item + Params = < + item + Name = 'id' + Value = '' + end> + Statements = < + item + Connection = 'IBX' + ConnectionType = 'Interbase' + Default = True + Name = 'IBX' + SQL = 'update articulos'#10'set imagen = null'#10'where id = :id'#10 + StatementType = stSQL + ColumnMappings = <> + end> + Name = 'EliminarImagen' + end item Params = < item @@ -622,70 +730,92 @@ object srvArticulos: TsrvArticulos Params = < item Name = 'ID_EMPRESA' + DataType = datInteger Value = '' end item Name = 'REFERENCIA' + DataType = datString + Size = 255 Value = '' end item Name = 'DESCRIPCION' + DataType = datString + Size = 255 Value = '' end item Name = 'FAMILIA' - Value = '' - end - item - Name = 'IMAGEN' + DataType = datString + Size = 255 Value = '' end item Name = 'COMISIONABLE' + DataType = datSmallInt Value = '' end item Name = 'FECHA_ALTA' + DataType = datDateTime Value = '' end item Name = 'FECHA_MODIFICACION' + DataType = datDateTime Value = '' end item Name = 'USUARIO' + DataType = datString + Size = 30 Value = '' end item Name = 'PRECIO_COSTE' + DataType = datCurrency Value = '' end item Name = 'PRECIO_PORTE' + DataType = datCurrency Value = '' end item Name = 'DESCUENTO' + DataType = datFloat Value = '' end item Name = 'ID_PROVEEDOR' + DataType = datInteger Value = '' end item Name = 'PRECIO_NETO' + DataType = datCurrency + Value = '' + end + item + Name = 'PRECIO_PVP' + DataType = datCurrency Value = '' end item Name = 'INVENTARIABLE' + DataType = datSmallInt Value = '' end item Name = 'REFERENCIA_PROV' + DataType = datString + Size = 255 Value = '' end item Name = 'ELIMINADO' + DataType = datSmallInt Value = '' end item @@ -699,14 +829,14 @@ object srvArticulos: TsrvArticulos SQL = 'UPDATE ARTICULOS'#10' SET '#10' ID_EMPRESA = :ID_EMPRESA,'#10' REFERE' + 'NCIA = :REFERENCIA, '#10' DESCRIPCION = :DESCRIPCION, '#10' FAMILI' + - 'A = :FAMILIA, '#10' IMAGEN = :IMAGEN, '#10' COMISIONABLE = :COMISI' + - 'ONABLE, '#10' FECHA_ALTA = :FECHA_ALTA, '#10' FECHA_MODIFICACION =' + - ' :FECHA_MODIFICACION, '#10' USUARIO = :USUARIO, '#10' PRECIO_COSTE' + - ' = :PRECIO_COSTE, '#10' PRECIO_PORTE = :PRECIO_PORTE, '#10' DESCUE' + - 'NTO = :DESCUENTO, '#10' ID_PROVEEDOR = :ID_PROVEEDOR, '#10' PRECIO' + - '_NETO = :PRECIO_NETO,'#10' INVENTARIABLE = :INVENTARIABLE,'#10' RE' + - 'FERENCIA_PROV = :REFERENCIA_PROV,'#10' ELIMINADO = :ELIMINADO'#10' W' + - 'HERE'#10' (ID = :OLD_ID)'#10 + 'A = :FAMILIA, '#10' COMISIONABLE = :COMISIONABLE,'#10' FECHA_ALTA ' + + '= :FECHA_ALTA, '#10' FECHA_MODIFICACION = :FECHA_MODIFICACION, '#10' ' + + ' USUARIO = :USUARIO, '#10' PRECIO_COSTE = :PRECIO_COSTE, '#10' P' + + 'RECIO_PORTE = :PRECIO_PORTE, '#10' DESCUENTO = :DESCUENTO, '#10' I' + + 'D_PROVEEDOR = :ID_PROVEEDOR, '#10' PRECIO_NETO = :PRECIO_NETO,'#10' ' + + ' PRECIO_PVP = :PRECIO_PVP,'#10' INVENTARIABLE = :INVENTARIABLE,'#10 + + ' REFERENCIA_PROV = :REFERENCIA_PROV,'#10' ELIMINADO = :ELIMINA' + + 'DO'#10' WHERE'#10' (ID = :OLD_ID)'#10 StatementType = stSQL ColumnMappings = <> end> diff --git a/Source/Modulos/Articulos/Servidor/srvArticulos_Impl.pas b/Source/Modulos/Articulos/Servidor/srvArticulos_Impl.pas index a4d19a39..a56f5a08 100644 --- a/Source/Modulos/Articulos/Servidor/srvArticulos_Impl.pas +++ b/Source/Modulos/Articulos/Servidor/srvArticulos_Impl.pas @@ -31,13 +31,15 @@ type procedure DARemoteServiceCreate(Sender: TObject); procedure DataAbstractServiceBeforeAcquireConnection(aSender: TObject; var aConnectionName: string); + function EliminarImagen(const ID_ARTICULO: Integer): Boolean; + function AnadirImagen(const ID_ARTICULO: Integer; const AFileName: AnsiString): Boolean; end; implementation {$R *.dfm} uses - {Generated:} FactuGES_Invk, uDataModuleServer, + {Generated:} FactuGES_Invk, uDataModuleServer, uROClasses, uDatabaseUtils, schArticulosClient_Intf, uRestriccionesUsuarioUtils; procedure Create_srvArticulos(out anInstance : IUnknown); @@ -46,6 +48,50 @@ begin end; { srvArticulos } +function TsrvArticulos.AnadirImagen(const ID_ARTICULO: Integer; const AFileName: AnsiString): Boolean; +var + AConn : IDAConnection; + dsData: IDADataset; + dsCommand: IDASQLCommand; + +begin + Result := False; + AConn := dmServer.ConnectionManager.NewConnection(dmServer.ConnectionManager.GetDefaultConnectionName); + + try + try + dsData := schArticulos.NewDataset(AConn, 'ExisteImagen', ['ID'], [ID_ARTICULO]); + dsData.Active := True; + Result := (dsData.FieldValues[0] > 0); + AConn.CommitTransaction; + except + RaiseError('Error al buscar articulo con imagen'); + AConn.RollbackTransaction; + end; + finally + dsData := NIL; + end; + + if Result then + begin + try + try + dsCommand := schArticulos.NewCommand(AConn, 'ModificarImagen'); + dsCommand.ParamByName('ID').AsInteger := ID_ARTICULO; + dsCommand.ParamByName('IMAGEN').LoadFromFile(AFileName); + dsCommand.Execute; + AConn.CommitTransaction; + Result := True; + except + RaiseError('Error al modificar la imagen'); + AConn.RollbackTransaction; + end; + finally + dsCommand := NIL; + end; + end; +end; + procedure TsrvArticulos.DARemoteServiceBeforeGetDatasetData( const Dataset: IDADataset; const IncludeSchema: Boolean; const MaxRecords: Integer); @@ -70,6 +116,32 @@ begin ConnectionName := dmServer.ConnectionName; end; +function TsrvArticulos.EliminarImagen(const ID_ARTICULO: Integer): Boolean; +var + AConn : IDAConnection; + dsCommand: IDASQLCommand; + +begin + Result := False; + AConn := dmServer.ConnectionManager.NewConnection(dmServer.ConnectionManager.GetDefaultConnectionName); + + try + try + dsCommand := schArticulos.NewCommand(AConn, 'EliminarImagen'); + with dsCommand do + ParamByName('ID').AsInteger := ID_ARTICULO; + dsCommand.Execute; + AConn.CommitTransaction; + Result := True; + except + RaiseError('Error al eliminar la imagen'); + AConn.RollbackTransaction; + end; + finally + dsCommand := NIL; + end; +end; + initialization TROClassFactory.Create('srvArticulos', Create_srvArticulos, TsrvArticulos_Invoker); diff --git a/Source/Modulos/Articulos/Views/Articulos_view.RES b/Source/Modulos/Articulos/Views/Articulos_view.RES index 8b251f312bcccec5485024f6fe8d80e1cdf25746..1641339fcc482e7e3492d1b45813a86619622c33 100644 GIT binary patch literal 4748 zcmbW5&ub)A5XUPdpe&2#;C*uNAUVhgd+&(4um@dnom`vXF9g}ZuHJ;se=<3UNdFJg zbCw+UD9j$byGIXV`~6hC>h4S?F|k9X-j90q{Z_qtZ<;nUJCO8!h?p${kR>3GhM`oH*q zk=UsjOCIgA_4!`B+Gb&`I84R)bT4dy-BQV<-SyFz?R8ILEQ(+JB$u{sEXE@j@B*7W zT;iZH#|OJ<&DO$RCkM6VbK3(B(k{nbdv1lpc;E$xz9as|v3uE1V{hw2w~g3eD0an7 z{BT%G%irdMe*|oDJmgvJaA2`9B<6Xi*?M~Q;)@Sbfwf3uf zVaWkbUjU=;sL{BlYemIZXv%qZ{SZw{-TCU+;!nH6KDDIJumU+9{E0zXW4>7T)y|>$DQlv zRJe?TjSp{c!DqeayAnSMTtZZT;>LN7J0Rls+5m@q)MbyB*eL%Eu@(+$Cw}Pd@q7N| z%Q0*AHpCP^b9v`@jx-l_FD>khpW2W8(OU2&V5TrnoAY-m_hlcV?zq3;7{2gF{J#Hc z6R+o~mVenX?>@W0@_DVzyOFs(5464CY{!q9ChoF#_*eXi@4gFuV8?vhl=_w5$iKL0 zEV0nMBcN08xtRmsgJrqjh@s#|{?*ssnsG)mH*wa6{efF0JFWHok@kA5%b661{B38= zCcgJ|*ZFTpV$8<-&+AWpa)Q8*`wL&hMeNQ^v6I7$HSdLZhZ^&+6<@Uw_Zsml9^v3W zVvPDBKHh;i=RU4J_ta3E;)Mn>Y+L zKLZ0UQ+*km9FO-b?U4gmn-62iwzH6&*duKGo~aUV)bYDla8wWZ9+^7p-F<8lP@i!m z@vhbD_${F}h>^T;C(?(b*OJDk?{dEXB?nuehoON3HAb!7Mr7-ls!84-5V-jJugbu<_$}mU=Yd9!?TOX;|B-#B)+0x#9q*yqJiqS!`49d=7ztk$O+9=1i;?K_|J<8T z?0b7=-`Z3A#vV$4XJ5(lQ~TOZHUFdA%oWvK5zg&_IKXIbughQBA8XAsd#=@|TFLXC zy(^m((;DnQmDQKatmw!@c`| G?EMQ&4NnpP delta 11 ScmeBCZD5|Duvteife`=|>;pCc diff --git a/Source/Modulos/Articulos/Views/Articulos_view.dproj b/Source/Modulos/Articulos/Views/Articulos_view.dproj index 328f09de..acac828b 100644 --- a/Source/Modulos/Articulos/Views/Articulos_view.dproj +++ b/Source/Modulos/Articulos/Views/Articulos_view.dproj @@ -54,11 +54,11 @@ MainSource - - - - - + + + + +
fEditorArticulo
diff --git a/Source/Modulos/Articulos/Views/uEditorArticulo.dfm b/Source/Modulos/Articulos/Views/uEditorArticulo.dfm index b4c51fda..7129d576 100644 --- a/Source/Modulos/Articulos/Views/uEditorArticulo.dfm +++ b/Source/Modulos/Articulos/Views/uEditorArticulo.dfm @@ -39,7 +39,7 @@ inherited fEditorArticulo: TfEditorArticulo Width = 624 ExplicitWidth = 624 inherited tbxMain: TTBXToolbar - ExplicitWidth = 394 + ExplicitWidth = 400 inherited TBXItem2: TTBXItem Visible = False end @@ -95,18 +95,6 @@ inherited fEditorArticulo: TfEditorArticulo end end end - inherited pgPaginas: TPageControl - Width = 624 - Height = 385 - ExplicitWidth = 624 - ExplicitHeight = 385 - inherited pagGeneral: TTabSheet - ExplicitLeft = 4 - ExplicitTop = 24 - ExplicitWidth = 616 - ExplicitHeight = 357 - end - end inherited StatusBar: TJvStatusBar Top = 461 Width = 624 @@ -117,6 +105,25 @@ inherited fEditorArticulo: TfEditorArticulo ExplicitTop = 461 ExplicitWidth = 624 end + inherited pgPaginas: TPageControl + Width = 618 + Height = 349 + ExplicitWidth = 618 + ExplicitHeight = 349 + inherited pagGeneral: TTabSheet + ExplicitLeft = 4 + ExplicitTop = 24 + ExplicitWidth = 610 + ExplicitHeight = 321 + end + end + inherited PnlComentario: TPanel + Width = 624 + inherited lbComentario: TLabel + Width = 614 + Height = 25 + end + end inherited EditorActionList: TActionList Top = 128 object actFamilias: TAction @@ -127,7 +134,18 @@ inherited fEditorArticulo: TfEditorArticulo OnExecute = actFamiliasExecute end end - inherited SmallImages: TPngImageList + inherited dsDataTable: TDADataSource [6] + Left = 168 + Top = 120 + end + inherited LargeImages: TPngImageList + Top = 112 + end + inherited JvFormStorage: TJvFormStorage + Left = 400 + Top = 152 + end + inherited SmallImages: TPngImageList [9] PngImages = < item PngImage.Data = { @@ -633,17 +651,6 @@ inherited fEditorArticulo: TfEditorArticulo Top = 112 Bitmap = {} end - inherited dsDataTable: TDADataSource [6] - Left = 168 - Top = 120 - end - inherited LargeImages: TPngImageList [7] - Top = 112 - end - inherited JvFormStorage: TJvFormStorage [8] - Left = 400 - Top = 152 - end inherited JvAppRegistryStorage: TJvAppRegistryStorage Left = 432 Top = 152 diff --git a/Source/Modulos/Articulos/Views/uEditorArticulo.pas b/Source/Modulos/Articulos/Views/uEditorArticulo.pas index 86965f34..0f190eb6 100644 --- a/Source/Modulos/Articulos/Views/uEditorArticulo.pas +++ b/Source/Modulos/Articulos/Views/uEditorArticulo.pas @@ -13,7 +13,7 @@ uses JvAppStorage, JvAppRegistryStorage, JvFormPlacement, JvComponentBase, uViewArticulos, uIEditorArticulo, uArticulosController, JvExComCtrls, - JvStatusBar, dxLayoutLookAndFeels; + JvStatusBar, dxLayoutLookAndFeels, uDAInterfaces; type TfEditorArticulo = class(TfEditorDBItem, IEditorArticulo) @@ -46,6 +46,7 @@ type //sobreescribir este metodo procedure AsignarVista; virtual; procedure PonerTitulos(const ATitulo: string = ''); override; + function GetModified: Boolean; override; public property Articulo: IBizArticulo read GetArticulo write SetArticulo; @@ -74,6 +75,14 @@ begin Result := FController; end; +function TfEditorArticulo.GetModified: Boolean; +begin + Result := inherited GetModified; + //COMPROBAMOS SI EN LA VISTA HA HABIDO CAMBIOS EN LA IMAGEN + if not Result then + Result := Result or ViewArticulo.Modified; +end; + function TfEditorArticulo.GetViewArticulo: IViewArticulo; begin Result := FViewArticulo; @@ -83,6 +92,7 @@ procedure TfEditorArticulo.GuardarInterno; begin inherited; FController.Guardar(FArticulo); + ViewArticulo.Modified := False; Modified := False; end; diff --git a/Source/Modulos/Articulos/Views/uEditorElegirArticulos.dfm b/Source/Modulos/Articulos/Views/uEditorElegirArticulos.dfm index 2fc6b872..84869f51 100644 --- a/Source/Modulos/Articulos/Views/uEditorElegirArticulos.dfm +++ b/Source/Modulos/Articulos/Views/uEditorElegirArticulos.dfm @@ -10,6 +10,7 @@ inherited fEditorElegirArticulos: TfEditorElegirArticulos Width = 656 Caption = 'Lista de art'#237'culos' Visible = False + ExplicitTop = 64 ExplicitWidth = 656 inherited Image1: TImage Left = 629 @@ -20,6 +21,7 @@ inherited fEditorElegirArticulos: TfEditorElegirArticulos Top = 91 Width = 656 Height = 49 + ExplicitTop = 91 ExplicitWidth = 656 ExplicitHeight = 49 inherited tbxMain: TTBXToolbar @@ -130,7 +132,7 @@ inherited fEditorElegirArticulos: TfEditorElegirArticulos AlignWithMargins = True Left = 25 Top = 8 - Width = 606 + Width = 131 Height = 13 Margins.Left = 0 Margins.Top = 0 @@ -144,20 +146,17 @@ inherited fEditorElegirArticulos: TfEditorElegirArticulos Font.Name = 'Tahoma' Font.Style = [fsBold] ParentFont = False - ExplicitWidth = 131 end object lblComments: TLabel AlignWithMargins = True Left = 50 Top = 29 - Width = 581 - Height = 27 + Width = 3 + Height = 13 Margins.Left = 25 Margins.Top = 0 Margins.Right = 0 Align = alClient - ExplicitLeft = 34 - ExplicitTop = -6 end end inherited EditorActionList: TActionList [5] diff --git a/Source/Modulos/Articulos/Views/uViewArticulo.dfm b/Source/Modulos/Articulos/Views/uViewArticulo.dfm index da1eae46..c869fff5 100644 --- a/Source/Modulos/Articulos/Views/uViewArticulo.dfm +++ b/Source/Modulos/Articulos/Views/uViewArticulo.dfm @@ -177,7 +177,7 @@ inherited frViewArticulo: TfrViewArticulo Font.Name = 'Tahoma' Font.Style = [] ParentFont = False - TabOrder = 11 + TabOrder = 12 ReadOnly = False ExplicitLeft = 219 ExplicitTop = 166 @@ -329,6 +329,26 @@ inherited frViewArticulo: TfrViewArticulo TabOrder = 4 Width = 144 end + object ePrecioPVP: TcxDBCurrencyEdit + Left = 103 + Top = 301 + DataBinding.DataField = 'PRECIO_PVP' + DataBinding.DataSource = dsViewArticulo + Properties.Alignment.Horz = taRightJustify + Style.BorderColor = clWindowFrame + Style.BorderStyle = ebs3D + Style.HotTrack = False + Style.LookAndFeel.Kind = lfStandard + Style.LookAndFeel.NativeStyle = True + StyleDisabled.LookAndFeel.Kind = lfStandard + StyleDisabled.LookAndFeel.NativeStyle = True + StyleFocused.LookAndFeel.Kind = lfStandard + StyleFocused.LookAndFeel.NativeStyle = True + StyleHot.LookAndFeel.Kind = lfStandard + StyleHot.LookAndFeel.NativeStyle = True + TabOrder = 11 + Width = 400 + end object dxLayoutControlArticuloGroup_Root: TdxLayoutGroup ShowCaption = False Hidden = True @@ -381,6 +401,7 @@ inherited frViewArticulo: TfrViewArticulo AutoAligns = [aaVertical] AlignHorz = ahClient Caption = ' ' + Visible = False Control = eNoComisionable ControlOptions.ShowBorder = False end @@ -389,6 +410,7 @@ inherited frViewArticulo: TfrViewArticulo AlignHorz = ahClient Caption = ' ' ShowCaption = False + Visible = False Control = cbNoInventariable ControlOptions.ShowBorder = False end @@ -401,7 +423,6 @@ inherited frViewArticulo: TfrViewArticulo AlignHorz = ahClient AlignVert = avClient Caption = 'Imagen' - Visible = False LayoutDirection = ldHorizontal object dxLayoutControlArticuloItem6: TdxLayoutItem AutoAligns = [] @@ -440,34 +461,44 @@ inherited frViewArticulo: TfrViewArticulo Caption = 'Datos del proveedor para el art'#237'culo' object dxLayoutControlArticuloItem15: TdxLayoutItem Caption = 'Ref. del prov:' + Visible = False Control = eReferenciaProv ControlOptions.ShowBorder = False end object dxLayoutControlArticuloItem16: TdxLayoutItem - Caption = 'Precio:' + Caption = 'Precio coste:' Control = ePrecioCoste ControlOptions.ShowBorder = False end object dxLayoutControlArticuloItem17: TdxLayoutItem Caption = 'Dto (%):' + Visible = False Control = eDescuento ControlOptions.ShowBorder = False end object dxLayoutControlArticuloItem18: TdxLayoutItem Caption = 'Precio neto:' + Visible = False Control = ePrecioNeto ControlOptions.ShowBorder = False end object dxLayoutControlArticuloItem19: TdxLayoutItem Caption = 'Coste de envio:' + Visible = False Control = ePrecioPorte ControlOptions.ShowBorder = False end + object dxLayoutControlArticuloItem9: TdxLayoutItem + Caption = 'Precio PVP:' + Control = ePrecioPVP + ControlOptions.ShowBorder = False + end end object dxLayoutControlArticuloGroup12: TdxLayoutGroup AutoAligns = [aaVertical] AlignHorz = ahRight Caption = 'Proveedor para el art'#237'culo' + Visible = False object dxLayoutControlArticuloItem14: TdxLayoutItem Control = frViewDatosYSeleccionProveedor1 ControlOptions.AutoColor = True diff --git a/Source/Modulos/Articulos/Views/uViewArticulo.pas b/Source/Modulos/Articulos/Views/uViewArticulo.pas index 772381f8..d0de5e5b 100644 --- a/Source/Modulos/Articulos/Views/uViewArticulo.pas +++ b/Source/Modulos/Articulos/Views/uViewArticulo.pas @@ -71,6 +71,8 @@ type dxLayoutControlArticuloItem7: TdxLayoutItem; cbNoInventariable: TcxDBCheckBox; dxLayoutControlArticuloGroup8: TdxLayoutGroup; + dxLayoutControlArticuloItem9: TdxLayoutItem; + ePrecioPVP: TcxDBCurrencyEdit; procedure actEliminarExecute(Sender: TObject); procedure actAnadirExecute(Sender: TObject); procedure cbFamiliaPropertiesInitPopup(Sender: TObject); @@ -82,24 +84,28 @@ type procedure PrecioNetoChanged(Sender: TObject); private procedure CargarImagen; - procedure SalvarImagen; + protected FFamiliasController: IFamiliasController; FController: IArticulosController; FArticulo: IBizArticulo; + FImagenModificada: Boolean; function GetArticulo: IBizArticulo; procedure SetArticulo(const Value: IBizArticulo); virtual; function GetController : IArticulosController; procedure SetController (const Value : IArticulosController); procedure OnProveedorChanged(Sender: TObject); + public + function GetModified: Boolean; override; + procedure SetModified(const Value: Boolean); override; property Articulo: IBizArticulo read GetArticulo write SetArticulo; property Controller : IArticulosController read GetController write SetController; end; implementation -uses uDataModuleArticulos, uSistemaFunc, uBizFamilias, uBizContactos; +uses uDataModuleArticulos, uSistemaFunc, schArticulosClient_Intf, uBizFamilias, uBizContactos; {$R *.dfm} @@ -111,40 +117,54 @@ uses uDataModuleArticulos, uSistemaFunc, uBizFamilias, uBizContactos; } procedure TfrViewArticulo.actAnadirExecute(Sender: TObject); +var + aAux : String; begin -{ eImagen.LoadFromFile; + eImagen.LoadFromFile; if Assigned(eImagen.Picture) then - SalvarImagen;} -end; - -procedure TfrViewArticulo.actEliminarExecute(Sender: TObject); -begin -{ inherited; - eImagen.Clear; - FArticulo.QuitarImagen;} -end; - -procedure TfrViewArticulo.CargarImagen; -{var - aAux : String;} -begin -{ if FArticulo.HayImagen then begin ShowHourglassCursor; try aAux := DarFicheroJPGTemporal; - FArticulo.SalvarImagen(aAux); + eImagen.Picture.SaveToFile(aAux); + FController.PonerImagen(Articulo, aAux); + FImagenModificada := True; + finally + DeleteFile(aAux); + HideHourglassCursor; + end; + end; +end; + +procedure TfrViewArticulo.actEliminarExecute(Sender: TObject); +begin + inherited; + eImagen.Clear; + FController.QuitarImagen(Articulo); + FImagenModificada := True; +end; + +procedure TfrViewArticulo.CargarImagen; +var + aAux : String; +begin + if FArticulo.HayImagen then + begin + ShowHourglassCursor; + try + aAux := DarFicheroJPGTemporal; + Articulo.DataTable.FieldByName(fld_ArticulosIMAGEN).SaveToFile(aAux); try eImagen.Picture.LoadFromFile(aAux); except on EInvalidGraphic do - ShowMessage('error'); + ShowMessage('error de imagen en el articulo'); end; finally DeleteFile(aAux); HideHourglassCursor; end; - end;} + end; end; procedure TfrViewArticulo.cbFamiliaPropertiesInitPopup(Sender: TObject); @@ -192,6 +212,7 @@ end; procedure TfrViewArticulo.CustomViewCreate(Sender: TObject); begin inherited; + FImagenModificada := False; FFamiliasController := TFamiliasController.Create; end; @@ -220,6 +241,14 @@ begin Result := FController; end; +function TfrViewArticulo.GetModified: Boolean; +begin + Result := inherited GetModified; + //COMPROBAMOS SI EN LA VISTA HA HABIDO CAMBIOS EN LA IMAGEN + if not Result then + Result := Result or FImagenModificada; +end; + procedure TfrViewArticulo.OnProveedorChanged(Sender: TObject); begin if Assigned(FArticulo) then @@ -236,22 +265,6 @@ begin FController.CalcularPrecioNeto(FArticulo); end; -procedure TfrViewArticulo.SalvarImagen; -{var - aAux : String;} -begin -{ ShowHourglassCursor; - try - aAux := DarFicheroJPGTemporal; - eImagen.Picture.SaveToFile(aAux); - FArticulo.CargarImagen(aAux); - Self.Modified := True; - finally - DeleteFile(aAux); - HideHourglassCursor; - end;} -end; - procedure TfrViewArticulo.SetArticulo(const Value: IBizArticulo); begin FArticulo := Value; @@ -264,7 +277,7 @@ begin frViewDatosYSeleccionProveedor1.Proveedor := (FController.ProveedoresController.Buscar(FArticulo.ID_PROVEEDOR) as IBizProveedor); frViewDatosYSeleccionProveedor1.OnProveedorChanged := OnProveedorChanged; -// CargarImagen; + CargarImagen; end else begin dsViewArticulo.DataTable := NIL; @@ -278,5 +291,12 @@ begin FController := Value; end; +procedure TfrViewArticulo.SetModified(const Value: Boolean); +begin + inherited; + if not Value then + FImagenModificada := False; +end; + end. diff --git a/Source/Modulos/Articulos/Views/uViewArticulos.dfm b/Source/Modulos/Articulos/Views/uViewArticulos.dfm index 00c97801..27da9d20 100644 --- a/Source/Modulos/Articulos/Views/uViewArticulos.dfm +++ b/Source/Modulos/Articulos/Views/uViewArticulos.dfm @@ -31,9 +31,11 @@ inherited frViewArticulos: TfrViewArticulos Tag = 1 Value = 1 end> + Visible = False BestFitMaxWidth = 22 MinWidth = 22 Options.HorzSizing = False + VisibleForCustomization = False Width = 22 end object cxGridViewCOMISIONABLE: TcxGridDBColumn @@ -63,9 +65,11 @@ inherited frViewArticulos: TfrViewArticulos end> Properties.PostPopupValueOnTab = True Properties.ShowDescriptions = False + Visible = False BestFitMaxWidth = 22 MinWidth = 22 Options.HorzSizing = False + VisibleForCustomization = False Width = 22 end object cxGridViewREFERENCIA: TcxGridDBColumn @@ -89,13 +93,17 @@ inherited frViewArticulos: TfrViewArticulos object cxGridViewNOMBRE_PROVEEDOR: TcxGridDBColumn Caption = 'Proveedor' DataBinding.FieldName = 'NOMBRE_PROVEEDOR' + Visible = False BestFitMaxWidth = 120 + VisibleForCustomization = False Width = 120 end object cxGridViewREFERENCIA_PROV: TcxGridDBColumn Caption = 'Ref. proveedor' DataBinding.FieldName = 'REFERENCIA_PROV' + Visible = False BestFitMaxWidth = 60 + VisibleForCustomization = False Width = 60 end object cxGridViewPRECIO_COSTE: TcxGridDBColumn @@ -112,24 +120,39 @@ inherited frViewArticulos: TfrViewArticulos PropertiesClassName = 'TcxSpinEditProperties' Properties.Alignment.Horz = taRightJustify Properties.DisplayFormat = ',0.00 %;-,0.00 %' + Visible = False FooterAlignmentHorz = taRightJustify HeaderAlignmentHorz = taRightJustify + VisibleForCustomization = False end object cxGridViewPRECIO_NETO: TcxGridDBColumn Caption = 'Precio neto' DataBinding.FieldName = 'PRECIO_NETO' PropertiesClassName = 'TcxCurrencyEditProperties' Properties.Alignment.Horz = taRightJustify + Visible = False FooterAlignmentHorz = taRightJustify HeaderAlignmentHorz = taRightJustify + VisibleForCustomization = False end object cxGridViewPRECIO_PORTE: TcxGridDBColumn Caption = 'Precio porte' DataBinding.FieldName = 'PRECIO_PORTE' PropertiesClassName = 'TcxCurrencyEditProperties' Properties.Alignment.Horz = taRightJustify + Visible = False FooterAlignmentHorz = taRightJustify HeaderAlignmentHorz = taRightJustify + VisibleForCustomization = False + end + object cxGridViewPRECIO_PVP: TcxGridDBColumn + Caption = 'Precio PVP' + DataBinding.FieldName = 'PRECIO_PVP' + PropertiesClassName = 'TcxCurrencyEditProperties' + Properties.Alignment.Horz = taRightJustify + FooterAlignmentHorz = taRightJustify + GroupSummaryAlignment = taRightJustify + HeaderAlignmentHorz = taRightJustify end end end @@ -159,7 +182,6 @@ inherited frViewArticulos: TfrViewArticulos end inherited pnlAgrupaciones: TTBXDockablePanel Visible = True - ExplicitWidth = 128 inherited TBXAlignmentPanel1: TTBXAlignmentPanel inherited TBXToolbar1: TTBXToolbar object TBXSeparatorItem1: TTBXSeparatorItem diff --git a/Source/Modulos/Articulos/Views/uViewArticulos.pas b/Source/Modulos/Articulos/Views/uViewArticulos.pas index e24f2e6d..38216176 100644 --- a/Source/Modulos/Articulos/Views/uViewArticulos.pas +++ b/Source/Modulos/Articulos/Views/uViewArticulos.pas @@ -37,6 +37,7 @@ type TBXSeparatorItem1: TTBXSeparatorItem; TBXSeparatorItem2: TTBXSeparatorItem; cxGridViewINVENTARIABLE: TcxGridDBColumn; + cxGridViewPRECIO_PVP: TcxGridDBColumn; procedure cxGridViewIDCustomDrawCell( Sender: TcxCustomGridTableView; ACanvas: TcxCanvas; AViewInfo: TcxGridTableDataCellViewInfo; var ADone: Boolean); diff --git a/Source/Modulos/Articulos/Views/uViewDetallesArticulos.dfm b/Source/Modulos/Articulos/Views/uViewDetallesArticulos.dfm index 05ff8da3..9d711ec5 100644 --- a/Source/Modulos/Articulos/Views/uViewDetallesArticulos.dfm +++ b/Source/Modulos/Articulos/Views/uViewDetallesArticulos.dfm @@ -117,6 +117,7 @@ inherited frViewDetallesArticulos: TfrViewDetallesArticulos end inherited TBXDock1: TTBXDock inherited TBXToolbar1: TTBXToolbar + ExplicitWidth = 451 object TBXItem12: TTBXItem [0] Action = actAnadirArticulos DisplayMode = nbdmImageAndText @@ -127,9 +128,7 @@ inherited frViewDetallesArticulos: TfrViewDetallesArticulos object actAnadirArticulos: TAction Category = 'Operaciones' Caption = 'A'#241'adir art'#237'culos' - Enabled = False ImageIndex = 12 - Visible = False OnExecute = actAnadirArticulosExecute OnUpdate = actAnadirArticulosUpdate end diff --git a/Source/Modulos/Contratos de cliente/Controller/uContratosClienteController.pas b/Source/Modulos/Contratos de cliente/Controller/uContratosClienteController.pas index cf401e78..704f8470 100644 --- a/Source/Modulos/Contratos de cliente/Controller/uContratosClienteController.pas +++ b/Source/Modulos/Contratos de cliente/Controller/uContratosClienteController.pas @@ -741,7 +741,7 @@ begin AContrato.FORMA_PAGO.Add(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_FORMA_PAGO_COCINA)); AContrato.PLAZO_ENTREGA.Add(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_PLAZOS_ENTREGA_COCINA)); AContrato.OBSERVACIONES.Add(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_OBSERVACIONES_COCINA)); - (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_C_VACIO, 'MUEBLES DE COCINA ', False, AContrato.Detalles); + (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_C, 'MUEBLES DE COCINA ', False, AContrato.Detalles); (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_V, 'IMPORTES ', True, AContrato.Detalles); (Self.DetallesController as IDetallesContratoClienteController).AnadirCapitulo(TIPO_CAPITULO_V, 'AUMENTO POR ', False, AContrato.Detalles); end; diff --git a/Source/Modulos/Contratos de cliente/Controller/uDetallesContratoClienteController.pas b/Source/Modulos/Contratos de cliente/Controller/uDetallesContratoClienteController.pas index 3f8990e1..32ca61ae 100644 --- a/Source/Modulos/Contratos de cliente/Controller/uDetallesContratoClienteController.pas +++ b/Source/Modulos/Contratos de cliente/Controller/uDetallesContratoClienteController.pas @@ -224,11 +224,10 @@ end; procedure TDetallesContratoClienteController.RellenarImportes(ADetalles: IDAStronglyTypedDataTable; AArticulos: IBizArticulo); begin -//Como en tecsitel no hay descuento por linea de detalle, solo recuperamos nuevamente el valor del articulo cuando el detalle no tenga niguno -//de esta forma evitamos que al cambiar de cliente se quiten los importes que se hubiesen establecido para los articulos. +//Para acana el importa a cargar en la lista será siempre el precio PVP if ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).IsNull then if Assigned(AArticulos) then - ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := AArticulos.PRECIO_NETO + ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := AArticulos.PRECIO_PVP else ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := Null; end; diff --git a/Source/Modulos/Facturas de cliente/Controller/uDetallesFacturaClienteController.pas b/Source/Modulos/Facturas de cliente/Controller/uDetallesFacturaClienteController.pas index 35b3e767..5801ac4b 100644 --- a/Source/Modulos/Facturas de cliente/Controller/uDetallesFacturaClienteController.pas +++ b/Source/Modulos/Facturas de cliente/Controller/uDetallesFacturaClienteController.pas @@ -158,8 +158,9 @@ end; procedure TDetallesFacturaClienteController.RellenarImportes(ADetalles: IDAStronglyTypedDataTable; AArticulos: IBizArticulo); begin +//Para acana el importa a cargar en la lista será siempre el precio PVP if Assigned(AArticulos) then - ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := AArticulos.PRECIO_COSTE + ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := AArticulos.PRECIO_PVP else ADetalles.DataTable.FieldByName(CAMPO_IMPORTE_UNIDAD).AsVariant := Null; end; diff --git a/Source/Modulos/Familias/Plugin/uPluginFamilias.dfm b/Source/Modulos/Familias/Plugin/uPluginFamilias.dfm index 54d891a0..51a30d1b 100644 --- a/Source/Modulos/Familias/Plugin/uPluginFamilias.dfm +++ b/Source/Modulos/Familias/Plugin/uPluginFamilias.dfm @@ -35,7 +35,7 @@ object PluginFamilias: TPluginFamilias object Ventas1: TMenuItem Caption = 'Datos' object Familias1: TMenuItem - Tag = 19000 + Tag = 900 Action = actFamilias end end diff --git a/Source/Modulos/Inventario/Controller/Inventario_controller.rc b/Source/Modulos/Inventario/Controller/Inventario_controller.rc index e69de29b..153736af 100644 --- a/Source/Modulos/Inventario/Controller/Inventario_controller.rc +++ b/Source/Modulos/Inventario/Controller/Inventario_controller.rc @@ -0,0 +1,22 @@ +1 VERSIONINFO +FILEVERSION 1,0,0,0 +PRODUCTVERSION 1,0,0,0 +FILEFLAGSMASK 0x3FL +FILEFLAGS 0x00L +FILEOS 0x40004L +FILETYPE 0x1L +FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "0C0A04E4" + BEGIN + VALUE "FileVersion", "1.0.0.0\0" + VALUE "ProductVersion", "1.0.0.0\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0C0A, 1252 + END +END diff --git a/Source/Modulos/Inventario/Controller/uInventarioController.pas b/Source/Modulos/Inventario/Controller/uInventarioController.pas index 007c135e..f51d4981 100644 --- a/Source/Modulos/Inventario/Controller/uInventarioController.pas +++ b/Source/Modulos/Inventario/Controller/uInventarioController.pas @@ -680,11 +680,11 @@ begin exit; try - APresupuesto := FPresupuestosClienteController.BuscarPendientes; - APresupuesto := FPresupuestosClienteController.ElegirPresupuestos(APresupuesto, '', False); +// APresupuesto := FPresupuestosClienteController.BuscarPendientes; +// APresupuesto := FPresupuestosClienteController.ElegirPresupuestos(APresupuesto, '', False); - if Assigned(APresupuesto) then - Reservar(AInventario, False, APresupuesto); +// if Assigned(APresupuesto) then +// Reservar(AInventario, False, APresupuesto); finally APresupuesto := Nil; diff --git a/Source/Modulos/Inventario/Data/Inventario_data.rc b/Source/Modulos/Inventario/Data/Inventario_data.rc index e69de29b..153736af 100644 --- a/Source/Modulos/Inventario/Data/Inventario_data.rc +++ b/Source/Modulos/Inventario/Data/Inventario_data.rc @@ -0,0 +1,22 @@ +1 VERSIONINFO +FILEVERSION 1,0,0,0 +PRODUCTVERSION 1,0,0,0 +FILEFLAGSMASK 0x3FL +FILEFLAGS 0x00L +FILEOS 0x40004L +FILETYPE 0x1L +FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "0C0A04E4" + BEGIN + VALUE "FileVersion", "1.0.0.0\0" + VALUE "ProductVersion", "1.0.0.0\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0C0A, 1252 + END +END diff --git a/Source/Modulos/Inventario/Model/Inventario_model.rc b/Source/Modulos/Inventario/Model/Inventario_model.rc index e69de29b..153736af 100644 --- a/Source/Modulos/Inventario/Model/Inventario_model.rc +++ b/Source/Modulos/Inventario/Model/Inventario_model.rc @@ -0,0 +1,22 @@ +1 VERSIONINFO +FILEVERSION 1,0,0,0 +PRODUCTVERSION 1,0,0,0 +FILEFLAGSMASK 0x3FL +FILEFLAGS 0x00L +FILEOS 0x40004L +FILETYPE 0x1L +FILESUBTYPE 0x0L +BEGIN + BLOCK "StringFileInfo" + BEGIN + BLOCK "0C0A04E4" + BEGIN + VALUE "FileVersion", "1.0.0.0\0" + VALUE "ProductVersion", "1.0.0.0\0" + END + END + BLOCK "VarFileInfo" + BEGIN + VALUE "Translation", 0x0C0A, 1252 + END +END diff --git a/Source/Modulos/Inventario/Plugin/Inventario_plugin.dproj b/Source/Modulos/Inventario/Plugin/Inventario_plugin.dproj index 303b9c99..7ca4a406 100644 --- a/Source/Modulos/Inventario/Plugin/Inventario_plugin.dproj +++ b/Source/Modulos/Inventario/Plugin/Inventario_plugin.dproj @@ -41,20 +41,19 @@ Delphi.Personality Package -FalseTrueFalseTrueFalseFalseTrueFalse1000FalseFalseFalseFalseFalse308212521.0.0.01.0.0.0Inventario_plugin.dpk +FalseTrueFalseFalseFalseFalseTrueFalse1000FalseFalseFalseFalseFalse308212521.0.0.01.0.0.0Inventario_plugin.dpk MainSource - - - + + + -