agreement-design-prototype 0.0.3 → 0.0.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
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