im_onix 1.0.2
Sign up to get free protection for your applications and to get access to all the features.
- checksums.yaml +7 -0
- data/README.md +39 -0
- data/bin/html_codelist_to_yml.rb +46 -0
- data/bin/onix3_to_onix2.rb +192 -0
- data/bin/onix3_to_onix3.rb +401 -0
- data/bin/onix_bench.rb +15 -0
- data/bin/onix_pp.rb +216 -0
- data/bin/onix_split.rb +72 -0
- data/data/codelists/codelist-1.yml +12 -0
- data/data/codelists/codelist-10.yml +51 -0
- data/data/codelists/codelist-100.yml +8 -0
- data/data/codelists/codelist-101.yml +7 -0
- data/data/codelists/codelist-102.yml +5 -0
- data/data/codelists/codelist-11.yml +13 -0
- data/data/codelists/codelist-12.yml +15 -0
- data/data/codelists/codelist-121.yml +162 -0
- data/data/codelists/codelist-13.yml +10 -0
- data/data/codelists/codelist-138.yml +8 -0
- data/data/codelists/codelist-139.yml +102 -0
- data/data/codelists/codelist-14.yml +6 -0
- data/data/codelists/codelist-140.yml +9 -0
- data/data/codelists/codelist-141.yml +12 -0
- data/data/codelists/codelist-142.yml +14 -0
- data/data/codelists/codelist-143.yml +9 -0
- data/data/codelists/codelist-144.yml +10 -0
- data/data/codelists/codelist-145.yml +9 -0
- data/data/codelists/codelist-146.yml +5 -0
- data/data/codelists/codelist-147.yml +16 -0
- data/data/codelists/codelist-148.yml +6 -0
- data/data/codelists/codelist-149.yml +7 -0
- data/data/codelists/codelist-15.yml +15 -0
- data/data/codelists/codelist-150.yml +128 -0
- data/data/codelists/codelist-151.yml +10 -0
- data/data/codelists/codelist-152.yml +4 -0
- data/data/codelists/codelist-153.yml +19 -0
- data/data/codelists/codelist-154.yml +11 -0
- data/data/codelists/codelist-155.yml +10 -0
- data/data/codelists/codelist-156.yml +6 -0
- data/data/codelists/codelist-157.yml +6 -0
- data/data/codelists/codelist-158.yml +32 -0
- data/data/codelists/codelist-159.yml +8 -0
- data/data/codelists/codelist-16.yml +8 -0
- data/data/codelists/codelist-160.yml +6 -0
- data/data/codelists/codelist-161.yml +5 -0
- data/data/codelists/codelist-162.yml +9 -0
- data/data/codelists/codelist-163.yml +18 -0
- data/data/codelists/codelist-164.yml +7 -0
- data/data/codelists/codelist-165.yml +6 -0
- data/data/codelists/codelist-166.yml +6 -0
- data/data/codelists/codelist-167.yml +7 -0
- data/data/codelists/codelist-168.yml +4 -0
- data/data/codelists/codelist-169.yml +7 -0
- data/data/codelists/codelist-17.yml +95 -0
- data/data/codelists/codelist-170.yml +2 -0
- data/data/codelists/codelist-171.yml +4 -0
- data/data/codelists/codelist-172.yml +3 -0
- data/data/codelists/codelist-173.yml +5 -0
- data/data/codelists/codelist-174.yml +4 -0
- data/data/codelists/codelist-175.yml +217 -0
- data/data/codelists/codelist-176.yml +16 -0
- data/data/codelists/codelist-177.yml +4 -0
- data/data/codelists/codelist-178.yml +30 -0
- data/data/codelists/codelist-179.yml +4 -0
- data/data/codelists/codelist-18.yml +8 -0
- data/data/codelists/codelist-184.yml +10 -0
- data/data/codelists/codelist-19.yml +9 -0
- data/data/codelists/codelist-196.yml +22 -0
- data/data/codelists/codelist-197.yml +7 -0
- data/data/codelists/codelist-198.yml +4 -0
- data/data/codelists/codelist-2.yml +8 -0
- data/data/codelists/codelist-20.yml +2 -0
- data/data/codelists/codelist-203.yml +10 -0
- data/data/codelists/codelist-204.yml +6 -0
- data/data/codelists/codelist-21.yml +36 -0
- data/data/codelists/codelist-22.yml +11 -0
- data/data/codelists/codelist-23.yml +17 -0
- data/data/codelists/codelist-24.yml +13 -0
- data/data/codelists/codelist-25.yml +31 -0
- data/data/codelists/codelist-26.yml +94 -0
- data/data/codelists/codelist-27.yml +101 -0
- data/data/codelists/codelist-28.yml +10 -0
- data/data/codelists/codelist-29.yml +26 -0
- data/data/codelists/codelist-3.yml +13 -0
- data/data/codelists/codelist-30.yml +19 -0
- data/data/codelists/codelist-31.yml +5 -0
- data/data/codelists/codelist-32.yml +5 -0
- data/data/codelists/codelist-33.yml +44 -0
- data/data/codelists/codelist-34.yml +18 -0
- data/data/codelists/codelist-35.yml +8 -0
- data/data/codelists/codelist-36.yml +5 -0
- data/data/codelists/codelist-37.yml +8 -0
- data/data/codelists/codelist-38.yml +42 -0
- data/data/codelists/codelist-39.yml +21 -0
- data/data/codelists/codelist-40.yml +8 -0
- data/data/codelists/codelist-41.yml +8 -0
- data/data/codelists/codelist-42.yml +18 -0
- data/data/codelists/codelist-43.yml +8 -0
- data/data/codelists/codelist-44.yml +22 -0
- data/data/codelists/codelist-45.yml +15 -0
- data/data/codelists/codelist-46.yml +11 -0
- data/data/codelists/codelist-47.yml +6 -0
- data/data/codelists/codelist-48.yml +13 -0
- data/data/codelists/codelist-49.yml +87 -0
- data/data/codelists/codelist-5.yml +20 -0
- data/data/codelists/codelist-50.yml +10 -0
- data/data/codelists/codelist-51.yml +37 -0
- data/data/codelists/codelist-52.yml +3 -0
- data/data/codelists/codelist-53.yml +7 -0
- data/data/codelists/codelist-54.yml +25 -0
- data/data/codelists/codelist-55.yml +21 -0
- data/data/codelists/codelist-56.yml +4 -0
- data/data/codelists/codelist-57.yml +7 -0
- data/data/codelists/codelist-58.yml +27 -0
- data/data/codelists/codelist-59.yml +12 -0
- data/data/codelists/codelist-6.yml +78 -0
- data/data/codelists/codelist-60.yml +4 -0
- data/data/codelists/codelist-61.yml +5 -0
- data/data/codelists/codelist-62.yml +7 -0
- data/data/codelists/codelist-63.yml +2 -0
- data/data/codelists/codelist-64.yml +18 -0
- data/data/codelists/codelist-65.yml +31 -0
- data/data/codelists/codelist-66.yml +6 -0
- data/data/codelists/codelist-67.yml +4 -0
- data/data/codelists/codelist-68.yml +19 -0
- data/data/codelists/codelist-69.yml +6 -0
- data/data/codelists/codelist-7.yml +128 -0
- data/data/codelists/codelist-70.yml +4 -0
- data/data/codelists/codelist-71.yml +13 -0
- data/data/codelists/codelist-72.yml +9 -0
- data/data/codelists/codelist-73.yml +43 -0
- data/data/codelists/codelist-74.yml +491 -0
- data/data/codelists/codelist-75.yml +4 -0
- data/data/codelists/codelist-76.yml +14 -0
- data/data/codelists/codelist-77.yml +21 -0
- data/data/codelists/codelist-78.yml +179 -0
- data/data/codelists/codelist-79.yml +25 -0
- data/data/codelists/codelist-8.yml +9 -0
- data/data/codelists/codelist-80.yml +23 -0
- data/data/codelists/codelist-81.yml +41 -0
- data/data/codelists/codelist-82.yml +19 -0
- data/data/codelists/codelist-83.yml +71 -0
- data/data/codelists/codelist-84.yml +12 -0
- data/data/codelists/codelist-85.yml +25 -0
- data/data/codelists/codelist-86.yml +7 -0
- data/data/codelists/codelist-87.yml +8 -0
- data/data/codelists/codelist-88.yml +2 -0
- data/data/codelists/codelist-89.yml +3 -0
- data/data/codelists/codelist-9.yml +11 -0
- data/data/codelists/codelist-90.yml +13 -0
- data/data/codelists/codelist-91.yml +254 -0
- data/data/codelists/codelist-92.yml +11 -0
- data/data/codelists/codelist-93.yml +15 -0
- data/data/codelists/codelist-94.yml +5 -0
- data/data/codelists/codelist-95.yml +5 -0
- data/data/codelists/codelist-96.yml +193 -0
- data/data/codelists/codelist-97.yml +3 -0
- data/data/codelists/codelist-98.yml +23 -0
- data/data/codelists/codelist-99.yml +26 -0
- data/data/onix21/codelists/codelist-1.yml +14 -0
- data/data/onix21/codelists/codelist-10.yml +52 -0
- data/data/onix21/codelists/codelist-100.yml +8 -0
- data/data/onix21/codelists/codelist-101.yml +7 -0
- data/data/onix21/codelists/codelist-102.yml +5 -0
- data/data/onix21/codelists/codelist-11.yml +13 -0
- data/data/onix21/codelists/codelist-12.yml +16 -0
- data/data/onix21/codelists/codelist-121.yml +162 -0
- data/data/onix21/codelists/codelist-13.yml +11 -0
- data/data/onix21/codelists/codelist-138.yml +8 -0
- data/data/onix21/codelists/codelist-139.yml +109 -0
- data/data/onix21/codelists/codelist-14.yml +6 -0
- data/data/onix21/codelists/codelist-140.yml +9 -0
- data/data/onix21/codelists/codelist-141.yml +12 -0
- data/data/onix21/codelists/codelist-142.yml +14 -0
- data/data/onix21/codelists/codelist-143.yml +9 -0
- data/data/onix21/codelists/codelist-144.yml +8 -0
- data/data/onix21/codelists/codelist-145.yml +10 -0
- data/data/onix21/codelists/codelist-146.yml +5 -0
- data/data/onix21/codelists/codelist-147.yml +16 -0
- data/data/onix21/codelists/codelist-148.yml +6 -0
- data/data/onix21/codelists/codelist-149.yml +8 -0
- data/data/onix21/codelists/codelist-15.yml +16 -0
- data/data/onix21/codelists/codelist-150.yml +133 -0
- data/data/onix21/codelists/codelist-151.yml +10 -0
- data/data/onix21/codelists/codelist-152.yml +4 -0
- data/data/onix21/codelists/codelist-153.yml +22 -0
- data/data/onix21/codelists/codelist-154.yml +11 -0
- data/data/onix21/codelists/codelist-155.yml +10 -0
- data/data/onix21/codelists/codelist-156.yml +6 -0
- data/data/onix21/codelists/codelist-157.yml +6 -0
- data/data/onix21/codelists/codelist-158.yml +35 -0
- data/data/onix21/codelists/codelist-159.yml +8 -0
- data/data/onix21/codelists/codelist-16.yml +8 -0
- data/data/onix21/codelists/codelist-160.yml +7 -0
- data/data/onix21/codelists/codelist-161.yml +5 -0
- data/data/onix21/codelists/codelist-162.yml +9 -0
- data/data/onix21/codelists/codelist-163.yml +18 -0
- data/data/onix21/codelists/codelist-164.yml +7 -0
- data/data/onix21/codelists/codelist-165.yml +6 -0
- data/data/onix21/codelists/codelist-166.yml +6 -0
- data/data/onix21/codelists/codelist-167.yml +11 -0
- data/data/onix21/codelists/codelist-168.yml +4 -0
- data/data/onix21/codelists/codelist-169.yml +7 -0
- data/data/onix21/codelists/codelist-17.yml +98 -0
- data/data/onix21/codelists/codelist-170.yml +6 -0
- data/data/onix21/codelists/codelist-171.yml +4 -0
- data/data/onix21/codelists/codelist-172.yml +3 -0
- data/data/onix21/codelists/codelist-173.yml +5 -0
- data/data/onix21/codelists/codelist-174.yml +4 -0
- data/data/onix21/codelists/codelist-175.yml +230 -0
- data/data/onix21/codelists/codelist-176.yml +16 -0
- data/data/onix21/codelists/codelist-177.yml +4 -0
- data/data/onix21/codelists/codelist-178.yml +30 -0
- data/data/onix21/codelists/codelist-179.yml +5 -0
- data/data/onix21/codelists/codelist-18.yml +8 -0
- data/data/onix21/codelists/codelist-184.yml +10 -0
- data/data/onix21/codelists/codelist-19.yml +9 -0
- data/data/onix21/codelists/codelist-196.yml +22 -0
- data/data/onix21/codelists/codelist-197.yml +7 -0
- data/data/onix21/codelists/codelist-198.yml +8 -0
- data/data/onix21/codelists/codelist-2.yml +8 -0
- data/data/onix21/codelists/codelist-20.yml +2 -0
- data/data/onix21/codelists/codelist-203.yml +10 -0
- data/data/onix21/codelists/codelist-204.yml +7 -0
- data/data/onix21/codelists/codelist-21.yml +36 -0
- data/data/onix21/codelists/codelist-215.yml +9 -0
- data/data/onix21/codelists/codelist-216.yml +11 -0
- data/data/onix21/codelists/codelist-217.yml +3 -0
- data/data/onix21/codelists/codelist-218.yml +5 -0
- data/data/onix21/codelists/codelist-219.yml +5 -0
- data/data/onix21/codelists/codelist-22.yml +11 -0
- data/data/onix21/codelists/codelist-220.yml +7 -0
- data/data/onix21/codelists/codelist-23.yml +17 -0
- data/data/onix21/codelists/codelist-24.yml +14 -0
- data/data/onix21/codelists/codelist-25.yml +31 -0
- data/data/onix21/codelists/codelist-26.yml +100 -0
- data/data/onix21/codelists/codelist-27.yml +107 -0
- data/data/onix21/codelists/codelist-28.yml +10 -0
- data/data/onix21/codelists/codelist-29.yml +30 -0
- data/data/onix21/codelists/codelist-3.yml +13 -0
- data/data/onix21/codelists/codelist-30.yml +20 -0
- data/data/onix21/codelists/codelist-31.yml +5 -0
- data/data/onix21/codelists/codelist-32.yml +10 -0
- data/data/onix21/codelists/codelist-33.yml +46 -0
- data/data/onix21/codelists/codelist-34.yml +18 -0
- data/data/onix21/codelists/codelist-35.yml +8 -0
- data/data/onix21/codelists/codelist-36.yml +5 -0
- data/data/onix21/codelists/codelist-37.yml +8 -0
- data/data/onix21/codelists/codelist-38.yml +42 -0
- data/data/onix21/codelists/codelist-39.yml +21 -0
- data/data/onix21/codelists/codelist-40.yml +8 -0
- data/data/onix21/codelists/codelist-41.yml +9 -0
- data/data/onix21/codelists/codelist-42.yml +18 -0
- data/data/onix21/codelists/codelist-43.yml +9 -0
- data/data/onix21/codelists/codelist-44.yml +27 -0
- data/data/onix21/codelists/codelist-45.yml +20 -0
- data/data/onix21/codelists/codelist-46.yml +11 -0
- data/data/onix21/codelists/codelist-47.yml +6 -0
- data/data/onix21/codelists/codelist-48.yml +13 -0
- data/data/onix21/codelists/codelist-49.yml +281 -0
- data/data/onix21/codelists/codelist-5.yml +20 -0
- data/data/onix21/codelists/codelist-50.yml +10 -0
- data/data/onix21/codelists/codelist-51.yml +37 -0
- data/data/onix21/codelists/codelist-52.yml +3 -0
- data/data/onix21/codelists/codelist-53.yml +7 -0
- data/data/onix21/codelists/codelist-54.yml +25 -0
- data/data/onix21/codelists/codelist-55.yml +21 -0
- data/data/onix21/codelists/codelist-56.yml +4 -0
- data/data/onix21/codelists/codelist-57.yml +7 -0
- data/data/onix21/codelists/codelist-58.yml +27 -0
- data/data/onix21/codelists/codelist-59.yml +12 -0
- data/data/onix21/codelists/codelist-6.yml +78 -0
- data/data/onix21/codelists/codelist-60.yml +4 -0
- data/data/onix21/codelists/codelist-61.yml +5 -0
- data/data/onix21/codelists/codelist-62.yml +7 -0
- data/data/onix21/codelists/codelist-63.yml +2 -0
- data/data/onix21/codelists/codelist-64.yml +18 -0
- data/data/onix21/codelists/codelist-65.yml +31 -0
- data/data/onix21/codelists/codelist-66.yml +6 -0
- data/data/onix21/codelists/codelist-67.yml +4 -0
- data/data/onix21/codelists/codelist-68.yml +19 -0
- data/data/onix21/codelists/codelist-69.yml +6 -0
- data/data/onix21/codelists/codelist-7.yml +132 -0
- data/data/onix21/codelists/codelist-70.yml +4 -0
- data/data/onix21/codelists/codelist-71.yml +14 -0
- data/data/onix21/codelists/codelist-72.yml +9 -0
- data/data/onix21/codelists/codelist-73.yml +43 -0
- data/data/onix21/codelists/codelist-74.yml +492 -0
- data/data/onix21/codelists/codelist-75.yml +4 -0
- data/data/onix21/codelists/codelist-76.yml +14 -0
- data/data/onix21/codelists/codelist-77.yml +21 -0
- data/data/onix21/codelists/codelist-78.yml +191 -0
- data/data/onix21/codelists/codelist-79.yml +26 -0
- data/data/onix21/codelists/codelist-8.yml +9 -0
- data/data/onix21/codelists/codelist-80.yml +23 -0
- data/data/onix21/codelists/codelist-81.yml +41 -0
- data/data/onix21/codelists/codelist-82.yml +19 -0
- data/data/onix21/codelists/codelist-83.yml +72 -0
- data/data/onix21/codelists/codelist-84.yml +12 -0
- data/data/onix21/codelists/codelist-85.yml +25 -0
- data/data/onix21/codelists/codelist-86.yml +7 -0
- data/data/onix21/codelists/codelist-87.yml +8 -0
- data/data/onix21/codelists/codelist-88.yml +2 -0
- data/data/onix21/codelists/codelist-89.yml +3 -0
- data/data/onix21/codelists/codelist-9.yml +13 -0
- data/data/onix21/codelists/codelist-90.yml +13 -0
- data/data/onix21/codelists/codelist-91.yml +254 -0
- data/data/onix21/codelists/codelist-92.yml +11 -0
- data/data/onix21/codelists/codelist-93.yml +15 -0
- data/data/onix21/codelists/codelist-94.yml +5 -0
- data/data/onix21/codelists/codelist-95.yml +5 -0
- data/data/onix21/codelists/codelist-96.yml +194 -0
- data/data/onix21/codelists/codelist-97.yml +3 -0
- data/data/onix21/codelists/codelist-98.yml +25 -0
- data/data/onix21/codelists/codelist-99.yml +26 -0
- data/data/onix21/shortnames.yml +431 -0
- data/data/shortnames.yml +395 -0
- data/lib/im_onix.rb +2 -0
- data/lib/onix/code.rb +543 -0
- data/lib/onix/collateral_detail.rb +94 -0
- data/lib/onix/contributor.rb +87 -0
- data/lib/onix/date.rb +183 -0
- data/lib/onix/descriptive_detail.rb +552 -0
- data/lib/onix/discount_coded.rb +20 -0
- data/lib/onix/entity.rb +135 -0
- data/lib/onix/error.rb +6 -0
- data/lib/onix/helper.rb +66 -0
- data/lib/onix/identifier.rb +158 -0
- data/lib/onix/onix21.rb +604 -0
- data/lib/onix/onix_message.rb +187 -0
- data/lib/onix/price.rb +74 -0
- data/lib/onix/product.rb +846 -0
- data/lib/onix/product_supply.rb +89 -0
- data/lib/onix/publishing_detail.rb +86 -0
- data/lib/onix/related_material.rb +30 -0
- data/lib/onix/related_product.rb +45 -0
- data/lib/onix/related_work.rb +24 -0
- data/lib/onix/sales_outlet.rb +14 -0
- data/lib/onix/sales_restriction.rb +37 -0
- data/lib/onix/sales_rights.rb +12 -0
- data/lib/onix/subject.rb +35 -0
- data/lib/onix/subset.rb +334 -0
- data/lib/onix/supporting_resource.rb +192 -0
- data/lib/onix/tax.rb +23 -0
- data/lib/onix/territory.rb +56 -0
- data/lib/onix/website.rb +21 -0
- metadata +477 -0
data/lib/onix/product.rb
ADDED
@@ -0,0 +1,846 @@
|
|
1
|
+
require 'onix/helper'
|
2
|
+
require 'onix/code'
|
3
|
+
require 'onix/entity'
|
4
|
+
require 'onix/descriptive_detail'
|
5
|
+
require 'onix/publishing_detail'
|
6
|
+
require 'onix/collateral_detail'
|
7
|
+
require 'onix/related_material'
|
8
|
+
require 'onix/supporting_resource'
|
9
|
+
require 'onix/subject'
|
10
|
+
require 'onix/contributor'
|
11
|
+
require 'onix/product_supply'
|
12
|
+
require 'onix/territory'
|
13
|
+
require 'onix/error'
|
14
|
+
|
15
|
+
module ONIX
|
16
|
+
# flattened supplies extractor
|
17
|
+
module ProductSuppliesExtractor
|
18
|
+
# class must define a product_supplies returning an Array of objects responding to :
|
19
|
+
# - availability_date (Date)
|
20
|
+
# - countries (country code Array)
|
21
|
+
|
22
|
+
# :category: High level
|
23
|
+
# flattened supplies with prices
|
24
|
+
#
|
25
|
+
# supplies is a hash symbol array in the form :
|
26
|
+
# [{:available=>bool,
|
27
|
+
# :availability_date=>date,
|
28
|
+
# :including_tax=>bool,
|
29
|
+
# :currency=>string,
|
30
|
+
# :territory=>string,
|
31
|
+
# :suppliers=>[Supplier,...],
|
32
|
+
# :prices=>[{:amount=>int,
|
33
|
+
# :from_date=>date,
|
34
|
+
# :until_date=>date,
|
35
|
+
# :tax=>{:amount=>int, :rate_percent=>float}}]}]
|
36
|
+
def supplies(keep_all_prices_dates=false)
|
37
|
+
supplies=[]
|
38
|
+
|
39
|
+
# add territories if missing
|
40
|
+
if self.product_supplies
|
41
|
+
self.product_supplies.each do |ps|
|
42
|
+
ps.supply_details.each do |sd|
|
43
|
+
sd.prices.each do |p|
|
44
|
+
supply={}
|
45
|
+
supply[:suppliers]=sd.suppliers
|
46
|
+
supply[:available]=sd.available?
|
47
|
+
supply[:availability_date]=sd.availability_date
|
48
|
+
|
49
|
+
unless supply[:availability_date]
|
50
|
+
if ps.availability_date
|
51
|
+
supply[:availability_date]=ps.market_publishing_detail.availability_date
|
52
|
+
end
|
53
|
+
end
|
54
|
+
supply[:price]=p.amount
|
55
|
+
supply[:qualifier]=p.qualifier.human if p.qualifier
|
56
|
+
supply[:including_tax]=p.including_tax?
|
57
|
+
if !p.territory or p.territory.countries.length==0
|
58
|
+
supply[:territory]=[]
|
59
|
+
supply[:territory]=ps.countries
|
60
|
+
|
61
|
+
if supply[:territory].length==0
|
62
|
+
if @publishing_detail
|
63
|
+
supply[:territory]=self.countries_rights
|
64
|
+
end
|
65
|
+
end
|
66
|
+
else
|
67
|
+
supply[:territory]=p.territory.countries
|
68
|
+
end
|
69
|
+
supply[:from_date]=p.from_date
|
70
|
+
supply[:until_date]=p.until_date
|
71
|
+
supply[:currency]=p.currency
|
72
|
+
supply[:tax]=p.tax
|
73
|
+
|
74
|
+
unless supply[:availability_date]
|
75
|
+
if @publishing_detail
|
76
|
+
supply[:availability_date]=@publishing_detail.publication_date
|
77
|
+
end
|
78
|
+
end
|
79
|
+
|
80
|
+
supplies << supply
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end
|
84
|
+
end
|
85
|
+
|
86
|
+
grouped_supplies={}
|
87
|
+
supplies.each do |supply|
|
88
|
+
pr_key="#{supply[:available]}_#{supply[:including_tax]}_#{supply[:currency]}_#{supply[:territory].join('_')}"
|
89
|
+
grouped_supplies[pr_key]||=[]
|
90
|
+
grouped_supplies[pr_key] << supply
|
91
|
+
end
|
92
|
+
|
93
|
+
nb_suppliers = supplies.map{|s| s[:suppliers][0].name}.uniq.length
|
94
|
+
# render prices sequentially with dates
|
95
|
+
grouped_supplies.each do |ksup, supply|
|
96
|
+
if supply.length > 1
|
97
|
+
global_price=supply.select{|p| not p[:from_date] and not p[:until_date]}
|
98
|
+
global_price=global_price.first
|
99
|
+
|
100
|
+
if global_price
|
101
|
+
if nb_suppliers > 1
|
102
|
+
grouped_supplies[ksup] += self.prices_with_periods(supply, global_price)
|
103
|
+
else
|
104
|
+
grouped_supplies[ksup] = self.prices_with_periods(supply, global_price)
|
105
|
+
end
|
106
|
+
grouped_supplies[ksup].uniq!
|
107
|
+
else
|
108
|
+
# remove explicit from date
|
109
|
+
explicit_from=supply.select{|p| p[:from_date] and not supply.select{|sp| sp[:until_date] and sp[:until_date]<=p[:from_date]}.first}.first
|
110
|
+
if explicit_from
|
111
|
+
explicit_from[:from_date]=nil unless keep_all_prices_dates
|
112
|
+
end
|
113
|
+
end
|
114
|
+
|
115
|
+
|
116
|
+
else
|
117
|
+
supply.each do |s|
|
118
|
+
if s[:from_date] and s[:availability_date] and s[:from_date] >= s[:availability_date]
|
119
|
+
s[:availability_date]=s[:from_date]
|
120
|
+
end
|
121
|
+
s[:from_date]=nil unless keep_all_prices_dates
|
122
|
+
|
123
|
+
end
|
124
|
+
end
|
125
|
+
end
|
126
|
+
|
127
|
+
# merge by territories
|
128
|
+
grouped_territories_supplies={}
|
129
|
+
grouped_supplies.each do |ksup,supply|
|
130
|
+
fsupply=supply.first
|
131
|
+
pr_key="#{fsupply[:available]}_#{fsupply[:including_tax]}_#{fsupply[:currency]}"
|
132
|
+
supply.each do |s|
|
133
|
+
pr_key+="_#{s[:price]}_#{s[:from_date]}_#{s[:until_date]}"
|
134
|
+
end
|
135
|
+
grouped_territories_supplies[pr_key]||=[]
|
136
|
+
grouped_territories_supplies[pr_key] << supply
|
137
|
+
end
|
138
|
+
|
139
|
+
supplies=[]
|
140
|
+
|
141
|
+
grouped_territories_supplies.each do |ksup,supply|
|
142
|
+
fsupply=supply.first.first
|
143
|
+
supplies << {:including_tax=>fsupply[:including_tax],:currency=>fsupply[:currency],
|
144
|
+
:territory=>supply.map{|fs| fs.map{|s| s[:territory]}}.flatten.uniq,
|
145
|
+
:available=>fsupply[:available],
|
146
|
+
:availability_date=>fsupply[:availability_date],
|
147
|
+
:suppliers=>fsupply[:suppliers],
|
148
|
+
:prices=>supply.first.map{|s|
|
149
|
+
|
150
|
+
s[:amount]=s[:price]
|
151
|
+
s.delete(:price)
|
152
|
+
s.delete(:available)
|
153
|
+
s.delete(:currency)
|
154
|
+
s.delete(:availability_date)
|
155
|
+
s.delete(:including_tax)
|
156
|
+
s.delete(:territory)
|
157
|
+
s
|
158
|
+
}}
|
159
|
+
end
|
160
|
+
|
161
|
+
supplies
|
162
|
+
end
|
163
|
+
|
164
|
+
# add missing periods when they can be guessed
|
165
|
+
def prices_with_periods(supplies, global_supply)
|
166
|
+
complete_supplies = supplies.select{ |supply| supply[:from_date] && supply[:until_date] }.sort_by { |supply| supply[:from_date] }
|
167
|
+
missing_start_period_supplies = supplies.select{ |supply| supply[:from_date] && !supply[:until_date] }.sort_by { |supply| supply[:from_date] }
|
168
|
+
missing_end_period_supplies = supplies.select{ |supply| !supply[:from_date] && supply[:until_date] }.sort_by { |supply| supply[:until_date] }
|
169
|
+
|
170
|
+
return [global_supply] if [complete_supplies, missing_start_period_supplies, missing_end_period_supplies].all? {|supply| supply.empty? }
|
171
|
+
|
172
|
+
return self.add_missing_periods(complete_supplies, global_supply) unless complete_supplies.empty?
|
173
|
+
|
174
|
+
without_start = missing_start_period_supplies.length == 1 && complete_supplies.empty? && missing_end_period_supplies.empty?
|
175
|
+
without_end = missing_end_period_supplies.length == 1 && complete_supplies.empty? && missing_start_period_supplies.empty?
|
176
|
+
|
177
|
+
return self.add_starting_period(missing_start_period_supplies.first, global_supply) if without_start
|
178
|
+
return self.add_ending_period(missing_end_period_supplies.first, global_supply) if without_end
|
179
|
+
|
180
|
+
[global_supply]
|
181
|
+
end
|
182
|
+
|
183
|
+
def add_missing_periods(supplies, global_supply)
|
184
|
+
new_supplies = []
|
185
|
+
|
186
|
+
supplies.each.with_index do |supply, index|
|
187
|
+
new_supplies << global_supply.dup.tap{ |start_sup| start_sup[:until_date] = supply[:from_date] - 1 } if index == 0
|
188
|
+
|
189
|
+
if index > 0 && index != supplies.length
|
190
|
+
new_supplies << global_supply.dup.tap do |missing_supply|
|
191
|
+
missing_supply[:from_date] = supplies[index - 1][:until_date] + 1
|
192
|
+
missing_supply[:until_date] = supply[:from_date] - 1
|
193
|
+
end
|
194
|
+
end
|
195
|
+
|
196
|
+
new_supplies << supply
|
197
|
+
|
198
|
+
new_supplies << global_supply.dup.tap{ |end_sup| end_sup[:from_date] = supply[:until_date] + 1 } if index == supplies.length - 1
|
199
|
+
end
|
200
|
+
|
201
|
+
new_supplies
|
202
|
+
end
|
203
|
+
|
204
|
+
def add_starting_period(supply, global_supply)
|
205
|
+
missing_supply = global_supply.dup
|
206
|
+
missing_supply[:until_date] = supply[:from_date] - 1
|
207
|
+
|
208
|
+
[missing_supply, supply]
|
209
|
+
end
|
210
|
+
|
211
|
+
def add_ending_period(supply, global_supply)
|
212
|
+
missing_supply = global_supply.dup
|
213
|
+
missing_supply[:from_date] = supply[:until_date] + 1
|
214
|
+
|
215
|
+
[supply, missing_supply]
|
216
|
+
end
|
217
|
+
|
218
|
+
# :category: High level
|
219
|
+
# flattened supplies only including taxes
|
220
|
+
def supplies_including_tax
|
221
|
+
self.supplies.select{|p| p[:including_tax]}
|
222
|
+
end
|
223
|
+
|
224
|
+
# :category: High level
|
225
|
+
# flattened supplies only excluding taxes
|
226
|
+
def supplies_excluding_tax
|
227
|
+
self.supplies.select{|p| not p[:including_tax]}
|
228
|
+
end
|
229
|
+
|
230
|
+
# :category: High level
|
231
|
+
# flattened supplies with default tax (excluding tax for US and CA, including otherwise)
|
232
|
+
def supplies_with_default_tax
|
233
|
+
self.supplies_including_tax + self.supplies_excluding_tax.select{|s| ["CAD","USD"].include?(s[:currency])}
|
234
|
+
end
|
235
|
+
|
236
|
+
# :category: High level
|
237
|
+
# flattened supplies for country
|
238
|
+
def supplies_for_country(country,currency=nil)
|
239
|
+
country_supplies=self.supplies
|
240
|
+
if currency
|
241
|
+
country_supplies=country_supplies.select{|s| s[:currency]==currency}
|
242
|
+
end
|
243
|
+
country_supplies.select{|s|
|
244
|
+
if s[:territory].include?(country)
|
245
|
+
true
|
246
|
+
else
|
247
|
+
false
|
248
|
+
end
|
249
|
+
}
|
250
|
+
end
|
251
|
+
|
252
|
+
# :category: High level
|
253
|
+
# price amount for given +currency+ and country at time
|
254
|
+
def at_time_price_amount_for(time,currency,country=nil)
|
255
|
+
sups=self.supplies_with_default_tax.select { |p| p[:currency]==currency }
|
256
|
+
if country
|
257
|
+
sups=sups.select{|p| p[:territory].include?(country)}
|
258
|
+
end
|
259
|
+
if sups.length > 0
|
260
|
+
# exclusive
|
261
|
+
sup=sups.first[:prices].select { |p|
|
262
|
+
(!p[:from_date] or p[:from_date].to_date <= time.to_date) and
|
263
|
+
(!p[:until_date] or p[:until_date].to_date > time.to_date)
|
264
|
+
}.first
|
265
|
+
|
266
|
+
if sup
|
267
|
+
sup[:amount]
|
268
|
+
else
|
269
|
+
# or inclusive
|
270
|
+
sup=sups.first[:prices].select { |p|
|
271
|
+
(!p[:from_date] or p[:from_date].to_date <= time.to_date) and
|
272
|
+
(!p[:until_date] or p[:until_date].to_date >= time.to_date)
|
273
|
+
}.first
|
274
|
+
|
275
|
+
if sup
|
276
|
+
sup[:amount]
|
277
|
+
else
|
278
|
+
nil
|
279
|
+
end
|
280
|
+
end
|
281
|
+
|
282
|
+
else
|
283
|
+
nil
|
284
|
+
end
|
285
|
+
end
|
286
|
+
|
287
|
+
# :category: High level
|
288
|
+
# current price amount for given +currency+ and country
|
289
|
+
def current_price_amount_for(currency,country=nil)
|
290
|
+
at_time_price_amount_for(Time.now,currency,country)
|
291
|
+
end
|
292
|
+
end
|
293
|
+
|
294
|
+
class Product < SubsetDSL
|
295
|
+
include EanMethods
|
296
|
+
include IsbnMethods
|
297
|
+
include ProprietaryIdMethods
|
298
|
+
|
299
|
+
element "RecordReference", :text
|
300
|
+
element "NotificationType", :subset
|
301
|
+
element "RecordSourceName", :text
|
302
|
+
elements "ProductIdentifier", :subset
|
303
|
+
element "DescriptiveDetail", :subset
|
304
|
+
element "CollateralDetail", :subset
|
305
|
+
element "PublishingDetail", :subset
|
306
|
+
element "RelatedMaterial", :subset
|
307
|
+
elements "ProductSupply", :subset
|
308
|
+
|
309
|
+
# shortcuts
|
310
|
+
def identifiers
|
311
|
+
@product_identifiers
|
312
|
+
end
|
313
|
+
|
314
|
+
# default LanguageCode from ONIXMessage
|
315
|
+
attr_accessor :default_language_of_text
|
316
|
+
# default code from ONIXMessage
|
317
|
+
attr_accessor :default_currency_code
|
318
|
+
|
319
|
+
include ProductSuppliesExtractor
|
320
|
+
|
321
|
+
# :category: High level
|
322
|
+
# product title string
|
323
|
+
def title
|
324
|
+
@descriptive_detail.title
|
325
|
+
end
|
326
|
+
|
327
|
+
# :category: High level
|
328
|
+
# product subtitle string
|
329
|
+
def subtitle
|
330
|
+
@descriptive_detail.subtitle
|
331
|
+
end
|
332
|
+
|
333
|
+
# :category: High level
|
334
|
+
# product description string including HTML
|
335
|
+
def description
|
336
|
+
if @collateral_detail
|
337
|
+
@collateral_detail.description
|
338
|
+
else
|
339
|
+
nil
|
340
|
+
end
|
341
|
+
end
|
342
|
+
|
343
|
+
# :category: High level
|
344
|
+
# product larger front cover URL string
|
345
|
+
def frontcover_url
|
346
|
+
if @collateral_detail
|
347
|
+
@collateral_detail.frontcover_url
|
348
|
+
end
|
349
|
+
end
|
350
|
+
|
351
|
+
# :category: High level
|
352
|
+
# product larger front cover last updated date
|
353
|
+
def frontcover_last_updated
|
354
|
+
if @collateral_detail
|
355
|
+
@collateral_detail.frontcover_last_updated
|
356
|
+
end
|
357
|
+
end
|
358
|
+
|
359
|
+
# :category: High level
|
360
|
+
# product larger front cover mimetype
|
361
|
+
def frontcover_mimetype
|
362
|
+
if @collateral_detail
|
363
|
+
@collateral_detail.frontcover_mimetype
|
364
|
+
end
|
365
|
+
end
|
366
|
+
|
367
|
+
# :category: High level
|
368
|
+
# ePub sample URL string
|
369
|
+
def epub_sample_url
|
370
|
+
if @collateral_detail
|
371
|
+
@collateral_detail.epub_sample_url
|
372
|
+
end
|
373
|
+
end
|
374
|
+
|
375
|
+
# :category: High level
|
376
|
+
# ePub sample last updated date
|
377
|
+
def epub_sample_last_updated
|
378
|
+
if @collateral_detail
|
379
|
+
@collateral_detail.epub_sample_last_updated
|
380
|
+
end
|
381
|
+
end
|
382
|
+
|
383
|
+
# :category: High level
|
384
|
+
# ePub sample mimetype
|
385
|
+
def epub_sample_mimetype
|
386
|
+
if @collateral_detail
|
387
|
+
@collateral_detail.epub_sample_mimetype
|
388
|
+
end
|
389
|
+
end
|
390
|
+
|
391
|
+
# :category: High level
|
392
|
+
# product edition number
|
393
|
+
def edition_number
|
394
|
+
@descriptive_detail.edition_number
|
395
|
+
end
|
396
|
+
|
397
|
+
# product LanguageCode of text
|
398
|
+
def language_of_text
|
399
|
+
@descriptive_detail.language_of_text || @default_language_of_text
|
400
|
+
end
|
401
|
+
|
402
|
+
# :category: High level
|
403
|
+
# product language code string of text (eg: fre)
|
404
|
+
def language_code_of_text
|
405
|
+
if self.language_of_text
|
406
|
+
self.language_of_text.code
|
407
|
+
end
|
408
|
+
end
|
409
|
+
|
410
|
+
# :category: High level
|
411
|
+
# product language name string of text (eg: French)
|
412
|
+
def language_name_of_text
|
413
|
+
if self.language_of_text
|
414
|
+
self.language_of_text.human
|
415
|
+
end
|
416
|
+
end
|
417
|
+
|
418
|
+
# :category: High level
|
419
|
+
# publisher collection title
|
420
|
+
def publisher_collection_title
|
421
|
+
@descriptive_detail.publisher_collection_title
|
422
|
+
end
|
423
|
+
|
424
|
+
def subjects
|
425
|
+
@descriptive_detail.subjects
|
426
|
+
end
|
427
|
+
|
428
|
+
# BISAC categories Subject
|
429
|
+
def bisac_categories
|
430
|
+
@descriptive_detail.bisac_categories
|
431
|
+
end
|
432
|
+
|
433
|
+
# :category: High level
|
434
|
+
# BISAC categories identifiers string array (eg: FIC000000)
|
435
|
+
def bisac_categories_codes
|
436
|
+
self.bisac_categories.map{|c| c.code}.uniq
|
437
|
+
end
|
438
|
+
|
439
|
+
# CLIL categories Subject
|
440
|
+
def clil_categories
|
441
|
+
@descriptive_detail.clil_categories
|
442
|
+
end
|
443
|
+
|
444
|
+
# :category: High level
|
445
|
+
# CLIL categories identifier string array
|
446
|
+
def clil_categories_codes
|
447
|
+
self.clil_categories.map{|c| c.code}.uniq
|
448
|
+
end
|
449
|
+
|
450
|
+
# :category: High level
|
451
|
+
# keywords string array
|
452
|
+
def keywords
|
453
|
+
@descriptive_detail.keywords
|
454
|
+
end
|
455
|
+
|
456
|
+
# :category: High level
|
457
|
+
# Protection type string (None, Watermarking, Drm, AdobeDrm)
|
458
|
+
def protection_type
|
459
|
+
@descriptive_detail.protection_type
|
460
|
+
end
|
461
|
+
|
462
|
+
# :category: High level
|
463
|
+
# List of protections type string (None, Watermarking, DRM, AdobeDRM)
|
464
|
+
def protections
|
465
|
+
@descriptive_detail.protections
|
466
|
+
end
|
467
|
+
|
468
|
+
# :category: High level
|
469
|
+
# product has DRM ?
|
470
|
+
def drmized?
|
471
|
+
if @protections.any? {|p| p =~ /Drm/ }
|
472
|
+
true
|
473
|
+
else
|
474
|
+
false
|
475
|
+
end
|
476
|
+
end
|
477
|
+
|
478
|
+
# :category: High level
|
479
|
+
# is product digital ?
|
480
|
+
def digital?
|
481
|
+
@descriptive_detail.digital?
|
482
|
+
end
|
483
|
+
|
484
|
+
# :category: High level
|
485
|
+
# is product audio ?
|
486
|
+
def audio?
|
487
|
+
@descriptive_detail.audio?
|
488
|
+
end
|
489
|
+
|
490
|
+
# :category: High level
|
491
|
+
# is product digital ?
|
492
|
+
def streaming?
|
493
|
+
@descriptive_detail.streaming?
|
494
|
+
end
|
495
|
+
|
496
|
+
# :category: High level
|
497
|
+
# is product a bundle of multiple parts ?
|
498
|
+
def bundle?
|
499
|
+
@descriptive_detail.bundle?
|
500
|
+
end
|
501
|
+
|
502
|
+
def sold_separately?
|
503
|
+
@product_supplies.map{|ps| ps.supply_details.map{|sd| sd.sold_separately?}.flatten}.flatten.uniq.first
|
504
|
+
end
|
505
|
+
|
506
|
+
# :category: High level
|
507
|
+
# bundle ProductPart array
|
508
|
+
def parts
|
509
|
+
@descriptive_detail.parts
|
510
|
+
end
|
511
|
+
|
512
|
+
# :category: High level
|
513
|
+
# digital file filesize in bytes
|
514
|
+
def filesize
|
515
|
+
@descriptive_detail.filesize
|
516
|
+
end
|
517
|
+
|
518
|
+
# :category: High level
|
519
|
+
# audio formats array
|
520
|
+
def audio_formats
|
521
|
+
@descriptive_detail.audio_formats
|
522
|
+
end
|
523
|
+
|
524
|
+
# :category: High level
|
525
|
+
# audio format string ()
|
526
|
+
def audio_format
|
527
|
+
@descriptive_detail.audio_format
|
528
|
+
end
|
529
|
+
|
530
|
+
# :category: High level
|
531
|
+
# digital file format string (Epub,Pdf,Mobipocket)
|
532
|
+
def file_format
|
533
|
+
@descriptive_detail.file_format
|
534
|
+
end
|
535
|
+
|
536
|
+
def form_details
|
537
|
+
@descriptive_detail.form_details
|
538
|
+
end
|
539
|
+
|
540
|
+
def reflowable?
|
541
|
+
@descriptive_detail.reflowable?
|
542
|
+
end
|
543
|
+
|
544
|
+
# :category: High level
|
545
|
+
# digital file mimetype (Epub,Pdf,Mobipocket)
|
546
|
+
def file_mimetype
|
547
|
+
@descriptive_detail.file_mimetype
|
548
|
+
end
|
549
|
+
|
550
|
+
# :category: High level
|
551
|
+
# digital file description string
|
552
|
+
def file_description
|
553
|
+
@descriptive_detail.file_description
|
554
|
+
end
|
555
|
+
|
556
|
+
# :category: High level
|
557
|
+
# raw file description string without HTML
|
558
|
+
def raw_file_description
|
559
|
+
if @descriptive_detail.file_description
|
560
|
+
Helper.strip_html(@descriptive_detail.file_description).gsub(/\s+/," ").strip
|
561
|
+
else
|
562
|
+
nil
|
563
|
+
end
|
564
|
+
end
|
565
|
+
|
566
|
+
# :category: High level
|
567
|
+
# page count
|
568
|
+
def pages
|
569
|
+
@descriptive_detail.pages
|
570
|
+
end
|
571
|
+
|
572
|
+
# :category: High level
|
573
|
+
# raw book description string without HTML
|
574
|
+
def raw_description
|
575
|
+
if self.description
|
576
|
+
Helper.strip_html(self.description).gsub(/\s+/," ").strip
|
577
|
+
else
|
578
|
+
nil
|
579
|
+
end
|
580
|
+
end
|
581
|
+
|
582
|
+
def publishers
|
583
|
+
if @publishing_detail
|
584
|
+
@publishing_detail.publishers
|
585
|
+
else
|
586
|
+
[]
|
587
|
+
end
|
588
|
+
end
|
589
|
+
|
590
|
+
def publisher
|
591
|
+
if @publishing_detail
|
592
|
+
@publishing_detail.publisher
|
593
|
+
else
|
594
|
+
nil
|
595
|
+
end
|
596
|
+
end
|
597
|
+
|
598
|
+
# :category: High level
|
599
|
+
# publisher name string, if multiple publishers are found, then they are concatenated with " / "
|
600
|
+
def publisher_name
|
601
|
+
if self.publishers.length > 0
|
602
|
+
self.publishers.map{|p| p.name}.join(" / ")
|
603
|
+
end
|
604
|
+
end
|
605
|
+
|
606
|
+
# :category: High level
|
607
|
+
# publisher GLN string, nil if multiple publishers are found
|
608
|
+
def publisher_gln
|
609
|
+
if self.publishers.length==1
|
610
|
+
self.publisher.gln
|
611
|
+
end
|
612
|
+
end
|
613
|
+
|
614
|
+
def imprint
|
615
|
+
if @publishing_detail
|
616
|
+
@publishing_detail.imprint
|
617
|
+
else
|
618
|
+
nil
|
619
|
+
end
|
620
|
+
end
|
621
|
+
|
622
|
+
# :category: High level
|
623
|
+
# imprint name string
|
624
|
+
def imprint_name
|
625
|
+
if self.imprint
|
626
|
+
self.imprint.name
|
627
|
+
else
|
628
|
+
nil
|
629
|
+
end
|
630
|
+
end
|
631
|
+
|
632
|
+
# :category: High level
|
633
|
+
# imprint GLN string
|
634
|
+
def imprint_gln
|
635
|
+
if self.imprint
|
636
|
+
self.imprint.gln
|
637
|
+
end
|
638
|
+
end
|
639
|
+
|
640
|
+
def distributors
|
641
|
+
@product_supplies.map{|ps| ps.distributors}.flatten.uniq{|d| d.name}
|
642
|
+
end
|
643
|
+
|
644
|
+
# product distributor
|
645
|
+
def distributor
|
646
|
+
if self.distributors.length > 0
|
647
|
+
if self.distributors.length==1
|
648
|
+
self.distributors.first
|
649
|
+
else
|
650
|
+
raise ExpectsOneButHasSeveral, self.distributors.map(&:name)
|
651
|
+
end
|
652
|
+
else
|
653
|
+
nil
|
654
|
+
end
|
655
|
+
end
|
656
|
+
|
657
|
+
# :category: High level
|
658
|
+
# product distributor name string
|
659
|
+
def distributor_name
|
660
|
+
if self.distributor
|
661
|
+
self.distributor.name
|
662
|
+
else
|
663
|
+
nil
|
664
|
+
end
|
665
|
+
end
|
666
|
+
|
667
|
+
# :category: High level
|
668
|
+
# product distributor GLN string
|
669
|
+
def distributor_gln
|
670
|
+
if self.distributor
|
671
|
+
self.distributor.gln
|
672
|
+
else
|
673
|
+
nil
|
674
|
+
end
|
675
|
+
end
|
676
|
+
|
677
|
+
# :category: High level
|
678
|
+
# return every related subset
|
679
|
+
def related
|
680
|
+
if @related_material
|
681
|
+
(@related_material.related_products + @related_material.related_works)
|
682
|
+
else
|
683
|
+
[]
|
684
|
+
end
|
685
|
+
end
|
686
|
+
|
687
|
+
# :category: High level
|
688
|
+
# paper linking RelatedProduct
|
689
|
+
def part_of_product
|
690
|
+
if @related_material
|
691
|
+
@related_material.part_of_products.first
|
692
|
+
end
|
693
|
+
end
|
694
|
+
|
695
|
+
# :category: High level
|
696
|
+
# paper linking RelatedProduct
|
697
|
+
def print_product
|
698
|
+
if @related_material
|
699
|
+
@related_material.print_products.first
|
700
|
+
end
|
701
|
+
end
|
702
|
+
|
703
|
+
# DEPRECATED see print_product instead
|
704
|
+
def paper_linking
|
705
|
+
self.print_product
|
706
|
+
end
|
707
|
+
|
708
|
+
# :category: High level
|
709
|
+
# date of publication
|
710
|
+
def publication_date
|
711
|
+
if @publishing_detail
|
712
|
+
@publishing_detail.publication_date
|
713
|
+
end
|
714
|
+
end
|
715
|
+
|
716
|
+
# date of embargo
|
717
|
+
def embargo_date
|
718
|
+
if @publishing_detail
|
719
|
+
@publishing_detail.embargo_date
|
720
|
+
end
|
721
|
+
end
|
722
|
+
|
723
|
+
def preorder_embargo_date
|
724
|
+
if @publishing_detail
|
725
|
+
@publishing_detail.preorder_embargo_date
|
726
|
+
end
|
727
|
+
end
|
728
|
+
|
729
|
+
def public_announcement_date
|
730
|
+
if @publishing_detail
|
731
|
+
@publishing_detail.public_announcement_date
|
732
|
+
end
|
733
|
+
end
|
734
|
+
|
735
|
+
def sales_restriction
|
736
|
+
if @publishing_detail
|
737
|
+
@publishing_detail.sales_restriction
|
738
|
+
end
|
739
|
+
end
|
740
|
+
|
741
|
+
# :category: High level
|
742
|
+
# product countries rights string array
|
743
|
+
def countries_rights
|
744
|
+
countries=[]
|
745
|
+
if @publishing_detail
|
746
|
+
countries+=@publishing_detail.sales_rights.map{|sr| sr.territory.countries}.flatten.uniq
|
747
|
+
end
|
748
|
+
|
749
|
+
if @product_supplies
|
750
|
+
countries+=@product_supplies.map{|ps| ps.markets.map{|m| m.territory.countries}.flatten}.flatten.uniq
|
751
|
+
end
|
752
|
+
|
753
|
+
countries.uniq
|
754
|
+
end
|
755
|
+
|
756
|
+
# :category: High level
|
757
|
+
def illustrations
|
758
|
+
return [] unless @collateral_detail && @collateral_detail.supporting_resources
|
759
|
+
|
760
|
+
@collateral_detail.supporting_resources.image.map do |image_resource|
|
761
|
+
{
|
762
|
+
:url => image_resource.versions.last.links.first.strip,
|
763
|
+
:type => image_resource.type.human,
|
764
|
+
:width => image_resource.versions.last.image_width,
|
765
|
+
:height => image_resource.versions.last.image_height,
|
766
|
+
:caption => image_resource.caption,
|
767
|
+
:format_code => image_resource.versions.last.file_format,
|
768
|
+
:updated_at => image_resource.versions.last.last_updated_utc
|
769
|
+
}
|
770
|
+
end
|
771
|
+
end
|
772
|
+
|
773
|
+
# :category: High level
|
774
|
+
def excerpts
|
775
|
+
return [] unless @collateral_detail && @collateral_detail.supporting_resources
|
776
|
+
|
777
|
+
@collateral_detail.supporting_resources.sample_content.human_code_match(:resource_mode,["Text","Multimode"]).map do |resource|
|
778
|
+
{
|
779
|
+
:url => resource.versions.last.links.first.strip,
|
780
|
+
:form => resource.versions.last.form.human,
|
781
|
+
:md5 => resource.versions.last.md5_hash,
|
782
|
+
:format_code => resource.versions.last.file_format,
|
783
|
+
:updated_at => resource.versions.last.last_updated_utc
|
784
|
+
}
|
785
|
+
end
|
786
|
+
end
|
787
|
+
|
788
|
+
def available_product_supplies
|
789
|
+
@product_supplies.select{|ps| ps.available?}
|
790
|
+
end
|
791
|
+
|
792
|
+
# :category: High level
|
793
|
+
# is product available ?
|
794
|
+
def available?
|
795
|
+
self.available_product_supplies.length > 0 and not self.delete?
|
796
|
+
end
|
797
|
+
|
798
|
+
# :category: High level
|
799
|
+
# is product available for given +country+ ?
|
800
|
+
def available_for_country?(country)
|
801
|
+
self.supplies_for_country(country).select{|s| s[:available]}.length > 0 and self.available?
|
802
|
+
end
|
803
|
+
|
804
|
+
# :category: High level
|
805
|
+
# is product price to be announced ?
|
806
|
+
def price_to_be_announced?
|
807
|
+
unless self.product_supplies.empty? || self.product_supplies.first.supply_details.empty?
|
808
|
+
unpriced_item_type = self.product_supplies.first.supply_details.first.unpriced_item_type
|
809
|
+
end
|
810
|
+
unpriced_item_type ? unpriced_item_type.human=="PriceToBeAnnounced" : false
|
811
|
+
end
|
812
|
+
|
813
|
+
# :category: High level
|
814
|
+
# is a deletion notification ?
|
815
|
+
def delete?
|
816
|
+
self.notification_type.human=="Delete"
|
817
|
+
end
|
818
|
+
|
819
|
+
# :category: High level
|
820
|
+
# Contributor array
|
821
|
+
def contributors
|
822
|
+
@descriptive_detail.contributors
|
823
|
+
end
|
824
|
+
|
825
|
+
# :category: High level
|
826
|
+
# List of ONIX outlets values
|
827
|
+
def onix_outlets_values
|
828
|
+
if @publishing_detail
|
829
|
+
@publishing_detail.sales_rights.map { |sri|
|
830
|
+
sri.sales_restrictions.select { |sr| (!sr.start_date or sr.start_date <= Date.today) and (!sr.end_date or sr.end_date >= Date.today) }.map { |sr|
|
831
|
+
sr.sales_outlets.select { |so|
|
832
|
+
so.identifier and so.identifier.type.human=="OnixSalesOutletIdCode" }.map { |so| so.identifier.value } } }.flatten
|
833
|
+
else
|
834
|
+
[]
|
835
|
+
end
|
836
|
+
end
|
837
|
+
|
838
|
+
def parse(n)
|
839
|
+
super
|
840
|
+
parts.each do |part|
|
841
|
+
part.part_of=self
|
842
|
+
end
|
843
|
+
end
|
844
|
+
|
845
|
+
end
|
846
|
+
end
|