Code Monkey home page Code Monkey logo

appsales-mobile's People

Contributors

0xced avatar a2 avatar bbjay avatar danielctull avatar dave256 avatar derandereandi avatar emlombardo avatar futuretap avatar haslup avatar hirohitokato avatar iosdeveloper avatar jollyjinx avatar jquave avatar ktakayama avatar markofjohnson avatar markrickert avatar monkeydom avatar mosesgottlieb avatar omz avatar p2 avatar paultiarks avatar philippec avatar roostr avatar stuartcarnie avatar taberrr avatar tahabebek avatar timshadel avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

appsales-mobile's Issues

No New Data Appears

Great app! Been using it for a little over 1 month. As of nov. 17th I stopped recieving any new data from iTunes connect. I keep hitting refresh but nothing seems to change. No new information is appearing. Any suggestions would be appreciated!

-Brendan

Weekly out side of current Month

In the weekly report tableview, when I select any week outside of the current month the app crashes. I just compiled and install this app on a 3Gs runing 4.0.2OS. Is it just me? BTW, love this app so far.

Builderrors: foundation.h not found

I try to build the source code with the latest released SDK.
I get builderrors: foundation.h not found, UIKit.h not found.
Tried to remove + add the foundation framework, but now I get even more errors: about 3000 build errors ....

Anyone who can help me out?

Characters not showing up correctly in Reviews TableView list

When you select a review from the Reviews controller some text shown in the tableview for each review is not shown correctly. For example, an apostrophe is shown as ' These appear to be the HTML entity codes. When the review is selected the full review is shown, and these characters are translated correctly.

Is there a simple fix to have these characters shown correctly in the main reviews tableview?

Thanks

Accept donation?

Dear Evan,

Do you have a Paypal a/c to accept donation? It's such great piece of software for iPhone developer to keep tract of sales and the presentation is so well crafted and layout is so beautiful.

If you need another suggestion, it'd be nice to add "Ranking" information.

Thanks
horace

regional sales figures are wrong

appsales doesn't compute the percentage of sales correctly, I think what is going on is that the percentage number is computed based on the number of downloads and not revenue, even when you are looking at regional revenue pie chart. So you can get a line like this:
AU: 10% ($0)
Clearly the AU region can't be 10% of sales if it had 0 dollars revenue... If you look carefully you see that the percentage numbers on the list don't match the pie slices drawn.

Cosmetic issues with graph report views

I've noticed a couple of issues with the graph views. First, the percentages reported for the various regions, and sorting order always use the sales statistics, even when in revenue mode.

Also, in revenue mode, I personally prefer fractions to be displayed.

I use this patch to make these changes against the git code to handle this (the first 3 hunks take care of the first part of this issue, the last hunk enables fraction display):

diff -ru AppSales-Mobile-pristine/Classes/RegionsGraphView.m AppSales-Mobile/Classes/RegionsGraphView.m
--- AppSales-Mobile-pristine/Classes/RegionsGraphView.m 2010-07-09 13:50:31.000000000 -0500
+++ AppSales-Mobile/Classes/RegionsGraphView.m  2010-07-13 13:40:42.000000000 -0500
@@ -150,7 +150,10 @@
        for (NSString *region in sortedRegions) {
                totalRevenue += [[revenueByRegion objectForKey:region] floatValue];
        }
-       sortedRegions = [unitsByRegion keysSortedByValueUsingSelector:@selector(compare:)];
+       if (showUnits)
+               sortedRegions = [unitsByRegion keysSortedByValueUsingSelector:@selector(compare:)];
+       else
+               sortedRegions = [revenueByRegion keysSortedByValueUsingSelector:@selector(compare:)];

        //draw title:
        [[UIColor darkGrayColor] set];
@@ -191,7 +194,12 @@
                if (colorIndex < 0) colorIndex = [colors count] - 1;

                float units = [[unitsByRegion objectForKey:region] floatValue];
-               float percentage = units / totalUnits;
+               float revenue = [[revenueByRegion objectForKey:region] floatValue];
+               float percentage;
+               if (showUnits)
+                       percentage = units / totalUnits;
+               else
+                       percentage = revenue / totalRevenue;
                CGContextBeginPath(c);
                CGContextMoveToPoint(c, center.x, center.y);
                float angle = lastAngle + (percentage * -M_PI * 2);
@@ -214,7 +222,12 @@
                NSString *region = [sortedRegions objectAtIndex:j];
                float revenue = [[revenueByRegion objectForKey:region] floatValue];
                float units = [[unitsByRegion objectForKey:region] floatValue];
-               float percentage = units / totalUnits;
+               float percentage;
+               if (showUnits)
+                       percentage = units / totalUnits;
+               else
+                       percentage = revenue / totalRevenue;
+
                UIColor *color = [colors objectAtIndex:colorIndex];
                colorIndex--;
                if (colorIndex < 0) colorIndex = [colors count] - 1;
@@ -233,7 +246,7 @@
                if (showUnits)
                        legendString = [NSString stringWithFormat:@"%@%% (%i)", percentString, (int)units];
                else
