agreement-design-prototype 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 9b8b0ee3c86692db54196238eb53be579e4b3f8b2bc24dee7a6dc67ca89d7068
4
- data.tar.gz: 511c0e41fd44633b68f48efc18cb00a29b7692db569eb3ef112adcb6b7392e87
3
+ metadata.gz: 4be9d81a5edecf06009e29793a626e699d48f3c12a2d60003c8b18c857b287af
4
+ data.tar.gz: 28b6ebb6911ee923b868a76236f3ae3fc5fd9299eba00b6d139c35b47e072849
5
5
  SHA512:
6
- metadata.gz: 7b167ee34fc849c9d4e4470a93ef8b21283f50c8e2059a5e862e1b1239255122cf605eb397e59da8b308b14138237f632a591330b8f3c72cca570e6afa2de3f8
7
- data.tar.gz: feeca74a1f808b7663062910a89719db1c551d9a57b100a4f9088219e17b3141bb6eb88a0c6952bb958c9d75a5371c36279a7edc0223596b16c6bfe37bcc33f9
6
+ metadata.gz: 67f906f47daded5e621a16ceda86a5a1218c87e4ebb808abb6a68e8c6d63cd54284717feff59e68072c12c9c448d612a2de8ad94af34ea48d6b3fe2b4cbee316
7
+ data.tar.gz: 3952efcaf70a5efaa8b6c1507d910ae4fad7812e99217ccc7d289295ac2d9a5b8899318003ff938ef918a93c8842917283bed46f3e7dd4d5c0f37456a0a199a6
data/README.md CHANGED
@@ -15,3 +15,18 @@ This prototype
15
15
  - possibly produces data domain descriptions, e.g. Ruby-on-Rails schema records
16
16
 
17
17
 
18
+ # Things to see
19
+
20
+ the [agreements](agreements/) directory defines our [agreements metamodel](model/agreement.rb) and our
21
+ [reference agreements and catalogues](model/fm.rb)
22
+ (example for fm given)
23
+
24
+ the build script generates [outputs](gen) including
25
+
26
+ - [data files](gen/data) showing the agreements and catalogue entries
27
+ - for instance, can bulk load [jsonlines](gen/data/fm_catalogue.jsonlines) for FM catalogue into search cluster
28
+ - a [picture](gen/images/metamodel.jpg) of the metamodel
29
+ - documentation for the agreements and metamodel
30
+
31
+
32
+
@@ -1,7 +1,8 @@
1
1
  # agreement-design.gemspec
2
+ # TODO - split the gem for schema design from the one containing agreement models
2
3
  Gem::Specification.new do |spec|
3
4
  spec.name = "agreement-design-prototype"
4
- spec.version = "0.0.3"
5
+ spec.version = "0.0.4"
5
6
  spec.authors = ["CCS"]
6
7
  spec.homepage = 'https://github.com/Crown-Commercial-Service/cmp-design-prototype/agreement-design'
7
8
  spec.email = ["rubygems@humphries.tech"]
@@ -1,16 +1,31 @@
1
1
  require_relative "../src/diagram"
2
+ require_relative "../src/doc"
3
+ require_relative "../src/data"
2
4
  require_relative "../model/agreement"
5
+ require_relative "../model/fm"
6
+ require_relative '../model/geographic'
3
7
 
4
- path= File.join(File.dirname(__FILE__), '../', "gen")
8
+ path = File.join(File.dirname(__FILE__), '../', "gen")
5
9
 
6
- # TODO: escape the path somehow so it works when called direct. Works ok from Rake
7
- diagram= Diagram.new( path, "data_model")
8
- diagram.describe Category, Parties
10
+ metamodels = [Agreements, Parties, Geographic, FM]
11
+ models = [Agreements::FM_Agreements, FM::FM_Catalogue, Geographic::NUTS]
9
12
 
10
- doc= Doc.new( path, "metamodel")
11
- doc.document_metamodel Category, Parties
13
+ diagram = Diagram.new(path, "metamodel")
14
+ diagram.describe *metamodels
12
15
 
13
- doc= Doc.new( path, "frameworks")
14
- require_relative '../model/fm'
15
- doc.document Category::FM
16
+ doc = Document.new(path, "metamodel")
17
+ doc.document_metamodel *metamodels
16
18
 
