<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SkyBlog :: A Navitaire NewSkies Development Blog &#187; New Skies</title>
	<atom:link href="http://blog.coltcooper.com/category/new-skies/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.coltcooper.com</link>
	<description></description>
	<lastBuildDate>Thu, 22 Dec 2011 05:28:18 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Monarch Travel Commerce &#8211; Delivered By Navitaire (via Colt Cooper)</title>
		<link>http://blog.coltcooper.com/2011/12/monarch-travel-commerce-delivered-by-navitaire-via-colt-cooper/</link>
		<comments>http://blog.coltcooper.com/2011/12/monarch-travel-commerce-delivered-by-navitaire-via-colt-cooper/#comments</comments>
		<pubDate>Wed, 21 Dec 2011 14:56:14 +0000</pubDate>
		<dc:creator>Colt</dc:creator>
				<category><![CDATA[New Skies]]></category>
		<category><![CDATA[SkySales]]></category>
		<category><![CDATA[Avis]]></category>
		<category><![CDATA[Car Hire]]></category>
		<category><![CDATA[Navitaire]]></category>
		<category><![CDATA[Travel Commerce]]></category>

		<guid isPermaLink="false">http://blog.coltcooper.com/?p=147</guid>
		<description><![CDATA[At the end of last month, Monarch Airlines switched on Navitaire&#8217;s Travel Commerce product to sell car hire in their SkySales booking path.  The article mentions that Monarch is the first carrier to use Travel Commerce in the European region.  Along with it being a first for Monarch, it was also a first for myself in working [...]]]></description>
			<content:encoded><![CDATA[<p>At the end of last month, <a href="http://nsknewsletter.wordpress.com/2011/12/22/monarch-airlines-becomes-newest-navitaire-travel-commerce-customer/" target="_blank">Monarch Airlines switched on Navitaire&#8217;s Travel Commerce product to sell car hire in their SkySales booking path</a>.  The article mentions that Monarch is the first carrier to use Travel Commerce in the European region.  Along with it being a first for Monarch, it was also a first for myself in working with Travel Commerce.</p>
<p>As I was solely responsible for the development of Monarch&#8217;s Avis car hire in SkySales, I quickly discovered that there wasn&#8217;t much information I could draw on to help with development issues.  Monarch had previously sold Avis rentals on the confirmation page using a separate site that was connected directly to the Avis API.  Irregardless of the quality of that API, it was easy to troubleshoot problems because it was a two-party handshake.  However, with Travel Commerce the simplicity of a two-party negotiation now turns into a contentious arbitration process.</p>
<p>An example of this was when the SkySales code was failing to pass certain required fields through to Avis.  Travel Commerce didn&#8217;t object and tried to sell the car (ignoring and not relaying any Avis error messages).  The result was a car that was considered sold as far as Travel Commerce was concerned, but awaiting confirmation (which Avis would never send).  It was only through asking Navitaire to dig through XML log messages on their side that we were able to discover the rejection messages Avis was sending.</p>
<p>I&#8217;m not sure if my experience developing against Travel Commerce is due to an immature Navitaire Avis connector or if it&#8217;s because just a few carriers are using Travel Commerce at the moment.  Regardless, I&#8217;ve got my battle scars now and am able to offer Travel Commerce customization to my list of professional service offerings.  If your airline is considering using Travel Commerce, feel free to contact me for a down to earth point of view.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coltcooper.com/2011/12/monarch-travel-commerce-delivered-by-navitaire-via-colt-cooper/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Overriding SkySales Controls</title>
		<link>http://blog.coltcooper.com/2011/06/overriding-skysales-controls/</link>
		<comments>http://blog.coltcooper.com/2011/06/overriding-skysales-controls/#comments</comments>
		<pubDate>Mon, 13 Jun 2011 07:02:58 +0000</pubDate>
		<dc:creator>Colt</dc:creator>
				<category><![CDATA[New Skies]]></category>
		<category><![CDATA[SkySales]]></category>

		<guid isPermaLink="false">http://blog.coltcooper.com/?p=86</guid>
		<description><![CDATA[There will come a time at some point in your SkySales development efforts when you'll need to change some bit of code to work differently than what Navitaire delivers with a fresh New Skies install.  Since Navitaire does not ship the source of SkySales code to their clients, it can be a bit tricky to leverage 95% of what they've done in a control and just add the bare minimum to make it meet your business needs.]]></description>
			<content:encoded><![CDATA[<p>There will come a time at some point in your SkySales development efforts when you&#8217;ll need to change some bit of code to work differently than what Navitaire delivers with a fresh New Skies install.  Since Navitaire does not ship the SkySales source code to their clients, it can be a bit tricky to leverage 95% of what they&#8217;ve done in a control just to make the last 5% conform to your business needs.</p>
<p>Seasoned developers have in their toolbox a <a href="http://reflector.red-gate.com">handy tool called Reflector</a> that will allow them to examine and even debug into the assemblies that Navitaire ships.  For enhancing and working with SkySales controls, this is an absolute must.</p>
<blockquote><h4>Site Note</h4>
<p>Navitaire is aware that their customers routinely decompile the SkySales assemblies.  It&#8217;s not a big secret.  If they were concerned about this, they would obfuscate the code to make it very difficult to understand when viewed through a decompiler.  It makes you wonder why they don&#8217;t ship the plain code alongside the compiled code.</p></blockquote>
<p>Being able to snoop through SkySales code is invaluable.  However, there is a danger to having this decompiled code available to the novice developer.</p>
<p>I&#8217;ve seen many times where decompiled SkySales control code was taken wholesale from the decompiler and pasted into a new custom control (variables named &#8220;num3&#8243; are a dead giveaway).  Modifications are then implemented (usually without comments) to certain portions of the Navitaire code where needed.  Don&#8217;t get me wrong, this can be a time saver when a project deadline is looming.  However, what you gain in short-term development speed, you loose in long term maintenance.  Are future developers going to be able to understand all of that code you just dropped into the project?  Will they know exactly where the vendor&#8217;s code stops and your custom code stops?  And the biggest question of all:  How will that code be updated when your airline takes an upgrade?</p>
<p>If you&#8217;re doing at least a moderate level of customization to your SkySales solution, you&#8217;re going to have a situation where you must use some or all of a decompiled control.  But how can you do this with minimal maintenance issues?  Below is the best method I&#8217;ve found to have the best of both worlds.</p>
<p>In your project, create a special folder to place any classes you must decompile fully.  Examine the class and determine the best entry point for your modifications.  Once you fully understand what the Navitaire base class is doing, insert events at the points in the base methods where you need to insert your customizations.  Your modifications should be well commented and should be a single event line.  You will then create a new class that will contain your business logic and subscribe to the custom event you created in the parent control.  The following is an example of a custom event:</p>
<p><code>DisplayingBoardingPass(this, new DisplayingBoardingPassEventArgs(pass, segment, passenger));<br />
</code></p>
<p>This was done for a client in the notoriously monolithic OnActivatedPreRender method for the BoardingPassDisplay control.  In this case, the client just wanted to add some XML data inside the boarding pass node being constructed.  However, because the boarding pass node doesn&#8217;t use any events or virtual methods when creating it&#8217;s XML structure, the control had to be decompiled in order to allow an insertion at just the right point.  Events will also allow you to pass objects to child classes so you can implement some intended <a href="http://en.wikipedia.org/wiki/Side_effect_%28computer_science%29">side effects</a> on those base objects.</p>
<p>Now, when it comes time to take the next Navitaire upgrade, the client can reflect on the new BoardingPassDisplay control and run a compare to easily see what has been changed.  Since our modifications consisted of one line here or there, the original code is intact and devoid of the various business logic that creeps into custom controls over time.</p>
<p>While the method described above will work and has been tested as a viable way to reduce maintenance costs through upgrades, we should ask: &#8220;Why is this necessary&#8221;?  The SkySales team must believe that the methods they have marked as virtual are all any one will need to successfully modify the base control functionality.  This is not the case.  The SkySales controls were not written from an implementers point of view.  I suggest that Navitaire should run through their SkySales controls and sprinkle them with events.  As implementers, we need events in the middle of large loops, before and after objects are committed, and in methods that are not easily overridden because of their reliance on private methods.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coltcooper.com/2011/06/overriding-skysales-controls/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Job Opening &#8211; C# Developer</title>
		<link>http://blog.coltcooper.com/2011/01/job-opening-c-developer/</link>
		<comments>http://blog.coltcooper.com/2011/01/job-opening-c-developer/#comments</comments>
		<pubDate>Sun, 30 Jan 2011 05:25:09 +0000</pubDate>
		<dc:creator>Colt</dc:creator>
				<category><![CDATA[Jobs]]></category>
		<category><![CDATA[New Skies]]></category>

		<guid isPermaLink="false">http://blog.coltcooper.com/?p=74</guid>
		<description><![CDATA[We are hiring for a development position! ​ We are looking for an energetic, mid-level C# developer who is willing to learn the ins and outs of the New Skies airline reservation system.​  Ability to occasionally travel to international and domestic locations is a plus as is familiarity with the airline sector and reservation systems [...]]]></description>
			<content:encoded><![CDATA[<p>We are hiring for a development position! ​   We are looking for an energetic, mid-level C# developer who is willing to learn the ins and outs of the New Skies airline reservation system.​  Ability to  occasionally travel to international and domestic locations is a plus as is familiarity with the airline sector and reservation systems in general.</p>
<p>Our ideal candidate is one who has grown beyond their current position and is looking for the chance to make a large positive impact with our company and our airline clients.</p>
<p>The core competencies we&#8217;re looking for are:<br />
- 3+​ years of C# experience in WinForms and ASP.​NET<br />
- Proven ability to problem solve /​ debug given the tools available (VS2010, logs, events)</p>
<p>Suggested experience/​technologies:<br />
- Airline Reservation System programming<br />
- XSLT/​XML</p>
<p>Because we&#8217;re a small professional shop, we don&#8217;t believe in unnecessary process as we prefer to Get Things Done.​  You can expect a friendly, organized environment run by developers.​  We use the latest software tools and equipment.</p>
<p>To apply, send an e-mail your resume to <u>jobs</u> at <u>coltcooper.com</u>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coltcooper.com/2011/01/job-opening-c-developer/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Enable &#8216;Enter&#8217; Key in SkySales Forms</title>
		<link>http://blog.coltcooper.com/2010/06/enable-enter-key-in-skysales-forms/</link>
		<comments>http://blog.coltcooper.com/2010/06/enable-enter-key-in-skysales-forms/#comments</comments>
		<pubDate>Sat, 05 Jun 2010 19:38:21 +0000</pubDate>
		<dc:creator>Colt</dc:creator>
				<category><![CDATA[New Skies]]></category>
		<category><![CDATA[SkySales]]></category>

		<guid isPermaLink="false">http://blog.coltcooper.com/?p=63</guid>
		<description><![CDATA[If you&#8217;ve developed in SkySales or even .NET Web Forms you probably have noticed the lack of support for traditional &#8216;enter&#8217; key behavior on forms. This is due to the .NET methodology of hijacking the return key behavior with some javascript events. Since SkySales is based on .NET Web Forms, the problem rears it&#8217;s ugly [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve developed in SkySales or even .NET Web Forms you probably have noticed the lack of support for traditional &#8216;enter&#8217; key behavior on forms.  This is due to the .NET methodology of hijacking the return key behavior with some javascript events.  Since SkySales is based on .NET Web Forms, the problem rears it&#8217;s ugly head there as well.  And, if it does end up working but you have multiple form inputs and buttons on the page, it may not trigger the right submit button.</p>
<p>Out of the box, SkySales loads up the submit form button with a few actions such as client-side validation in the form of javascript functions like: &#8220;validate(this)&#8221;.  That particular validate method determines which form elements are child members of the control submitting the form and then runs the appropriate validation for each element on the form.  We&#8217;ll use a similar method for tackling the enter key problem.</p>
<p>For this fix, I&#8217;m assuming the use of the jQuery framework (which has officially been shipping with SkySales since the 2.x version).  The following **code is how we&#8217;ll capture the enter key from the XSLT file:</p>
<p><code>&lt;script langugage="javascript"&gt;<br />
$(function()<br />
{<br />
$("input[@id^='&lt;xsl:value-of  select="/*/@clientID"/&gt;']").keydown( function(event) { checkEnter(event, '&lt;xsl:value-of select="//CONTROLS/LINKBUTTONSUBMIT/*/@id"/&gt;'); });<br />
});<br />
&lt;/script&gt;</code></p>
<p>Notice in the code above that we are just checking for inputs that start with the clientID of the SkySales control we are using.  If your control is inside a control group, this code should be in the control group XSLT so it covers all of the elements inside the group.  If you had some select boxes on your form that you wanted to add enter key support on, you would simply expand the jQuery selector to **include select elements:</p>
<p><code><br />
$("<strong>select[@id^='&lt;xsl:value-of  select="/*/@clientID"/&gt;'],</strong> [input[@id^='&lt;xsl:value-of  select="/*/@clientID"/&gt;']")... etc<br />
</code></p>
<p>The checkEnter function will basically create a new function for client script residing in the onClick method for the button id that is passed in, and then fire the href event.  This function should reside in a common javascript file that gets included on every page.  The source can be downloaded <a title="checkEnter" href="http://coltcooper.com/downloads/checkEnter.js" target="_blank">here</a>.</p>
<p>I believe this small bit of code can help your SkySales site out by helping it behave the way people expect pages to behave on the web.</p>
<h5>** Special note **:  The code samples work with earlier versions of jQuery.  The current version doesn&#8217;t require the @ symbol in front of attribute identifiers so modify your code appropriately.</h5>
]]></content:encoded>
			<wfw:commentRss>http://blog.coltcooper.com/2010/06/enable-enter-key-in-skysales-forms/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>&#8220;Booking Modified By Another User&#8221; Error</title>
		<link>http://blog.coltcooper.com/2009/11/booking-modified-by-another-user-error/</link>
		<comments>http://blog.coltcooper.com/2009/11/booking-modified-by-another-user-error/#comments</comments>
		<pubDate>Mon, 09 Nov 2009 14:06:29 +0000</pubDate>
		<dc:creator>Colt</dc:creator>
				<category><![CDATA[New Skies]]></category>
		<category><![CDATA[SkySales]]></category>

		<guid isPermaLink="false">http://blog.coltcooper.com/?p=19</guid>
		<description><![CDATA[On a recent implementation of NewSkies implementation of SkySales, I would occasionally run into a strange error from the NewSkies application server: “Booking Modified By Another User”.  It seemed to occur only after a booking was initially created, then was modified again...]]></description>
			<content:encoded><![CDATA[<p>On a recent implementation of SkySales, I would occasionally run into a strange error from the NewSkies application server: “Booking Modified By Another User”.  It seemed to occur only after a booking was initially created, then was modified again.  On the second attempt at committing the booking, core (the app server) would occasionally throw this error.</p>
<p>This error is triggered when the application server detects that the last updated date/time of the booking in the database doesn’t match what it has in memory.  While this is a valid sanity check to prevent the application server blindly overwriting a booking in the database, we had no idea who or what was modifying the booking in between our commits.</p>
<p>After some digging, we discovered that the last user updating the booking was a process account (ProcessMaster).  This can be seen when whatever action it took left a trace in the booking history (viewed in SkySpeed).  </p>
<p>As Navitaire doesn’t seem to have a solution for the problem, the best recommendation was to re-retrieve the booking when this error was found and try the commit again.  This would refresh the application server with the most recent copy of the booking and reset things on the web server as well.</p>
<p>This unfortunately has a side effect of killing any changes the user has just requested to their booking.  It’s less painful if they have to repeat just one screen of changes, but it’s worse if they just finished a change process involving a number of steps.</p>
<p>If you absolutely had to be graceful with the customer – you could write a lot of code to queue up and retry those changes made.  Unfortunately, the most common (and cheapest) approach is to throw up your hands with an error and blindly ask the customer to repeat to you what they just did.</p>
<p>The bottom line is this:  Don’t assume that once a booking is created, you’re the only one working with it.  What I’ve described above is a corner case, but a well-known one at that.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coltcooper.com/2009/11/booking-modified-by-another-user-error/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Managing New Skies Settings</title>
		<link>http://blog.coltcooper.com/2009/06/managing-new-skies-settings/</link>
		<comments>http://blog.coltcooper.com/2009/06/managing-new-skies-settings/#comments</comments>
		<pubDate>Sat, 20 Jun 2009 05:12:10 +0000</pubDate>
		<dc:creator>Colt</dc:creator>
				<category><![CDATA[New Skies]]></category>

		<guid isPermaLink="false">http://blog.coltcooper.com/?p=11</guid>
		<description><![CDATA[Configuration settings management in New Skies can plague airlines of all sizes.  I've created a tool to ease the pain of managing configurations between multiple environments.]]></description>
			<content:encoded><![CDATA[<p>Configuration settings management in New Skies can plague airlines of all sizes.</p>
<p>To be successful at change management in New Skies, carriers resort to a gatekeeper concept where a single person or group is responsible for changes in the development / test / production environments.</p>
<p>The tools that ship with New Skies out of the box fall short of managing settings across multiple environments.  This is either a manual process of having two management windows open at the same time and tediously ensuring the settings are the same in both environments or a request is put in to an understaffed Navitaire operations group to run a database script to bulk copy settings between environments.  I’ve developed a tool that makes settings management between environments simple.</p>
<p>The Settings Manager tool has two modes, <strong>Compare</strong> and <strong>Sync</strong>.  Compare allows the comparison of two settings snapshots.  These could be brand new snapshots between two environments or even two different historical snapshots of the same environment.</p>
<p>
If you’re a publicly held company in the US then you’re all too familiar with Sarbanes Oxley requirements.  New Skies is an IT system that directly affects financials, therefore, you’ll need the ability to audit changes to those settings.  The NewSkies database schema fails to provide an auditing of system settings; only saving information on the time a setting was last changed and the user who changed it.  Once a few changes to the same setting has been made, the original information is overwritten.</p>
<p>The Settings Manager can be scheduled to take snapshots of settings on a periodical basis and archive them for auditing.  Snapshots are then archived on disk – there’s no database to worry about or maintain.</p>
<p>Feel free to <a href="mailto:contact@coltcooper.com">contact me</a> for further info.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.coltcooper.com/2009/06/managing-new-skies-settings/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

