ارسال و بررسی وضعیت

ارسال صورتحساب‌ها در تدبیر مؤدیان از طریق دامنهٔ api.moaddiyan.com انجام نمی‌شود و برای ارسال به سرور اصلی یا سندباکس باید از دامنه‌های دیگری استفاده کنید (دلیل این امر تلاش برای مدیریت بهتر ارسال در سمت سرور و جداسازی فراخوانی‌های پرهزینهٔ ارسال از فراخوانی‌های عادی است).

نشانی فعلی ارسال به سرور اصلی تدبیر مؤدیان snd.moaddiyan.com (بدون http یا هر چیز اضافه) و نشانی فعالی ارسال به سرور سندباکس از طریق تدبیر مؤدیان box.moaddiyan.com است. اما بهتر است از کدهایی شبیه تکه‌کدهای زیر برای به دست آوردن مقادیر آنها استفاده کنید.

private async Task<string> GetServiceUrlForSendAsync()
{
    try
    {
        using (HttpClient httpClient = new HttpClient())
        {
            await MoaddiyanSessionChecker.PrepareClientAsync(httpClient);
            var response = await httpClient.GetAsync
                (
                $"https://api.moaddiyan.com/api/taxoptions/ServiceUrlForIntamediaSend"
                );
            if (response.StatusCode != HttpStatusCode.OK)
            {
                Cursor = Cursors.Default;
                Enabled = true;
                MessageBox.Show(JsonConvert.DeserializeObject<string>(await response.Content.ReadAsStringAsync()));
                return "";
            }
            response.EnsureSuccessStatusCode();
            Cursor = Cursors.Default;
            Enabled = true;
            return JsonConvert.DeserializeObject<string>(await response.Content.ReadAsStringAsync());//snd.moaddiyan.com
        }
    }
    catch (Exception exp)
    {
        Cursor = Cursors.Default;
        Enabled = true;
        MessageBox.Show(exp.ToString());
        return "";
    }
}

private async Task<string> GetServiceUrlForSandBoxAsync()
{
    try
    {
        using (HttpClient httpClient = new HttpClient())
        {
            await MoaddiyanSessionChecker.PrepareClientAsync(httpClient);
            var response = await httpClient.GetAsync
                (
                $"https://api.moaddiyan.com/api/taxoptions/ServiceUrlForSandBox"
                );
            if (response.StatusCode != HttpStatusCode.OK)
            {
                Cursor = Cursors.Default;
                Enabled = true;
                MessageBox.Show(JsonConvert.DeserializeObject<string>(await response.Content.ReadAsStringAsync()));
                return "";
            }
            response.EnsureSuccessStatusCode();
            Cursor = Cursors.Default;
            Enabled = true;
            return JsonConvert.DeserializeObject<string>(await response.Content.ReadAsStringAsync());//box.moaddiyan.com
        }
    }
    catch (Exception exp)
    {
        Cursor = Cursors.Default;
        Enabled = true;
        MessageBox.Show(exp.ToString());
        return "";
    }
}

برای ارسال صورتحساب‌ها از کدی مانند تکه‌کد زیر استفاده کنید:

 private async void btnSend_Click(object sender, EventArgs e)
 {
     if(grd.SelectedRows.Count == 0)
     {
         MessageBox.Show("لطفاً صورتحسابهای مد نظر را انتخاب کنید.");
         return;
     }
     var workspaces = JsonConvert.DeserializeObject<WorkspaceExViewModel[]>(Settings.Default.WorkspacesJson);
     var workspace = workspaces.Where(w => w.Workspace.Id == Settings.Default.WorkspaceId).Single();

     List<Guid> idArray = new List<Guid>();
     foreach (DataGridViewRow row in grd.SelectedRows)
     {
         idArray.Add((row.DataBoundItem as IntamediaInvoice).Id);
     }
     try
     {
         string serviceUrl = workspace.TaxInfo.SandBox ? await GetServiceUrlForSandBoxAsync() : await GetServiceUrlForSendAsync();
         using (HttpClient httpClient = new HttpClient())
         {
             await MoaddiyanSessionChecker.PrepareClientAsync(httpClient);
             var response = await httpClient.PostAsync
                 (
                 $"https://{serviceUrl}/api/invoice/{Settings.Default.WorkspaceId}/queue",
                  new StringContent(JsonConvert.SerializeObject(idArray), Encoding.UTF8, "application/json")
                 );
             if (response.StatusCode != HttpStatusCode.OK)
             {
                 Cursor = Cursors.Default;
                 Enabled = true;
                 MessageBox.Show(JsonConvert.DeserializeObject<string>(await response.Content.ReadAsStringAsync()));
                 return;
             }
             response.EnsureSuccessStatusCode();
             MessageBox.Show("صورتحسابهای انتخاب شده در صف ارسال قرار گرفتند.");
         }
     }
     catch (Exception exp)
     {
         Cursor = Cursors.Default;
         Enabled = true;
         MessageBox.Show(exp.ToString());
         return;
     }
 }

پس از قرار گرفتن صورتحساب‌ها در صف ارسال و در نوبت خود آنها به سرور سامانهٔ مؤدیان ارسال می‌شوند.

سرور تدبیر مؤدیان پس از کمی وقفه (توصیه شده در دستورالعمل ارسال صورتحساب به سامانه) اقدام به استعلام وضعیت صورتحسابهای ارسالی می‌کند و پس از دریافت یک وضعیت نهایی (ارسال موفق یا خطا) وضعیت صورتحساب را به‌روزرسانی می‌کند.

شما در کد خودتان برای فرایند استعلام کاری لازم نیست (و نمی‌توانید) بکنید.

اگر می‌خواهید کاربر را در برنامهٔ خودتان از وضعیت مطلع کنید یا فیلدهای اطلاعاتی برنامهٔ خودتان را به‌روزآوری کنید با یک تأخیر چند ثانیه‌ای می‌توانید اطلاعات صورتحساب‌های ارسالی را مجدداً GET کنید و با بررسی وضعیت فیلد InvoiceStatus جهت تعیین این که ارسال موفق بوده یا خیر و در صورت لزوم بررسی مقادیر فیلد Results جهت اعلان خطاهای سامانه‌ای به کاربر نسبت به این امر اقدام کنید.