19
+ doc = Document.new(path, "data")
20
+ doc.document *models
21
+
22
+ data= DataFile.new( path, "data", fmt: :json)
23
+ data.output *models
24
+ data= DataFile.new( path, "data", fmt: :yaml)
25
+ data.output *models
26
+
27
+ data= DataFile.new( path, "fm_agreements", fmt: :jsonlines)
28
+ data.output Agreements::FM_Agreements
29
+
30
+ data= DataFile.new( path, "fm_catalogue", fmt: :jsonlines)
31
+ data.output FM::FM_Catalogue
@@ -0,0 +1 @@
1
+ {"agreement":[{"kind":"Framework","id":"FM","fwk_number":"RM8330","version":"0.1.0","description":"This agreement is for the provision of Facilities Management","start_date":"2018-10-01"},{"kind":"Lot","id":"FM lot 1","name":"low-to-mid value Facilities Management Lot","part_of_id":"FM","min_value":0,"max_value":70000000,"version":"0.1.0","item_type":[{"id":"FM.1a-C.3","scheme_id":"CCS","unit":"Currency","code":"CCS-building-area-method","keyword":["cleaning","washing","janitor"]}]}],"fm_offering":[{"supplier_id":"XYZ corp","name":"XYZ's nifty school cleaning service","agreement_id":"FM","location_id":["UK"],"sector":["Education"],"sc_cleared":"TRUE","item":[{"type":"FM.1a-C.3","value":3000}]}],"areacode":[{"name":"UK","subcode":[{"name":"UKC","description":"North East","subcode":[{"name":"UKC1","description":"Tees Valley and County Durham"}]},{"name":"UKL","description":"London"}]}]}
@@ -0,0 +1,46 @@
1
+ ---
2
+ :agreement:
3
+ - :kind: :Framework
4
+ :id: FM
5
+ :fwk_number: RM8330
6
+ :version: 0.1.0
7
+ :description: This agreement is for the provision of Facilities Management
8
+ :start_date: 2018-10-01
9
+ - :kind: :Lot
10
+ :id: FM lot 1
11
+ :name: low-to-mid value Facilities Management Lot
12
+ :part_of_id: FM
13
+ :min_value: 0
14
+ :max_value: 70000000
15
+ :version: 0.1.0
16
+ :item_type:
17
+ - :id: FM.1a-C.3
18
+ :scheme_id: :CCS
19
+ :unit: :Currency
20
+ :code: CCS-building-area-method
21
+ :keyword:
22
+ - cleaning
23
+ - washing
24
+ - janitor
25
+ :fm_offering:
26
+ - :supplier_id: XYZ corp
27
+ :name: XYZ's nifty school cleaning service
28
+ :agreement_id: FM
29
+ :location_id:
30
+ - :UK
31
+ :sector:
32
+ - :Education
33
+ :sc_cleared: 'TRUE'
34
+ :item:
35
+ - :type: FM.1a-C.3
36
+ :value: 3000
37
+ :areacode:
38
+ - :name: :UK
39
+ :subcode:
40
+ - :name: :UKC
41
+ :description: North East
42
+ :subcode:
43
+ - :name: :UKC1
44
+ :description: Tees Valley and County Durham
45
+ - :name: :UKL
46
+ :description: London
@@ -0,0 +1,2 @@
1
+ {"kind":"Framework","id":"FM","fwk_number":"RM8330","version":"0.1.0","description":"This agreement is for the provision of Facilities Management","start_date":"2018-10-01"}
2
+ {"kind":"Lot","id":"FM lot 1","name":"low-to-mid value Facilities Management Lot","part_of_id":"FM","min_value":0,"max_value":70000000,"version":"0.1.0","item_type":[{"id":"FM.1a-C.3","scheme_id":"CCS","unit":"Currency","code":"CCS-building-area-method","keyword":["cleaning","washing","janitor"]}]}
@@ -0,0 +1 @@
1
+ {"supplier_id":"XYZ corp","name":"XYZ's nifty school cleaning service","agreement_id":"FM","location_id":["UK"],"sector":["Education"],"sc_cleared":"TRUE","item":[{"type":"FM.1a-C.3","value":3000}]}
@@ -0,0 +1,45 @@
1
+ strict digraph {
2
+ subgraph cluster_Agreements {
3
+ node [shape=plaintext margin=0];
4
+ label=Agreements;
5
+ "ItemType" [label=<<table BORDER="1" CELLBORDER="0" CELLSPACING="0"><TH><TD>ItemType</TD></TH><TR><TD ALIGN="LEFT">-id</TD></TR><TR><TD ALIGN="LEFT">-scheme_id</TD></TR><TR><TD ALIGN="LEFT">-description</TD></TR><TR><TD ALIGN="LEFT">-keyword</TD></TR><TR><TD ALIGN="LEFT">-uri</TD></TR><TR><TD ALIGN="LEFT">-code</TD></TR><TR><TD ALIGN="LEFT">-unit</TD></TR></table>>];
6
+ "Need" [label=<<table BORDER="1" CELLBORDER="0" CELLSPACING="0"><TH><TD>Need</TD></TH><TR><TD ALIGN="LEFT">-buyer_id</TD></TR><TR><TD ALIGN="LEFT">-kind</TD></TR><TR><TD ALIGN="LEFT">-unit</TD></TR></table>>];
7
+ "Agreement" [label=<<table BORDER="1" CELLBORDER="0" CELLSPACING="0"><TH><TD>Agreement</TD></TH><TR><TD ALIGN="LEFT">-kind</TD></TR><TR><TD ALIGN="LEFT">-id</TD></TR><TR><TD ALIGN="LEFT">-name</TD></TR><TR><TD ALIGN="LEFT">-version</TD></TR><TR><TD ALIGN="LEFT">-start_date</TD></TR><TR><TD ALIGN="LEFT">-end_date</TD></TR><TR><TD ALIGN="LEFT">-description</TD></TR><TR><TD ALIGN="LEFT">-fwk_number</TD></TR><TR><TD ALIGN="LEFT">-sf_typ</TD></TR><TR><TD ALIGN="LEFT">-sf_is</TD></TR><TR><TD ALIGN="LEFT">-part_of_id</TD></TR><TR><TD ALIGN="LEFT">-conforms_to_id</TD></TR><TR><TD ALIGN="LEFT">-item_type</TD></TR><TR><TD ALIGN="LEFT">-min_value</TD></TR><TR><TD ALIGN="LEFT">-max_value</TD></TR></table>>];
8
+ "Item" [label=<<table BORDER="1" CELLBORDER="0" CELLSPACING="0"><TH><TD>Item</TD></TH><TR><TD ALIGN="LEFT">-type</TD></TR><TR><TD ALIGN="LEFT">-unit</TD></TR><TR><TD ALIGN="LEFT">-value</TD></TR></table>>];
9
+ "Offering" [label=<<table BORDER="1" CELLBORDER="0" CELLSPACING="0"><TH><TD>Offering</TD></TH><TR><TD ALIGN="LEFT">-agreement_id</TD></TR><TR><TD ALIGN="LEFT">-supplier_id</TD></TR><TR><TD ALIGN="LEFT">-offerType</TD></TR><TR><TD ALIGN="LEFT">-name</TD></TR><TR><TD ALIGN="LEFT">-description</TD></TR><TR><TD ALIGN="LEFT">-item</TD></TR><TR><TD ALIGN="LEFT">-location_id</TD></TR><TR><TD ALIGN="LEFT">-sector</TD></TR></table>>];
10
+ "Catalogue" [label=<<table BORDER="1" CELLBORDER="0" CELLSPACING="0"><TH><TD>Catalogue</TD></TH><TR><TD ALIGN="LEFT">-offers</TD></TR></table>>];
11
+ "Involvement" [label=<<table BORDER="1" CELLBORDER="0" CELLSPACING="0"><TH><TD>Involvement</TD></TH><TR><TD ALIGN="LEFT">-agreement_id</TD></TR><TR><TD ALIGN="LEFT">-party_id</TD></TR><TR><TD ALIGN="LEFT">-role</TD></TR></table>>];
12
+ }
13
+ subgraph cluster_Parties {
14
+ node [shape=plaintext margin=0];
15
+ label=Parties;
16
+ "Party" [label=<<table BORDER="1" CELLBORDER="0" CELLSPACING="0"><TH><TD>Party</TD></TH><TR><TD ALIGN="LEFT">-id</TD></TR><TR><TD ALIGN="LEFT">-supplier_registration_completed</TD></TR><TR><TD ALIGN="LEFT">-buyer_registration_completed</TD></TR></table>>];
17
+ }
18
+ subgraph cluster_Geographic {
19
+ node [shape=plaintext margin=0];
20
+ label=Geographic;
21
+ "AreaCode" [label=<<table BORDER="1" CELLBORDER="0" CELLSPACING="0"><TH><TD>AreaCode</TD></TH><TR><TD ALIGN="LEFT">-name</TD></TR><TR><TD ALIGN="LEFT">-description</TD></TR><TR><TD ALIGN="LEFT">-subcode</TD></TR></table>>];
22
+ }
23
+ subgraph cluster_FM {
24
+ node [shape=plaintext margin=0];
25
+ label=FM;
26
+ "FM_Offering" [label=<<table BORDER="1" CELLBORDER="0" CELLSPACING="0"><TH><TD>FM_Offering</TD></TH><TR><TD ALIGN="LEFT">-agreement_id</TD></TR><TR><TD ALIGN="LEFT">-supplier_id</TD></TR><TR><TD ALIGN="LEFT">-offerType</TD></TR><TR><TD ALIGN="LEFT">-name</TD></TR><TR><TD ALIGN="LEFT">-description</TD></TR><TR><TD ALIGN="LEFT">-item</TD></TR><TR><TD ALIGN="LEFT">-location_id</TD></TR><TR><TD ALIGN="LEFT">-sector</TD></TR><TR><TD ALIGN="LEFT">-sc_cleared</TD></TR></table>>];
27
+ }
28
+ "Agreement" -> "Agreement" [label="part_of_id" arrowhead = "open" arrowtail = "none" ];
29
+ "Agreement" -> "Agreement" [label="conforms_to_id" arrowhead = "open" arrowtail = "none" ];
30
+ "Agreement" -> "ItemType" [label="{contains} item_type" arrowhead = "none" arrowtail = "diamond" ];
31
+ "Item" -> "ItemType" [label="type" arrowhead = "open" arrowtail = "none" ];
32
+ "Offering" -> "Agreement" [label="agreement_id" arrowhead = "open" arrowtail = "none" ];
33
+ "Offering" -> "Party" [label="supplier_id" arrowhead = "open" arrowtail = "none" ];
34
+ "Offering" -> "Item" [label="{contains} item" arrowhead = "none" arrowtail = "diamond" ];
35
+ "Offering" -> "AreaCode" [label="location_id" arrowhead = "open" arrowtail = "none" ];
36
+ "Catalogue" -> "Offering" [label="{contains} offers" arrowhead = "none" arrowtail = "diamond" ];
37
+ "Involvement" -> "Agreement" [label="agreement_id" arrowhead = "open" arrowtail = "none" ];
38
+ "Involvement" -> "Party" [label="party_id" arrowhead = "open" arrowtail = "none" ];
39
+ "AreaCode" -> "AreaCode" [label="{contains} subcode" arrowhead = "none" arrowtail = "diamond" ];
40
+ "FM_Offering" -> "Offering" [label="extends" arrowhead = "none" arrowtail = "normal" ];
41
+ "FM_Offering" -> "Agreement" [label="agreement_id" arrowhead = "open" arrowtail = "none" ];
42
+ "FM_Offering" -> "Party" [label="supplier_id" arrowhead = "open" arrowtail = "none" ];
43
+ "FM_Offering" -> "Item" [label="{contains} item" arrowhead = "none" arrowtail = "diamond" ];
44
+ "FM_Offering" -> "AreaCode" [label="location_id" arrowhead = "open" arrowtail = "none" ];
45
+ }
data/gen/doc/data.md ADDED
@@ -0,0 +1,44 @@
1
+ ### FM
2
+ - kind Framework
3
+ - id FM
4
+ - fwk_number RM8330
5
+ - version 0.1.0
6
+ - description This agreement is for the provision of Facilities Management
7
+ - start_date 2018-10-01
8
+ ### low-to-mid value Facilities Management Lot FM lot 1
9
+ - kind Lot
10
+ - id FM lot 1
11
+ - name low-to-mid value Facilities Management Lot
12
+ - part_of_id FM
13
+ - min_value 0
14
+ - max_value 70000000
15
+ - version 0.1.0
16
+ #### item_type FM.1a-C.3
17
+ - id FM.1a-C.3
18
+ - scheme_id CCS
19
+ - unit Currency
20
+ - code CCS-building-area-method
21
+ - keyword cleaning
22
+ - keyword washing
23
+ - keyword janitor
24
+ ### XYZ's nifty school cleaning service
25
+ - supplier_id XYZ corp
26
+ - name XYZ's nifty school cleaning service
27
+ - agreement_id FM
28
+ - location_id UK
29
+ - sector Education
30
+ - sc_cleared TRUE
31
+ #### item
32
+ - type FM.1a-C.3
33
+ - value 3000
34
+ ### UK
35
+ - name UK
36
+ #### UKC
37
+ - name UKC
38
+ - description North East
39
+ ##### UKC1
40
+ - name UKC1
41
+ - description Tees Valley and County Durham
42
+ #### UKL
43
+ - name UKL
44
+ - description London
data/gen/doc/metamodel.md CHANGED
@@ -1,98 +1,140 @@
1
- # Category
2
- ## ItemParameter
3
- Defines the meaning of Items in Catalogues
1
+ # Data model: Agreements
2
+ ## ItemType
3
+ Defines the items that can be offered in any selected agreements
4
+ Agreements hava a number of items that can have values defining the agreement. The Items should
5
+ constrain the key quantifiable elements of an agreement award. A supplier may provide additional
6
+ variable facts in their Offer to supplement the description of how they support the agreement.
4
7
 
