4. TP ۱: مدیریت پایهٔ یک برگهٔ پرداخت
4.1. Introduction
برای عملی کردن آنچه تاکنون آموختهایم، اکنون پروژهای را پیشنهاد میکنیم که شامل توسعه یک کلاینت اندروید برای تبلتها است و برای شبیهسازی محاسبات حقوق و دستمزد کارکنان یک مؤسسه خیریه طراحی شده است.
این برنامه دارای معماری کلاینت/سرور خواهد بود:

- سرور [1] فراهم شده است؛
- شما باید کلاینت اندروید [2] را بسازید.
4.2. پایگاه داده
4.2.1. تعریف
دادههای ثابتی که برای تولید فیش حقوقی لازم است در پایگاهدادهٔ dbpam ذخیره خواهد شد. این پایگاهداده شامل جداول زیر است:
ساختار:
کلید اصلی | |
شماره نسخه – با هر اصلاح در سطر افزایش مییابد | |
شماره بیمه اجتماعی ملی کارمند – منحصر به فرد | |
نام کارمند | |
نام کوچک آنها | |
آدرس آنها | |
شهر او | |
کد پستی او | |
کلید خارجی روی فیلد [ID] در جدول [INDEMNITES] |
محتوای آن میتواند به شرح زیر باشد:

ساختار:
کلید اصلی | |
شماره نسخه – با هر تغییر در سطر افزایش مییابد | |
درصد: مشارکت اجتماعی کلی + مشارکت در بازپرداخت بدهی اجتماعی | |
درصد: سهم اجتماعی عمومی قابل کسر | |
درصد: تأمین اجتماعی، مستمری بیوگی، مستمری پیری | |
درصد: مستمری تکمیلی + بیمه بیکاری |
محتوای آن میتواند به شرح زیر باشد:
![]()
نرخهای حق بیمه تأمین اجتماعی به کارمند بستگی ندارند. جدول بالا تنها شامل یک سطر است.
کلید اصلی | |
شماره نسخه – با هر تغییر در سطر افزایش مییابد | |
شاخص پردازش – یکتا | |
قیمت خالص به یورو برای یک ساعت آمادهباش | |
کمکهزینه نگهداری به یورو برای هر روز مراقبت | |
مبلغ کمکهزینه غذا به یورو برای هر روز مراقبت از کودک | |
اضافه حقوق تعطیلات. این درصد است که باید به حقوق پایه اعمال شود. |
محتوای آن میتواند به شرح زیر باشد:

شایان ذکر است که مزایای دریافتی ممکن است از یک پرستار کودک به دیگری متفاوت باشد. این مزایا در واقع از طریق گروه حقوق به هر پرستار کودک خاص مرتبط هستند. برای مثال، خانم ماری جووینال که رتبه حقوق ۲ (جدول EMPLOYES) دارد، دستمزد ساعتی ۲.۱ یورو (جدول INDEMNITES) است.
4.2.2. تولید
اسکریپت تولید پایگاه داده [dbpam_hibernate.sql] ارائه شده است:
![]() |
پایگاه داده [dbpam_hibernate] را ایجاد کنید (این نام پایگاه داده BD است که توسط وب سرور / jSON استفاده میشود) و اطمینان حاصل کنید که ورود root (بدون رمز عبور) میتواند به آن دسترسی داشته باشد. شما میتوانید این کار را به شرح زیر انجام دهید:
MySQL را اجرا کنید و سپس [PhpMyAdmin] را:
![]() | ![]() |
- [1-2]: اسکریپت [dbpam_hibernate.sql] را وارد کرده و سپس آن را اجرا کنید؛
4.2.3. مدلسازی پایگاه داده جاوا
عناصر جداول [EMPLOYES]، [INDEMNITES] و [COTISATIONS] توسط کلاسهای زیر مدلسازی شدهاند:
[Employe]
package pam.entities;
import java.io.Serializable;
public class Employe implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private int version;
private String SS;
private String nom;
private String prenom;
private String adresse;
private String ville;
private String codePostal;
private int idIndemnite;
private Indemnite indemnite;
public Employe() {
}
public Employe(String SS, String nom, String prenom, String adresse, String ville, String codePostal, Indemnite indemnite) {
...
}
// گیرندهها و تنظیمکنندهها
....
}
- ردههای ۸ تا ۱۵: این فیلدها با ستونهای جدول [EMPLOYES] مطابقت دارند؛
- خط ۱۶: فیلد [indemniteId] با ستون [INDEMNITE_ID] مطابقت دارد که کلید خارجی جدول [EMPLOYES] است؛
- خط ۱۷: فوقالعاده کارمند. این فیلد همیشه پر نمیشود:
- هنگام درخواست URL [/employes]، پر نمیشود،
- بلکه هنگام درخواست URL و [/salaire] است؛
[Indemnite]
package pam.entities;
import java.io.Serializable;
public class Indemnite implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private int version;
private int indice;
private double baseHeure;
private double entretienJour;
private double repasJour;
private double indemnitesCp;
public Indemnite() {
}
public Indemnite(int indice, double baseHeure, double entretienJour, double repasJour, double indemnitesCP) {
...
}
// گیرنده و تنظیمکنندهها
....
}
- ردههای ۸–۱۴: فیلدها با ستونهای جدول [INDEMNITES] مطابقت دارند؛
[Cotisation]
package pam.entities;
import java.io.Serializable;
public class Cotisation implements Serializable {
private static final long serialVersionUID = 1L;
private Long id;
private int version;
private double csgrds;
private double csgd;
private double secu;
private double retraite;
public Cotisation() {
}
public Cotisation(double csgrds, double csgd, double secu, double retraite) {
...
}
// گیرنده و تنظیمکنندهها
...
}
- خطوط ۸–۱۳: فیلدها با ستونهای جدول [COTISATIONS] مطابقت دارند؛
4.3. نصب وبسرور / jSON
![]() |
4.3.1. نصب
بینیری جاوا برای وبسرور / jSON ارائه شده است:
![]() |
برای راهاندازی وبسرور / jSON، مراحل زیر را دنبال کنید:
- دستور SGBD MySQL را اجرا کنید؛
- اطمینان حاصل کنید که BD و [dbpam_hibernate] وجود دارند؛
- یک پنجره DOS را باز کنید؛
- به پوشه jar بروید؛
- دستور را تایپ کنید:
این فرض را در نظر میگیرد که باینری [java.exe] در دایرکتوری PATH روی سیستم شما قرار دارد. اگر اینطور نباشد، مسیر کامل [java.exe] را وارد کنید، برای مثال:
برخی گزارشها نمایش داده میشوند:
- خط ۱۶: URL [/salaire/{SS}/{ht}/{jt}] شناسایی شد؛
- خط ۱۷: URL و [/employes] شناسایی شدند؛
4.3.2. URL از سرویس وب/jSON
![]() |
سرویس وب / jSON توسط Spring MVC پیادهسازی شده و دو URL را ارائه میدهد:
@RequestMapping(value = "/employes", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public EmployesResponse getEmployes() {
...
@RequestMapping(value = "/salaire/{SS}/{ht}/{jt}", method = RequestMethod.GET, produces = "application/json; charset=UTF-8")
public FeuilleSalaireResponse getFeuilleSalaire(@PathVariable("SS") String SS, @PathVariable("ht") double ht, @PathVariable("jt") int jt) {
سرویس وب دو درخواست URL زیر را میپذیرد:
- خط ۱: /کارمندان: برای بازیابی فهرست کارمندان؛
- خط ۴: /salary/SS/ht/jt: برای بازیابی فیش حقوقی کارمندی با شناسه [SS] که [ht] ساعت در [jt] روز کار کرده است؛
در اینجا چند اسکرینشات برای نمایش این موضوع آورده شده است.
ما در حال درخواست کارمندان هستیم:

ما پایگاه داده را خاموش کرده، سرور را مجدداً راهاندازی میکنیم و کارمندان را استعلام میگیریم:

ما یک حقوق را استعلام میکنیم:

ما حقوق یک شخص وجود ندارد را درخواست میکنیم:

4.3.3. پاسخها jSON از سرویس وب/jSON
![]() |
![]() |
سرویس وب URL / jSON پاسخهایی از نوع [Response<T>] ارسال میکند:
package client.android.dao.service;
import java.util.List;
public class Response<T> {
// ----------------- ویژگیها
//وضعیت تراکنش
private int status;
// هر پیام وضعیت
private List<String> messages;
// بدنه پاسخ
private T body;
// سازندهها
public Response() {
}
public Response(int status, List<String> messages, T body) {
this.status = status;
this.messages = messages;
this.body = body;
}
// گیرنده و تنظیمکننده
...
}
- URL و [/employes] نوع Response<List<Employee>> را بازمیگردانند؛
- URL و [/salaire] نوع Response<FeuilleSalaire> را برمیگردانند؛
کلاس [FeuilleSalaire] به شرح زیر است:
package pam.entities;
import java.io.Serializable;
public class FeuilleSalaire implements Serializable {
private static final long serialVersionUID = 1L;
// fields خصوصی
private Employe employe;
private Cotisation cotisation;
private ElementsSalaire elementsSalaire;
// سازندهها
public FeuilleSalaire() {
}
public FeuilleSalaire(Employe employe, Cotisation cotisation, ElementsSalaire elementsSalaire) {
...
}
// گیرندهها و تنظیمکنندهها
...
}
کلاس [ElementsSalaire] (خط ۱۱) به شرح زیر است:
package pam.entities;
import java.io.Serializable;
public class ElementsSalaire implements Serializable {
private static final long serialVersionUID = 1L;
// میدانهای خصوصی
private double salaireBase;
private double cotisationsSociales;
private double indemnitesEntretien;
private double indemnitesRepas;
private double salaireNet;
// سازندهها
public ElementsSalaire() {
}
public ElementsSalaire(double salaireBase, double cotisationsSociales, double indemnitesEntretien, double indemnitesRepas, double salaireNet) {
...
}
// گیرندهها و تنظیمکنندهها
...
}
4.4. تستهای کلاینت اندروید
![]() |
بینیار اجرایی کلاینت اندروید آماده زیر ارائه شده است:
![]() |
با استفاده از ماوس خود، باینری [pam-client.apk] را که در بالا نشان داده شده است، روی شبیهساز تبلت [GenyMotion] بکشید. سپس ذخیره و اجرا خواهد شد. همچنین اگر قبلاً این کار را انجام ندادهاید، وبسرور / jSON را نیز راهاندازی کنید. هدف کلاینت اندروید دریافت اطلاعاتی است که توسط سرور وب / jSON بازگردانده میشود و قالببندی آن است. نماهای مختلف کلاینت اندروید به شرح زیر است:
ابتدا باید به سرویس وب / jSON متصل شوید:

- در [1]، URL را از سرویس وب / jSON وارد کنید. با استفاده از شبیهساز، یکی از آدرسهای IP را از PC وارد کنید (اما نه 127.0.0.1). روی تبلت، آدرس وایفای ماشین وبسرور / jSON را وارد کرده و در صورتی که فایروال دارد، آن را غیرفعال کنید، زیرا ممکن است درخواستهای ورودی را مسدود کند؛
- در [2]، وارد شوید؛
سپس به صفحه شبیهسازی هدایت میشوید:

- در [3]، یک کارمند را انتخاب کنید؛
- در [4]، تعداد ساعاتی را وارد کنید؛
- در [5]، تعداد روزها را وارد کنید؛
- در [6]، شبیهسازی را اجرا کنید؛
صفحه شبیهسازی نمایش داده شده به شرح زیر است:

- در [7]، نتیجه شبیهسازی؛
- در [8]، آن را ذخیره میکنید؛

- در [9]، فهرست شبیهسازیها؛
- در [10]، یک شبیهسازی حذف میشود؛

- در [11]، دیگر شبیهسازیای وجود ندارد؛
- در [12]، بازگشت به فرم شبیهسازی؛

- در [13]، فرم دوباره ظاهر میشود؛
- در [14]، به صفحه پیکربندی بازمیگردید؛

- در [15]، به فرم ورود اولیه بازمیگردید.
4.5. وظیفه
چارچوب کلاینت اندروید که پیشتر معرفی شد، در اختیار شما قرار گرفته است. این چارچوب از پروژه [client-android-skel] که در پاراگراف ۲ توصیف شده، ساخته شده است.
![]() |
این پروژه قابل اجرا است و از قبل شامل ویوهای لازم میباشد. شما تنها باید مقداری کد اضافه کنید تا برنامه همان کاری را که باید انجام دهد، انجام دهد. رویهای که باید دنبال کنید به شرح زیر است:
- نسخه کامل را اجرا کنید تا با حجم کار آشنا شوید؛
- نسخهٔ سادهشده را اجرا کرده و کد آن را مطالعه کنید. این نسخه مطابق روشهای طراحی بهکاررفته در صفحات قبلی است؛
- کدهای گمشده را اضافه کنید؛










