SlideShare a Scribd company logo
1 of 30
Download to read offline
10 Years later
“develop in Pharo, deploy in Gemstone” with Seaside
Johan Brichau - johan@yesplan.be
Yesplan ?
Web Application (SaaS) to manage an event venue
Yesplan ?
Web Application (SaaS) to manage an event venue
Yesplan ?
Web Application (SaaS) to manage an event venue
Yesplan ?
Web Application (SaaS) to manage an event venue
- jQuery
- jQuery-UI
- KnockoutJs
- D3.js
- Datatables
- Jasper reports
- ….
Yesplan ?
Web Application (SaaS) to manage an event venue
- jQuery
- jQuery-UI
- KnockoutJs
- D3.js
- Datatables
- Jasper reports
- ….
ReactJs
Yesplan ?
• Founded by aa. and arts centre
• Over 200 customers (in BE, NL, Lux, CH, UK, NO, DK, FI)
• Currently 25 employees:
• 5 software engineers, 1 dev ops engineer, 1 interaction designer and 1
report engineer
• sales, account management, marketing, support,
• Emphasis on making an application that not only works, but also is
enjoyable to use
Yesplan 0.1 (2009)
• Yesplan calendar built using Seaside’s “full page rendering”
• Standard ‘component calls component’ implementation
• A lot of jQuery for animations and ajax updates
• Javascript universe was “big mess” 

(excluding notable exceptions)
• More errors than functionality in most ‘plugins’
• Bad performance and horrible engineering
• Pharo + GoodsDB in production
title
group
in-place editing info bubbles
group visualization
Yesplan 1.0 (2010)
• Yesplan calendar with incremental ajax updates
• A lot of jQuery-based scripts
• SVG animations using generated Javascript
• Develop in Pharo, deploy in GemStone
• Pharo for development
• GemStone for deployment
• Unit tests + Seaside Component Tests
Yesplan 1.0 (2010)
• Yesplan calendar with incremental ajax updates
• A lot of jQuery-based scripts
• SVG animations using generated Javascript
• Develop in Pharo, deploy in GemStone
• Pharo for development
• GemStone for deployment
• Unit tests + Seaside Component Tests
seconds
0
1,5
3
4,5
6
1 commit after one change in 100 000 loaded objects
Magma Goods
Goods w/ manual barrier Gemstone
0,68s
Yesplan 1.x (2010-2013)
• Seaside with a lot of Javascript generation
• Separate Javascript source code files
• jQuery event delegation
• Parasol
• Selenium (Webdriver) testing
• Targeted at Seaside apps but not limited to
html span
class: 'name';
passenger: self;
with: self visibleresourceUse event name.
html jQuery this
on: 'click' 