-                       legendString = [NSString stringWithFormat:@"%@%%  (%@)", percentString, [[CurrencyManager sharedManager] baseCurrencyDescriptionForAmount:[NSNumber numberWithFloat:revenue] withFraction:NO]];
+                       legendString = [NSString stringWithFormat:@"%@%%  (%@)", percentString, [[CurrencyManager sharedManager] baseCurrencyDescriptionForAmount:[NSNumber numberWithFloat:revenue] withFraction:YES]];
                [legendString drawInRect:CGRectMake(205, y + 3, 110, 10) withFont:[UIFont boldSystemFontOfSize:11.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentLeft];
                i++;
        }

In App Purchais issue

the in app sales are shown as free because the transactionType start with "IA".
To solve this problem I add this in initWithCSV:(NSString *)csv method of Day class:

if([transactionType rangeOfString:@"IA"].location == 0){
    transactionType = [transactionType substringFromIndex:2];
}

So the in app purchais is shown like an app!

Sorry for my english...

Nicola

Reviews are limited to 25 per country

Love the new reviews integrated into the app! However, it seems as if only the last 25 reviews per country are being retrieved (the first page of reviews as shown in iTunes).

In order to have a correct review count and average rating, it would be great if all reviews could be downloaded.

App Sales crashes because of migrated account

I recently migrated from an individual account to a company account, and the seller name got switched over it with it. Now when I log into itts.apple.com, the very first screen asks me to select a vendor. The choices are my personal name and my company name, each having its own unique vendor id.

When I try to download the latest reports, app sales crashes because of this.

Sum of sales.

This isn't really an issue its more of a request. It would be great if appsales-mobile would total up all of the weekly sales reports and the daily reports. I find it quite annoying having to add up my sales reports every week I get a new weekly report. It would be great if this was included.

Josh

IA9 code for InApp Purchase is not managed

First of all... great app!
The IA9 code is not managed. It is a payed in-app subscription.
I've added this line in Day.m - initWithCSV:

if ([transactionType isEqualToString:@"IA9"]) transactionType = @"1";

Dismissing app filter crashes

Need to check for invalid buttonIndexes in the clickedButtonAtIndex selector, adding the following fixes it:

  • (void)actionSheet:(UIActionSheet *)actionSheet clickedButtonAtIndex:(NSInteger)buttonIndex {
    if(buttonIndex==-1) return;
    ..........
    ..........

iOS 4 Import/Export Not Working

Just confirmed that Import / Export works fine on my iPad (iOS 3.2) using the most recent build. However, neither iOS 4 device (iPhone / iPod Touch) allow access to the Import / Export web page.

iOS4 - Wont save data

With the new operating system, I am having troubles saving data. I can load the data fine, but in iOS4, when you press the home button it leaves it semi-open.... So you can still double tap the home button and it shows up as it is in the background. If I close it from there, or shut off my phone, none of my reports will have saved.

Reporting updated on June 10 ,2010

Just wanted to give everyone a heads up.
I tried to get my sales reports this morning (6/10/10) and it was reporting "no new reports found" due to some changes they made to the reporting system.

I fixed it by making the same kind of changes we did in Feb. 2010

CHANGED
if (i==0) {
downloadType = @"Daily";
downloadActionName = @"17.13.1";
}
else {
downloadType = @"Weekly";
downloadActionName = @"17.15.1";
}
AND

downloadType, @"17.11",
downloadType, @"hiddenDayOrWeekSelection",
@"Summary", @"17.9",
@"ShowDropDown", @"hiddenSubmitTypeName", nil];

AND

downloadType, @"17.11",
dayString, @"hiddenDayOrWeekSelection",
@"Download", @"hiddenSubmitTypeName",
@"ShowDropDown", @"hiddenSubmitTypeName",
@"Summary", @"17.9",

TO NEW CALUES OF

            if (i==0) {
        downloadType = @"Daily";
        downloadActionName = @"19.15.1";
    }
    else {
        downloadType = @"Weekly";
        downloadActionName = @"19.17.1";
    }

AND

downloadType, @"19.13",
downloadType, @"hiddenDayOrWeekSelection",
@"Summary", @"19.11",
@"ShowDropDown", @"hiddenSubmitTypeName", nil];

AND

downloadType, @"19.13",
dayString, @"hiddenDayOrWeekSelection",
@"Download", @"hiddenSubmitTypeName",
@"ShowDropDown", @"hiddenSubmitTypeName",
@"Summary", @"19.11",

Hangs/crashes with two VendorIDs

ReportManager.m in method fetchReportsWithUserInfo: crashes on me for the "Choose vendor" page.

The code block begins on line 175, apparently Christian Beer contributed the code.
My guess is that the html changed.

LIne 181 and 181 were:
[scanner scanUpToString:@"<option value="null">" intoString:NULL];
[scanner scanString:@"<option value="null">" intoString:NULL];
Doing this doesn't find the vendor ID for me. I had to change it to the following:
[scanner scanUpToString:@"<option value="0">" intoString:NULL];
[scanner scanString:@"<option value="0">" intoString:NULL];

That is only the first problem though...

