When you need to pass new attributes to/from a ledger, you may to to create custom serializers and deserializers.
For example, given the following:
CustomCustomeris a custom resource that inherits fromLedgerSync::Ledgers::NetSuite::Customerand defines a custom attribute string namedfoo- the attribute
foois used in both the request and response bodies clientdefines a valid instance of the NetSuite client
class CustomSerializer < LedgerSync::Ledgers::NetSuite::Customer::Serializer
attribute :foo
end
class CustomDeserializer < LedgerSync::Ledgers::NetSuite::Customer::Deserializer
attribute :foo
end
# Serializing
custom_resource = CustomCustomer.new(foo: 'asdf') # See above under Resources -> Custom Attributes
serializer = CustomSerializer.new(resource: custom_resource)
serializer.serialize # => {..., "foo"=>"asdf",...}
# Deserializing
deserialized_resource = serializer.deserialize(hash: { foo: 'qwerty' }, resource: CustomCustomer.new)
deserialized_resource.foo # => 'qwerty'
custom_resource.foo # => 'asdf'
op = LedgerSync::Ledgers::NetSuite::Customer::Operations::Create.new(
client: client,
deserializer: CustomSerializer.new,
serializer: CustomSerializer.new,
resource: custom_resource
)
Note that in the above example, we extend an existing customer serializer in the NetSuite ledger. In most cases, serializers have the following inheritance pattern: LedgerSync::Ledgers::[ADAPTOR]::[RESOURCE]::Serializer < LedgerSync::Ledgers::[ADAPTOR]::Serializer < LedgerSync::Serializer.
So in this example, it would be LedgerSync::Ledgers::NetSuite::Customer::Serializer < LedgerSync::Ledgers::NetSuite::Serializer < LedgerSync::Serializer. The more specific the serializer, the more helper methods are available that are ledger and/or resource specific.
Similarly, deserializers follow the same pattern.