5
8
  |attribute|type|multiplicity|description|
6
9
  |---------|----|------------|-----------|
7
- |id|String|1||
8
- |detail|String|1||
10
+ |id|String|1|The code id, which must be unique across all schemes|
11
+ |scheme_id|(CPV,CPVS,UNSPSC,CPV,OKDP,OKPD,CCS)|1|The classiciation scheme id|
12
+ |description|String|1||
9
13
  |keyword|String|*||
10
- |valueMin|String|1||
11
- |valueMax|String|1||
12
- |type|String|1|One of: String, Currency, Location, Amount|
13
- |standard|String|1|which standard defines the item type, such as UBL2.1|
14
- |reference|String|1|reference within standard, such as UBL2.1|
15
- ## Agreement
16
- General definition of Commercial Agreements
14
+ |uri|String|1| URI for the code within the scheme defining this type |
15
+ |code|String|1| Code within the scheme defining this type |
16
+ |unit|(Area,Currency)|1| define the units, if one units matches |
17
+ ## Need
18
+ Defines a buyer's need which can be matched to agreement items and other details
19
+ The need matches closely to our definitions of agreements under 'items types' and their classification
20
+ schemes, but is not a one-to-one match.
17
21
 
18
22
  |attribute|type|multiplicity|description|
19
23
  |---------|----|------------|-----------|
