mirror of
https://github.com/danieleteti/delphimvcframework.git
synced 2024-11-16 08:15:53 +01:00
200 lines
5.1 KiB
ObjectPascal
200 lines
5.1 KiB
ObjectPascal
unit BusinessObjects;
|
|
|
|
// *************************************************************************** }
|
|
//
|
|
// Delphi MVC Framework
|
|
//
|
|
// Copyright (c) 2010-2022 Daniele Teti and the DMVCFramework Team
|
|
//
|
|
// https://github.com/danieleteti/delphimvcframework
|
|
//
|
|
// ***************************************************************************
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
// you may not use this file except in compliance with the License.
|
|
// You may obtain a copy of the License at
|
|
//
|
|
// http://www.apache.org/licenses/LICENSE-2.0
|
|
//
|
|
// Unless required by applicable law or agreed to in writing, software
|
|
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
// See the License for the specific language governing permissions and
|
|
// limitations under the License.
|
|
//
|
|
// ***************************************************************************
|
|
|
|
interface
|
|
|
|
uses
|
|
MVCFramework.Serializer.Commons,
|
|
MVCFramework.ActiveRecord,
|
|
MVCFramework.Nullables,
|
|
System.Generics.Collections,
|
|
System.Classes;
|
|
|
|
type
|
|
|
|
[MVCNameCase(ncCamelCase)]
|
|
[MVCTable('articles')]
|
|
TArticles = class(TMVCActiveRecord)
|
|
private
|
|
[MVCTableField('id', [foPrimaryKey, foAutoGenerated])]
|
|
fID: Int64;
|
|
[MVCTableField('description')]
|
|
fDescription: String;
|
|
[MVCTableField('price')]
|
|
fPrice: Integer;
|
|
public
|
|
constructor Create; override;
|
|
destructor Destroy; override;
|
|
property ID: Int64 read fID write fID;
|
|
property Description: String read fDescription write fDescription;
|
|
property Price: Integer read fPrice write fPrice;
|
|
end;
|
|
|
|
[MVCNameCase(ncCamelCase)]
|
|
[MVCTable('order_details')]
|
|
TOrderDetail = class(TMVCActiveRecord)
|
|
private
|
|
[MVCTableField('id', [foPrimaryKey, foAutoGenerated])]
|
|
fID: NullableInt64;
|
|
[MVCTableField('id_order')]
|
|
fIDOrder: Int64;
|
|
[MVCTableField('id_article')]
|
|
fIDArticle: Int64;
|
|
[MVCTableField('unit_price')]
|
|
fUnitPrice: Currency;
|
|
[MVCTableField('discount')]
|
|
fDiscount: Integer;
|
|
[MVCTableField('quantity')]
|
|
fQuantity: Integer;
|
|
[MVCTableField('description')]
|
|
fDescription: String;
|
|
[MVCTableField('total')]
|
|
fTotal: Currency;
|
|
public
|
|
constructor Create; override;
|
|
destructor Destroy; override;
|
|
property ID: NullableInt64 read fID write fID;
|
|
property IDOrder: Int64 read fIDOrder write fIDOrder;
|
|
property IDArticle: Int64 read fIDArticle write fIDArticle;
|
|
property UnitPrice: Currency read fUnitPrice write fUnitPrice;
|
|
property Discount: Integer read fDiscount write fDiscount;
|
|
property Quantity: Integer read fQuantity write fQuantity;
|
|
property Description: String read fDescription write fDescription;
|
|
property Total: Currency read fTotal write fTotal;
|
|
end;
|
|
|
|
[MVCNameCase(ncCamelCase)]
|
|
[MVCTable('orders')]
|
|
TOrder = class(TMVCActiveRecord)
|
|
private
|
|
[MVCTableField('id', [foPrimaryKey, foAutoGenerated])]
|
|
fID: Int64;
|
|
[MVCTableField('id_customer')]
|
|
fIDCustomer: Integer;
|
|
[MVCTableField('order_date')]
|
|
fOrderDate: TDate;
|
|
[MVCTableField('total')]
|
|
fTotal: Currency;
|
|
[MVCOwned]
|
|
fDetails: TObjectList<TOrderDetail>;
|
|
protected
|
|
procedure OnAfterLoad; override;
|
|
procedure OnAfterUpdate; override;
|
|
procedure OnAfterInsert; override;
|
|
public
|
|
constructor Create; override;
|
|
destructor Destroy; override;
|
|
property ID: Int64 read fID write fID;
|
|
property IDCustomer: Integer read fIDCustomer write fIDCustomer;
|
|
property OrderDate: TDate read fOrderDate write fOrderDate;
|
|
property Total: Currency read fTotal write fTotal;
|
|
property OrderItems: TObjectList<TOrderDetail> read fDetails;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
System.SysUtils;
|
|
|
|
constructor TArticles.Create;
|
|
begin
|
|
inherited Create;
|
|
end;
|
|
|
|
destructor TArticles.Destroy;
|
|
begin
|
|
inherited;
|
|
end;
|
|
|
|
constructor TOrderDetail.Create;
|
|
begin
|
|
inherited Create;
|
|
end;
|
|
|
|
destructor TOrderDetail.Destroy;
|
|
begin
|
|
inherited;
|
|
end;
|
|
|
|
constructor TOrder.Create;
|
|
begin
|
|
inherited Create;
|
|
fDetails := TObjectList<TOrderDetail>.Create(true);
|
|
end;
|
|
|
|
destructor TOrder.Destroy;
|
|
begin
|
|
fDetails.Free;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TOrder.OnAfterInsert;
|
|
begin
|
|
inherited;
|
|
for var lOrderDetail in fDetails do
|
|
begin
|
|
lOrderDetail.IDOrder := ID;
|
|
lOrderDetail.Insert;
|
|
end;
|
|
end;
|
|
|
|
procedure TOrder.OnAfterUpdate;
|
|
begin
|
|
inherited;
|
|
var lOrderItems := TMVCActiveRecord.SelectRQL<TOrderDetail>(Format('eq(idorder,%d)', [ID]), 100);
|
|
try
|
|
TMVCActiveRecord.Merge<TOrderDetail>(lOrderItems, fDetails)
|
|
.Apply(
|
|
procedure (const Obj: TOrderDetail; const EntityAction: TMVCEntityAction;
|
|
var Handled: Boolean)
|
|
begin
|
|
if EntityAction in [eaCreate, eaUpdate] then
|
|
begin
|
|
Obj.IDOrder := ID;
|
|
end;
|
|
end);
|
|
finally
|
|
lOrderItems.Free;
|
|
end;
|
|
end;
|
|
|
|
procedure TOrder.OnAfterLoad;
|
|
var
|
|
lList: TObjectList<TOrderDetail>;
|
|
begin
|
|
inherited;
|
|
lList := TMVCActiveRecord.SelectRQL<TOrderDetail>(Format('eq(idOrder,%d)',[ID]), 1000);
|
|
try
|
|
fDetails.Clear;
|
|
fDetails.AddRange(lList);
|
|
lList.OwnsObjects := False;
|
|
finally
|
|
lList.Free;
|
|
end;
|
|
end;
|
|
|
|
end.
|