 			]
 		@version = 'VERSION'
 
+	cacheOrderForm: (data) =>
+		@orderFormId = data.orderFormId
+		@orderForm = data.orderForm
+
+	orderFormHasExpectedSections = (orderForm, sections) ->
+		if not orderForm or not orderForm instanceof Object
+			return false
+		for section in sections
+			return false if not orderForm[section]
+
 	# Sends an idempotent request to retrieve the current OrderForm.
 	# @param expectedOrderFormSections [Array] an array of attachment names.
 	# @return [Promise] a promise for the OrderForm.
-	getOrderForm: (expectedFormSections = @allOrderFormSections) =>
-		# TODO guardar orderForm
-		checkoutRequest = { expectedOrderFormSections: expectedFormSections }
-		@ajax
-			url: @_getOrderFormURL()
-			type: 'POST'
-			contentType: 'application/json; charset=utf-8'
-			dataType: 'json'
-			data: JSON.stringify(checkoutRequest)
+	getOrderForm: (expectedFormSections = @_allOrderFormSections) =>
+		if orderFormHasExpectedSections(@orderForm, expectedFormSections)
+			return $.when(@orderForm)
+		else
+			checkoutRequest = { expectedOrderFormSections: expectedFormSections }
+			return @ajax
+				url: @_getBaseOrderFormURL()
+				type: 'POST'
+				contentType: 'application/json; charset=utf-8'
+				dataType: 'json'
+				data: JSON.stringify(checkoutRequest)
+			.done @cacheOrderForm
 
 	# Sends an OrderForm attachment to the current OrderForm, possibly updating it.
 	# @param attachmentId [String] the name of the attachment you're sending.

			contentType: 'application/json; charset=utf-8'
			dataType: 'json'
			data: JSON.stringify(updateItemsRequest)

	# Sends a request to update the items in the OrderForm.
	# @param items [Array] an array of objects representing the items in the OrderForm.

			contentType: 'application/json; charset=utf-8'
			dataType: 'json'
			data: JSON.stringify(checkoutRequest)
		.done @cacheOrderForm

	# Sends a request to calculates shipping for the current OrderForm, given an address object.
	# @param address [Object] an address object