20
- |id|String|1||
21
- |item_params|Category::ItemParameter|*||
22
- |version|String|1|semantic version id of the form X.Y.Z|
23
- |start_date|Date|1||
24
- |end_date|Date|1||
25
- ## Framework extends Category::Agreement
26
- A kind of Framework used for calloffs, composed of Lots
24
+ |buyer_id|String|1|The buyer expressing the need|
25
+ |kind|(Budget,Location,Service)|1||
26
+ |unit|(Area,Currency)|1|The units typically used to express the need|
27
+ ## Agreement
28
+ General definition of Commercial Agreements
27
29
 
28
30
  |attribute|type|multiplicity|description|
29
31
  |---------|----|------------|-----------|
30
- |id|String|1||
31
- |item_params|Category::ItemParameter|*||
32
+ |kind|(Framework,Lot,Contract)|1|Kind of agreement, including :Framework, :Lot, :Contract|
33
+ |id|String|1|uuid of agreeement|
34
+ |name|String|1|uuid of agreeement|
32
35
  |version|String|1|semantic version id of the form X.Y.Z|
33
36
  |start_date|Date|1||
34
37
  |end_date|Date|1||
35
- |fwk_id|String|1|Such as the RM number|
36
- ## Lot extends Category::Agreement
37
-
38
+ |description|String|1|Describe the agreement|
39
+ |fwk_number|String|1|Framework (RM) number of related framework if required. @Example RM123|
40
+ |sf_typ|String|1|SalesForce data type|
41
+ |sf_is|String|1|SalesForce row id|
42
+ |part_of_id|String -> Agreements::Agreement|1|Agreement this is part of, applicable only to Lots|
43
+ |conforms_to_id|String -> Agreements::Agreement|1|Agreement this conforms to, such as a Contract conforming to a Framework|
44
+ |item_type|Agreements::ItemType|*|describe the items that can be offered under the agreement|
45
+ |min_value|Integer|0..1|Minimum value of award, in pounds sterling|
46
+ |max_value|Integer|0..1|Maximum value of award, in pounds sterling|
47
+ ## Item
48
+ Specifies the value of an item that is being offered for an agreement
38
49
 
