libs-gdl2/Examples/Trading/TradingData.m
David Ayers 4d73ac52dd * Documentation/GDL2Intro/Examples: Move to ...
* Examples: ... here.
	* Examples/GNUmakefile: Adapt to new location.
	* Documentation/GDL2Intro/GNUmakefile: Remove subproject.
	* Documentation/GDL2Intro/GDL2Intro.texi: Update references to new
	location.
	* Trading: Move to ...
	* Examples/Trading: ... here.
	* Examples/Trading/GNUmakefile: Adapte to new location.
	* Examples/GNUmakefile: Add Trading.


git-svn-id: svn+ssh://svn.gna.org/svn/gnustep/libs/gdl2/trunk@27918 72102866-910b-0410-8b05-ffd578937521
2009-02-18 17:21:05 +00:00

312 lines
8.2 KiB
Objective-C

#include "TradingData.h"
#define PDEC2(x) \
[NSDecimalNumber decimalNumberWithMantissa:x \
exponent:-2 \
isNegative:NO]
@implementation TradingData
- (id) init
{
self = [super init];
if (self)
{
ec = [[EOEditingContext alloc] init];
customerDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec
entityName:@"Customer"];
customerGroupDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec
entityName:@"CustomerGroup"];
productGroupDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec
entityName:@"ProductGroup"];
productDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec
entityName:@"Product"];
suppliersDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec
entityName:@"Supplier"];
priceListDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec
entityName:@"PriceList"];
priceListPosDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec
entityName:@"PriceListPos"];
orderDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec
entityName:@"Order"];
orderPosDS = [[EODatabaseDataSource alloc] initWithEditingContext:ec
entityName:@"OrderPos"];
}
return self;
}
- (void) dealloc
{
[ec release];
[customerDS release];
[customerGroupDS release];
[productGroupDS release];
[productDS release];
[suppliersDS release];
[priceListDS release];
[priceListPosDS release];
[orderDS release];
[orderPosDS release];
}
- (void) fillTables
{
id fsfSup, mysqlSup, postgreSup, publicSup, acmeSup;
id implGrp, softGrp;
id folkGrp;
id rake, shovel, pitchfork, mysql, postgresql, sqlite, gnustep, gcc;
id salePriceList;
id customer;
id order;
implGrp = [self addProductGroup:@"Implements of destruction"];
softGrp = [self addProductGroup:@"Software"];
fsfSup = [self addSupplierNamed:@"The Free Software Foundation"];
gnustep = [self addProduct:@"GNUstep"
price:PDEC2(2595)
supplier:fsfSup
group:softGrp];
gcc = [self addProduct:@"gcc"
price:PDEC2(4995)
supplier:fsfSup
group:softGrp];
mysqlSup = [self addSupplierNamed:@"MySQL AB"];
mysql = [self addProduct:@"MySQL"
price:PDEC2(3000)
supplier:fsfSup
group:softGrp];
postgreSup = [self addSupplierNamed:@"The PostgreSQL Global Development Group"];
postgresql = [self addProduct:@"PostgreSQL"
price:PDEC2(3000)
supplier:postgreSup
group:softGrp];
publicSup = [self addSupplierNamed:@"sqlite.org"];
sqlite = [self addProduct:@"SQLite"
price:PDEC2(1500)
supplier:publicSup
group:softGrp];
acmeSup = [self addSupplierNamed:@"ACME"];
shovel = [self addProduct:@"Shovel"
price:PDEC2(1400)
supplier:acmeSup
group:implGrp];
rake = [self addProduct:@"Rake"
price:PDEC2(1295)
supplier:acmeSup
group:implGrp];
pitchfork = [self addProduct:@"Pitchfork"
price:PDEC2(1800)
supplier:acmeSup
group:implGrp];
folkGrp = [self addCustomerGroup:@"Angry Townfolk"];
[self customer:[self addCustomer:@"Angry Townsperson1" group:folkGrp]
order:rake
quantity:3];
[self customer:[self addCustomer:@"Angry Townsperson2" group:folkGrp]
order:shovel];
[self customer:[self addCustomer:@"Angry Townsperson3" group:folkGrp]
order:rake
quantity:2];
customer = [self addCustomer:@"Test Customer1"];
order = [self createOrderForCustomer:customer];
[self order:order product:mysql quantity:5];
[self order:order product:postgresql quantity:1];
[self order:order product:rake quantity:2];
[self customer:[self addCustomer:@"Test Customer2"]
order:postgresql];
[self customer:[self addCustomer:@"Test Customer3"]
order:sqlite];
salePriceList = [self addPriceList:@"Farm Supply Sale"
forGroup:folkGrp];
[self addProduct:pitchfork
price:PDEC2(1675)
toPriceList:salePriceList];
[self addProduct:rake
price:PDEC2(800)
toPriceList:salePriceList];
[self addProduct:shovel
price:PDEC2(995)
toPriceList:salePriceList];
[self saveChanges];
}
- (id) addPriceList:(NSString *)name
forGroup:(id)grp
{
id record = [priceListDS createObject];
[record takeValue:name forKey:@"name"];
[record addObject:grp toBothSidesOfRelationshipWithKey:@"customerGroup"];
return record;
}
- (id) addProduct:(id)product
price:(NSDecimalNumber *)price
toPriceList:(id)priceList
{
id record = [priceListPosDS createObject];
[record addObject:product toBothSidesOfRelationshipWithKey:@"product"];
[record takeValue:price forKey:@"price"];
[record addObject:priceList toBothSidesOfRelationshipWithKey:@"priceList"];
[priceListPosDS insertObject:record];
return record;
}
- (id) addProductGroup:(NSString *)productGroupName
{
id record = [productGroupDS createObject];
[record takeValue:productGroupName forKey:@"name"];
return record;
}
- (id) addSupplierNamed:(NSString *)name
{
id record = [suppliersDS createObject];
[record takeValue:name forKey:@"name"];
[suppliersDS insertObject:record];
return record;
}
- (id) addProduct:(NSString *)productName
price:(NSDecimalNumber *)price
supplier:(id)supplier
group:(id)productGroup
{
id record = [productDS createObject];
[record takeValue:productName forKey:@"name"];
[record takeValue:price forKey:@"price"];
[record addObject:supplier toBothSidesOfRelationshipWithKey:@"supplier"];
[record addObject:productGroup toBothSidesOfRelationshipWithKey:@"productGroup"];
[productDS insertObject:record];
return record;
}
- (id) addCustomerGroup:(NSString *)name
{
id record = [customerGroupDS createObject];
[record takeValue:name forKey:@"name"];
[customerGroupDS insertObject:record];
return record;
}
- (id) addCustomer:(NSString *)name
{
return [self addCustomer:name group:nil];
}
- (id) addCustomer:(NSString *)name
group:(id)group
{
id record = [customerDS createObject];
[record takeValue:name forKey:@"name"];
[record addObject:group toBothSidesOfRelationshipWithKey:@"customerGroup"];
[customerDS insertObject:record];
return record;
}
- (id) createOrderForCustomer:(id)customer
{
id order = [orderDS createObject];
[order takeValue:[NSDate date] forKey:@"date"];
[order addObject:customer toBothSidesOfRelationshipWithKey:@"customer"];
[orderDS insertObject:order];
return order;
}
- (id) order:(id)order
product:(id)product
quantity:(int)quantity
{
id orderPos = [orderPosDS createObject];
NSNumber *price = [product valueForKey:@"price"];
NSNumber *qNum = [NSNumber numberWithInt:quantity];
/* this should really not be in the database but in some business logic */
NSNumber *value = [NSNumber numberWithDouble:((double)quantity) * [price doubleValue]];
[orderPos addObject:product toBothSidesOfRelationshipWithKey:@"product"];
[orderPos addObject:order toBothSidesOfRelationshipWithKey:@"order"];
/* FIXME customer group pricing */
[orderPos takeValue:price forKey:@"price"];
[orderPos takeValue:qNum forKey:@"quantity"];
[orderPos takeValue:value forKey:@"value"];
/* FIXME this should be a relationship to a pos table */
[orderPos takeValue:[NSNumber numberWithInt:1] forKey:@"posnr"];
return orderPos;
}
- (id) customer:(id)customer
order:(id)product
{
return [self customer:customer order:product quantity:1];
}
- (id) customer:(id)customer
order:(id)product
quantity:(int)quantity
{
return [self customer:customer order:product quantity:quantity posNr:1];
}
- (id) customer:(id)customer
order:(id)product
quantity:(int)quantity
posNr:(int)posNr
{
id order = [orderDS createObject];
id orderPos = [orderPosDS createObject];
NSNumber *price = [product valueForKey:@"price"];
NSNumber *qNum = [NSNumber numberWithInt:quantity];
NSNumber *value = [NSNumber numberWithDouble:((double)quantity) * [price doubleValue]];
[order takeValue:[NSDate date] forKey:@"date"];
[order addObject:customer toBothSidesOfRelationshipWithKey:@"customer"];
[orderPos addObject:order toBothSidesOfRelationshipWithKey:@"order"];
/* FIXME customer group pricing */
[orderPos takeValue:price forKey:@"price"];
[orderPos takeValue:qNum forKey:@"quantity"];
[orderPos takeValue:value forKey:@"value"];
/* fixme this should be a relationship to a pos table */
[orderPos takeValue:[NSNumber numberWithInt:posNr] forKey:@"posnr"];
[orderPos addObject:product toBothSidesOfRelationshipWithKey:@"product"];
return order;
}
- (void) saveChanges
{
[ec saveChanges];
}
@end