The code around line 240-242 doesn't work anymore:
[scanner scanUpToString:@"<td class="content">" intoString:NULL];
[scanner scanUpToString:@"<a href="" intoString:NULL];
[scanner scanString:@"<a href="" intoString:NULL];

The it doesn't find the URL it is looking for (in the table?). The problem is that I don't know what the URL is supposed to be. I've gone through the HTML and made it find URLs I thought might work, but they don't. I don't know what to do with this, I don't know what it is looking for.

Any help would be appreciated.

Following is the html source for the Vendor ID page:
In GUI-Land, you choose a vendor ID, then click the "Submit" button.

<TITLE>iTunes Label Connect</TITLE> <script language="javascript"> //function vndrID() //{ // var vendorID; // if(document.getElementById('vendorId').value!="") // { // document.superPage.submit(); // } // else // { // return false; // } //} var flag; function vndrID() { flag="true"; var vendorID; if(document.getElementById('vendorId').value!="") { document.superPage.submit(); return false; } else { return false; } } function checkVendorIdNumber() { if(event.keyCode >=48 && event.keyCode <=57) { event.returnValue = true; } else if(event.keyCode == 8 ) { event.returnValue = true; } else if(event.keyCode == 9 ) { event.returnValue = true; } else if(event.keyCode == 13) { event.returnValue = true; } else if(event.keyCode == 63234) { event.returnValue = true; } else if(event.keyCode == 63235) { event.returnValue = true; }else if(event.keyCode == 63272) { event.returnValue = true; } else { event.returnValue = false; } } function validateData() { if(document.getElementById('roleHidden').value == 2) { if(document.getElementById('vendorName').value=="" && document.getElementById('vendorId').value=="") { alert("Please select a vendor") return false; } else if(document.getElementById('vendorId').value=="") { alert("Please select a vendor ID") return false; } ``` } if(flag!="true") { if(document.getElementById('roleHidden').value == 1) { if(document.getElementById('selectName').value=="null") { alert("Please select a vendor"); return false; } if(document.getElementById('selectName').value!="null" && document.getElementById('selCountry').value=="1") { alert("Please wait until page refresh"); return false; } } else { if(document.getElementById('vendorName').value=="") { alert("Please select a vendor"); return false; } } if(document.getElementById('vendorId').value=="") { alert("Please select a vendor ID"); return false; } if(isNaN(document.getElementById('vendorId').value)) { alert("Invalid data format.\n\nOnly numbers are allowed."); document.superPage.vndrid.focus(); return false; } /* if(document.getElementById('selCountry').value=="null") { alert("Please select a Territory"); return false; } */ } else { return false; } ``` } function pickerValue() { document.getElementById('vendorId').value=""; document.superPage.submit(); } function clearFields() { var browserType = navigator.userAgent; tempVersion = navigator.userAgent.split("/"); var iIE = browserType.indexOf("IE"); // combo = document.getElementById('selCountry'); // combo.options.length = 0; // ele = document.createElement('option'); // ele.text="Select Territory"; /\* if(iIE > -1) { //ele.value="1"; combo.add(ele,1); } ``` else { ele.value="1"; combo.appendChild(ele); } ``` */ if(document.getElementById('roleHidden').value == 1) { // document.getElementById('selectName').value="null"; document.getElementById('selectName').options[0].selected=true; document.getElementById('vendorId').value=""; } else { document.getElementById('vendorName').value=""; document.getElementById('vendorId').value=""; } return false; } ``` function getPapulateValues() { var browserType = navigator.userAgent; tempVersion = navigator.userAgent.split("/"); var iIE = browserType.indexOf("IE"); // combo = document.getElementById('selCountry'); ``` // combo.options.length = 0; // ele = document.createElement('option'); // ele.text="Select Territory"; /\* if(iIE > -1) { //ele.value="1"; combo.add(ele,1); } ``` else { ele.value="1"; combo.appendChild(ele); } */ if(document.getElementById('selectName').value=="null") { document.getElementById('vendorId').value=""; return false; } else { document.getElementById('vendorId').value = document.getElementById('selectName').value; document.superPage.submit(); } } </script>

 </HEAD>

 <BODY BGCOLOR="#FFFFFF" LEFTMARGIN="0" MARGINHEIGHT="0" MARGINWIDTH="0" TOPMARGIN="0" RIGHTMARGIN="0">

  <center>
  <div style="width:100%;background-color:#ffffff; float: middle;">
    <img width="1" height="8" src="/WebObjects/piano.woa/Contents/WebServerResources/spacer.gif"/>
    <br/>
    <div class="ipoditunes" id="globalheader">
      <ul id="globalnav">
        <li id="gn-apple">
          <a href="http://www.apple.com/">Apple</a>
        </li>
        <li id="gn-store">
          <a href="http://store.apple.com/">Store</a>
        </li>
        <li id="gn-mac">
          <a href="http://www.apple.com/mac/">Mac</a>
        </li>
        <li id="gn-ipoditunes">
          <a href="http://www.apple.com/itunes/">iPod + iTunes</a>
        </li>
        <li id="gn-iphone">
          <a href="http://www.apple.com/iphone/">iPhone</a>
        </li>
        <li id="gn-downloads">
          <a href="http://www.apple.com/downloads/">Downloads</a>
        </li>
        <li id="gn-support">
          <a href="http://www.apple.com/support/">Support</a>
        </li>
      </ul>
      <div id="globalsearch"> </div>
    </div>
  </div>
</center>
<input Id="roleHidden" type="hidden" value="1" name="2" /><input type="hidden" name="3" /> 

  <TABLE BORDER=0 CELLPADDING=4 CELLSPACING=0 WIDTH="99%">
    <TR>
      <TD ALIGN=center>


<td width="300">
    <img src="/WebObjects/piano.woa/Contents/WebServerResources/txt_title_itunesvips.gif"  alt="iTunes VIPs" border="0"></td>
 <td align="right">
        <form method="post" name="SignOut" action="/cgi-bin/WebObjects/Piano.woa/5/wo/Psd5CQrKRtg0r3OxtuXQ1M/2.5">
        <table border="0" cellspacing="0" cellpadding="10">
            <tr>
                <td><font color="gray">[email protected], Vendor 1 name</font>&nbsp;</td>
                <td><input type="submit" value="Sign Out" name="SignOt" /></td>
            </tr>                
        </table>
    <input type="hidden" name="wosid" value="Psd5CQrKRtg0r3OxtuXQ1M" /></form>

       </td>
   </tr>
</table>

 </td>
            <td></td>
        </tr>
        <tr>
            <td colspan=3>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<font color="gray"><b>Reporting &gt; Vendor Selection</b></font><br></td>
        </tr>

<tr>
    <td background="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_top.gif" align="left" width="18"><img src="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_topl.gif" width="18" height="15" alt="" border="0"></td>
    <td background="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_top.gif"><img src="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_top.gif" height="15" width="698" alt="" border="0"></td>
    <td align="left"><img src="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_topr.gif" width="19" height="15" alt="" border="0"></td>
</tr>
    <form method="post" name="superPage" enctype="multipart/form-data" action="/cgi-bin/WebObjects/Piano.woa/5/wo/Psd5CQrKRtg0r3OxtuXQ1M/2.9">
<tr>
    <td background="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_l.gif"></td>
    <td colspan="1">

    <table cellspacing="0" border="0" cellpadding="5" align="center" width="99%">
        <tr>
            <td ></td>
            <td ><font color="#333333" size="4"><strong>Vendor Options</strong></font><br></td>
        </tr>
        <tr align="center">
                    <td colspan="2"><font size="2" color="red"></font></td><br>
                </tr>
                                        <tr valign="middle">
                                            <td align="right" width="40%">
                                                <b>Vendor Name:&nbsp;&nbsp;&nbsp;&nbsp;</b> 
                                            </td>
                                            <td colspan="2"><table valign="middle" align="left" cellspacing=0 cellpadding=0 ><tr>
                                        <td>
                                             <select Id="selectName" onChange="getPapulateValues()" style="width:153px" name="9.6.0"><option value="0">Select Vendor</option><option value="85018951">Vendor 1 Name (85018951)</option><option value="80054025">Vendor 2 Name (80054025)</option></select></td>
                                        <td align="center" valign="middle">&nbsp;&nbsp;&nbsp;&nbsp;</td>

                                            </tr></table></td>
                                                                                            </tr>

                                        <tr><td></td><td></td></tr>
                                        <tr>
                                            <td align="right">
                                                <b>Vendor ID:&nbsp;&nbsp;&nbsp;&nbsp;</b> 
                                            </td>
                                            <td align="left" valign="middle">

                                       <input READONLY="true" onKeyPress="return checkVendorIdNumber(event);" Id="vendorId" onChange="return vndrID();" type="text" name="vndrid" />
                                            </td>

                                        </tr>


                                        </table>
          <center><table  style="margin-top: 20px;">
          <tr>
           <td><a href="mailto:[email protected]"><img border="0" src="/WebObjects/piano.woa/Contents/WebServerResources/btn_help.gif"></a></td>
          <td>If you have <a href="mailto:[email protected]">feedback</a> or <a href="mailto:[email protected]">questions</a> please let us know.</td>
          </tr>
</table>

</center>

```
Copyright © 2008 Apple Inc. All rights reserved.

Here is the source for the following page which chooses the daily report:

<TITLE>iTunes Label Connect</TITLE> <script language="javascript"> function showButton(obj) { if(obj.value=="3") { ``` } } function FillDate(strDropdown){ } function FillWeek(strDropdown){ } function handleSelReportType() { if(document.getElementById('selReportType').value=='Select Report Type') return false; if(eval(document.getElementById('dayorweekdropdown'))){ if(document.getElementById('selDateType').value=='Select Date Type'){ alert("Please select a Date Type"); return false; } } if(document.getElementById('selReportType').value=='Summary'){ document.frmVendorPage.hiddenSubmitTypeName.value="Summary"; document.frmVendorPage.submit(); } else{ document.frmVendorPage.hiddenSubmitTypeName.value="ClearSummary"; document.frmVendorPage.submit(); } } function handleSelDateType() { if(document.getElementById('selReportType').value=='Select Report Type'){ if(!(document.getElementById('selDateType').value=='Select Date Type')) alert("Please select a Report Type"); if(document.getElementById('selDateType').value=='Weekly') document.frmVendorPage.hiddenDayOrWeekSelection.value="Weekly"; if(document.getElementById('selDateType').value=='Daily') document.frmVendorPage.hiddenDayOrWeekSelection.value="Daily"; return false; } if(document.getElementById('selDateType').value=='Weekly'){ document.frmVendorPage.hiddenDayOrWeekSelection.value="Weekly"; document.frmVendorPage.hiddenSubmitTypeName.value="ShowDropDown"; document.frmVendorPage.submit(); } if(document.getElementById('selDateType').value=='Daily'){ document.frmVendorPage.hiddenDayOrWeekSelection.value="Daily"; document.frmVendorPage.hiddenSubmitTypeName.value="ShowDropDown"; document.frmVendorPage.submit(); } if(document.getElementById('selDateType').value=='Monthly Free'){ document.frmVendorPage.hiddenDayOrWeekSelection.value="Monthly Free"; document.frmVendorPage.hiddenSubmitTypeName.value="ShowDropDown"; document.frmVendorPage.submit(); } ``` //////////////// The below part of code has been commented to solve the issue comming while selecting "select date Type" and click on Download ///////////////////////// // // disable the button activity on change : Begin // window.document.getElementById('idlnkprevious').href = "#"; // window.document.getElementById('idlnkdownload').href = "#"; // window.document.getElementById('idlnkpreview').href = "#"; // // disable the button activity on change : End //////////////// The above part of code has been commented to solve the issue comming while selecting "select date Type" and click on Download ///////////////////////// ``` } function submitThisForm(){ } function validateData(inValue){ jsClearErrorMsg(); if(document.getElementById('selDateType').value=='Select Date Type' && document.getElementById('selReportType').value=='Select Report Type') alert("Please select a Report Type and Date Type"); else if(document.getElementById('selReportType').value=='Select Report Type') alert("Please select a Report Type"); else if(document.getElementById('selDateType').value=='Select Date Type') alert("Please select a Date Type"); else if(document.getElementById('dayorweekdropdown').value=='Select Value') alert("Please select a value for Daily or Weekly"); else if(document.getElementById('dayorweekdropdown').value=='') alert("There is no date for this selection"); else{ document.frmVendorPage.hiddenDayOrWeekSelection.value=document.getElementById('dayorweekdropdown').value; document.frmVendorPage.hiddenSubmitTypeName.value=inValue; document.frmVendorPage.submit(); } } function jsClearErrorMsg() { window.document.getElementById('iddownloadmsg').innerHTML = ""; } ``` </script>
    <tr>
            <td colspan="3" height="10px"></td>
    </tr>


    <tr>
    <td colspan="3"><font color="black" size="2%"><ul type="square"><li style="margin-left:-10px;">Please note that reports are purged on a regular basis (daily after 7 days and weekly after 13 weeks).</li>
    <li style="margin-left:-10px;">Sales/Trend reports are for directional purposes only, do not use for financial statement purpose.</li></ul></font></td>
    </tr>


    <tr>
<td background="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_top.gif" align="left" width="18"><img src="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_topl.gif" width="18" height="15" alt="" border="0"></td>
<td background="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_top.gif"><img src="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_top.gif" height="15" width="698" alt="" border="0"></td>
<td align="left"><img src="/WebObjects/piano.woa/Contents/WebServerResources/box_gray_topr.gif" width="19" height="15" alt="" border="0"></td>
<table cellspacing="0" border="0" cellpadding="0" align="center" width="735">
    <tr>
        <td width="18"></td>
        <td width="349"></td>
        <td width="19"></td>
    </tr>
    <tr>
  <td></td>
  <td colspan="1">

    <table cellpadding="0" cellspacing="0" border="0" width="100%">

      <tr>

        <td width="345">
          <img src="/WebObjects/piano.woa/Contents/WebServerResources/txt_title_itunesvips.gif" alt="iTunes VIPs" border="0">
        </td>

    <td align="right" valign="bottom">

              <form method="post" name="SignOutFrm" action="/cgi-bin/WebObjects/Piano.woa/5/wo/Psd5CQrKRtg0r3OxtuXQ1M/4.3">
              <table border="0" cellspacing="0" cellpadding="10">
                <tr>
                    <td align="left"><font color="gray">[email protected], Vendor 1 name</font></td>                       
                    <td align="left"><input type="submit" value="Sign Out" name="SignBtn" /></td>
                 </tr>
            </table>
            <input type="hidden" name="wosid" value="Psd5CQrKRtg0r3OxtuXQ1M" /></form>


    </td>

      </tr>
    </table>
        </td>
     Reporting > Transaction Reports
        <table border="0" cellspacing="0" cellpadding="5" align="center" width="100%">
       <tr align="center"><td align="center" colspan="2"><font id="iddownloadmsg" color="red" size="2">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;</font></td><td width="1%"></td><td width="15%"><font color="#3564CC"><b><A target="userGuideDoc" onClick="window.open('/cgi-bin/WebObjects/Piano.woa/5/wo/Psd5CQrKRtg0r3OxtuXQ1M/4.11.5.0','userGuideDoc','toolbar=no,location=no,status=no,menubar=no,resizable=yes,scrollbars=yes,width=700,height=700'); return false" href="/cgi-bin/WebObjects/Piano.woa/5/wo/Psd5CQrKRtg0r3OxtuXQ1M/4.11.5.0">User Guide</A></b></font></td></tr><tr><td align="center" valign="top" colspan="4"><font color="#333333" size="4"><strong>Report Options</strong></font>
                    <br>
                    <br></td></tr>
                    <tr>
                        <td align="right" valign="middle" width="40%"><b>Report Type:<br><br></b></td>
                        <td align="left" colspan="3">&nbsp;&nbsp;&nbsp;<select Id="selReportType" onchange="handleSelReportType()" name="11.7"><option value="Summary">Summary</option></select><br><br></td>
                    </tr>
                    <tr>
                        <td align="right" valign="middle"><b>Report Period:<br><br></b></td>
                        <td>&nbsp;&nbsp;&nbsp;<select Id="selDateType" onchange="handleSelDateType()" name="11.9"><option value="Select Date Type">Select Date Type</option><option value="Monthly Free">Monthly Free</option><option value="Weekly">Weekly</option><option value="Daily">Daily</option></select><br>&nbsp;</td>
                    </tr>






        </table>

            <center><table  style="margin-top: 20px;">
              <tr>
               <td><a href="mailto:[email protected]"><img border="0" src="/WebObjects/piano.woa/Contents/WebServerResources/btn_help.gif"></a></td>
              <td>If you have <a href="mailto:[email protected]">feedback</a> or <a href="mailto:[email protected]">questions</a> please let us know.</td>
              </tr>
    </table>
                                                </td> </tr></table> </td>

                                                 </tr>


Copyright © 2008 Apple Inc. All rights reserved.

Downloading Daily Reports Stopped Working

I've been unable to load the daily reports for the last 2-3 days. I see the message "Downloading Daily Reports..." but then nothing happens. Perhaps there's been a change in iTunes Connect that is causing this?

Thumbnail for new App

I have a new app, and it will show up in the reports and Reviews, but without a thumbnail.
In reviews it is just blank, in reports there is an 'app' icon

Previously downloaded files?

I have files that I kept from my previous iPhone and want to move the data to my new iPhone. How do I get the previous files to show up on the new iPhone? I thought I saw a way to do this in the old google group, but that no longer exists.

iOS4 Build Warnings

Hi,

I have just recompilled App Sales-Mobile using the newly released iOS4 SDK.

The build has succeeded, but has 14 Warnings. These range from Depreciated functions to Invalid number of segments of a segmeted control.

Can you tell me if a new iOS4 compatible version will be available?

Thanks.

A better sparkline function

This is an improvement to the existing main screen buttons for the iPhone. It does some better color coding and also shows the last 3 days and last 3 weeks of total revenue on the Days and Weeks buttons. The graphs have also been extended to show 30 days for the Days graph, and it will show lifetime for the Weeks graph with labels beneath.

In RootViewController.m:

- (UIImage *)sparklineForReports:(NSArray *)days { UIGraphicsBeginImageContext(CGSizeMake(180, 37)); CGContextRef c = UIGraphicsGetCurrentContext();

NSSortDescriptor *dateSorter = [[[NSSortDescriptor alloc] initWithKey:@"date" ascending:NO] autorelease];
NSArray *sortedDays = [days sortedArrayUsingDescriptors:[NSArray arrayWithObject:dateSorter]];
Day *lastDay = [sortedDays objectAtIndex:0];
if ( ( !lastDay.isWeek ) && ( [sortedDays count] > 30 ) )
{
// Limit days to 30, but show all weeks in graph so we can see a lifetime summary
sortedDays = [sortedDays subarrayWithRange:NSMakeRange(0, 30)];
}

BOOL reportIsLatest = NO;
if ([sortedDays count] > 0) {
Day *lastDay = [sortedDays objectAtIndex:0];
NSTimeInterval reportAge = [[NSDate date] timeIntervalSince1970] - [lastDay.date timeIntervalSince1970];
if (!lastDay.isWeek && reportAge < 172800) { //48 hours
reportIsLatest = YES;
}
else if (lastDay.isWeek && reportAge < 1209600) { //14 days
reportIsLatest = YES;
}
}

NSMutableArray *unitSales = [NSMutableArray array];

int maxUnitSales = 0;
for (Day *d in [sortedDays reverseObjectEnumerator]) {
float revenue = [d totalRevenueInBaseCurrency];
if (revenue > maxUnitSales)
maxUnitSales = (int)revenue;
[unitSales addObject:[NSNumber numberWithFloat:revenue]];
}

//Use number of sales if no revenue was made (e.g. for free apps):
if (maxUnitSales == 0) {
[unitSales removeAllObjects];
maxUnitSales = 0;
for (Day *d in [sortedDays reverseObjectEnumerator]) {
int units = [d totalUnits];
if (units > maxUnitSales)
maxUnitSales = units;
[unitSales addObject:[NSNumber numberWithInt:units]];
}
}

[[UIColor grayColor] set];
float maxY = 27.0;
float minY = 3.0;
float minX = 2.0;
float maxX = 75.0;
int i = 0;
float prevX = 0.0;
float prevY = 0.0;
CGMutablePathRef path = CGPathCreateMutable();

CGContextBeginPath(c);

if ( lastDay.isWeek )
[@"Lifetime" drawInRect:CGRectMake(minX, 26, maxX-minX, 15) withFont:[UIFont boldSystemFontOfSize:9.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentCenter];
else
[@"Last 30 Days" drawInRect:CGRectMake(minX, 26, maxX-minX, 15) withFont:[UIFont boldSystemFontOfSize:9.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentCenter];

for (NSNumber *sales in unitSales) {
float r = [sales floatValue];
float y = maxY - ((r / maxUnitSales) * (maxY - minY));
float x = minX + ((maxX - minX) / ([unitSales count] - 1)) * i;
if (prevX == 0.0) {
CGPathMoveToPoint(path, NULL, x, y);
}
else {
CGPathAddLineToPoint(path, NULL, x, y);
}
prevX = x;
prevY = y;
i++;
}

if ([unitSales count] > 1) {
CGContextSetLineWidth(c, 1.0);
CGContextSetLineJoin(c, kCGLineJoinRound);
CGContextSetLineCap(c, kCGLineCapRound);

CGMutablePathRef fillPath = CGPathCreateMutableCopy(path);
CGPathAddLineToPoint(fillPath, NULL, prevX, maxY);
CGPathAddLineToPoint(fillPath, NULL, minX, maxY);
[[UIColor colorWithWhite:0.95 alpha:1.0] set];
CGContextAddPath(c, fillPath);
CGContextFillPath(c);
CGPathRelease(fillPath);

[[UIColor grayColor] set];
CGContextAddPath(c, path);
CGContextStrokePath(c);

NSNumber *lastDayUnits = [unitSales lastObject];
NSNumber *lastButOneDayUnits = [unitSales objectAtIndex:[unitSales count]-2];
float percentage = ([lastDayUnits floatValue] - [lastButOneDayUnits floatValue]) / [lastButOneDayUnits floatValue];
int roundedPercent = (int)(percentage * 100.0);
NSString *percentString = (roundedPercent < 0) ? [NSString stringWithFormat:@"%i%%", roundedPercent] : [NSString stringWithFormat:@"+%i%%", roundedPercent];
[(reportIsLatest) ? ([UIColor blackColor]) : ([UIColor darkGrayColor]) set];

if (roundedPercent < 0)
    [[UIColor colorWithRed:0.84 green:0.11 blue:0.06 alpha:1.0] set];
else
    [[UIColor colorWithRed:0.11 green:0.84 blue:0.06 alpha:1.0] set];

[percentString drawInRect:CGRectMake(80, 7, 40, 15) withFont:[UIFont boldSystemFontOfSize:12.0]];
CGContextFillEllipseInRect(c, CGRectMake(prevX-2.5, prevY-2.5, 5, 5));

}

// Show the last 3 days/weeks of total revenue to the right of the graph
NSNumberFormatter *numberFormatter = [[NSNumberFormatter new] autorelease];
[numberFormatter setNumberStyle:NSNumberFormatterDecimalStyle];
[numberFormatter setMinimumFractionDigits:2];
[numberFormatter setMaximumFractionDigits:2];
[numberFormatter setMinimumIntegerDigits:1];
[numberFormatter setPerMillSymbol:@","];

[[UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1.0] set];

int nOffset = 0;
if ([unitSales count] > 1+nOffset)
{
if ( reportIsLatest )
{
// We have the latest report
NSNumber *number = [unitSales objectAtIndex:[unitSales count]-1+nOffset];
NSString *string = [ numberFormatter stringFromNumber:[ NSNumber numberWithFloat:[number floatValue] ] ];
[[NSString stringWithFormat:@"%@%@", [[CurrencyManager sharedManager] baseCurrencyDescription], string] drawInRect:CGRectMake(120, -3, 60, 15) withFont:[UIFont boldSystemFontOfSize:12.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentRight];
}
else
{
// We don't have the latest report, so show ----'s so we know by just looking that we aren't up to date
nOffset = 1; // Shift the two most recent reports down one line
[[UIColor colorWithRed:0.5 green:0.5 blue:0.5 alpha:1.0] set];
[[NSString stringWithFormat:@"- - - - . - -"] drawInRect:CGRectMake(120, -3, 60, 15) withFont:[UIFont boldSystemFontOfSize:12.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentRight];
[[UIColor colorWithRed:0.2 green:0.2 blue:0.2 alpha:1.0] set];
}
}

if ([unitSales count] > 2-nOffset)
{
NSNumber *number = [unitSales objectAtIndex:[unitSales count]-2+nOffset];
NSString *string = [ numberFormatter stringFromNumber:[ NSNumber numberWithFloat:[number floatValue] ] ];
[[NSString stringWithFormat:@"%@%@", [[CurrencyManager sharedManager] baseCurrencyDescription], string] drawInRect:CGRectMake(120, 10, 60, 15) withFont:[UIFont boldSystemFontOfSize:12.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentRight];
}

if ([unitSales count] > 3-nOffset)
{
NSNumber *number = [unitSales objectAtIndex:[unitSales count]-3+nOffset];
NSString *string = [ numberFormatter stringFromNumber:[ NSNumber numberWithFloat:[number floatValue] ] ];
[[NSString stringWithFormat:@"%@%@", [[CurrencyManager sharedManager] baseCurrencyDescription], string] drawInRect:CGRectMake(120, 23, 60, 15) withFont:[UIFont boldSystemFontOfSize:12.0] lineBreakMode:UILineBreakModeClip alignment:UITextAlignmentRight];
}

[[UIColor colorWithRed:0.0 green:0.0 blue:0.0 alpha:1.0] set];

CGPathRelease(path);

UIImage *trendImage = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();
return trendImage;
}

Feature: Enable translate of foreign reviews

Many reviews come for other countries where English (or German) is not the lingua Franca (per se - natch). Having a link that would submit the text to Google translate using the country of origin (with it's most common language as the source) and a destination langauge from a preference, would be great.

Or at least enable copying of the text to bring it into a browser ourselves.

PS. Great work! I use it all the time!

Remove reviews for in-app sales

Reviews for in-app sales are copies of reviews for the app in which they appear, so having them download and appear in the list of reviews is a waste of time and resources.

I am happy to make the change that excludes in-app purchases from the code that grabs reviews online if someone would provide the information I need to get those changes into the main code branch or get those changes to the developer so that he can commit them. I don't want to have local changes to the code that don't carry over to new revisions.

The executable was signed with invalid entitlements

Since the Entitlements.plist was added to the project, it won't allow you to install it on a device, giving the error in the title.
Fix: Command + I on the target (AppSalesMobile), go to the Build tab and double click on the Code Signing -> Code Signing Entitlements. Erase "Entitlements.plist" and you'll be able to compile and install the application on the device.

Incorrect data

Since you introduced the 2modes for the graphs (by revenue and by sales) the differences on the home screen (daily and weekly) are messed up. I dont't know if they show differences by sales, but it's not by revenue. Toggling the mode from the graphs screen doesnt seem to affect this.

I was using an older version of the app because of this behavior, but the recent itunesconnect change broke it and it doesnt work at all.

Reviews not taken from products with only imported report sales

When importing reports into AS-M, I've found that reviews are not downloaded for products where the only reported sales have come in through the import mechanism. Only sales that have been downloaded are captured for review downloads. This patch corrects that:

diff -ru AppSales-Mobile-pristine/Classes/ReportManager.m AppSales-Mobile/Classes/ReportManager.m
--- AppSales-Mobile-pristine/Classes/ReportManager.m    2010-07-09 13:50:31.000000000 -0500
+++ AppSales-Mobile/Classes/ReportManager.m     2010-07-13 13:41:08.000000000 -0500
@@ -638,6 +638,19 @@
                [weeks setObject:report forKey:report.date];
        } else {
                [days setObject:report forKey:report.date];
+               for (Country *c in [report.countries allValues]) {
+                       for (Entry *e in c.entries) {
+                               NSString *appID = e.productIdentifier;
+                               NSString *appName = e.productName;
+                               if (appID && ![self.appsByID objectForKey:appID]) {
+                                       App *app = [[App new] autorelease];
+                                       app.appID = appID;
+                                       app.appName = appName;
+                                       app.reviewsByUser = [NSMutableDictionary dictionary];
+                                       [appsByID setObject:app forKey:appID];
+                               }
+                       }
+               }
        }
 }

Display of report date depends on timezone

The date stored with the individual day data is time-zone dependent - if some reports are downloaded in a different time zone than others, the list of days will show missing and duplicate days.

corrupted day cannot be deleted or redownloaded

after a failed download session (due to bad connection) it seems that a day was badly downloaded.
This day wouldn't appear in the list (so I couldn't delete it) and wouldn't be downloaded.
I have fixed this instance of the issue by using the debugger and manually calling the deleteDay but I think that corrupted days should either be detected and automatically cleaned or should show in the list so they can be manually deleted.
I have the .dat file corresponding to the corrupted day, but I can't upload it to the issue.

Reviews count

I have 45 reviews with my app.
After downloading it says 45 reviews (43 new)
I mark them all as read (with the button "Mark all as read") and push the Download button.

Again 45 reviews (43 new)

This happened a little while ago after an update.

Idle timer should be disabled while downloading reports/reviews

I think you should add [[UIApplication sharedApplication] setIdleTimerDisabled:YES/NO] in the updateProgress and updateStatus functions, so that while reports or reviews are being downloaded, the device won't go into sleep mode (like when downloading reviews for all countries, which can take a long time). I've already made those changes in my version, and it works better this way (for me at least).

Import works on iOS 4.0 but encoding is wrong...

Hi, I did import my reports by using build-in update and import a ZIP file which contains reports in txt format. The build-in works great but the import one got wrong application name since it is in Chinese...

Blank Graphs

Free apps are displayed as blank graphs when the mode is on revenue.

Stopped downloading Weekly Reports

The last weekly report downloaded was for 23 Nov, I haven't had any since on my iPhone. Daily reports are downloaded fine. Strangely enough, when I run it in the simulator it works, and downloads the two missing Weekly reports.

I have updated to the latest version as of today, 16 Dec, still has this issue.

Mutliple Logins

I work on three different companies so it would be nice to store all three logins and the data is saved in separately for those three.

Exporting all sales to a master.log file

I have code to generate a master.log file that includes all days and weeks of sales even from earlier versions of AppSalesMobile. I had 450+ days of sales held hostage on my iPhone, so I wrote these functions to export all of the data so I could back up all of my sales numbers and get the data onto my iPad. I noticed that the newer version of this app lost details of my weekly sales from a while ago...so these functions will generate new weekly sales reports based on the daily sales data that is stored on the device. If anyone is interested, reply here and I'll post the code or email it to you if you can merge it into the github code base.

login screen does not use UITableView

It would be create if the login screen used a UITableView with custom cells instead of a view with a faux table background and some text boxes. UITableViews are always a pain to get data out of and not lose it on redraw, but it is worth it, I think.

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.