39
50
  |attribute|type|multiplicity|description|
40
51
  |---------|----|------------|-----------|
41
- |id|String|1||
42
- |item_params|Category::ItemParameter|*||
43
- |version|String|1|semantic version id of the form X.Y.Z|
44
- |start_date|Date|1||
45
- |end_date|Date|1||
46
- |fwk_id|String|1|Part of framework|
47
- ## Item
48
- Something offered to a buyer as part of a contract.Items are defined in Catalogues.
52
+ |type|String -> Agreements::ItemType|1| type of the item |
53
+ |unit|(Area,Currency)|1| define the units |
54
+ |value|Object|1|an object of the type matching type->units|
55
+ ## Offering
56
+ Supplier offering against an item or items of an agreement.
57
+ This may be extended for different agreements. A supplier may provide additional
58
+ variable facts in their Offer to supplement the description of how they support the agreement.
49
59
 
50
60
  |attribute|type|multiplicity|description|
51
61
  |---------|----|------------|-----------|
52
- |id|String|1|Item id, possibly a concatentation of the standard (in params) and the catalogue and an incrementatl id?|
53
- |params|String|1||
62
+ |agreement_id|String -> Agreements::Agreement|1|The agreement this offering relates to|
63
+ |supplier_id|String -> Parties::Party|1||
64
+ |offerType|String|1|Name of the subclass of the Offering, supporting the Agreement|
65
+ |name|String|1||
54
66
  |description|String|1||
