=begin #カラーミーショップ API ## カラーミーショップ API [カラーミーショップ](https://shop-pro.jp) APIでは、受注の検索や商品情報の更新を行うことができます。 ## 利用手順 はじめに、カラーミーデベロッパーアカウントを用意します。[デベロッパー登録ページ](https://api.shop-pro.jp/developers/sign_up)から登録してください。 次に、[登録ページ](https://api.shop-pro.jp/oauth/applications/new)からアプリケーション登録を行ってください。 スマートフォンのWebViewを利用する場合は、リダイレクトURLに`urn:ietf:wg:oauth:2.0:oob`を入力してください。 その後、カラーミーショップアカウントの認証ページを開きます。認証ページのURLは、`https://api.shop-pro.jp/oauth/authorize`に必要なパラメータをつけたものです。 |パラメータ名|値| |---|---| |`client_id`|アプリケーション詳細画面で確認できるクライアントID| |`response_type`|\"code\"という文字列| |`scope`| 別表参照| |`redirect_url`|アプリケーション登録時に入力したリダイレクトURL| `scope`は、以下のうち、アプリケーションが利用したい機能をスペース区切りで指定してください。 |スコープ|機能| |---|---| |`read_products`|商品データの参照| |`write_products`|在庫データの更新| |`read_sales`|受注・顧客データの参照| |`write_sales`|受注データの更新| 以下のようなURLとなります。 ``` https://api.shop-pro.jp/oauth/authorize?client_id=CLIENT_ID&redirect_uri=REDIRECT_URL&response_type=code&scope=read_products%20write_products ``` 初めてこのページを訪れる場合は、カラーミーショップアカウントのIDとパスワードの入力を求められます。 承認ボタンを押すと、このアプリケーションがショップのデータにアクセスすることが許可され、リダイレクトURLへリダイレクトされます。 承認された場合は、`code`というクエリパラメータに認可コードが付与されます。承認がキャンセルされた、またはエラーが起きた場合は、 `error`パラメータにエラーの内容を表す文字列が与えられます。 アプリケーション登録時のリダイレクトURLに`urn:ietf:wg:oauth:2.0:oob`を指定した場合は、以下のようなURLにリダイレクトされます。 末尾のパスが認可コードになっています。 ``` https://api.shop-pro.jp/oauth/authorize/AUTH_CODE ``` 認可コードの有効期限は発行から10分間です。 最後に、認可コードとアクセストークンを交換します。以下のパラメータを付けて、`https://api.shop-pro.jp/oauth/token`へリクエストを送ります。 |パラメータ名|値| |---|---| |`client_id`|アプリケーション詳細画面に表示されているクライアントID| |`client_secret`|アプリケーション詳細画面に表示されているクライアントシークレット| |`code`|取得した認可コード| |`grant_type`|\"authorization_code\"という文字列| |`redirect_uri`|アプリケーション登録時に入力したリダイレクトURL| ```console # curl での例 $ curl -X POST \\ -d'client_id=CLIENT_ID' \\ -d'client_secret=CLIENT_SECRET' \\ -d'code=CODE' \\ -d'grant_type=authorization_code' \\ -d'redirect_uri=REDIRECT_URI' \\ 'https://api.shop-pro.jp/oauth/token' ``` リクエストが成功すると、以下のようなJSONが返ってきます。 ```json { \"access_token\": \"d461ab8XXXXXXXXXXXXXXXXXXXXXXXXX\", \"token_type\": \"bearer\", \"scope\": \"read_products write_products\" } ``` アクセストークンに有効期限はありませんが、許可済みアプリケーション一覧画面から失効させることができます。なお、同じ認可コードをアクセストークンに交換できるのは1度だけです。 取得したアクセストークンは、Authorizationヘッダに入れて使用します。以下にショップ情報を取得する際の例を示します。 ```console # curlの例 $ curl -H 'Authorization: Bearer d461ab8XXXXXXXXXXXXXXXXXXXXXXXXX' https://api.shop-pro.jp/v1/shop.json ``` ## エラー カラーミーショップAPI v1では - エラーコード - エラーメッセージ - ステータスコード の配列でエラーを表現します。以下に例を示します。 ```json { \"errors\": [ { \"code\": 404100, \"message\": \"レコードが見つかりませんでした。\", \"status\": 404 } ] } ``` OpenAPI spec version: 1.0.0 Generated by: https://openapi-generator.tech OpenAPI Generator version: 3.2.0-SNAPSHOT =end require 'date' module ColorMeShop class SaleDetail # 受注明細ID attr_accessor :id # 売上ID attr_accessor :sale_id # ショップアカウントID attr_accessor :account_id # 商品ID attr_accessor :product_id # 配送ID attr_accessor :sale_delivery_id # オプション1の値 attr_accessor :option1_value # オプション2の値 attr_accessor :option2_value # オプション1の値の選択肢中の位置 attr_accessor :option1_index # オプション2の値の選択肢中の位置 attr_accessor :option2_index # 型番 attr_accessor :product_model_number # 商品名 attr_accessor :product_name # 商品原価 attr_accessor :product_cost # 商品画像URL attr_accessor :product_image_url # サムネイル用商品画像URL attr_accessor :product_thumbnail_image_url # モバイル用商品画像URL attr_accessor :product_mobile_image_url # 商品販売価格 attr_accessor :price # 税込み商品価格 attr_accessor :price_with_tax # 商品点数 attr_accessor :product_num # 単位 attr_accessor :unit # 商品小計。販売価格と点数の積 attr_accessor :subtotal_price # Attribute mapping from ruby-style variable name to JSON key. def self.attribute_map { :'id' => :'id', :'sale_id' => :'sale_id', :'account_id' => :'account_id', :'product_id' => :'product_id', :'sale_delivery_id' => :'sale_delivery_id', :'option1_value' => :'option1_value', :'option2_value' => :'option2_value', :'option1_index' => :'option1_index', :'option2_index' => :'option2_index', :'product_model_number' => :'product_model_number', :'product_name' => :'product_name', :'product_cost' => :'product_cost', :'product_image_url' => :'product_image_url', :'product_thumbnail_image_url' => :'product_thumbnail_image_url', :'product_mobile_image_url' => :'product_mobile_image_url', :'price' => :'price', :'price_with_tax' => :'price_with_tax', :'product_num' => :'product_num', :'unit' => :'unit', :'subtotal_price' => :'subtotal_price' } end # Attribute type mapping. def self.openapi_types { :'id' => :'Integer', :'sale_id' => :'Integer', :'account_id' => :'String', :'product_id' => :'Integer', :'sale_delivery_id' => :'Integer', :'option1_value' => :'String', :'option2_value' => :'String', :'option1_index' => :'Integer', :'option2_index' => :'String', :'product_model_number' => :'String', :'product_name' => :'String', :'product_cost' => :'Integer', :'product_image_url' => :'String', :'product_thumbnail_image_url' => :'String', :'product_mobile_image_url' => :'String', :'price' => :'Integer', :'price_with_tax' => :'Integer', :'product_num' => :'Integer', :'unit' => :'String', :'subtotal_price' => :'Integer' } end # Initializes the object # @param [Hash] attributes Model attributes in the form of hash def initialize(attributes = {}) return unless attributes.is_a?(Hash) # convert string to symbol for hash key attributes = attributes.each_with_object({}) { |(k, v), h| h[k.to_sym] = v } if attributes.has_key?(:'id') self.id = attributes[:'id'] end if attributes.has_key?(:'sale_id') self.sale_id = attributes[:'sale_id'] end if attributes.has_key?(:'account_id') self.account_id = attributes[:'account_id'] end if attributes.has_key?(:'product_id') self.product_id = attributes[:'product_id'] end if attributes.has_key?(:'sale_delivery_id') self.sale_delivery_id = attributes[:'sale_delivery_id'] end if attributes.has_key?(:'option1_value') self.option1_value = attributes[:'option1_value'] end if attributes.has_key?(:'option2_value') self.option2_value = attributes[:'option2_value'] end if attributes.has_key?(:'option1_index') self.option1_index = attributes[:'option1_index'] end if attributes.has_key?(:'option2_index') self.option2_index = attributes[:'option2_index'] end if attributes.has_key?(:'product_model_number') self.product_model_number = attributes[:'product_model_number'] end if attributes.has_key?(:'product_name') self.product_name = attributes[:'product_name'] end if attributes.has_key?(:'product_cost') self.product_cost = attributes[:'product_cost'] end if attributes.has_key?(:'product_image_url') self.product_image_url = attributes[:'product_image_url'] end if attributes.has_key?(:'product_thumbnail_image_url') self.product_thumbnail_image_url = attributes[:'product_thumbnail_image_url'] end if attributes.has_key?(:'product_mobile_image_url') self.product_mobile_image_url = attributes[:'product_mobile_image_url'] end if attributes.has_key?(:'price') self.price = attributes[:'price'] end if attributes.has_key?(:'price_with_tax') self.price_with_tax = attributes[:'price_with_tax'] end if attributes.has_key?(:'product_num') self.product_num = attributes[:'product_num'] end if attributes.has_key?(:'unit') self.unit = attributes[:'unit'] end if attributes.has_key?(:'subtotal_price') self.subtotal_price = attributes[:'subtotal_price'] end end # Show invalid properties with the reasons. Usually used together with valid? # @return Array for valid properties with the reasons def list_invalid_properties invalid_properties = Array.new invalid_properties end # Check to see if the all the properties in the model are valid # @return true if the model is valid def valid? true end # Checks equality by comparing each attribute. # @param [Object] Object to be compared def ==(o) return true if self.equal?(o) self.class == o.class && id == o.id && sale_id == o.sale_id && account_id == o.account_id && product_id == o.product_id && sale_delivery_id == o.sale_delivery_id && option1_value == o.option1_value && option2_value == o.option2_value && option1_index == o.option1_index && option2_index == o.option2_index && product_model_number == o.product_model_number && product_name == o.product_name && product_cost == o.product_cost && product_image_url == o.product_image_url && product_thumbnail_image_url == o.product_thumbnail_image_url && product_mobile_image_url == o.product_mobile_image_url && price == o.price && price_with_tax == o.price_with_tax && product_num == o.product_num && unit == o.unit && subtotal_price == o.subtotal_price end # @see the `==` method # @param [Object] Object to be compared def eql?(o) self == o end # Calculates hash code according to all attributes. # @return [Fixnum] Hash code def hash [id, sale_id, account_id, product_id, sale_delivery_id, option1_value, option2_value, option1_index, option2_index, product_model_number, product_name, product_cost, product_image_url, product_thumbnail_image_url, product_mobile_image_url, price, price_with_tax, product_num, unit, subtotal_price].hash end # Builds the object from hash # @param [Hash] attributes Model attributes in the form of hash # @return [Object] Returns the model itself def build_from_hash(attributes) return nil unless attributes.is_a?(Hash) self.class.openapi_types.each_pair do |key, type| if type =~ /\AArray<(.*)>/i # check to ensure the input is an array given that the the attribute # is documented as an array but the input is not if attributes[self.class.attribute_map[key]].is_a?(Array) self.send("#{key}=", attributes[self.class.attribute_map[key]].map { |v| _deserialize($1, v) }) end elsif !attributes[self.class.attribute_map[key]].nil? self.send("#{key}=", _deserialize(type, attributes[self.class.attribute_map[key]])) end # or else data not found in attributes(hash), not an issue as the data can be optional end self end # Deserializes the data based on type # @param string type Data type # @param string value Value to be deserialized # @return [Object] Deserialized data def _deserialize(type, value) case type.to_sym when :DateTime DateTime.parse(value) when :Date Date.parse(value) when :String value.to_s when :Integer value.to_i when :Float value.to_f when :BOOLEAN if value.to_s =~ /\A(true|t|yes|y|1)\z/i true else false end when :Object # generic object (usually a Hash), return directly value when /\AArray<(?.+)>\z/ inner_type = Regexp.last_match[:inner_type] value.map { |v| _deserialize(inner_type, v) } when /\AHash<(?.+?), (?.+)>\z/ k_type = Regexp.last_match[:k_type] v_type = Regexp.last_match[:v_type] {}.tap do |hash| value.each do |k, v| hash[_deserialize(k_type, k)] = _deserialize(v_type, v) end end else # model temp_model = ColorMeShop.const_get(type).new temp_model.build_from_hash(value) end end # Returns the string representation of the object # @return [String] String presentation of the object def to_s to_hash.to_s end # to_body is an alias to to_hash (backward compatibility) # @return [Hash] Returns the object in the form of hash def to_body to_hash end # Returns the object in the form of hash # @return [Hash] Returns the object in the form of hash def to_hash hash = {} self.class.attribute_map.each_pair do |attr, param| value = self.send(attr) next if value.nil? hash[param] = _to_hash(value) end hash end # Outputs non-array value in the form of hash # For object, use to_hash. Otherwise, just return the value # @param [Object] value Any valid value # @return [Hash] Returns the value in the form of hash def _to_hash(value) if value.is_a?(Array) value.compact.map { |v| _to_hash(v) } elsif value.is_a?(Hash) {}.tap do |hash| value.each { |k, v| hash[k] = _to_hash(v) } end elsif value.respond_to? :to_hash value.to_hash else value end end end end