# سامانه دانیال همراه
یکی از شرکت های معتبر واردات قعطات کامپیوتری (به نام دانیال همراه) هر ماه قطعاتی را از کشورهای مختلف وارد می کند. این شرکت اخیرا با مشکلات متعددی برای امور گارانتی خود مواجه شده است. روال گارانتی به این صورت است که الزاما بایستی شماره سریال قطعه مورد نظر توسط خریدار نهایی به شرکت اعلام شود. به همین دلیل شرکت برای هر دستگاه یک کارت گارانتی چاپ کرده که بر روی کارت شماره سریال قطعه و همچنین کد فعالسازی گارانتی چاپ شده است. کد فعالسازی به صورت مخفی و تحت یک `scratch code` بر روی کارت چاپ می شود.
حال می خواهیم سیستمی با مشخصات زیر برای ارائه کدهای گارانتی به مشتریان شرکت پیاده سازی کنیم.
## پروژه اولیه
فایل های پروژه اولیه را می توانید از [اینجا](https://quera.ir/qbox/download/OnbVnGdZQz/danial-hamrah.zip) دانلود کنید. این پروژه بر اساس کتابخانه لاراول نسخه `5.8.*` پیاده سازی خواهد شد.
فایل هایی که اضافه بر ساختار معمول پروژه های لاراول در اختیار شما قرار شده است عبارتند از :
- فایل `input.xlsx` که در مسیر `storage/app/input.xlsx` قرار داده شده است. این فایل از طرف شرکت به ما داده می شود و شامل دو ستون است. ستون اول یا `A` کد یکتای شناسایی محصولات (شبیه به شماره سریال) بوده و ستون دوم کد فعالسازی است که شرکت به صورت تصادفی برای هر قطعه مشخص کرده.
- فایل `CValidator.php` که در مسیر `app/CValidator.php` قرار داده شده است و شامل تابع اعبتارسنجی کد ملی است که برای قسمت اعتبارسنجی می توانید از آن استفاده کنید.
- فایل های مورد نیاز برای قسمت `Frontend` که در پوشه های `resource/views/home` و `public/css` قرار داده اند تا نیازی به توسعه `css/html` از سمت شما به حداقل ممکن برسد.
## لیست نیازمندی ها
- با توجه با اینکه مدیریت شرکت نسبت به امنیت سامانه بسیار حساس است، مخالفت بسیار زیادی با این پروژه داشته است. لذا به ایشان اطمینان دادیم که امنیت سامانه به نحوی تامین شود که اگر حتی کل فایل ها و پایگاه داده برنامه مورد حمله واقع شد اطلاعات کد های فعالسازی دچار مشکل و دستبرد نشود. به همین دلیل امکان استفاده مستقیم از فایل اکسل ورودی را نداریم. بایستی یک دستور `Artisan` به نام `GenerateFile` ایجاد کنید تا با فراخوانی این دستور یک فایل `csv` به این صورت ایجاد شود که هر سطر آن معادل یک سطر در فایل اکسل بوده با این تفاوت که فیلد شماره سریال ها (فیلد اول) به صورت `hash` شده با الگوریتم `sha1` ذخیره شود و فیلد دوم با استفاده از کلاس `Crypto` لاراول رمز نگاری شود. در اینصورت حتی اگر کل اطلاعات در دسترس نفر دیگری قرار بگیرد بدون داشتن شماره سریال ها به صورت `palin text` نمی تواند از کدهای گارانتی استفاده کند. برای انجام این قسمت در نظر داشته باشید که فایل `csv` با نام `data.csv` در آدرس `storage/app/data.csv` باید ساخته شود و کاراکتر `delimiter` حتما بایستی `,` باشد اما خط ابتدای فایل که نام `field` ها در آن نوشته می شود مورد داوری قرار نمیگیرد و مختارید که از هر نامی استفاده کنید ولی وجود آن الزامی است.
- لیست `route` های مورد نیاز در فایل `routes/web.php` از قبل نوشته شده است. برنامه به صورت یک فرم ۳ مرحله ای بوده و در هر مرحله اطلاعات مورد نیاز دریافت و اعتبارسنجی (`validate`) می شوند.
- در مرحله اول فیلدهای نام و نام خانوداگی صرفا خالی یا پر بودنشان ملاک بررسی است. هیچ شرط اضافه ای نخواهند داشت.
- فیلد کد ملی علاوه بر شرط پر بودن باید با توجه به تابع موجود در فایل `CValidator` مورد بررسی قرار گرفته تا از اعتبار اولیه آن مطمئن شویم.
- منظور از فیلد کد گارانتی همان فیلد `serial_number` در فایل اکسل است که علاوه بر شرط پر بودن باید در لیست ارائه شده نیز موجود باشد. یعنی مقدار وارد شده توسط کاربر را بررسی خواهیم کرد که آیا در محتویات ستون اول فایل اکسل وجود دارد یا نه؟. ضمنا این فیلد بایستی از نظر تعداد کاراکتر ها (که ۲ کاراکتر عددی می باشد) نیز مورد بررسی قرار بگیرد
- در صورتیکه کلیه اطلاعات به درستی وارد شد، کاربر را به صفحه دوم منتقل میکنیم و قبل از آن دو کلید در `session` ست می کنیم. اول کلید `gid` که همان کد گارانتی است که کاربر به درستی وارد کرده و دوم کلید `code` که محتوی کد موقتی است که برای اعتبار سنجی کاربر مورد استفاده قرار خواهد گرفت.
- کد موقت تولید شده قبلا از طریق پیامک به دست کاربر می رسید اما به دلیل شرایط مسابقه فعلا تصمیم گرفتیم که کد را مستقیما در مرحله دوم به کاربر نشان بدهیم.
- با ارسال فرم در مرحله دوم اولا بررسی خواهیم کرد که کلید های `session` که در مرحله اول ست شده بودند همچنان وجود داشته و مقادیر آنها معتبر باشند (در صورت عدم وجود کلید ها بایستی کاربر به مرحله قبل منتقل شود) و دوما مقدار `code` که کاربر وارد میکند با کدی که در مرحله ۱ تولید شده است یکسان و همخوان باشد. ضمنا فیلد `code` بایستی از نظر تعداد کاراکتر ها (که ۶ کاراکتر عددی می باشد) نیز مورد بررسی قرار بگیرد
- در صورتیکه کد موقت به درستی وارد شود، کاربر را به مرحله سوم منتقل میکنیم و کد فعالسازی متناظر با کد گارانتی وارد شده را رمزگشایی کرده و به او نمایش میدهیم.
- لطفا نکات زیر را برای داوری صحیح پاسخ هایتان در نظر داشته باشید :
-ملاک بررسی صحت اعتبارسنجی های انجام شده کلید `errors` در `session` می باشد که به صورت عادی توسط لاراول ست می شود. به بیان دیگر حتما سعی کنید از توابع و کلاس های موجود در لاراول برای اعتبارسنجی و تولید خطاهای احتمالی استفاده کنید تا کمترین میزان مغایرت با داوری را داشته باشید. به این منظور می توانید از قسمت [`Validation`](https://laravel.com/docs/5.8/validation) کمک بگیرید.
-پیغام های تولید شده در اعتبار سنجی ها کاملا باید مطابق لیست زیر باشد (واضح است که حتی ۱ کاراکتر اختلاف باعث رد شدن جواب خواهد شد) :
```
پر کردن فیلد نام اجباری می باشد
پر کردن فیلد نام خانوادگی اجباری می باشد
پر کردن فیلد کد ملی اجباری می باشد
کد ملی وارد شده صحیح نمی باشد
پر کردن فیلد کد گارانتی اجباری می باشد
کد گارانتی وارد شده معتبر نمی باشد
تعداد رقم های وارد شده برای کد گارانتی صحیح نمی باشد
پر کردن فیلد کد موقت اجباری می باشد
تعداد رقم های وارد شده برای کد موقت صحیح نمی باشد
کد موقت وارد شده صحیح نمی باشد
کد فعالسازی شما عبارت است از : 13
```
- در نظر داشته باشید که در طول برنامه پس از تولید فایل `data.csv` فایل ورودی اکسل اولیه حذف خواهد شد و دیگر در دسترس نخواهد بود. لذا در ادامه بایستی همه چیز با استفاده از اطلاعات فایل تولید شده بررسی و ارائه شود.
- برای استخراج اطلاعات از فایل اکسل می توانید از کتابخانه های آماده استفاده کنید و فایل `composer.json` را همراه پاسخ خود آپلود کنید.
- در صفحات مختلف، نسبت به مرحله ای که فعال می باشد، بایستی وضعیت نمایش داده شده در بالای فرم (که مراحل را به صورت فعال و غیر فعال نمایش می دهد) صحیح باشد. مثلا در صفحه ای که آدرس آن `/step2` است باید مراحل ۱ و ۲ هردو فعال باشند (کلاس `active` به عنصر `li` داده شود).
## آنچه باید آپلود کنید
پوشه های زیر را در یک فایل فشرده با فرمت `zip` آپلود کنید :
```
app
config
resources
routes
composer.json
```
### تصحیح
+ گویا فایل `input.xlsx` که در پروژه اولیه قرار داده شده با نرم افزار اکسل مشکل دارد و باز نمیشود. اول این که فایل از نظر محتوایی سالمه و با کدهای php میشه محتواش رو خوند و دوم اینکه میتونید همون فایل رو با google sheet باز کنید یا اینکه فایل جدید رو از این [آدرس](https://quera.ir/qbox/download/DF4BnTrsxQ/input.xlsx) دانلود کنید و جایگزین کنید.
+ در مرحله دوم در صورتیکه همه چیز صحیح باشد، بایستی کد فعالسازی به صورت رمزگشایی شده در یک متغیر `session` با کلید `activation_code` قرار بگیرد و کاربر به مرحله سوم منتقل شده و کد فعالسازی به کاربر نشان داده شود.