55
- |value|String|1||
67
+ |item|Agreements::Item|*|details of the item|
68
+ |location_id|String -> Geographic::AreaCode|1..*|Pick list of applicable regions. There must be at least one, even if it is just 'UK'|
69
+ |sector|(ALL,Education,CentralGov,WiderGov,Etc)|*|Pick list of applicable sectors.|
56
70
  ## Catalogue
57
- A collection of items that can be bought via an Agreement.
71
+ A collection of supplier offerings against an item, for an agreement
58
72
 
59
73
  |attribute|type|multiplicity|description|
60
74
  |---------|----|------------|-----------|
61
- |id|String|1||
62
- |items|Category::Item|*||
63
- |agreement_id|String|1||
64
- ## Offer
65
-
75
+ |offers|Agreements::Offering|*|description of the item|
76
+ ## Involvement
77
+ Involvement relationship between a party and an agreement
78
+ Technology strategy documents call this type 'interest' but perhaps this could
79
+ be confused with the accounting interest
66
80
 
67
81
  |attribute|type|multiplicity|description|
68
82
  |---------|----|------------|-----------|
69
- |id|String|1|Offer id, probably a UUID|
70
- |item_id|String|1||
71
- |catalogue_id|String|1||
72
- |supplier_id|String|1||
73
- |description|String|1|Description of the offer|
74
- ## Award
75
-
83
+ |agreement_id|String -> Agreements::Agreement|1|The agreement this interest relates to|
84
+ |party_id|String -> Parties::Party|1|The party this interest relates to|
85
+ |role|(AwardedSupplier,AwardedBuyer,SupplyingQuote,RequestingQuote,Etc)|1|The role of the party in the involvment|
86
+ # Codes
87
+ ## CCS
88
+ CCS invented schemes
76
89
 
77
- |attribute|type|multiplicity|description|
78
- |---------|----|------------|-----------|
79
- |buyer_id|String|1||
80
- # Parties
90
+ ## Budget
91
+ What is the budget the buyer has for their need?
92
+ Match the budget to the value range of the agreement, and the value range of supplier offers.
93
+ Matching the budget will probably require evaluation of offer prices.
94
+
95
+ ## Location
96
+ Where is the need?
97
+ Match location needs to locations of offers
98
+
99
+ ## Service
100
+ What sort of things do they need?
101
+ Match the service to item types, their keywords, and offering titles.
102
+
103
+ # Data model: Parties
81
104
  ## Party
82
105
 
106
+ The party is used to identify buyers and suppliers. Since some organisations act as
107
+ both buyers and suppliers we use the same record for both, but most organisations will
108
+ be one or the other. The onvolvement of the party with an agreement determine the role in
109
+ that contenxt.
110
+ Details still to be added
83
111
 
84
112
  |attribute|type|multiplicity|description|
85
113
  |---------|----|------------|-----------|
86
114
  |id|String|1|UUID or Salesforce ID?|
87
- ## Supplier extends Parties::Party
115
+ |supplier_registration_completed|Date|1||
116
+ |buyer_registration_completed|Date|1||
117
+ # Data model: Geographic
118
+ ## AreaCode
88
119
 
89
120
 
90
121
  |attribute|type|multiplicity|description|
91
122
  |---------|----|------------|-----------|
92
- |id|String|1|UUID or Salesforce ID?|
93
- ## Buyer extends Parties::Party
94
-
123
+ |name|String|1||
124
+ |description|String|1||
125
+ |subcode|Geographic::AreaCode|*|UUID or Salesforce ID?|
126
+ # Data model: FM
127
+ ## FM_Offering extends Agreements::Offering
128
+ An offer for FM elements
95
129
 
96
130
  |attribute|type|multiplicity|description|
97
131
  |---------|----|------------|-----------|
