infopark_crm_connector 0.9.2 → 1.0.0
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.
- data/.yardopts +8 -0
- data/CHANGELOG.markdown +94 -0
- data/LICENSE +2 -0
- data/README.markdown +110 -0
- data/lib/crm_connector.rb +11 -15
- data/lib/crm_connector/account.rb +31 -2
- data/lib/crm_connector/activity.rb +61 -3
- data/lib/crm_connector/configuration.rb +2 -4
- data/lib/crm_connector/contact.rb +123 -3
- data/lib/crm_connector/core/continuation_support.rb +2 -1
- data/lib/crm_connector/core/enumerator.rb +20 -11
- data/lib/crm_connector/core/known_attributes.rb +3 -1
- data/lib/crm_connector/core/resource.rb +108 -16
- data/lib/crm_connector/core/search_support.rb +3 -1
- data/lib/crm_connector/custom_type.rb +20 -3
- data/lib/crm_connector/{default.rb → errors.rb} +1 -1
- data/lib/crm_connector/errors/authentication_failed.rb +10 -0
- data/lib/crm_connector/errors/base.rb +8 -0
- data/lib/crm_connector/event.rb +37 -2
- data/lib/crm_connector/event_contact.rb +38 -2
- data/lib/crm_connector/mailing.rb +35 -2
- data/lib/crm_connector/role.rb +7 -2
- data/lib/crm_connector/system.rb +14 -8
- metadata +22 -53
- data/CHANGELOG.rdoc +0 -87
- data/README.rdoc +0 -59
- data/lib/crm_connector/base.rb +0 -4
- data/lib/crm_connector/core/base.rb +0 -111
- data/lib/crm_connector/debugging.rb +0 -21
- data/lib/crm_connector/default/account.rb +0 -30
- data/lib/crm_connector/default/activity.rb +0 -54
- data/lib/crm_connector/default/contact.rb +0 -112
- data/lib/crm_connector/default/custom_type.rb +0 -24
- data/lib/crm_connector/default/event.rb +0 -23
- data/lib/crm_connector/default/event_contact.rb +0 -57
- data/lib/crm_connector/default/mailing.rb +0 -33
- data/lib/crm_connector/default/resource.rb +0 -10
- data/lib/crm_connector/default/role.rb +0 -9
- data/lib/crm_connector/inheriting_resource.rb +0 -30
- data/lib/crm_connector/resource.rb +0 -15
data/.yardopts
ADDED
data/CHANGELOG.markdown
ADDED
@@ -0,0 +1,94 @@
|
|
1
|
+
## Version 1.0.0 - 2012-09-14
|
2
|
+
* Enabled support for `event.custom_attributes`
|
3
|
+
* Removed deprecated functions `EventContact.find_by` and `EventContact.find_by_event_id_and_contact_id`. Please user `EventContact.search` instead.
|
4
|
+
* Removed `configuration.debug`.
|
5
|
+
* Renamed `Infopark::Crm::AuthenticationFailed` to `Infopark::Crm::Errors::AuthenticationFailed`.
|
6
|
+
* Merged `Infopark::Crm::Core::Base` and `Infopark::Crm::Resource` into `Infopark::Crm::Core:Resource`.
|
7
|
+
|
8
|
+
## Version 0.9.2 - 2012-03-19
|
9
|
+
* Security improvement for `Contact.authenticate`, `Contact.password_set` and `contact.password_request`
|
10
|
+
|
11
|
+
## Version 0.9.1 - 2012-02-28
|
12
|
+
* Removed `Diary`. Please use `Activity` instead.
|
13
|
+
* Added `Mailing`
|
14
|
+
* Added `appointment_*` and `task_*` fields to `Activity`
|
15
|
+
* Added `role_names` field to `Contact`
|
16
|
+
* Added `tags` field to `Activity`, `Account` and `Contact`
|
17
|
+
|
18
|
+
## Version 0.9 - 2012-01-27
|
19
|
+
Initial Release of Infopark CRM Connector
|
20
|
+
|
21
|
+
### Changes from OMC Connector to CRM Connector
|
22
|
+
* Namespace changed from `OmcConector::` to `Infopark::Crm::`
|
23
|
+
* Attribute names may have changed. For new attributes please refer to [Web Services API documentation](http://kb.infopark.de/crm-api).
|
24
|
+
* Works only with Infopark WebCRM.
|
25
|
+
|
26
|
+
#### Changed configuration
|
27
|
+
* `live_server_groups_callback` - replaces `contact_roles_callback`
|
28
|
+
|
29
|
+
#### New classes
|
30
|
+
* `CustomType`
|
31
|
+
* `Role`
|
32
|
+
* `System`
|
33
|
+
|
34
|
+
#### New methods
|
35
|
+
* `Account.search`
|
36
|
+
* `Activity.search`
|
37
|
+
* `Contact.search`
|
38
|
+
* `Event.search`
|
39
|
+
* `EventContact.search`
|
40
|
+
* `contact.live_server_groups` - replaces `contact.roles`
|
41
|
+
|
42
|
+
#### Removed classes
|
43
|
+
* `AccountCollection`
|
44
|
+
* `InquiryKind` - use `CustomType`
|
45
|
+
* `InquiryLink`
|
46
|
+
* `Inquiry` - use `Activity`
|
47
|
+
* `Location` - use `contact` and `account` properties
|
48
|
+
* `Mailing`
|
49
|
+
* `RegistrationInquiry`
|
50
|
+
* `Session`
|
51
|
+
|
52
|
+
|
53
|
+
#### Removed methods
|
54
|
+
* `account.contacts` - use `Contact.search(:params => {:acount_id => acount_id})`
|
55
|
+
* `Account.find_by_name` - use `Account.search`
|
56
|
+
* `account.inquiries` - use `Activity.search(:params => {:account_id => account_id})`
|
57
|
+
* `account.locations`
|
58
|
+
* `contact.account_activities` - use `Activity.search(:query => {:account_id => account_id})`
|
59
|
+
* `contact.activities` - use `Activity.search(:params => {:contact_id => contact_id})`
|
60
|
+
* `contact.create_activity`
|
61
|
+
* `contact.create_diary`
|
62
|
+
* `contact.create_location_with_account_association`
|
63
|
+
* `contact.create_location`
|
64
|
+
* `contact.create_registration_request`
|
65
|
+
* `contact.event_participation`
|
66
|
+
* `contact.find_activity`
|
67
|
+
* `Contact.find_by_email` - use `Contact.search(:params => {:email => email})`
|
68
|
+
* `Contact.find_by_login` - use `Contact.search(:params => {:login => login})`
|
69
|
+
* `Contact.languages`
|
70
|
+
* `contact.location`
|
71
|
+
* `Contact.lookup_uptions`
|
72
|
+
* `contact.move_location`
|
73
|
+
* `contact.roles` - use `contact.live_server_groups`
|
74
|
+
* `contact.serialized_attributes` - use `contact.attributes`
|
75
|
+
* `contact.subscriptions`
|
76
|
+
* `Contact.titles`
|
77
|
+
* `contact.update_location`
|
78
|
+
* `contact.update_subscriptions`
|
79
|
+
* `contact.validate_login` - use `Contact.search(:params => {:login => login})`
|
80
|
+
* `event.attend(!)`
|
81
|
+
* `event.contacts` - use `EventContact.search(:event_id => event_id)`
|
82
|
+
* `Event.find_by_name`
|
83
|
+
* `event.inquire(!)`
|
84
|
+
* `event.refuse(!)`
|
85
|
+
* `event.register(!)`
|
86
|
+
* `event_contact.attend` - use `event_contact.status = 'attended'`
|
87
|
+
* `event_contact.inquire` - use `event_contact.status = 'unregistered'`
|
88
|
+
* `event_contact.refuse` - use `event_contact.status = 'refused'`
|
89
|
+
* `event_contact.register` - use `event_contact.status = 'registered'`
|
90
|
+
* `event_contact.update_details`
|
91
|
+
* `inquiry.create_diary`
|
92
|
+
* `inquiry.create_link`
|
93
|
+
* `inquiry.diaries`
|
94
|
+
* `inquiry.links`
|
data/LICENSE
CHANGED
data/README.markdown
ADDED
@@ -0,0 +1,110 @@
|
|
1
|
+
<img alt="Infopark WebCRM Connector" src="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAkAAAAC8CAMAAACni+FPAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAwBQTFRF/+Rcp6aj6enp58VdxEFKrZZO6TpHFxcXZmZmtTxFU1NTukBJ5ubmntf8WKLs/91bbxQZ+jhG//yN+Pj4//96mpqZdXZ1yy45xcXC/md0xTlD4eHg9vb2H23gKysrK1aV+9NW/UhWhoaGR0dH3d3d/+hd2NjY9PPz//Rjs7Oy/ltp/8jVxKlVXV1dw7y88vLyYmJi/+xfw8K+1tXV//6o8ctS//5tvb25Mmau7+/v/7jGs6io7u7u0NDQ/nSBBgYGzs7Np4+RwOz+WFhYgRQbIiIiycnE7OzspzQ8/9lYy6k9yMLCUW+c3z1J4sBb0dHN9NZki2lr0szN3b1avLO0kIpvbW1tMl+huaBSODg4ujU+ycnJqbTF27pVu7u2nIhL/4eTiSgt07NS//lminpJ/6m41dXRpRQb/tZXkEpP3d3ZrjlB2trWzUBKw6ZO2rVCzc3I1j9KNYz0bY3A/T9N9MtK39/e2vv/opRnL1qaYVc6KVKPuVorzsnJ0TpFLkNpoaGgd2pB3TlFeVBTaTA8zK9V///U+Sk4Tltu2yAr0bRZyXY2ty43txggJ02I8UVRHTlk//6958BIuJo9/5mm3jRA3dTV7P//m25x7T9Lqio0/1Fe/vRx+9RQ//BgIF+9d7z2tdPai6C+sLCvU2N/i4+W05FD/9HfqUJK///o//X/vyUuhTZCzzVA/+Bbv8TJ989U8dFf19HRxMnPyxcf/O1yoX6Ay9DToJqAfX19///x17haIFOipzEe2KNN/+75sqRl5OPgqyEq9v//zMvLIU+S/+pVcH+Kq6uqlREaP12Ny8bG4uLitba1/9/r///429rapU5UoCQat66u1s7P17ZT/f//7lFdwLe4///9+OJmwMC8/f39/Pz8+/v7+vr67cpf+v////3/rp6g6Ojo//j/9Npf8+GM5OTk4K175ePk6+vrY3CA/t1RvFFYkJCQg42b19fWuLi3oGBk09PTk1ldVT9mQEp2Q37Lx8nMyMzQpVdcrEQmmy04/v7+////vmDhMgAAMMxJREFUeNrsnQlgVPW975lIIIRUAkMmKwESSAQNCQkSIkkIZmMpoCxjlsqmgMp+CxGlYEDBatlkUxDU+9JbaVkUFa4ptLUYMJRQ0wtcKJlkuI+0l9c0Ly+YWvSWmffft3POJLQGgv1/z2SZc/5zZub8P/P9/f7LOdPJq6X1D6iTPgRaGiAtDZCWBkhLA6SlpQHS0gBpaYC0NEBaWhogLQ2QlgZISwOkpaUB0tIAaWmAtDRAWloaIC0NkJYGSEsDpKUB0tLSAGlpgLQ0QFoaIC0tDZCWBkhLA6SlAdLS0gBpaYC0NEBaGiBRHlO5JNVCucgD3FEN1edXjZ86EurSmQ9SghLryK5qJcn7cJk+j66/uxwgn+RwFFDZuvSUS1ePvvHF//xu37593fZ1Azfwz+/2/c8Xbxy9OnL8gHSIg6uOyAIlzdC3CiBf/NDKhzUcVTXk6tEvfreve/fOnbt37m4UoOl3Xxy9Or4B7rXWgJAm6NsIUOvw1NaC2nUPODf6L/v2QXQUaNAN/7MPINRt/vz5T78xenw+Z0jCyBoiXYt3IUCW+LAKr6v1eu2rrr6xb343GRv0G1EDf/Z1xzdIEPwZ8/Qb5/4EI57bXedWKbJiSNfjXQZQa/SASgelqq9+sW9MUbduivXsU2jC/ACUuu0DJgQwAgxdjQQ25IaiFGmGvkUAmeMj0APMJ34I8B7oKVDGpAfD043/0x0VnE805sDRVXVelxszZI6QJuguBcgnPqiqvd6Sq0+P6WaJj+hA2H9QLNsHHgFNaAxY5o+5+ei5NK/Lbne77QaIzBnStXk3AGSKj0CPG+CTMhrg040C1L2NQg6EPAgQBHXz6av53lq7XYZII3Q3A+TDfFDtut0g9Rl9YENREQ1f3VsBCLtQN/zDYhhDaGS81223Y4goQ7INaYLuIoCs3YfgU+tNA+4D6CmaX9RW/+kmWhDxIErQmJt/mWr32u3mDJkgpGu0IwNkhQ+hB9hP7aW/jNkA4JlP+OnexgBGsiHYPS0DNGbMrDdavHV2kSGN0N0JUGv42Ou8JUdvwuhVNL9bUbciCZ/Obc2CqAVxhG4euJrITEhgSERIE9TxATLyI2TOkB+Pd+rTuyE9YEH8RBCCOqNeaItRDLV1r6ZByIQePe+1R1m4kNGEdK12RIB82A/Cx+5tGH1zw/wNDJ8iQENEd0INpccXRLQvqFs3A0E3D5wDBPlGSBPUoQEy54dFL8DPgEdx+IIC9AD7ATcITGco8rcVhsS2PESIEzSrKaouygQhTdBdB5ApPnZvBQhfRWOKiP9EQIIiuoMFstOZOBD7awVRN4s0CIWxfFdUlMIQRcgQxnTFdiyAPFb8EHzc3qmw74cJIgTpof7TmfgPXegfEwPqbp5IA4JeDPLESwi5DQjdYYJSy6iaNUDmAMnZj5vwY/eOlPiJKIogBtSZESTLGiJLCxpz88USV7wBoQ5EkCc7MJYsIRogH/FLsR/Az7lZGxR8InD8ilCwYSYkINTZJIrNN7bFbkIPqo03IGRB0J0AKACgg2+lGiBrAxL8h/Ajxq8IRBBAqLOKj8yRQJPcS0QsyMyDZr1Y706UCSJhjBF0J0MYAIjK9vftID4yI+ws1PXi5nTPtwag1vwng/MTgehBDhThAyEc2WSEOosAmUex3bMebYhKTIy3ez12BpE5QTWltutENcaa8BRfl5RmfNNpfGvzrQN06w7kKZke4kjKZnsITHA2DWp2o20V1w1KLc6obqg12Y+9slRRhuVzhqlFB7ULQMYESMQnylUF21+MHkyQb3oUfDqLgawbJYjPDcII7T5xYv+OzSMT7a6oyLOlkbXxzIZMCPKGCHVxzfCW4hMCJdUY33UN33q9rQw4/24HGmBzKC8Jy1kaBLaWm20KzE5wxtgq4lXws9Vy5VZP6g5QiwbcBoBkfkAduh+9GVoUWsTRoQIALQQ3tFhiJLXMZILEYdXdJ/aHTrgYPnhw//E7K//fb1ZucURFxQsmpBLkbcnmCjPWV7YsE8MoZRsT/NoMEHvMrQHUEpOQbaVUsD0m21oBIQNkgALUEglVFk+bYtiZoz0AMuOnjvET5b06C9ADEToIFhGghREEnoXgN1ArfqRkQXxy0Ibd+/fvuDg4PHzwstDds378m01AJ7eEeASC7HaFIG+iI8EHHqnKgYsxvutytrHcdesAVd6K+/jAJzs7qxWAACAh+cLeEg0AZU+3eGLb7QVITIAwP7D+alMObDgI6IkIVfxnIQNoIbGghaZW1F1MqyULgvwUAXhCJwwOzwx/s0vozZdeeOHkyU0rIUGbtpz1xosEuRFBDCBvUwKT0cNDEmQFqIHAmx7ANrY5n/E42GPaDpDdlpTgS3Fe6b2YyilkaWlOw+YY82eucxhKtgdAvvmJcj+6G/ATAQgCCB0EC9RqsCzEy0JiP+hvZ0uEuncWEiHaH71hw/7QtRfDMzPD++/YMOvLFzadPLlyJeHn5At/rbbjFhlv0IsElXECAtLVQxejHrkW9W1n8G0V7QlQUIxvNpIi2wBQQkCLL4AM7x+rKumOAAT5sdP4Fe+9NAvQA9kB6KDb6oOUHxNhP7LqWiQAoUHVIkDPjs2DM2dmDt68Y/dLXwJ4+q5EIgRt2vJZVLxCEESIEOQtCUhiUtshacI2LEOeXMk2BaS1HSD2oLYCFOdM8i0nPNeyKak1OVkUSzTZY7Lpcw8yFiz/5gGSMiBsQAI/UfFP7z4YGnqQIHQQWRDkZ/Xq1QvBTaGHMeQLou6dAT0wZc6cOTMTB66Vx/sCrVypEDTIBZr0ECGxW7qWAGQv55SordNmw5Ez9ByzOguI8fwdAJW1MXt2BrRChiOxTQDxN2AGkGm/uCfmtgJkyk+8d+SsUEANpIfws5pq4eqF5kJRbKFlKCsq2h+6Y3P4TEAPCFwHvtzU9/hjfRE/fTlACKEtP/SL90FQE6gcsjQpb+os20KX8jqlne8MoNvKvG0H6BYfVMKfhSyOkEFZcc3NcS3JlU0OuKYc9vU0BRhesLoERFKAHMatzniz4Blg3Gv7AcQDmMhPlN9fThwE/nOQaDVcOEHWEKGmmZGh7hEbQkHKnLl9+8zwzcB6/rry+HNAfalWiia0ctOW0to0hSDYQiQAJYPaIXJEKTl0gCpnkBJa+KaWtgNUzh7UJoDSy5UXUZoivtD4lFJHAEqAm3iZmuo4oJTiQSEO+cE0aKY5AozKMhv5NSn3zQOkGFCdW+QnsfbSLAYPAWi1aEGAn9XmJrQQ25DIUERRaOgOELe2b88c3GX/gS//+txjjz2H1fc5yYJWInw2rdzy10hgQZigKLFTGhLkDeIAOauVHNp46CpUj2LwxbcXQC6F45AgY3d4WakCEO/TiQ+T+KOdDYkcoHJ2BEwakh62UyffT0x7AUQMSOh/joJVV3f0hCU/q5fCZSFYlsLfZumQEMsiADwTBs/cPmd75ps7xhz4ciWgh+JD+JEQwmFsS6k9DXlQlEIQvCiIWzjsqdKb8mMH1mlV47xum7ztBVCxhI+j2LyVrzim2GuY1iTal58BoDL2r8NutD/23mNs7e9AJvzA9CP9wIYdB9myesfqtavhjdIDb4CehUsRRUutmmQLDyLr2T5nDgpcwHpGjHgM8mMgaKUSxLb8sD4NEpQYb+yT9nhDOB5yFpnFDrqNFWmSUmU7r4Wz7QVQvBRryqt8FG0yB8ibLu4ixQBQWIi6URwH48HvbPsBJBuQxA8AyH5mVigAB99W71h7cO1qtKxdupbzs5Q6kLkPIesJnznnoTkzB08AOXPfxzA9iB9fHgQQOvnClhp7OvMgeWTV463gAMk5chkDKNJhHqmqeL1UtxdAgyR+0n0VtXAg4Z0AFRsAqqgwZEhm+6y+3m4hzGNuQISftLrRJ3Ywrd2xFgtBtHTtUq6FlCKVIWA9XS5mznnooTmZFw/uPvBXAA+hR3YgmEc/ZwQIpNH/FpXPCFIsSPx8OqtMo3+Mi3+2pSH3Gqv8u3ZATWlMOVRM6fWW+NYAikwNgaVjQsoylDxerGjl9bXdgbzVPgEKi2IfoXJ14D6RbXK4BrWbAwkA1YoDYJiftMS/mAEEtRQvBokIRezYsSt8+0P3P7Q9fNeGm1/+BsIj4KMQZGpBoCUflJ4OCYo3EuTxCrlymGl8KvVWshLTzT+eUvBrOFsOW8ycrpBmXwBlNZFago9x2OQcuUY0oDDv3wcQz+YYQEIrLFl44ABll9ycSgUfayeAXBggNxvBwPyk1R/Yb87P2gmYnwlLfTC0IXzO/e/OmXkxdPeBL6H1jHhMJUgKYn2NBJ1cueWFsMR8lSBmQTYn6+GwyfGJrE0FiSwtIpJSV85WC13U9rNOY89JU4lVP1BaSECS3BtT5ha78YR9tZaoC/1AA9RMmO2EORBbU+OtSbLqmAphu8wAALVTP5AvA4LJ69zdoV127OiCFvhLAGjthAlrAT8TFHbwDRvQzf87J3Pz2oujv3+jz9tvY2JGkB8TgCyaYlvK4v3y5TSIEeTNYN280pEJY2sHeOtZETFNCgoQivBRK9MuYAExqSf6WrmxbBPPdIKEDmPWCWgJUJLJ60EhUthJs6EnusbbwN6I0p9uZy8VxOiy9uqJlgFSDSg9fvyJ0B1dMD/4z1q4YH4AQRMmGBDiOdHC+bvn7f9o378++/rrrz/78HfuvffGiLchMo9ZBTEGEOCHI7SlKd6vAXqQQhACKNEhDynRmT5spd3rZtUcEGSCWBJv/6ZYjlqV1hoBGpTuMCtazqYWpbY20mAOUJKc0ycLo2FpJgDx4YoAOcvKEJ+8sp0BYgbklvjJjxq5MfTlLnCB+BCthTeMzwTM0IQJagSDLfqIMSdOb/zou/9y7zvvfOfhZ1//1P76ww+/886NGyNGwM5nM4QEgtigxqYtn6XVQ4LkphiNYU1JCUkJ+MY7Cl0xdGUMmthBSwh5SClbGcLTVbbOcCvlANF1peXmRcspkE3C2pTWAWKlq+XhLL6TJj4WRlfVeL1nWQG5O4K/w2IIEH1EuwHE5pDBHjvYhZiWnt5gv7oxtCeiBiDUU0AIENRlgoCQIZItRAaUs/Hgn/tA/QvE6GGAkRua0Tv33rjx9mPHEUemTXkBoU1b/pxfDwgiaZBqQZUBJvMrEgPEdddNSnjK2cpUlq36mk0RZpjOYTnHp5SGEGEOhb1VgHhhCaAa42sQp3MAgIKSTCcFudnTOxMBQO01nYMBJBlQFDag9Iaoqxtf6fkyWHp2ARz17CJIBmiCIZItLNp94nTO/r2Hjn3y8Wc3RjCMvvPww69/+p8EoxFvHz9+vO9zZgAxC9ry44YgSwvyNoPDl41v/PjF0VXwwyfc41lCWgBdlxDEPuqsXEJ2kiOm3CGuIAHS4xRXWtzi2Fwcuqr1c8hi+MNFgFKF3TrcHCC6MhW+cHonSWwExrHHQeOqZI/4ZgGyimCEH7/4kRt3IHjAQv5yfrr4RChi/oZ5OTk/emJgp4GHGvc++Oon0xhG92KM3LUIo+8TjPpigoREui8G6Id+QUHcgnhLDAFkd/Cpw2xWzyC6Kqke9gezGaABrKcmi0/xJJl1jTj9Nbk+yuOJChrkVOdUC1NasZylYRlZZ+UJqTEu+SnMpmybAETF8u20Ymm/KSZzoqF9lkn32Gwn6ckr22lKq2RAbBYiyYAa/OoTzyEHAnoZIqTYkE+EijZsPJ3zi7Fv9TjUo8ehQ4c6derU+P7WdZ/EfPbdt9/GGKHUKOpTkGH/K86wjx8/ubJvXyWKwY6ga5QgYWCezE70NmUHBpIbm1TWRFc5UFXGsBKsT8dG19ATTBOdbI0wOSu+ia3FTgXPyuBPGJhtSyQZq7QeVfV1oVhk6wDxR1eGhYVdL6sMKQ8QnyqwTJgsx1bDrq1r2bRMjBjB2NtJRHOj2SFpP4CoAeEmfHp+g19Q2qX9r/QU1cVgQ0omNIEZ0P55wTk/Gt4JwNOD6VCPxr1XpqxbEfNdjBGKaQCjT+vqaGoEKDq5ciXzoL4ghAVVXQMA+fGWGBnRQBZ0lp/jUsZmAtM1TYQWKpZmxrBVhJbp/GStFKlLWz6NxyOfJpMq9PcJqxGUpcKpNOmtAxTYioRurrQk6XQkDzslKIHPrIwMlI4BPwTOdgAIDWIYDCjfr76+YdX+V14W8TEmQwpCzIDGbDwd/IuB9x06dLnHZQbQ2LFjIUaNIKY9/smKz/48AmOEYtqzn37++/96naZGJ08ijlaeBEk0BEiwINYfjQAq4QDRD6AfW4PnKRbLB9MrnjSWXY/XOCxOIEtkleW0GwAqk3IOARg4ABLC7zvc/yhASeKrSpcB8laavPZK+RPSTgBRA5Lm0TN+YOoRVyQCxFxIMiE5iGGKIor2z8sJ/gkwoMuHoAcRhsZChMY+BTR2LKBo79YLBdM++66Mkef3nz4rYLRly2dBkdiCGqQxMRzDvG5nLFU2aeuEsTXNBCh6P4DUZAsr4cQ9PNVshWrxZdLOPEmxsRZFQ4QtMJiW87vO1qfMCqWNyi6VLCw9m21BllrF7sbwDk+6KhC5UikrEtCOAAkGlA4NKCgoKHKfEaCeuwBEu8BiZkLEhUAGNC/4b2+9dfkQRIhbEDIhjFC/p/r1e+opQNHyresKpjkwRjimPfus+w+1pPPx+Av/FlQSWQUtyI815YUJ9l7HqK50IV39MfR+Lh4KrStkJUgvbxN7TLm6Qh0QiGSPhbXjie7Kn05OjauELbBoAr8f2HolZY/qarHkOq8rEdAvl21Eqb09lr1hOvG+uistkS0fklGF7QaQFMFQBhQUdO3aFyYA4VRol6kJLUUmBA3odM440ATrdBlmQSwPGotd6CmMENT7/fbCZfnyxev8p/35x48xjB5+9lm7t/b1h38cAgECFlRPRzRkgM6OYsIRyhNI78eS9xnASlTS6lJWsId0NZyjWkg3QQw8ufzZCpXh70C+KdZ4txXFjrJS10L1rMH6rmwjbgKUq28HfCCsSkS3L0CyAV3705+OfvSyqQXt6oksaJdJIgQYgk2w03+7bw9oe3VCHgRuPIipBL2PBCgCZrT4gRnlf/4Nxujee0GC/fp7tmsDiAXhziAphrm8QfxYJ+Ack1Uy7XUNGSWviecY4O5/e1frumb0RUfJAKkza/izjIq2SwAVuv4BgIzPFKQCVMzuBxh2h9+goz0BMkQw3AcEAKqqChr9kZkDQQvaZd4YQwa0ARjQ6cXDB3ZCOiR6EIliAkEEoAfff/BB9M9ygFHBCgfECFD0zjtnI6sHlICXQhtitDPRjToTPZ5Yqd5Ak9rwecxQvIDfL8TZSRxfMahMUaBYFyJA6gTVYsE1/CSAohP/MYCUuGpwIDtzydxEGnflD0T5bQSIp9DXqv70p5HzXlm2rOeyntKNmtAuZkGSB61GfUA/eOK+TiiEwSh2WQljMkLvEz2ItRzcAEVbx82Y8eO3+9wIK6kWLYjNbsUAuYSDMwr1AZeyu7T7hTtO1zQzR/LWjGqLiiWActW2uWAMo6q93iSBp9b7gQJ9PnOun0+AhEMwXTHDkDsEEDGgyJLxOR8texMiBCnCv/AfkEXvYomQ7EHYgLYOHziwE/Eg2YTGjuUE9RPD2IMUIaCt4GfctjV9+ny/pTquuiSS9gWlKRbk8obxA406S5zGyBEo2wbPiUjHkK1NAJXBJJqbWZ16CgbfNipDrDOjWfkEqLSionhQqTPXMoj55ap8ZLEVDjnH63pNBagdkmjhZEKWAmGAIqt2Tp618eXBgCCDei4DDrSLtsZEglYX7QcZ0A+G3zdw4MDLpgT1GGsRxiSEHly8bVsAACglLo5YkDlA+dHS4auNVRMC2AghxxMd8Vrm+F2Ji1S2CaBSCaBsr2W6jQAqFR4Z0oZWmPhYqPwk0YLEq3PUGwCys/ccDTsqGnLFxF88AO0BkEsFCEewehDBIiObdx7IeWVwZv/+/ZfBRdSuZTCI7aLteQ4QNqAHgQFBdZIIOiQRhACyIGgrBMj/h336/K8Fzc2AICmGxbMR1TqXBzSYqWLR0aP3eLWl4hUAIIjYAFaeHl9b17YoBjXjqYwdKtm8aBZ7TqTs1gHihald1QXydaNKJQfqqr7FGLYGTmoZZL29/QDiM8lIL3TQtciSkp3PPJ2zsedMSBCShNGuZbuIkBERhLAB/Wj4HgIQzaQ7tUaQIYxt2zZjZZ8+32tJSYkT0mixHYZOc/Y2seOVG+T1hhlqAkDF1sG2dyW71/SNAhTLiwIXKREeGd3qBawCjQBJe4gV+gzyOUCUqyzxRXoDwEcFHw965bZyfgDaCSC3MJWVRbCSkpSSN3JOv5I5J/xNoP79BY5khLrsYkGsaMNH807/x+HhQwcO9OlBYzlB5ia0ddu2J0/2ufG9D1pSmoUYls67guwYoAx+nEEOGcJqjZ8lURsoIsaPJu0KrGwzQIXsXkIrANkLhYe2egEi7qJd+cQ4h7AHodfSL9qwX/5ksR5vfKHqsIJDxbY3QGQcFUWwAQN2Rh4NzpnXcw4miFO0DP5sRovgQhAhYkC97xs6cKgvDyIWJBHUTyJo3LZFzx/vM+K9lpaWZpJG+/F2mABQfGxuV7IAS3HS/8UaLmclpgOa6J1C2rwexDZHB1qPKNgQQLRooHoajZ1vy4UDso5cfj+2tRllSbwsByhD2IMwbtLAn8jGCSGrwFMng9/4DgviTewR3zxAtVYARZYMGNBccjU4J+ej8HfnhA8GUhhaBvnZjPmZgBdiQJeHD4Uy9yAfCPE49v7WbeP8Y0ErviIjowXHMNoOQ0kQBQgmQY5cqgSvO5b+L54IUZnL19ZH0//ZwGIF2+z0CN9eLwug6vWwvecWqhcVqipk26Jh993ZXEGtXU0oiRetEIyTrxWiYAN/IpvxHYSATwt9DJufH8M23x6AYA5dBQHaufMSAOj0K9t/hQmiDL3JgxlwIQIRJOggMKB5p38CDEggSPUgH2GMmdD7wICefOHtGzcysghAkeZJkMvltTEkCu1+7H/xilJxbG2AN1k41rQLh20O9D3uKQAUrV7TI4zXdiyEK71QqP7CIN+VFMDLCtfZKOU7yOVR0M8EIP65SaqL5R8n5kDtBxC+qLgwECakQAOqm3eefyknJ2fervt/NiccaLDqQ/03998MRBEiBjS099C3hvrwoB5mHiRlQv2AARWseeHtPt//AADUEhc3gMYw2hktZNEl0UwpYfS/QvHSv/ZYujrW3cQKMwRq2ebooFYA4k+l5jUhfFM26iMqjxbUyoh8AC8pXGwtqJCvDmRRMJ+v5cYWw953pckr5O85sF0AkqZycICq45p37nwjGBI0+Ld/QASJDPUnEG1GQgQd3PAKNKBee4a+hQkiiVAn36m0iQmNG7doxvMvgFZ8CoxhOAlis4IUgNzZ7PgMKmVHShqAcnDEnIwlu8lmW5sBSpKRcAXyTbiDu1kEKLrp7wBIeF3R0WyiZJoZQFlsHXuJhZG3ASDpokB8JJ4CFPdB9UgIUM7G8F/94aHM8ExKkBTKsAsBhLAB/WJP77egzDzokE8T6tdvL7iBRGjvYgDQmuc39RnxvepiKQlqEJMgcrky4bNe7pQr0WgPIewAC3mpzeSD3hpASgxrEbZUGqsfPLGvHTvNAaoRHs9ebn6sCUD2wGhVSd7bDlAUB+haFYhgcXHnd05+CROU+av//dBMeD1VwtCbog1hE9qMDeiXvfa8dZ8BIatESM6EngIEAYq2jhu3bsaa53/43RsfxjGAIq9JndGsL9rlPcs+k4Wx5lZSwY9goUmJAYWWkYlWkBEgeXKfSAs5sSKlUKrQ8vhbBihRwKKQnjhYbwaQwIjJ+7sDDgQbYQCgLBLDEEGed2dmYoIMCCF+lhbtBwb0tz297gNq3YQgQo2GOLa3396nHhw3bnHBmjWxtq+/mtRSLGTRRoDgxcqkXMHcH9JMSpSYVmCh2UW785uajACJ1ec9K6xPcJtXqvnZGW63DJD0wptMLMw0B/IWq2+vcMCdBaiKAjQ1OJhEsd96f7s90wyhixghbEAXej2BAIIIkVxaSaUZQY0IoUbBhPbC217ADzCgNc+nLvnw379GADXHWQJU6/LUJhnoiJUvtuIKMJQIFGcqJwsH3nDBqSAQ9spNACrkc5CLC82ClT1BeU5nmBIh3S0h6JwNCwcS2wcsZ2swdaCoWOW5sj23GyDaEY1HwpADNWd8cP780xCg4JzgjYPv9/xqzkyK0GDJhTa/2Z8YUK9eTzyBEBJMSMmlD0kIAYjGigiBBGjxBf8n1zwfkJf34b9/VYyzaApQgxEgF2+DMKkjDcYSUpLkEau6XPQme1ZMISvtUWopBI/GRtkKzT/6JbEGbMtT49LB0Xbb/aqLbY5AYjkWSbTXJX40Un05kNzoU3Ku2wcQa4VhgFJaPjj/wehg6EFgOb1rzq9+dj8yoUylRQYYIgY0cdjwJ0SCbtWExj4F+Hm84EkA0LQlYUaAZAdyY4DCDHgYrvtrKFFmkSRBBJyDUvyi3OnXWsocgbkCbipA0bGOyrLKGGltrkhmhhI60c4KA+E31rEtKTJA8vVWK40fivRC0zZjsvLS4kwBir0NAKEQVkUAOn/+/OQXg4MxQ6dDM9/92btzpEyIudDSolBgQD8ABsQJEk1IzqX5yIZkQk81Qv/Zum4GBMgGAQqrENvxFgCJnXbGbkQ0SS9aKSClQFJfG+q3A+l4YKGw13K1I5EXVVQoXSWjpdBQOpr8Qx4ZHWbZkah2Rw5Qe6JFB4qSX5sYwdqxI5Fd2o6f1Cwm0RCgyeevYnzgr42bt7/7W9WEEEGbQ0OBAc27Z9hwoCeeMIYxpTUmjmxAC+oxthEsPfYuXrx467EZMwA/a5Lz3gMAFcsANQgTOihAHk+AWq3qFeXcatWrY1m1zlxfIgAV5rYqpRkXF9jaA5LloQzlis8OoWSMZU80HvATFeK9wwBVYYCyPpi86vyj1IKCgQkNnnP//XMAQrhTiKVCE4pegQY0rBcCSA5jGCF1dBWbUCNcEEIAIMjP1q1T/KEBrZmWl/zeV2YAGRzIJfsHPE6Gr/pzmhIhKD7JVy07VICseHOqM+jTHK0AdNZqLAyn56K5xSsOJMFaI+1VuqJMzB0DKCXr/ORVk6e+RAkCDM3bEb79oTkgjoWLcax/ETKgR14bPlwhyLpBz5PpRuxCh5YDfB6c6D8DRbAyANDXXxsBSjcBqCJXnnphPAU8RClhvLiv3eFjLgcDiEwL6VocYlouKcp4nK/H+pwmUopG49mEkwrVOvmmrihk5UebTxOJFyeQyIN6MbntNZ3DRa/MIQCUTmdzIIA+mDz5zPnRwcEcoZx5O9AFw2eKmdDqUJgB/ei1XsOHGxASCRpqQKjxEPahHocaty7eunz5FH8MkCMvuea9r78K+woCFGcBEPkOOnTwcoWbsTuwoqtUwnSOV5myF+FG+oEK8V7QBJ0Qk3KOKLMDHVUaa7njrshGEug9cT4QnYrBNuEJPn7R7MFyb6lD2KvciIhhb749AbKLAJGxsJQMCNCZyc7gYM4QQCj0YvjM7TM5QhdxBvTfr/Ue3psh5NOEhAZZI7ahvVu37l1++FgBAmjNGlteTc2HX39VXIwBsm7GQ4C8AfKn2jiNPVF2oFjTwc38mEIzj8ilF0gVZiSmwnOolXKFlrM27DUB0T4mqpnOSKS95LnKvLIG45RWaeYuktyP2n4zEl3i5TXpdA7iQBCglozJ51etGn9m/IvBCkL7J1zMzKTtscFLUQYEDKg34Ke3BUFvySZ0CtLTiANZY6fG5VuXN+7tB/lBKdCTqck1yR9+/R4EiPdE17OTC+0iQB7hHHZ0NrmJETikElYjU362BKWmowOb2DWfhHPjoVHYbYEiPiE+h/KDBjljc1V4YD8AzPeFc+Obfb1w+LLVc+N5i43PhktyS1va79x4C4BYO76lBSZBZ8aPL3tJwAchdHoj/JJcTNDFg9CA/uO/1wMD6s0syMqEmAudQhA1Qor2bl3e6dDYw68WFJAIZkuuGfLehyAFYkMZVdCB5MFUBtA3+Q3sDWEhDlIVSY6Q5Gs+C7dUorLZztKsulb37IkMK41xZtN9N11vSfd2fPm8vAuaa6cClM/mA8FmGAboDCeINOmDc3Lmndi/Fn5XbvjFCGhAP1k/DPAzXIxihlyat8dOsSh2CtjP8oH3depxZV0BAWjNtOSampowANBXFVnWo/EEIPQtzlodCCChHZ8xGSRB48cPGW+LDg42MHR63rz9By9eDO/y0cZ5J4ABESmJkJUJQQMCN4DP5d5PDHxkygMPQIBmQAeaDvhJTq15DzTCCECRGqAOB5CXfMlKHT6tRxhN9aPNMBjDVgELGjJk/MiXghWhNtnp0/NOhCID+vkwio+QCBnDmJgKnRrYqXHv3iO9e9936MqxdRAgHMFsNakQoLCwsK/gjMRmdnIqAiiezwciEUwDdKcBUua0+gkxbDKKYUMuDblq9CA00wMytHHeL14TDMiQCKm9ikNPQYRA8NrbY0+vXr2HPjLx1XUcoI9rUlNrkpOhAfmYzaEB6pgAkWsrVNEYljUZW9ClIQYPyiEE5eRsPP3LPwzr3QssNIYpUYwQJA6wnjrU2Hik17Bhvff88Z5jr77K+JkxY3rqdMhPTRiPYHxSfaIKkEcD1JEAkie1NoMYloUtaMjUIWXZVgTN27B+PedHQciYCb019NSpxk4Dew17DeBz+cqUYxJAg1KnAwMKqxn/ntwPbXJuswaoAwDkYt8Ur8aw6jhoQRXUgqZeulQebcrP6dP/B2RAvXoJCA03RDFCEEDo1KlTA4/0em39+mG9AD4Tp0CAAD+LUCfQjErIDwRIjWDCnHoNUIcAyOuyjGG0HSZY0KVLU6cOGR2reBDW34YNw+xwhIabMITpGQoC1/qf/3T9sN5H/nhl4sSJiB9mQDbADzSgZBrBmmkbrF5Ogex1vBGmAbozALUew4gFnUEWBAi6dM5p5kG/HLgHGZAoNRFC4eu+PcNeW//z33++/jVgPoevTLxnIjQgFsD8Z9imT4cBDBgQaIJJ81nFr8wQAPJogO40QC4OEBsOE9phGYig8SiITT039WzIi7kqQbOOTbzn8OUjvXoN64UwEvsRqUBrC7IDnvWnKHQ9cuUeIMTPBWhAi5ABYX6AAYWpKbThWtFiBNMA3VGAaE9QlHqFIGJBWVmrOEHnppYdfVEFqOCBB16dcs/hHkf2DBs27DWgYYLA3fU//fnn8Ak/B/AM23Pk8uHDV65cofwcI/xs819RCflJBf6TBzIg3AvdbHGFMnudBqgjAaReo8xgQZygc2WVTS9GiwTN8v/Ev6DggXXHJl75IzIiiAxg5vPfkyf6HKQ86wFVvY4c+eMjEB7Kz8Qpj6MAtgga0IoyxA8MYGeSQQbdBgPSAN1RgMQsWv6qDGpBEkHJlKCR586NflSYZjbLv8D/kwKgBwBEU+658sjly0f2gJjVCxoQimt7jgB0/niYsCPwc+zxV2evW4f5OTsdJ0BhYXnJIAEyNaBE9VvnND93EiBuQdLXFRILIg0xGMRwGpSMEmmA0Eig0nI23T4H+A+4FXzyANS6da++emzKFEAI4OTwYZGaK4c5PsR/LsyGAWzRohml16fTBDrvDGnCoyYYGog3u8CdzqE7EEAiQdSCSBBrBhaUVVHBPQiZEJCtCdtQTg5oPyELovwAgo4BhqZMAZBAkO65Iukemj8/ThLoRdumjZzO4ldYXpgxgBkNSKdAHQcgw5cd4FlBQhDLKmZR7BIjCDA0+tEXAUQzPgFNqAKRoGOIoIkYIJGheyg+mB/gPyCA+YeQ8IXiVwXjp5lc2CWoXvm+J50CdQyA1BgmfWFYPR0RwwRBDxpPCYJhDDJkGzny6uijL86AFlRAgxglaIpIEAQH3zA+IHwRfsb5fwyzZ8ZPXjHnp1r+ogPVgHQE6ygAGS0on19oKk70oPGMIBLHrtoqr67w98cILSpQCEIIUYaIJmL7efzCbKB1/its168L4WsV5aeF8CN+1Uq88t3xGqCOAhC/yItwijMNYtXNmCDcH5SsIDTy6sgV/tSCCEA8ihGCAEPkhvEh/KzbtsJ2dvp1gk9yXljekgrKTwrlR/7aXZEfHcHuNEBel9GCpK9cuSZ4UEYFTqWBCXGEEEPEgfxNCSIMcUF6Hr8AtAi6D8cHRK+8JVl5xRUofvngRzEgDdAdBEiyIOVrLwUPQo15QBAJY8iEIELEhlb4zzB4EEDoAmDo8SmEIXRD1gPoAcvsghUfV14nbS8cvfJWIX6yBH5wAoT7EBNVfrQBdRiAiAUZCZI9KCuLmpCM0Ao4js4QWrSIEDT71QsXAEJAUwBH8NfjRLMXfbLCNgjTg90H2c+qSch+GD8wgWZ90DyD1gbUcQAytSA4poq/eE4iiIQxmAlhhGAgQxCVPvnkDGxCqENx0QMYodmzX50NItUx4DeiZhf4fwzoSWXmQ/BZkjWpAtkPa39xfuTvS8UAeTRAHQogiSCaBjGCsAnh9vxkjBDMhfAkj9TKj2OehBD5F2zDHkRdCDa0IEQXMEOL1xX4o8iVir2Hxi6MzyRqP6z9RRIg5RubtQF1IIBMLIgHMehBfpggwYSyQDMJ50LEhi7BKczTK0unTQMQzdi2DQEk43Nh9rpxgJ0VH9vKIDmpnB6Cz5JJgB+ID7YfiR/sP/EKPy4NUMcAyGOwIJkg+AXO1ISasQkBhFbBXIgyBKIQjESAorLSkGmAIzg33t9/m/+2gm0oNQLkfGyrLLsOqGHsiPQAfOZOAvgw++H8pBP/UQOYjmAdBiAzguIpQTCK1TMTogiBQFa8CiVDkKHxeQCFZKaa1OtllTZb6ce2UrDYbGWDYCczFPmD0OHwZAF8WuZmZbUI9oP58ePxyxDAtAF1EICoBbnwtx5ggAhBpEsamVBVVWQkyoQQQlmgQYYiGWToDEQhD0GRLIjdqaHCaxk9GB8QuybNnQtzZ4SPaD9oBMw3PxqgDgCQiQWRKIZb8w3UhFC3NEqFYCCDNgRCGYAIgpCHFYbcKEzkB0HDwMHoIHaWZGUheOY2txB8SPSCrS+aPhv5qdP8dCiALIJYFA9j1IQ4QtCFYCQjDGVNylqClScoTFqoluSRopMmTSL4zJ0EUh8BH2I/ZvxoA+qYAHkoQNYE4QY9QggHMpIMwVg2qQXBsGQSxQgveSI1lBsatRA7gJ4FC1owPjh44ehF7Efzc1cAJFmQShBBKJ0ghBgqERhCEE1KASiAdhTFaNKSrCWKwAqwdhJmZy6CpxnSsyClpbkZ0YNzHxN8fPCjAeoQAFkQJJgQcyGSTpeU0FAGGWqZu6C5eS7RJEaSQZgbrGYIz4JnUubCyMXMB+EDnicfRa80ER/NT8cGSCSojgPECALJdL7oQtiGIEMAouZnqiEOwErmNs8VNYksAjgQHQzPMwuaUyA8uN1O8KlnyQ8a/mJn8RB++AU5NEAdDCB64XpEUB0niDbooQnlk14hgSEE0YKSZ4AQRAAjCBLkpHku+w3/Ys/BgsUXwC4fAA+mh6Q+CB/Y98yyH83PXQAQJ4h6kGhCAkKoTQ8YQj4EG2UYogG/BjHtGUQR0gITPQMXLFAWUAcfV4IiFwldtOWVnsaTHyl8sWsian46GkAmHkQIooEsMZHmQtyGIEMQokjoIr+GMEWWQDpKOEqSShAvJSULFsCcB92h1oPoEfCR3Ifyg74fTPPTIQEiBHkEghhCUQpC2Ib8OEOkcQ8ggkK2ZBQE7dcAMAhPJL7LrQfRw1pezH588qMB6ogASQSZIYQjGQ1lQUTXoESKDIpEIQ5N8kHoMHgYPThzFtyHZz88/dH8dFSA2oIQS4ZoLINGJGAURIbMsL8QQfdhiXKVSA4OW9R6SOgymg91HxkfzU+HBYh+nTyJY1IuRBCiscwCoiDSToP6NU1yoEfxrSAPx8aDnIdaD6OH4CPy49L8dHCABII8taIJuZV8WvIhlhJhjowgKQIlEDqQHQwPo4fjI9gP4cel+en4AIkEiWEMupBbRYjm1AQi4EX5HCSEEmGpXnQcTg5CB7HDvUeix4CP5qfDA2SGEGNIDmUqRQJIDfkNovzIH9hBmE/BEchJFLNmCo9AT52BHo1PxwVIJEjOpiFCjCG7wBDOiRSMrEXLcXQ4PSb4EPPR/NwtAMkIeQwIcYYkiOKpl6S1qsTERDN4+H4F89H43IUAqQi5BIRMGWIQSSRRmhKNokWjogzwYHp84KP5uQsAUhBSsiEMkUCRnXIQb6JE46ooUQZ2CDzm9Gh87hKADAhJoYwyJEIkcNQ22UV2FHgs6NH43EUAqQhBG3KJDFGIFIogFz65kcER4GHWQ+nR+NzdABkQQj6EL6ioQmTAqG2CD8Ps8NkaFuaj8bkLATJhSDh9w5SjNqAkFWa7ENDR8HyLADJjiF8RRsZI5qgViY8T2XEZn05X4t0NkBlCHlbftQpGt0QPad35gEfT820AyJwhgSLaSBNUZyK1jPB4l+kT6Or71gBkTZEM0q3Laqe66r59APmC6JZB8rUjXW3fXoBapcgHTW15mK6xfwaA2kzRLUlX1j8XQN8oRLqi/jkB+oc50hWkAdLSAGlpaYC0NEBaGiAtDZCWlgZISwOkpQHS0gBpaYC0tDRAWhogLQ2QlgZIS0sDpHW79P8FGABxayM7vTb0IAAAAABJRU5ErkJggg==" />
|
2
|
+
|
3
|
+
|
4
|
+
Infopark WebCRM Connector is the official Ruby SDK for [Infopark WebCRM](http://www.infopark.de/webcrm). It basically wraps the [WebCRM web services API](http://kb.infopark.de/crm-api) using [Active Resource](http://rubydoc.info/gems/activeresource/3.2.8/frames). Currently, Active Resource 3.0, 3.1 and 3.2 in combination with Ruby 1.8.7 and 1.9.x are tested and supported.
|
5
|
+
|
6
|
+
# Installation
|
7
|
+
|
8
|
+
Add `infopark_crm_connector` to your `gemfile`:
|
9
|
+
|
10
|
+
gem 'infopark_crm_connector'
|
11
|
+
|
12
|
+
Install the gem with [Bundler](http://gembundler.com/):
|
13
|
+
|
14
|
+
bundle install
|
15
|
+
|
16
|
+
# Configuration
|
17
|
+
|
18
|
+
require 'infopark_crm_connector'
|
19
|
+
|
20
|
+
Infopark::Crm.configure do |configuration|
|
21
|
+
configuration.url = "https://webcrm.server/url"
|
22
|
+
configuration.login = "webcrm_user"
|
23
|
+
configuration.api_key = "api_key_of_webcrm_user"
|
24
|
+
end
|
25
|
+
|
26
|
+
# See, if it is working
|
27
|
+
Infopark::Crm::Contact.first.last_name
|
28
|
+
|
29
|
+
See {Infopark::Crm.configure} for a complete list of configuration keys.
|
30
|
+
|
31
|
+
# Example Usage
|
32
|
+
|
33
|
+
This Ruby SDK provides the WebCRM's domain models {Infopark::Crm::Account Account}, {Infopark::Crm::Activity Activity}, {Infopark::Crm::Contact Contact}, {Infopark::Crm::Event Event}, {Infopark::Crm::Mailing Mailing}, among others. All domain models are subclasses of {Infopark::Crm::Core::Resource} which itself inherits from {ActiveResource::Base} and provides methods such as `find(id)`, `create(hash)`, `update(hash)`, `search(params)` and others.
|
34
|
+
|
35
|
+
## Contact
|
36
|
+
# Retrieve the contact identified by the login 'root'
|
37
|
+
contact = Infopark::Crm::Contact.search(:params => {:login => 'root'}).first
|
38
|
+
|
39
|
+
# Change this contact's mail address
|
40
|
+
contact.update_attribute(:email, 'root@example.com')
|
41
|
+
|
42
|
+
# Send a new password request mail to the contact's address
|
43
|
+
contact.password_request
|
44
|
+
|
45
|
+
## Activity
|
46
|
+
|
47
|
+
# Create a new activity kind
|
48
|
+
Infopark::Crm::CustomType.create(:name => 'support case', :kind => 'Activity',
|
49
|
+
:states => ['created'])
|
50
|
+
|
51
|
+
# Create a new activity
|
52
|
+
activity = Infopark::Crm::Activity.new(:kind => 'support case')
|
53
|
+
|
54
|
+
# Set properties of this activity
|
55
|
+
activity.title = 'Sprechen Sie Deutsch?'
|
56
|
+
|
57
|
+
# Switch to a different request locale
|
58
|
+
Infopark::Crm.configure {|c| c.locale = 'de'}
|
59
|
+
|
60
|
+
# Post the activity (which is going to fail)
|
61
|
+
activity.save
|
62
|
+
# => false
|
63
|
+
|
64
|
+
# Get to know what's missing
|
65
|
+
activity.errors.to_hash
|
66
|
+
# => {:state=>["ist kein gültiger Wert"]}
|
67
|
+
|
68
|
+
# Contributing
|
69
|
+
|
70
|
+
The source code is freely available at (https://github.com/infopark/crm_connector). Pull requests are welcome.
|
71
|
+
|
72
|
+
## Get started
|
73
|
+
|
74
|
+
git clone git@github.com:infopark/crm_connector.git
|
75
|
+
cd crm_connector/
|
76
|
+
bundle
|
77
|
+
|
78
|
+
## Run tests
|
79
|
+
|
80
|
+
Configure `test/config.json` with an empty WebCRM tenant (see `test/config_template.json`)
|
81
|
+
|
82
|
+
Run tests with the current version of Active Resource:
|
83
|
+
|
84
|
+
bundle exec rake test
|
85
|
+
|
86
|
+
|
87
|
+
Run tests with all supported versions of Active Resource:
|
88
|
+
|
89
|
+
bundle exec rake appraisal:install
|
90
|
+
bundle exec rake appraisal
|
91
|
+
|
92
|
+
## Build and install gem
|
93
|
+
|
94
|
+
bundle exec rake gem #build
|
95
|
+
bundle exec rake install #build and install
|
96
|
+
|
97
|
+
## Documentation
|
98
|
+
|
99
|
+
bundle exec rake yard
|
100
|
+
open doc/index.html
|
101
|
+
|
102
|
+
# Changelog
|
103
|
+
|
104
|
+
{include:file:CHANGELOG.markdown}
|
105
|
+
|
106
|
+
# License
|
107
|
+
|
108
|
+
Copyright (c) 2009 - 2012 Infopark AG (http://www.infopark.com)
|
109
|
+
|
110
|
+
This software can be used and modified under the LGPLv3. Please refer to http://www.gnu.org/licenses/lgpl-3.0.html for the license text.
|
data/lib/crm_connector.rb
CHANGED
@@ -2,6 +2,7 @@ require 'active_resource'
|
|
2
2
|
require 'active_support/core_ext/string/conversions'
|
3
3
|
|
4
4
|
module Infopark; module Crm
|
5
|
+
# @private
|
5
6
|
def self.setup_autoload(mod, mod_source)
|
6
7
|
dir = File.expand_path(".", mod_source)[0..-4] # - ".rb"
|
7
8
|
pattern = "#{dir}/*.rb"
|
@@ -13,24 +14,20 @@ module Infopark; module Crm
|
|
13
14
|
end
|
14
15
|
|
15
16
|
setup_autoload(self, __FILE__)
|
16
|
-
|
17
|
-
# exceptions (defined elsewhere)
|
18
|
-
autoload :AuthenticationFailed, File.expand_path('../crm_connector/core/base', __FILE__)
|
19
|
-
|
20
17
|
end; end
|
21
18
|
|
22
19
|
module Infopark; module Crm
|
23
20
|
|
24
|
-
# Configures the web
|
21
|
+
# Configures the web services connection
|
25
22
|
#
|
26
|
-
# View {README
|
23
|
+
# View {file:README.markdown README} for a usage example.
|
27
24
|
#
|
28
25
|
# Supported configuration keys are:
|
29
|
-
# [url]
|
26
|
+
# [url] The web services server url (schema, host, port, path (up to, but not including /api)).
|
30
27
|
#
|
31
|
-
# [login]
|
28
|
+
# [login] The user name (login) of the WebCRM contact person.
|
32
29
|
#
|
33
|
-
# [api_key]
|
30
|
+
# [api_key] The WebCRM user's valid API key (web services credential).
|
34
31
|
#
|
35
32
|
# [locale] The locale to use when sending requests to the server. Can be
|
36
33
|
# redefined at any time.
|
@@ -43,9 +40,9 @@ module Infopark; module Crm
|
|
43
40
|
#
|
44
41
|
# Infopark::Crm::Contact.create.errors.full_messages
|
45
42
|
#
|
46
|
-
# [live_server_groups_callback] A custom definition of what
|
47
|
-
#
|
48
|
-
#
|
43
|
+
# [live_server_groups_callback] A custom definition of what a contact's live_server_groups field
|
44
|
+
# returns. Provide a lambda that takes the contact instance as an
|
45
|
+
# argument and returns an array of live_server_groups (strings).
|
49
46
|
#
|
50
47
|
# Example:
|
51
48
|
#
|
@@ -60,13 +57,12 @@ module Infopark; module Crm
|
|
60
57
|
# }
|
61
58
|
# end
|
62
59
|
#
|
63
|
-
# [debug] When set to true, includes the module Debugging into every resource, which
|
64
|
-
# provides a logger method. Cannot be reverted by setting to +false+
|
65
60
|
#
|
61
|
+
# @return [void]
|
66
62
|
def self.configure(&block)
|
67
63
|
yield Configuration
|
68
64
|
|
69
|
-
Core::
|
65
|
+
Core::Resource.configure(Configuration)
|
70
66
|
end
|
71
67
|
|
72
68
|
end; end
|
@@ -1,4 +1,33 @@
|
|
1
1
|
module Infopark; module Crm
|
2
|
-
|
3
|
-
class Account <
|
2
|
+
|
3
|
+
class Account < Core::Resource
|
4
|
+
|
5
|
+
##
|
6
|
+
# @!method self.search(input)
|
7
|
+
# Searches for accounts
|
8
|
+
# @param input [Hash] A hash containing a +params+ key. The value of this key is a hash containing the actual search query.
|
9
|
+
# @return [Core::Enumerator<Infopark::Crm::Account>]
|
10
|
+
# @webcrm_rest_url <code>GET /api/accounts/search</code>
|
11
|
+
# @example
|
12
|
+
# results = Infopark::Crm::Account.search(:params => {:account_group => 'account_group_name'})
|
13
|
+
# results = Infopark::Crm::Account.search(:params => {:q => 'full-text search'})
|
14
|
+
has_search
|
15
|
+
|
16
|
+
self.schema = {
|
17
|
+
:account_group => :string,
|
18
|
+
:country => :string,
|
19
|
+
:extended_address => :string,
|
20
|
+
:home_page => :string,
|
21
|
+
:locality => :string,
|
22
|
+
:name => :string,
|
23
|
+
:org_name_address => :string,
|
24
|
+
:org_unit_address => :string,
|
25
|
+
:phone => :string,
|
26
|
+
:postalcode => :string,
|
27
|
+
:region => :string,
|
28
|
+
:street_address => :string,
|
29
|
+
:tags => :array,
|
30
|
+
:want_geo_location => :boolean,
|
31
|
+
}
|
32
|
+
end
|
4
33
|
end; end
|
@@ -1,5 +1,63 @@
|
|
1
|
+
require 'ostruct'
|
2
|
+
|
1
3
|
module Infopark; module Crm
|
2
|
-
|
3
|
-
|
4
|
-
|
4
|
+
class Activity < Core::Resource
|
5
|
+
|
6
|
+
##
|
7
|
+
# @!method self.search(input)
|
8
|
+
# Searches for activities
|
9
|
+
# @param input [Hash] A hash containing a +params+ key. The value of this key is a hash containing the actual search query.
|
10
|
+
# @return [Array<Infopark::Crm::Activity>]
|
11
|
+
# @webcrm_rest_url <code>GET /api/activities/search</code>
|
12
|
+
# @example
|
13
|
+
# results = Infopark::Crm::Activity.search(:params => {:state => 'created'})
|
14
|
+
# results = Infopark::Crm::Activity.search(:params => {:kind => 'support case'})
|
15
|
+
# results = Infopark::Crm::Activity.search(:params => {:contact_id => cid})
|
16
|
+
# results = Infopark::Crm::Activity.search(:params => {:account_id => aid})
|
17
|
+
# results = Infopark::Crm::Activity.search(:params => {:q => 'full-text search'})
|
18
|
+
has_search
|
19
|
+
|
20
|
+
self.schema = {
|
21
|
+
:account_id => :string,
|
22
|
+
:appointment_contact_id => :string,
|
23
|
+
:appointment_dtend_at => :time,
|
24
|
+
:appointment_dtstart_at => :time,
|
25
|
+
:appointment_location => :string,
|
26
|
+
:comment_notes => :string,
|
27
|
+
:comment_published => :boolean,
|
28
|
+
:contact_id => :string,
|
29
|
+
:email_cc => :string,
|
30
|
+
:kind => :string,
|
31
|
+
:state => :string,
|
32
|
+
:tags => :array,
|
33
|
+
:task_due_at => :time,
|
34
|
+
:task_owner_id => :string,
|
35
|
+
:title => :string,
|
36
|
+
}
|
5
37
|
|
38
|
+
##
|
39
|
+
# Queries the WebCRM for the Contact with the id +contact_id+.
|
40
|
+
# @return [Infopark::Crm::Contact] The contact associated with this activity, if +contact_id+ is present.
|
41
|
+
# @webcrm_rest_url <code>GET /api/contacts/_contact_id_</code>
|
42
|
+
def contact
|
43
|
+
Infopark::Crm::Contact.find(contact_id) if contact_id
|
44
|
+
end
|
45
|
+
|
46
|
+
##
|
47
|
+
# Queries the WebCRM for the Account with the id +account_id+.
|
48
|
+
# @return [Infopark::Crm::Account] The account associated with this activity, if +account_id+ is present.
|
49
|
+
# @webcrm_rest_url <code>GET /api/accounts/_account_id_</code>
|
50
|
+
def account
|
51
|
+
Infopark::Crm::Account.find(account_id) if account_id
|
52
|
+
end
|
53
|
+
|
54
|
+
##
|
55
|
+
# Queries the WebCRM for the CustomType with the id +kind+.
|
56
|
+
# @return [Infopark::Crm::CustomType] The custom type associated with this activity, if +kind+ is present.
|
57
|
+
# @webcrm_rest_url <code>GET /api/custom_types/_kind_</code>
|
58
|
+
def custom_type
|
59
|
+
Infopark::Crm::CustomType.find(kind) if kind
|
60
|
+
end
|
61
|
+
|
62
|
+
end
|
63
|
+
end; end
|
@@ -1,8 +1,8 @@
|
|
1
|
-
# :stopdoc:
|
2
|
-
|
3
1
|
require 'active_support/core_ext/class/attribute_accessors'
|
4
2
|
|
5
3
|
module Infopark; module Crm
|
4
|
+
|
5
|
+
# @private
|
6
6
|
class Configuration
|
7
7
|
|
8
8
|
cattr_accessor :api_key
|
@@ -17,8 +17,6 @@ module Infopark; module Crm
|
|
17
17
|
|
18
18
|
cattr_accessor :live_server_groups_callback
|
19
19
|
|
20
|
-
cattr_accessor :debug
|
21
|
-
|
22
20
|
self.login = "webservice"
|
23
21
|
|
24
22
|
self.live_server_groups_callback = lambda {|contact| []}
|
@@ -1,5 +1,125 @@
|
|
1
1
|
module Infopark; module Crm
|
2
|
-
|
3
|
-
|
4
|
-
|
2
|
+
class Contact < Core::Resource
|
3
|
+
|
4
|
+
##
|
5
|
+
# @!method self.search(input)
|
6
|
+
# Searches for contacts
|
7
|
+
# @param input [Hash] A hash containing a +params+ key. The value of this key is a hash containing the actual search query.
|
8
|
+
# @return [Array<Infopark::Crm::Contact>]
|
9
|
+
# @webcrm_rest_url <code>GET /api/contacts/search</code>
|
10
|
+
# @example
|
11
|
+
# results = Infopark::Crm::Contact.search(:params => {:login => 'the_login'})
|
12
|
+
# results = Infopark::Crm::Contact.search(:params => {:email => 'email@example.com'})
|
13
|
+
# results = Infopark::Crm::Contact.search(:params => {:q => 'full-text search'})
|
14
|
+
has_search
|
15
|
+
|
16
|
+
self.schema = {
|
17
|
+
:account_id => :string,
|
18
|
+
:country => :string,
|
19
|
+
:email => :string,
|
20
|
+
:extended_address => :string,
|
21
|
+
:fax => :string,
|
22
|
+
:first_name => :string,
|
23
|
+
:gender => :string,
|
24
|
+
:job_title => :string,
|
25
|
+
:language => :string,
|
26
|
+
:last_name => :string,
|
27
|
+
:locality => :string,
|
28
|
+
:login => :string,
|
29
|
+
:mobile_phone => :string,
|
30
|
+
:name_prefix => :string,
|
31
|
+
:org_name_address => :string,
|
32
|
+
:org_unit_address => :string,
|
33
|
+
:phone => :string,
|
34
|
+
:postalcode => :string,
|
35
|
+
:region => :string,
|
36
|
+
:role_names => :array,
|
37
|
+
:street_address => :string,
|
38
|
+
:tags => :array,
|
39
|
+
:want_email => :boolean,
|
40
|
+
:want_geo_location => :boolean,
|
41
|
+
:want_phonecall => :boolean,
|
42
|
+
:want_snailmail => :boolean,
|
43
|
+
}
|
44
|
+
|
45
|
+
##
|
46
|
+
# Queries the WebCRM for the Account with the id +account_id+.
|
47
|
+
# @return [Infopark::Crm::Account] The account associated with this contact, if +account_id+ is present.
|
48
|
+
# @webcrm_rest_url <code>GET /api/accounts/_account_id_</code>
|
49
|
+
def account
|
50
|
+
Infopark::Crm::Account.find(account_id) if account_id
|
51
|
+
end
|
52
|
+
|
53
|
+
##
|
54
|
+
# Looks for the user with the given +login+ and check whether the +password+ is correct.
|
55
|
+
# @param login [String]
|
56
|
+
# @param password [String]
|
57
|
+
# @return [Infopark::Crm::Contact] The found and authenticated contact.
|
58
|
+
# @raise [Infopark::Crm::Errors::AuthenticationFailed] if provided +password+ is not correct.
|
59
|
+
# @webcrm_rest_url <code>POST /api/contacts/authenticate</code>
|
60
|
+
def self.authenticate(login, password)
|
61
|
+
begin
|
62
|
+
response = post(:authenticate, {}, format.encode({:login => login, :password => password}))
|
63
|
+
result = format.decode(response.body)
|
64
|
+
return find(result['id']) if result.kind_of? Hash # ActiveResource 3.0
|
65
|
+
find(result)
|
66
|
+
rescue ActiveResource::ResourceInvalid
|
67
|
+
raise Errors::AuthenticationFailed
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
##
|
72
|
+
# Sets a new +password+ for the contact, which is associated with the given +token+.
|
73
|
+
# @param password [String] The new password.
|
74
|
+
# @param token [String] The token provided by +password_request+ which is associated with a contact.
|
75
|
+
# @return [String] The result message from the server.
|
76
|
+
# @webcrm_rest_url <code>POST /api/contacts/password_set</code>
|
77
|
+
def self.password_set(password, token)
|
78
|
+
response = post(:password_set, {}, format.encode({:password => password, :token => token}))
|
79
|
+
result = format.decode(response.body)
|
80
|
+
return result['message'] if result.kind_of? Hash # ActiveResource 3.0
|
81
|
+
result
|
82
|
+
end
|
5
83
|
|
84
|
+
##
|
85
|
+
# Sets the password of this contact to +password+.
|
86
|
+
# @param password [String] the new password
|
87
|
+
# @return [void]
|
88
|
+
def password_set(password)
|
89
|
+
token = password_request(:params => {:only_get_token => true})
|
90
|
+
self.class.password_set(password, token)
|
91
|
+
end
|
92
|
+
|
93
|
+
##
|
94
|
+
# Instructs the WebCRM to send the user an e-mail to let them set a new password.
|
95
|
+
# @param options [Hash]
|
96
|
+
# @webcrm_rest_url <code>GET /api/contacts/_id_/password_request</code>
|
97
|
+
# @webcrm_todo return nil instead of message for default parameters?
|
98
|
+
def password_request(options = {})
|
99
|
+
params = options[:params] || {}
|
100
|
+
response = post(:password_request, {}, self.class.format.encode(params))
|
101
|
+
result = self.class.format.decode(response.body)
|
102
|
+
return result.values.first if result.kind_of? Hash # ActiveResource 3.0
|
103
|
+
result
|
104
|
+
end
|
105
|
+
|
106
|
+
# Returns the live_server_groups of this contact as defined by +Configuration.live_server_groups_callback+
|
107
|
+
# @return [Array<String>] The calculated roles of this contact.
|
108
|
+
def live_server_groups
|
109
|
+
return @live_server_groups if defined?(@live_server_groups)
|
110
|
+
callback = Configuration.live_server_groups_callback
|
111
|
+
@live_server_groups = callback.call(self) if callback.respond_to?(:call)
|
112
|
+
raise "live_server_groups_callback: not defined or unexpected result!" unless @live_server_groups
|
113
|
+
|
114
|
+
@live_server_groups
|
115
|
+
end
|
116
|
+
|
117
|
+
##
|
118
|
+
# Overwrites +live_server_groups+, so live_server_groups_callback is not called for this object.
|
119
|
+
# @return [void]
|
120
|
+
def live_server_groups=(value)
|
121
|
+
@live_server_groups = value
|
122
|
+
end
|
123
|
+
|
124
|
+
end
|
125
|
+
end; end
|