selector: '.name'
do: ((JSStream on: 'editEventName(event.target)') asFunction: #(event))
html document addLoadScript:
((((html jQuery expression: (JSStream on: 'target')) editable
type: 'text';
callback: [ :val | nameValue value: val ];
secondCallback: (html jQuery ajax
callback:[:theCells | theCell value changeEventName: nameValue value]]
passengers: ((html jQuery expression: (JSStream on: 'target')));
script: [:s | s<< (theCell value afterNameUpdateScriptOn: s)]);
yourself) asFunction: #(target)) assignTo: 'editEventName').
Yesplan 1.x (2010-2013)
Yesplan 1.x (2010-2013)
Yesplan 1.x (2010-2013)
Yesplan 1.x (2010-2013)
Yesplan 1.x (2010-2013)
Yesplan (2014-2015)
• Experiment with Hybrid Web Application
• Server-side session: Seaside
• Client-side UI: d3js, KnockoutJs,
BackboneJs,…
Yesplan (2014-2015)
• Experiment with Hybrid Web Application
• Server-side session: Seaside
• Client-side UI: d3js, KnockoutJs,
BackboneJs,…
Yesplan (2014-2015)
• Experiment with Hybrid Web Application
• Server-side session: Seaside
• Client-side UI: d3js, KnockoutJs,
BackboneJs,…
Yesplan (today)
• Full Hybrid Web Application
• Server-side session mgmt: Seaside
• Existing UI: server-side Seaside
• New UI: client-side ReactJs
• Operations
• SmalltalkCI (Travis-CI), parallel running test packages
• Sentry central error logging (Js + Smalltalk)
• Numbers
• +200 Gemstone databases
• +2000 simultaneous sessions
Client
Server
Data objects
Operations
Web components
generated
Client
Server
Data objects
Operations
Web components
generated
REST API Reporting engine
Mobile Portal
rich client application
<html>
…
<body>
….
<script>
…
</script>
</body>
</html>
Seaside-based ReactJs
<html>
…
<body>
….
<script>
…
</script>
</body>
</html>
Seaside-based ReactJs
Develop in Pharo, deploy in Gemstone
• Key Tools
• Grease
• Metacello
• https://github.com/GsDevKit/
• Pros
• Seaside in GsDevKit
• “Transparent” persistency
• Licensing model
• Gemstone performance, Pharo coolness
• NO ORM
• Live debugging of production environment
• Cons
• Dialect differences only become larger
• Pharo-specific classes
• “Transparent” persistency
Legend
defaultscheduledescription : string
defaultschedulestarttime : datetime
defaultscheduleendtime : datetime (or null)
attributes : attributedictionary
Event
Group
vipcode : string (or null)
firstname : string
lastname : string
addresslines : string (or null)
zipcode : string (or null)
country : string (or null)
city : string (or null)
Person
vat : string (or null)
type : string (or null)
Organization jobtitle : string
department: string (or null)
Link
duration : duration
Task Task Group
name : string
statustypes : string[0…n]
backgroundcolor : color
textcolor : color
Status
name : string
color : color
Profile
Attachment List
defaultstartidx : integer
defaultstopidx : integer
Event Schedule
number : integer
role : string (or null)
Abstract Resourcebooking
Event History List
type : string
value : string
Contactinfo
description : string
starttime : datetime
Schedule entry
Custom data group
time : datetime
user : string
description : string
History entry
locations[0…n]
profile
status
links[0…n]
links[0…n]
contactinfo[0…n]
profiles[0…n]
entries[0…n]
schedule
originalname : string
type : string
comment : string
date : date
user : string
url : string
Attachment
attachments[0…n]
Event Resource Booking List
resourcebookings
[0…n]
Event Task List tasks[0…n]
_type : string
comment : string (or null)
address : string (or null)
labels : string[0…n]
name : string
attributes : attributedictionary
Contact
status : string
name : string
team : string
cost : decimal
due : datetime
start : datetime
assignedby : string
assignedto : string
description : string
Abstract Task
tasks[0…n]
name : string
starttime : datetime
endtime : datetime
isproduction : boolean
Abstract Event
tasks
attachments
name : string
keyword : string
Custom data item
type : string
value : string|integer|decimal|date|time|datetime|
resourcebooking | contactbooking (or null)
Custom data element
children[0…n]
customdata
resource
customdata
groups[0…n]
organization
person
Event Contact Booking List
role : string
Event Contact Booking
contactsbookings[0…n]
contactbookings
contact
Custom data List
customdata
customdata
customdata
actualnumber: integer [opt.]
Resourcesetbooking
children[0…n]
Yesplan API v1.0.1 - 12 April 2013
production (or null)
group (or null)
recurrence
startdate : date
rule : (recurrence rule)
Recurrence
children[0…n]
history
Event custom data Listevent
event
entries[0…n]
event
Contactbooking custom data List
Contact custom data Listcontact
contactbooking
event
costings[1..n]
alteration : string (or null)
cost: decimal (or null)
price : decimal (or null)
netprice : decimal (or null)
vat: decimal (or null)
actualprice : decimal (or null)
Event Costings
costing
group: string
alteration : string (or null)
cost : decimal (or null)
price : decimal (or null)
vat: decimal (or null)
actualprice : decimal (or null)
Resourcegroup costing
event
costings[1…n]
alteration : string (or null)
cost : decimal (or null)
price : decimal (or null)
actualprice : decimal (or null)
invoice : boolean
accountableto: string
Resourcebooking costing
resourcecostings[1…n] costmodel
event
Resource SetLocation
notation : string
type : string
rates : integer[2][1…n]
Discount
name : string
account : string (or null)
purchaseprice : decimal
invoice : boolean
cost : string (cost formula) (1 or array)
price : string (cost formula) (1 or array)
vat : decimal
Cost model
costmodels[0…n]
durationdiscount
amount : integer
Resource
resources[0…n]
volumediscount
resourcetype : string
name : string
group : string
roles : string[0…n]
description : string
external : boolean
rented : boolean
Abstract Resource
Placeholder
Resource custom data List
resource
ResourceSetbooking costing
children[1…n]
repeatedevents [1…n]
Resourcebooking custom data List
resourcebooking
Resourcebooking
actualnumber: integer [opt.]
actualstart: datetime [opt.]
actualend: datetime [opt.]
Resourcebookinggroup
children[0…n]
start : datetime
end : datetime
actualstart: datetime
actualend: datetime
Singleton Resourcebooking
start : datetime
end : datetime
actualstart: datetime [opt.]
actualend: datetime [opt.]
actualnumber: integer [opt.]
Standard Resourcebooking
repeatedevent
reference link (retrieve needs separate call/request)
nesting link (entity directly included)
subtype
schedule
Group Schedule schedules[1…n] ???
Abstract Schedule Summary
Group Schedule Summary Event Schedule Summary
group
group
entries[0…n]
Develop in Pharo: GT !
Develop in Pharo: GT !
Thank you!
Johan Brichau
johan@inceptive.be
johan@yesplan.be

More Related Content

What's hot

(CMP310) Data Processing Pipelines Using Containers & Spot Instances
(CMP310) Data Processing Pipelines Using Containers & Spot Instances(CMP310) Data Processing Pipelines Using Containers & Spot Instances
(CMP310) Data Processing Pipelines Using Containers & Spot InstancesAmazon Web Services
 
Python in the serverless era (PyCon 2017)
Python in the serverless era (PyCon 2017)Python in the serverless era (PyCon 2017)
Python in the serverless era (PyCon 2017)Benny Bauer
 
Python in the Serverless Era (PyCon IL 2016)
Python in the Serverless Era (PyCon IL 2016)Python in the Serverless Era (PyCon IL 2016)
Python in the Serverless Era (PyCon IL 2016)Benny Bauer
 
KVO implementation
KVO implementationKVO implementation
KVO implementationJintin Lin
 
Scaling Rails Sites by default
Scaling Rails Sites by defaultScaling Rails Sites by default
Scaling Rails Sites by defaultYi-Ting Cheng
 
Building Docker Containers @ Scale
Building Docker Containers @ ScaleBuilding Docker Containers @ Scale
Building Docker Containers @ Scalelxfontes
 
Put a Button on It: Removing Barriers to Going Fast
Put a Button on It: Removing Barriers to Going FastPut a Button on It: Removing Barriers to Going Fast
Put a Button on It: Removing Barriers to Going FastOSCON Byrum
 
KazooCon 2014 - Kazoo Scalability
KazooCon 2014 - Kazoo ScalabilityKazooCon 2014 - Kazoo Scalability
KazooCon 2014 - Kazoo Scalability2600Hz
 
Running Airflow Workflows as ETL Processes on Hadoop
Running Airflow Workflows as ETL Processes on HadoopRunning Airflow Workflows as ETL Processes on Hadoop
Running Airflow Workflows as ETL Processes on Hadoopclairvoyantllc
 
Pharo VM Performance
Pharo VM PerformancePharo VM Performance
Pharo VM PerformancePharo
 
Docker and Pharo @ZWEIDENKER
Docker and Pharo @ZWEIDENKERDocker and Pharo @ZWEIDENKER
Docker and Pharo @ZWEIDENKERZWEIDENKER GmbH
 
API Design in the Modern Era - Architecture Next 2020
API Design in the Modern Era - Architecture Next 2020API Design in the Modern Era - Architecture Next 2020
API Design in the Modern Era - Architecture Next 2020Eran Stiller
 
What you see is what you get for AWS infrastructure
What you see is what you get for AWS infrastructureWhat you see is what you get for AWS infrastructure
What you see is what you get for AWS infrastructureAnton Babenko
 
Journée DevOps : Un outil de monitoring applicatif
Journée DevOps : Un outil de monitoring applicatifJournée DevOps : Un outil de monitoring applicatif
Journée DevOps : Un outil de monitoring applicatifPublicis Sapient Engineering
 
Build a RESTful API with the Serverless Framework
Build a RESTful API with the Serverless FrameworkBuild a RESTful API with the Serverless Framework
Build a RESTful API with the Serverless Frameworkmasahitojp
 
JCConf 2015 - Google Dataflow 在雲端大資料處理的應用
JCConf 2015 - Google Dataflow 在雲端大資料處理的應用JCConf 2015 - Google Dataflow 在雲端大資料處理的應用
JCConf 2015 - Google Dataflow 在雲端大資料處理的應用Simon Su
 
Ruby performance - The low hanging fruit
Ruby performance - The low hanging fruitRuby performance - The low hanging fruit
Ruby performance - The low hanging fruitBruce Werdschinski
 
PyConIT 2018 Writing and deploying serverless python applications
PyConIT 2018 Writing and deploying serverless python applicationsPyConIT 2018 Writing and deploying serverless python applications
PyConIT 2018 Writing and deploying serverless python applicationsCesar Cardenas Desales
 
RoR vs-nodejs-by-jcskyting
RoR vs-nodejs-by-jcskytingRoR vs-nodejs-by-jcskyting
RoR vs-nodejs-by-jcskyting信凱 王
 

What's hot (20)

(CMP310) Data Processing Pipelines Using Containers & Spot Instances
(CMP310) Data Processing Pipelines Using Containers & Spot Instances(CMP310) Data Processing Pipelines Using Containers & Spot Instances
(CMP310) Data Processing Pipelines Using Containers & Spot Instances
 
Python in the serverless era (PyCon 2017)
Python in the serverless era (PyCon 2017)Python in the serverless era (PyCon 2017)
Python in the serverless era (PyCon 2017)
 
Python in the Serverless Era (PyCon IL 2016)
Python in the Serverless Era (PyCon IL 2016)Python in the Serverless Era (PyCon IL 2016)
Python in the Serverless Era (PyCon IL 2016)
 
KVO implementation
KVO implementationKVO implementation
KVO implementation
 
Scaling Rails Sites by default
Scaling Rails Sites by defaultScaling Rails Sites by default
Scaling Rails Sites by default
 
Building Docker Containers @ Scale
Building Docker Containers @ ScaleBuilding Docker Containers @ Scale
Building Docker Containers @ Scale
 
Sheep it
Sheep itSheep it
Sheep it
 
Put a Button on It: Removing Barriers to Going Fast
Put a Button on It: Removing Barriers to Going FastPut a Button on It: Removing Barriers to Going Fast
Put a Button on It: Removing Barriers to Going Fast
 
KazooCon 2014 - Kazoo Scalability
KazooCon 2014 - Kazoo ScalabilityKazooCon 2014 - Kazoo Scalability
KazooCon 2014 - Kazoo Scalability
 
Running Airflow Workflows as ETL Processes on Hadoop
Running Airflow Workflows as ETL Processes on HadoopRunning Airflow Workflows as ETL Processes on Hadoop
Running Airflow Workflows as ETL Processes on Hadoop
 
Pharo VM Performance
Pharo VM PerformancePharo VM Performance
Pharo VM Performance
 
Docker and Pharo @ZWEIDENKER
Docker and Pharo @ZWEIDENKERDocker and Pharo @ZWEIDENKER
Docker and Pharo @ZWEIDENKER
 
API Design in the Modern Era - Architecture Next 2020
API Design in the Modern Era - Architecture Next 2020API Design in the Modern Era - Architecture Next 2020
API Design in the Modern Era - Architecture Next 2020
 
What you see is what you get for AWS infrastructure
What you see is what you get for AWS infrastructureWhat you see is what you get for AWS infrastructure
What you see is what you get for AWS infrastructure
 
Journée DevOps : Un outil de monitoring applicatif
Journée DevOps : Un outil de monitoring applicatifJournée DevOps : Un outil de monitoring applicatif
Journée DevOps : Un outil de monitoring applicatif
 
Build a RESTful API with the Serverless Framework
Build a RESTful API with the Serverless FrameworkBuild a RESTful API with the Serverless Framework
Build a RESTful API with the Serverless Framework
 
JCConf 2015 - Google Dataflow 在雲端大資料處理的應用
JCConf 2015 - Google Dataflow 在雲端大資料處理的應用JCConf 2015 - Google Dataflow 在雲端大資料處理的應用
JCConf 2015 - Google Dataflow 在雲端大資料處理的應用
 
Ruby performance - The low hanging fruit
Ruby performance - The low hanging fruitRuby performance - The low hanging fruit
Ruby performance - The low hanging fruit
 
PyConIT 2018 Writing and deploying serverless python applications
PyConIT 2018 Writing and deploying serverless python applicationsPyConIT 2018 Writing and deploying serverless python applications
PyConIT 2018 Writing and deploying serverless python applications
 
RoR vs-nodejs-by-jcskyting
RoR vs-nodejs-by-jcskytingRoR vs-nodejs-by-jcskyting
RoR vs-nodejs-by-jcskyting
 

Similar to Yesplan: 10 Years later

Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22Frédéric Harper
 
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...Frédéric Harper
 
Progressive Web Apps. What, why and how
Progressive Web Apps. What, why and howProgressive Web Apps. What, why and how
Progressive Web Apps. What, why and howRiza Fahmi
 
"Progressive Web Apps" by Riza Fahmi (Hacktiv8)
"Progressive Web Apps" by Riza Fahmi	(Hacktiv8)"Progressive Web Apps" by Riza Fahmi	(Hacktiv8)
"Progressive Web Apps" by Riza Fahmi (Hacktiv8)Tech in Asia ID
 
混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaver混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaveryangdj
 
After max+phonegap
After max+phonegapAfter max+phonegap
After max+phonegapyangdj
 
Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12
Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12
Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12Frédéric Harper
 
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22Frédéric Harper
 
SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...
SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...
SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...Sencha
 
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayI Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayPOSSCON
 
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28Frédéric Harper
 
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayI Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayAll Things Open
 
HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07
HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07
HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07Frédéric Harper
 
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代Shengyou Fan
 
Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09
Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09
Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09Frédéric Harper
 
Event-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineEvent-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineRicardo Silva
 
ADF and JavaScript - AMIS SIG, July 2017
ADF and JavaScript - AMIS SIG, July 2017ADF and JavaScript - AMIS SIG, July 2017
ADF and JavaScript - AMIS SIG, July 2017Lucas Jellema
 
Practical tipsmakemobilefaster oscon2016
Practical tipsmakemobilefaster oscon2016Practical tipsmakemobilefaster oscon2016
Practical tipsmakemobilefaster oscon2016Doris Chen
 
How to make Ajax Libraries work for you
How to make Ajax Libraries work for youHow to make Ajax Libraries work for you
How to make Ajax Libraries work for youSimon Willison
 

Similar to Yesplan: 10 Years later (20)

Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
Firefox OS: HTML5 sur les stéroïdes - HTML5mtl - 2014-04-22
 
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
HTML, not just for desktops: Firefox OS - Congreso Universitario Móvil - 201...
 
Progressive Web Apps. What, why and how
Progressive Web Apps. What, why and howProgressive Web Apps. What, why and how
Progressive Web Apps. What, why and how
 
"Progressive Web Apps" by Riza Fahmi (Hacktiv8)
"Progressive Web Apps" by Riza Fahmi	(Hacktiv8)"Progressive Web Apps" by Riza Fahmi	(Hacktiv8)
"Progressive Web Apps" by Riza Fahmi (Hacktiv8)
 
混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaver混搭移动开发:PhoneGap+JQurey+Dreamweaver
混搭移动开发:PhoneGap+JQurey+Dreamweaver
 
After max+phonegap
After max+phonegapAfter max+phonegap
After max+phonegap
 
HTML5 JS APIs
HTML5 JS APIsHTML5 JS APIs
HTML5 JS APIs
 
Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12
Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12
Firefox OS, HTML5 to the next level - Python Montreal - 2014-05-12
 
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
HTML for the Mobile Web, Firefox OS - All Things Open - 2014-10-22
 
SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...
SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...
SenchaCon 2016: A Look Ahead: Survey Next-Gen Modern Browser APIs - Shikhir S...
 
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayI Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
 
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
Firefox OS, fixing the mobile web - FITC Toronto - 2014-04-28
 
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP AnywayI Know It Was MEAN, But I Cut the Cord to LAMP Anyway
I Know It Was MEAN, But I Cut the Cord to LAMP Anyway
 
HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07
HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07
HTML pour le web mobile, Firefox OS - Devfest Nantes - 2014-11-07
 
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
[JCConf 2020] 用 Kotlin 跨入 Serverless 世代
 
Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09
Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09
Firefox OS, une plateforme à découvrir - IO Saglac - 2014-09-09
 
Event-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 EngineEvent-driven IO server-side JavaScript environment based on V8 Engine
Event-driven IO server-side JavaScript environment based on V8 Engine
 
ADF and JavaScript - AMIS SIG, July 2017
ADF and JavaScript - AMIS SIG, July 2017ADF and JavaScript - AMIS SIG, July 2017
ADF and JavaScript - AMIS SIG, July 2017
 
Practical tipsmakemobilefaster oscon2016
Practical tipsmakemobilefaster oscon2016Practical tipsmakemobilefaster oscon2016
Practical tipsmakemobilefaster oscon2016
 
How to make Ajax Libraries work for you
How to make Ajax Libraries work for youHow to make Ajax Libraries work for you
How to make Ajax Libraries work for you
 

More from Pharo

Object-Centric Debugging: a preview
Object-Centric Debugging: a previewObject-Centric Debugging: a preview
Object-Centric Debugging: a previewPharo
 
The future of testing in Pharo
The future of testing in PharoThe future of testing in Pharo
The future of testing in PharoPharo
 
Spec 2.0: The next step on desktop UI
Spec 2.0: The next step on desktop UI Spec 2.0: The next step on desktop UI
Spec 2.0: The next step on desktop UI Pharo
 
UI Testing with Spec
 UI Testing with Spec UI Testing with Spec
UI Testing with SpecPharo
 
Pharo 7.0 and 8.0 alpha
Pharo 7.0 and 8.0 alphaPharo 7.0 and 8.0 alpha
Pharo 7.0 and 8.0 alphaPharo
 
PHARO IoT: Installation Improvements and Continuous Integration
PHARO IoT: Installation Improvements and Continuous IntegrationPHARO IoT: Installation Improvements and Continuous Integration
PHARO IoT: Installation Improvements and Continuous IntegrationPharo
 
Easy REST with OpenAPI
Easy REST with OpenAPIEasy REST with OpenAPI
Easy REST with OpenAPIPharo
 
Comment soup with a pinch of types, served in a leaky bowl
Comment soup with a pinch of types, served in a leaky bowlComment soup with a pinch of types, served in a leaky bowl
Comment soup with a pinch of types, served in a leaky bowlPharo
 
apart Framework: Porting from VisualWorks
apart Framework: Porting from VisualWorksapart Framework: Porting from VisualWorks
apart Framework: Porting from VisualWorksPharo
 
XmppTalk
XmppTalkXmppTalk
XmppTalkPharo
 
A living programming environment for blockchain
A living programming environment for blockchainA living programming environment for blockchain
A living programming environment for blockchainPharo
 
Raspberry and Pharo
Raspberry and PharoRaspberry and Pharo
Raspberry and PharoPharo
 
Welcome: PharoDays 2017
Welcome: PharoDays 2017Welcome: PharoDays 2017
Welcome: PharoDays 2017Pharo
 
Pharo 6
Pharo 6Pharo 6
Pharo 6Pharo
 
Robotic Exploration and Mapping with Pharo
Robotic Exploration and Mapping with PharoRobotic Exploration and Mapping with Pharo
Robotic Exploration and Mapping with PharoPharo
 
Pharo 64bits
Pharo 64bitsPharo 64bits
Pharo 64bitsPharo
 
Smack: Behind the Refactorings
Smack: Behind the RefactoringsSmack: Behind the Refactorings
Smack: Behind the RefactoringsPharo
 
Git with Style
Git with StyleGit with Style
Git with StylePharo
 
Pharo JS
Pharo JSPharo JS
Pharo JSPharo
 
Seaside & ReactJS
Seaside & ReactJSSeaside & ReactJS
Seaside & ReactJSPharo
 

More from Pharo (20)

Object-Centric Debugging: a preview
Object-Centric Debugging: a previewObject-Centric Debugging: a preview
Object-Centric Debugging: a preview
 
The future of testing in Pharo
The future of testing in PharoThe future of testing in Pharo
The future of testing in Pharo
 
Spec 2.0: The next step on desktop UI
Spec 2.0: The next step on desktop UI Spec 2.0: The next step on desktop UI
Spec 2.0: The next step on desktop UI
 
UI Testing with Spec
 UI Testing with Spec UI Testing with Spec
UI Testing with Spec
 
Pharo 7.0 and 8.0 alpha
Pharo 7.0 and 8.0 alphaPharo 7.0 and 8.0 alpha
Pharo 7.0 and 8.0 alpha
 
PHARO IoT: Installation Improvements and Continuous Integration
PHARO IoT: Installation Improvements and Continuous IntegrationPHARO IoT: Installation Improvements and Continuous Integration
PHARO IoT: Installation Improvements and Continuous Integration
 
Easy REST with OpenAPI
Easy REST with OpenAPIEasy REST with OpenAPI
Easy REST with OpenAPI
 
Comment soup with a pinch of types, served in a leaky bowl
Comment soup with a pinch of types, served in a leaky bowlComment soup with a pinch of types, served in a leaky bowl
Comment soup with a pinch of types, served in a leaky bowl
 
apart Framework: Porting from VisualWorks
apart Framework: Porting from VisualWorksapart Framework: Porting from VisualWorks
apart Framework: Porting from VisualWorks
 
XmppTalk
XmppTalkXmppTalk
XmppTalk
 
A living programming environment for blockchain
A living programming environment for blockchainA living programming environment for blockchain
A living programming environment for blockchain
 
Raspberry and Pharo
Raspberry and PharoRaspberry and Pharo
Raspberry and Pharo
 
Welcome: PharoDays 2017
Welcome: PharoDays 2017Welcome: PharoDays 2017
Welcome: PharoDays 2017
 
Pharo 6
Pharo 6Pharo 6
Pharo 6
 
Robotic Exploration and Mapping with Pharo
Robotic Exploration and Mapping with PharoRobotic Exploration and Mapping with Pharo
Robotic Exploration and Mapping with Pharo
 
Pharo 64bits
Pharo 64bitsPharo 64bits
Pharo 64bits
 
Smack: Behind the Refactorings
Smack: Behind the RefactoringsSmack: Behind the Refactorings
Smack: Behind the Refactorings
 
Git with Style
Git with StyleGit with Style
Git with Style
 
Pharo JS
Pharo JSPharo JS
Pharo JS
 
Seaside & ReactJS
Seaside & ReactJSSeaside & ReactJS
Seaside & ReactJS
 

Recently uploaded

QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesBernd Ruecker
 
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...BookNet Canada
 
QMMS Lesson 2 - Using MS Excel Formula.pdf
QMMS Lesson 2 - Using MS Excel Formula.pdfQMMS Lesson 2 - Using MS Excel Formula.pdf
QMMS Lesson 2 - Using MS Excel Formula.pdfROWELL MARQUINA
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observabilityitnewsafrica
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Alkin Tezuysal
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch TuesdayIvanti
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024TopCSSGallery
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Mark Goldstein
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...panagenda
 
Microservices, Docker deploy and Microservices source code in C#
Microservices, Docker deploy and Microservices source code in C#Microservices, Docker deploy and Microservices source code in C#
Microservices, Docker deploy and Microservices source code in C#Karmanjay Verma
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Strongerpanagenda
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...Wes McKinney
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentPim van der Noll
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructureitnewsafrica
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityIES VE
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Nikki Chapple
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesKari Kakkonen
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditSkynet Technologies
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPathCommunity
 

Recently uploaded (20)

QCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architecturesQCon London: Mastering long-running processes in modern architectures
QCon London: Mastering long-running processes in modern architectures
 
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
Transcript: New from BookNet Canada for 2024: BNC SalesData and LibraryData -...
 
QMMS Lesson 2 - Using MS Excel Formula.pdf
QMMS Lesson 2 - Using MS Excel Formula.pdfQMMS Lesson 2 - Using MS Excel Formula.pdf
QMMS Lesson 2 - Using MS Excel Formula.pdf
 
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security ObservabilityGlenn Lazarus- Why Your Observability Strategy Needs Security Observability
Glenn Lazarus- Why Your Observability Strategy Needs Security Observability
 
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
Unleashing Real-time Insights with ClickHouse_ Navigating the Landscape in 20...
 
2024 April Patch Tuesday
2024 April Patch Tuesday2024 April Patch Tuesday
2024 April Patch Tuesday
 
Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024Top 10 Hubspot Development Companies in 2024
Top 10 Hubspot Development Companies in 2024
 
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
Arizona Broadband Policy Past, Present, and Future Presentation 3/25/24
 
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
Why device, WIFI, and ISP insights are crucial to supporting remote Microsoft...
 
Microservices, Docker deploy and Microservices source code in C#
Microservices, Docker deploy and Microservices source code in C#Microservices, Docker deploy and Microservices source code in C#
Microservices, Docker deploy and Microservices source code in C#
 
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better StrongerModern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
Modern Roaming for Notes and Nomad – Cheaper Faster Better Stronger
 
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
The Future Roadmap for the Composable Data Stack - Wes McKinney - Data Counci...
 
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native developmentEmixa Mendix Meetup 11 April 2024 about Mendix Native development
Emixa Mendix Meetup 11 April 2024 about Mendix Native development
 
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical InfrastructureVarsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
Varsha Sewlal- Cyber Attacks on Critical Critical Infrastructure
 
Decarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a realityDecarbonising Buildings: Making a net-zero built environment a reality
Decarbonising Buildings: Making a net-zero built environment a reality
 
How Tech Giants Cut Corners to Harvest Data for A.I.
How Tech Giants Cut Corners to Harvest Data for A.I.How Tech Giants Cut Corners to Harvest Data for A.I.
How Tech Giants Cut Corners to Harvest Data for A.I.
 
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
Microsoft 365 Copilot: How to boost your productivity with AI – Part one: Ado...
 
Testing tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examplesTesting tools and AI - ideas what to try with some tool examples
Testing tools and AI - ideas what to try with some tool examples
 
Manual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance AuditManual 508 Accessibility Compliance Audit
Manual 508 Accessibility Compliance Audit
 
UiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to HeroUiPath Community: Communication Mining from Zero to Hero
UiPath Community: Communication Mining from Zero to Hero
 

Yesplan: 10 Years later

  • 1. 10 Years later “develop in Pharo, deploy in Gemstone” with Seaside Johan Brichau - johan@yesplan.be
  • 2. Yesplan ? Web Application (SaaS) to manage an event venue
  • 3. Yesplan ? Web Application (SaaS) to manage an event venue
  • 4. Yesplan ? Web Application (SaaS) to manage an event venue
  • 5. Yesplan ? Web Application (SaaS) to manage an event venue - jQuery - jQuery-UI - KnockoutJs - D3.js - Datatables - Jasper reports - ….
  • 6. Yesplan ? Web Application (SaaS) to manage an event venue - jQuery - jQuery-UI - KnockoutJs - D3.js - Datatables - Jasper reports - …. ReactJs
  • 7.
  • 8. Yesplan ? • Founded by aa. and arts centre • Over 200 customers (in BE, NL, Lux, CH, UK, NO, DK, FI) • Currently 25 employees: • 5 software engineers, 1 dev ops engineer, 1 interaction designer and 1 report engineer • sales, account management, marketing, support, • Emphasis on making an application that not only works, but also is enjoyable to use
  • 9. Yesplan 0.1 (2009) • Yesplan calendar built using Seaside’s “full page rendering” • Standard ‘component calls component’ implementation • A lot of jQuery for animations and ajax updates • Javascript universe was “big mess” 
 (excluding notable exceptions) • More errors than functionality in most ‘plugins’ • Bad performance and horrible engineering • Pharo + GoodsDB in production title group in-place editing info bubbles group visualization
  • 10. Yesplan 1.0 (2010) • Yesplan calendar with incremental ajax updates • A lot of jQuery-based scripts • SVG animations using generated Javascript • Develop in Pharo, deploy in GemStone • Pharo for development • GemStone for deployment • Unit tests + Seaside Component Tests
  • 11. Yesplan 1.0 (2010) • Yesplan calendar with incremental ajax updates • A lot of jQuery-based scripts • SVG animations using generated Javascript • Develop in Pharo, deploy in GemStone • Pharo for development • GemStone for deployment • Unit tests + Seaside Component Tests seconds 0 1,5 3 4,5 6 1 commit after one change in 100 000 loaded objects Magma Goods Goods w/ manual barrier Gemstone 0,68s
  • 12. Yesplan 1.x (2010-2013) • Seaside with a lot of Javascript generation • Separate Javascript source code files • jQuery event delegation • Parasol • Selenium (Webdriver) testing • Targeted at Seaside apps but not limited to html span class: 'name'; passenger: self; with: self visibleresourceUse event name. html jQuery this on: 'click' 
 selector: '.name' do: ((JSStream on: 'editEventName(event.target)') asFunction: #(event)) html document addLoadScript: ((((html jQuery expression: (JSStream on: 'target')) editable type: 'text'; callback: [ :val | nameValue value: val ]; secondCallback: (html jQuery ajax callback:[:theCells | theCell value changeEventName: nameValue value]] passengers: ((html jQuery expression: (JSStream on: 'target'))); script: [:s | s<< (theCell value afterNameUpdateScriptOn: s)]); yourself) asFunction: #(target)) assignTo: 'editEventName').
  • 18. Yesplan (2014-2015) • Experiment with Hybrid Web Application • Server-side session: Seaside • Client-side UI: d3js, KnockoutJs, BackboneJs,…
  • 19. Yesplan (2014-2015) • Experiment with Hybrid Web Application • Server-side session: Seaside • Client-side UI: d3js, KnockoutJs, BackboneJs,…
  • 20. Yesplan (2014-2015) • Experiment with Hybrid Web Application • Server-side session: Seaside • Client-side UI: d3js, KnockoutJs, BackboneJs,…
  • 21. Yesplan (today) • Full Hybrid Web Application • Server-side session mgmt: Seaside • Existing UI: server-side Seaside • New UI: client-side ReactJs • Operations • SmalltalkCI (Travis-CI), parallel running test packages • Sentry central error logging (Js + Smalltalk) • Numbers • +200 Gemstone databases • +2000 simultaneous sessions
  • 23. Client Server Data objects Operations Web components generated REST API Reporting engine Mobile Portal rich client application
  • 26. Develop in Pharo, deploy in Gemstone • Key Tools • Grease • Metacello • https://github.com/GsDevKit/ • Pros • Seaside in GsDevKit • “Transparent” persistency • Licensing model • Gemstone performance, Pharo coolness • NO ORM • Live debugging of production environment • Cons • Dialect differences only become larger • Pharo-specific classes • “Transparent” persistency
  • 27. Legend defaultscheduledescription : string defaultschedulestarttime : datetime defaultscheduleendtime : datetime (or null) attributes : attributedictionary Event Group vipcode : string (or null) firstname : string lastname : string addresslines : string (or null) zipcode : string (or null) country : string (or null) city : string (or null) Person vat : string (or null) type : string (or null) Organization jobtitle : string department: string (or null) Link duration : duration Task Task Group name : string statustypes : string[0…n] backgroundcolor : color textcolor : color Status name : string color : color Profile Attachment List defaultstartidx : integer defaultstopidx : integer Event Schedule number : integer role : string (or null) Abstract Resourcebooking Event History List type : string value : string Contactinfo description : string starttime : datetime Schedule entry Custom data group time : datetime user : string description : string History entry locations[0…n] profile status links[0…n] links[0…n] contactinfo[0…n] profiles[0…n] entries[0…n] schedule originalname : string type : string comment : string date : date user : string url : string Attachment attachments[0…n] Event Resource Booking List resourcebookings [0…n] Event Task List tasks[0…n] _type : string comment : string (or null) address : string (or null) labels : string[0…n] name : string attributes : attributedictionary Contact status : string name : string team : string cost : decimal due : datetime start : datetime assignedby : string assignedto : string description : string Abstract Task tasks[0…n] name : string starttime : datetime endtime : datetime isproduction : boolean Abstract Event tasks attachments name : string keyword : string Custom data item type : string value : string|integer|decimal|date|time|datetime| resourcebooking | contactbooking (or null) Custom data element children[0…n] customdata resource customdata groups[0…n] organization person Event Contact Booking List role : string Event Contact Booking contactsbookings[0…n] contactbookings contact Custom data List customdata customdata customdata actualnumber: integer [opt.] Resourcesetbooking children[0…n] Yesplan API v1.0.1 - 12 April 2013 production (or null) group (or null) recurrence startdate : date rule : (recurrence rule) Recurrence children[0…n] history Event custom data Listevent event entries[0…n] event Contactbooking custom data List Contact custom data Listcontact contactbooking event costings[1..n] alteration : string (or null) cost: decimal (or null) price : decimal (or null) netprice : decimal (or null) vat: decimal (or null) actualprice : decimal (or null) Event Costings costing group: string alteration : string (or null) cost : decimal (or null) price : decimal (or null) vat: decimal (or null) actualprice : decimal (or null) Resourcegroup costing event costings[1…n] alteration : string (or null) cost : decimal (or null) price : decimal (or null) actualprice : decimal (or null) invoice : boolean accountableto: string Resourcebooking costing resourcecostings[1…n] costmodel event Resource SetLocation notation : string type : string rates : integer[2][1…n] Discount name : string account : string (or null) purchaseprice : decimal invoice : boolean cost : string (cost formula) (1 or array) price : string (cost formula) (1 or array) vat : decimal Cost model costmodels[0…n] durationdiscount amount : integer Resource resources[0…n] volumediscount resourcetype : string name : string group : string roles : string[0…n] description : string external : boolean rented : boolean Abstract Resource Placeholder Resource custom data List resource ResourceSetbooking costing children[1…n] repeatedevents [1…n] Resourcebooking custom data List resourcebooking Resourcebooking actualnumber: integer [opt.] actualstart: datetime [opt.] actualend: datetime [opt.] Resourcebookinggroup children[0…n] start : datetime end : datetime actualstart: datetime actualend: datetime Singleton Resourcebooking start : datetime end : datetime actualstart: datetime [opt.] actualend: datetime [opt.] actualnumber: integer [opt.] Standard Resourcebooking repeatedevent reference link (retrieve needs separate call/request) nesting link (entity directly included) subtype schedule Group Schedule schedules[1…n] ??? Abstract Schedule Summary Group Schedule Summary Event Schedule Summary group group entries[0…n]