98
- |id|String|1|UUID or Salesforce ID?|
132
+ |agreement_id|String -> Agreements::Agreement|1|The agreement this offering relates to|
133
+ |supplier_id|String -> Parties::Party|1||
134
+ |offerType|String|1|Name of the subclass of the Offering, supporting the Agreement|
135
+ |name|String|1||
136
+ |description|String|1||
137
+ |item|Agreements::Item|*|details of the item|
138
+ |location_id|String -> Geographic::AreaCode|1..*|Pick list of applicable regions. There must be at least one, even if it is just 'UK'|
139
+ |sector|(ALL,Education,CentralGov,WiderGov,Etc)|*|Pick list of applicable sectors.|
140
+ |sc_cleared|String|1||
Binary file
data/model/agreement.rb CHANGED
@@ -1,69 +1,121 @@
1
1
  require_relative '../src/data_model'
2
2
  require_relative 'party'
3
- require 'date'
3
+ require_relative 'geographic'
4
4
  include DataModel
5
5
 
6
- domain :Category do
6
+ domain :Agreements do
7
7
 
8
- datatype(:ItemParameter,
9
- description: "Defines the meaning of Items in Catalogues") {
10
- attribute :id, String
11
- attribute :detail, String
8
+ SECTOR = Selection(:ALL, :Education, :CentralGov, :WiderGov, :Etc)
9
+ UNITS = Selection(:Area, :Currency)
10
+ CLASSIFICATION_SCHEMES = Selection(:CPV, :CPVS, :UNSPSC, :CPV, :OKDP, :OKPD, :CCS)
11
+ code(:CCS, description: "CCS invented schemes")
12
+
13
+ datatype(:ItemType,
14
+ description:
15
+ "Defines the items that can be offered in any selected agreements
16
+ Agreements hava a number of items that can have values defining the agreement. The Items should
17
+ constrain the key quantifiable elements of an agreement award. A supplier may provide additional
18
+ variable facts in their Offer to supplement the description of how they support the agreement.") {
19
+
20
+ attribute :id, String, "The code id, which must be unique across all schemes"
21
+ attribute :scheme_id, CLASSIFICATION_SCHEMES, "The classiciation scheme id"
22
+ attribute :description, String
12
23
  attribute :keyword, String, ZERO_TO_MANY
13
- attribute :valueMin, String
14
- attribute :valueMax, String
15
- attribute :type, String, "One of: String, Currency, Location, Amount"
16
- attribute :standard, String, "which standard defines the item type, such as UBL2.1"
17
- attribute :reference, String, "reference within standard, such as UBL2.1"
24
+ attribute :uri, String, " URI for the code within the scheme defining this type "
25
+ attribute :code, String, " Code within the scheme defining this type "
26
+ attribute :unit, UNITS, " define the units, if one units matches "
27
+ }
28
+
29
+ CATEGORY_OF_NEED = Selection(:Budget, :Location, :Service)
30
+ code(:Budget, description:
31
+ "What is the budget the buyer has for their need?
32
+ Match the budget to the value range of the agreement, and the value range of supplier offers.
33
+ Matching the budget will probably require evaluation of offer prices.")
34
+ code(:Location, description:
35
+ "Where is the need?
36
+ Match location needs to locations of offers")
37
+ code(:Service, description:
38
+ "What sort of things do they need?
39
+ Match the service to item types, their keywords, and offering titles.")
40
+
41
+ datatype(:Need,
42
+ description:
43
+ " Defines a buyer's need which can be matched to agreement items and other details
44
+ The need matches closely to our definitions of agreements under 'items types' and their classification
45
+ schemes, but is not a one-to-one match.") {
46
+ attribute :buyer_id, String, "The buyer expressing the need"
47
+ attribute :kind, Selection(:Budget, :Location,)
48
+ attribute :kind, Selection(:Budget, :Location, :Service)
49
+ attribute :unit, UNITS, "The units typically used to express the need"
18
50
  }
19
51
 
20
52
  datatype(:Agreement,
21
53
  description: "General definition of Commercial Agreements") {
22
- attribute :id, String
23
- attribute :item_params, Category::ItemParameter, ZERO_TO_MANY, links: Category::ItemParameter
54
+
55
+ # identify the agreement
56
+ attribute :kind, Selection(:Framework, :Lot, :Contract),
57
+ #TODO doc should enumeration selections
58
+ "Kind of agreement, including :Framework, :Lot, :Contract"
59
+ attribute :id, String, "uuid of agreeement"
60
+ attribute :name, String, "uuid of agreeement"
24
61
  attribute :version, String, "semantic version id of the form X.Y.Z"
25
62
  attribute :start_date, Date
26
63
  attribute :end_date, Date
27
- }
64
+ attribute :description, String, "Describe the agreement"
65
+ attribute :fwk_number, String, "Framework (RM) number of related framework if required. @Example RM123"
66
+ attribute :sf_typ, String, "SalesForce data type"
67
+ attribute :sf_is, String, "SalesForce row id"
28
68
 
29
- datatype(:Framework, extends: Category::Agreement,
30
- description: "A kind of Framework used for calloffs, composed of Lots") {
31
- attribute :fwk_id, String, "Such as the RM number"
32
- }
69
+ # structure of agreement
70
+ attribute :part_of_id, String, "Agreement this is part of, applicable only to Lots", links: :Agreement
71
+ attribute :conforms_to_id, String, "Agreement this conforms to, such as a Contract conforming to a Framework", links: :Agreement
72
+ attribute :item_type, :ItemType, ZERO_TO_MANY,
73
+ "describe the items that can be offered under the agreement"
74
+
75
+ # Qualifications
76
+ attribute :min_value, Integer, ZERO_OR_ONE, "Minimum value of award, in pounds sterling"
77
+ attribute :max_value, Integer, ZERO_OR_ONE, "Maximum value of award, in pounds sterling"
33
78
 
34
- datatype(:Lot, extends: Category::Agreement) {
35
- attribute :fwk_id, String, "Part of framework", links: Category::Framework
36
79
  }
37
80
 
38
81
  datatype(:Item,
39
- description: "Something offered to a buyer as part of a contract."\
40
- "Items are defined in Catalogues.") {
41
- attribute :id, String, "Item id, possibly a concatentation of the standard (in params) and the catalogue and an incrementatl id?"
42
- attribute :params, String, links: Category::ItemParameter
43
- attribute :description, String
44
- attribute :value, String
82
+ description: "Specifies the value of an item that is being offered for an agreement") {
83
+ attribute :type, String, " type of the item ", links: :ItemType
84
+ attribute :unit, UNITS, " define the units "
85
+ attribute :value, Object, "an object of the type matching type->units"
45
86
  }
46
87
 
47
- datatype(:Catalogue,
48
- description: "A collection of items that can be bought via an Agreement.") {
49
- attribute :id, String
50
- attribute :items, Category::Item, ZERO_TO_MANY, links: Category::Item
51
- attribute :agreement_id, String, links: Category::Agreement
88
+ datatype(:Offering,
89
+ description: " Supplier offering against an item or items of an agreement.
90
+ This may be extended for different agreements. A supplier may provide additional
91
+ variable facts in their Offer to supplement the description of how they support the agreement. ") {
92
+ attribute :agreement_id, String, "The agreement this offering relates to", links: :Agreement
93
+ attribute :supplier_id, String, links: Parties::Party
94
+ attribute :offerType, String, "Name of the subclass of the Offering, supporting the Agreement"
95
+ attribute :name, String
96
+ attribute :description, String
97
+ attribute :item, :Item, ZERO_TO_MANY, "details of the item"
98
+ # Qualifications
99
+ attribute :location_id, String, ONE_TO_MANY,
100
+ "Pick list of applicable regions. There must be at least one, even if it is just 'UK'",
101
+ links: Geographic::AreaCode
102
+ attribute :sector, SECTOR, ZERO_TO_MANY,
103
+ "Pick list of applicable sectors."
52
104
  }
53
105
 
54
- datatype(:Offer,
55
- description: "") {
56
- attribute :id, String, "Offer id, probably a UUID"
57
- attribute :item_id, String, links: Category::Item
58
- attribute :catalogue_id, String, links: Category::Catalogue
59
- attribute :supplier_id, String, links: Parties::Supplier
60
- attribute :description, String, "Description of the offer"
106
+ datatype(:Catalogue,
107
+ description: " A collection of supplier offerings against an item, for an agreement ") {
108
+ attribute :offers, :Offering, ZERO_TO_MANY, "description of the item"
61
109
  }
62
110
 
63
- datatype(:Award,
64
- description: "") {
65
- attribute :buyer_id, String, links: Parties::Buyer
111
+ datatype(:Involvement,
112
+ description: "Involvement relationship between a party and an agreement
113
+ Technology strategy documents call this type 'interest' but perhaps this could
114
+ be confused with the accounting interest") {
115
+ attribute :agreement_id, String, "The agreement this interest relates to", links: :Agreement
116
+ attribute :party_id, String, "The party this interest relates to", links: Parties::Party
117
+ attribute :role, Selection(:AwardedSupplier, :AwardedBuyer, :SupplyingQuote, :RequestingQuote, :Etc),
118
+ "The role of the party in the involvment"
66
119
  }
67
120
 
68
- end
69
-
121
+ end