unit uBizAlbaranesCliente; interface uses Classes, uDADataTable, schAlbaranesClienteClient_Intf, uDBSelectionListUtils, uBizContactos, uBizDetallesAlbaranCliente, uROClasses, uDAInterfaces; const BIZ_CLIENT_ALBARAN_CLIENTE = 'Client.AlbaranCliente'; CTE_TIPO_ALBARAN = 'A'; CTE_TIPO_ALBARAN_DEV = 'D'; SITUACION_ALBARAN_PENDIENTE = 'PENDIENTE'; SITUACION_ALBARAN_ENVIADO = 'ENVIADO'; SITUACION_ALBARAN_SERVIDO = 'SERVIDO'; type IBizAlbaranCliente = interface(IAlbaranesCliente) ['{BC9BC56D-E137-46F8-A752-58D7F78DAAE8}'] procedure SetCliente(AValue : IBizCliente); function GetCliente : IBizCliente; property Cliente : IBizCliente read GetCliente write SetCliente; // Esta propidad es para que el controlador pueda acceder directamente // a la propiedad Cliente procedure _SetCliente(AValue : IBizCliente); function _GetCliente : IBizCliente; property _Cliente : IBizCliente read _GetCliente write _SetCliente; function GetDetalles: IBizDetallesAlbaranCliente; procedure SetDetalles(Value: IBizDetallesAlbaranCliente); property Detalles: IBizDetallesAlbaranCliente read GetDetalles write SetDetalles; function EsNuevo : Boolean; end; TBizAlbaranCliente = class(TAlbaranesClienteDataTableRules, IBizAlbaranCliente, ISeleccionable) private procedure CalcularBaseImponible; procedure CalcularIVA; protected FSeleccionableInterface : ISeleccionable; FCliente : IBizCliente; FDetalles : IBizDetallesAlbaranCliente; FDetallesLink : TDADataSource; procedure SetCliente(AValue : IBizCliente); function GetCliente : IBizCliente; procedure _SetCliente(AValue : IBizCliente); function _GetCliente : IBizCliente; function GetDetalles: IBizDetallesAlbaranCliente; procedure SetDetalles(Value: IBizDetallesAlbaranCliente); function GetSITUACIONValue: String; override; procedure SetFECHA_ALBARANValue(const aValue: TDateTime); override; procedure SetFECHA_ENVIOValue(const aValue: TDateTime); override; procedure SetFECHA_RECEPCIONValue(const aValue: TDateTime); override; procedure SetFECHA_PREVISTA_ENVIOValue(const aValue: TDateTime); override; // procedure SetINCIDENCIASValue(const aValue: IROStrings); override; procedure SetID_PEDIDOValue(const aValue: Integer); override; procedure SetID_FACTURAValue(const aValue: Integer); override; procedure SetID_FORMA_PAGOValue(const aValue: Integer); override; procedure SetID_TIENDAValue(const aValue: Integer); override; procedure IMPORTE_NETOOnChange(Sender: TDACustomField); procedure IMPORTE_PORTEOnChange(Sender: TDACustomField); procedure DESCUENTOOnChange(Sender: TDACustomField); procedure IVAOnChange(Sender: TDACustomField); procedure OnNewRecord(Sender: TDADataTable); override; procedure IniciarValoresAlbaranNuevo; public function EsNuevo : Boolean; procedure CalcularImporteTotal; property Cliente : IBizCliente read GetCliente write SetCliente; property _Cliente : IBizCliente read _GetCliente write _SetCliente; property Detalles: IBizDetallesAlbaranCliente read GetDetalles write SetDetalles; property SeleccionableInterface : ISeleccionable read FSeleccionableInterface write FSeleccionableInterface implements ISeleccionable; constructor Create(aDataTable: TDADataTable); override; destructor Destroy; override; end; implementation uses SysUtils, Variants, uDataModuleConfiguracion, uDataModuleUsuarios, uNumUtils, uDataTableUtils, DateUtils, uDateUtils, DB, uFactuGES_App, uBizEmpresasTiendas, uTypesConstConfiguration; { TBizAlbaranCliente } procedure TBizAlbaranCliente.CalcularBaseImponible; begin if not Self.DataTable.Editing then Edit; IMPORTE_DESCUENTO := roundCurrency(IMPORTE_NETO * (DESCUENTO/100)); BASE_IMPONIBLE := IMPORTE_NETO - IMPORTE_DESCUENTO + IMPORTE_PORTE; end; procedure TBizAlbaranCliente.CalcularImporteTotal; begin DataTable.DisableControls; DataTable.Fields.FieldEventsDisabled := True; try CalcularBaseImponible; CalcularIVA; if not Self.DataTable.Editing then Edit; IMPORTE_TOTAL := BASE_IMPONIBLE + IMPORTE_IVA; finally DataTable.Fields.FieldEventsDisabled := False; DataTable.EnableControls; end; end; procedure TBizAlbaranCliente.CalcularIVA; begin if not Self.DataTable.Editing then Edit; IMPORTE_IVA := roundCurrency((IVA / 100) * (BASE_IMPONIBLE)); end; constructor TBizAlbaranCliente.Create(aDataTable: TDADataTable); begin inherited; FCliente := Nil; FDetallesLink := TDADataSource.Create(NIL); FDetallesLink.DataTable := aDataTable; with DataTable do begin FieldByName(fld_AlbaranesClienteIMPORTE_NETO).OnChange := IMPORTE_NETOOnChange; FieldByName(fld_AlbaranesClienteIMPORTE_PORTE).OnChange := IMPORTE_PORTEOnChange; FieldByName(fld_AlbaranesClienteDESCUENTO).OnChange := DESCUENTOOnChange; FieldByName(fld_AlbaranesClienteIVA).OnChange := IVAOnChange; end; FSeleccionableInterface := TSeleccionable.Create(aDataTable); end; procedure TBizAlbaranCliente.DESCUENTOOnChange(Sender: TDACustomField); begin CalcularImporteTotal; end; destructor TBizAlbaranCliente.Destroy; begin FCliente := NIL; FDetalles := NIL; FDetallesLink.Free; FSeleccionableInterface := NIL; inherited; end; function TBizAlbaranCliente.EsNuevo: Boolean; begin Result := (ID < 0); end; function TBizAlbaranCliente.GetCliente: IBizCliente; begin Result := FCliente; end; procedure TBizAlbaranCliente.IMPORTE_NETOOnChange(Sender: TDACustomField); begin CalcularImporteTotal; end; procedure TBizAlbaranCliente.IMPORTE_PORTEOnChange(Sender: TDACustomField); begin CalcularImporteTotal; end; procedure TBizAlbaranCliente.IniciarValoresAlbaranNuevo; begin ID_EMPRESA := AppFactuGES.EmpresaActiva.ID; USUARIO := AppFactuGES.UsuarioActivo.UserName; FECHA_ALBARAN := DateOf(Date); INCIDENCIAS_ACTIVAS := 0; SITUACION := SITUACION_ALBARAN_PENDIENTE; REFERENCIA := ''; TIPO := CTE_TIPO_ALBARAN; ID_TIENDA := AppFactuGES.TiendaActiva.ID; TIENDA := AppFactuGES.TiendaActiva.NOMBRE; //TEMPORAL ALMACÉN PUESTO A CAPÓN Y PROVISIONAL ID_ALMACEN := 0; OBSERVACIONES.Add(AppFactuGES.Configuracion.GetSettingAsString(teBD, CTE_OBSERVACIONES_ALBARANES, AppFactuGES.EmpresaActiva.ID)); end; procedure TBizAlbaranCliente.IVAOnChange(Sender: TDACustomField); begin CalcularImporteTotal; end; function TBizAlbaranCliente.GetDetalles: IBizDetallesAlbaranCliente; begin Result := FDetalles; end; function TBizAlbaranCliente.GetSITUACIONValue: String; begin result := Trim(DataTable.Fields[idx_AlbaranesClienteSITUACION].AsString); end; procedure TBizAlbaranCliente.OnNewRecord(Sender: TDADataTable); begin inherited; IniciarValoresAlbaranNuevo; end; procedure TBizAlbaranCliente.SetCliente(AValue: IBizCliente); var bEnEdicion : Boolean; begin FCliente := AValue; if Assigned(FCliente) then begin if not FCliente.DataTable.Active then FCliente.DataTable.Active := True; bEnEdicion := (DataTable.State in dsEditModes); if not bEnEdicion then DataTable.Edit; ID_CLIENTE := FCliente.ID; if FCliente.ID_FORMA_PAGO > 0 then ID_FORMA_PAGO := FCliente.ID_FORMA_PAGO; // Se establece un descuento especial general a petición de angelica DESCUENTO := FCliente.DESCUENTO; CALLE := FCliente.CALLE; POBLACION := FCliente.POBLACION; CODIGO_POSTAL := FCliente.CODIGO_POSTAL; PROVINCIA := FCliente.PROVINCIA; PAIS := FCliente.PAIS; PERSONA_CONTACTO := FCliente.NOMBRE; TELEFONO := FCliente.TELEFONO_1; IDIOMA_ISO := FCliente.IDIOMA_ISO; DataTable.Post; //Muy importante ya que es necesario hacer un post de la cabecera antes de añadir detalles //si se quita el id de la cabecera y los detalles se desincroniza if bEnEdicion then DataTable.Edit; end; end; procedure TBizAlbaranCliente.SetID_TIENDAValue(const aValue: Integer); begin if aValue < 0 then DataTable.Fields[idx_AlbaranesClienteID_TIENDA].AsVariant := NULL else inherited SetID_TIENDAValue(aValue); end; procedure TBizAlbaranCliente.SetDetalles(Value: IBizDetallesAlbaranCliente); begin FDetalles := Value; EnlazarMaestroDetalle(FDetallesLink, FDetalles); end; procedure TBizAlbaranCliente.SetFECHA_ALBARANValue(const aValue: TDateTime); begin if EsFechaVacia(aValue) then SetFieldNull(DataTable, fld_AlbaranesClienteFECHA_ALBARAN) else inherited; end; procedure TBizAlbaranCliente.SetFECHA_ENVIOValue(const aValue: TDateTime); begin if EsFechaVacia(aValue) then SetFieldNull(DataTable, fld_AlbaranesClienteFECHA_ENVIO) else inherited; end; procedure TBizAlbaranCliente.SetFECHA_PREVISTA_ENVIOValue(const aValue: TDateTime); begin if EsFechaVacia(aValue) then SetFieldNull(DataTable, fld_AlbaranesClienteFECHA_PREVISTA_ENVIO) else inherited; end; procedure TBizAlbaranCliente.SetFECHA_RECEPCIONValue(const aValue: TDateTime); begin if EsFechaVacia(aValue) then SetFieldNull(DataTable, fld_AlbaranesClienteFECHA_RECEPCION) else inherited; end; procedure TBizAlbaranCliente.SetID_FACTURAValue(const aValue: Integer); begin if (aValue = 0) then SetFieldNull(DataTable, fld_AlbaranesClienteID_FACTURA) else inherited; end; procedure TBizAlbaranCliente.SetID_FORMA_PAGOValue(const aValue: Integer); begin if (aValue = 0) then SetFieldNull(DataTable, fld_AlbaranesClienteID_FORMA_PAGO) else inherited; end; procedure TBizAlbaranCliente.SetID_PEDIDOValue(const aValue: Integer); begin if (aValue = 0) then SetFieldNull(DataTable, fld_AlbaranesClienteID_PEDIDO) else inherited; end; { procedure TBizAlbaranCliente.SetINCIDENCIASValue(const aValue: IROStrings); begin if not Assigned(aValue) then SetFieldNull(DataTable, fld_AlbaranesClienteINCIDENCIAS) else inherited; end; } function TBizAlbaranCliente._GetCliente: IBizCliente; begin Result := FCliente; end; procedure TBizAlbaranCliente._SetCliente(AValue: IBizCliente); begin FCliente := AValue; end; initialization RegisterDataTableRules(BIZ_CLIENT_ALBARAN_CLIENTE, TBizAlbaranCliente); finalization end.