Skip to content

Instantly share code, notes, and snippets.

@CodeCouturiers
Created August 8, 2024 10:22
Show Gist options
  • Save CodeCouturiers/8d13a87409a54732073ea9534376c3ef to your computer and use it in GitHub Desktop.
Save CodeCouturiers/8d13a87409a54732073ea9534376c3ef to your computer and use it in GitHub Desktop.
@CodeCouturiers
Copy link
Author

СУБПІДРЯДНИЙ ДОГОВІР
про надання послуг (виконання робіт) у сфері інформатизації

м. Київ «» ________ 20 р.

Товариство з обмеженою відповідальністю «IT-РОЗРОБНИК-УКРАЇНА» (Ідентифікаційний код _____________), в особі директора ______________, який діє на підставі Статуту, іменоване надалі «Генеральний підрядник» з однієї сторони, та

Фізична особа-підприємець ____________________, іменований надалі «Субпідрядник», з іншої сторони,

разом іменовані «Сторони», а окремо – «Сторона», уклали цей Субпідрядний договір про надання послуг (виконання робіт) у сфері інформатизації (надалі – «Договір») про наступне:

  1. ПРЕДМЕТ ДОГОВОРУ

1.1. Генеральний підрядник доручає, а Субпідрядник зобов'язується надати послуги та виконати роботи у сфері інформатизації (надалі – Послуги/Роботи) відповідно до Технічного завдання (Додаток № 1), яке є невід'ємною частиною цього Договору.

1.2. Послуги/Роботи надаються/виконуються Субпідрядником в рамках виконання Генеральним підрядником договору №___ від ..20___ р. з ________________ (надалі – «Замовник»).

  1. ПРАВА ТА ОБОВ'ЯЗКИ СТОРІН

2.1. Генеральний підрядник зобов'язаний:
2.1.1. Надати Субпідряднику необхідну для виконання Послуг/Робіт інформацію та матеріали.
2.1.2. Прийняти та оплатити належним чином надані Послуги/Роботи.

2.2. Генеральний підрядник має право:
2.2.1. Контролювати процес надання Послуг/Робіт Субпідрядником.
2.2.2. Вимагати від Субпідрядника усунення недоліків, виявлених під час приймання Послуг/Робіт.

2.3. Субпідрядник зобов'язаний:
2.3.1. Надати Послуги/Роботи якісно та в строки, визначені цим Договором.
2.3.2. Передати Генеральному підряднику результати Послуг/Робіт, включаючи вихідний код, документацію та інші матеріали.
2.3.3. Не розголошувати конфіденційну інформацію Генерального підрядника та Замовника.
2.3.4. Не вступати в прямі контакти з Замовником без згоди Генерального підрядника.

2.4. Субпідрядник має право:
2.4.1. Отримувати від Генерального підрядника інформацію, необхідну для надання Послуг/Робіт.
2.4.2. Отримати оплату за надані Послуги/Роботи.

  1. ВАРТІСТЬ ПОСЛУГ/РОБІТ ТА ПОРЯДОК РОЗРАХУНКІВ

3.1. Загальна вартість Послуг/Робіт за цим Договором становить _______ грн (__________ гривень __ копійок), без ПДВ.

3.2. Оплата здійснюється в наступному порядку:

  • 30% від вартості - протягом 5 банківських днів з моменту підписання Договору;
  • 70% від вартості - протягом 5 банківських днів після підписання Акту приймання-передачі наданих Послуг/Робіт.

3.3. Генеральний підрядник здійснює оплату Субпідряднику після отримання оплати від Замовника за відповідний етап робіт.

  1. ПОРЯДОК ЗДАЧІ-ПРИЙМАННЯ ПОСЛУГ/РОБІТ

4.1. Після завершення надання Послуг/Робіт Субпідрядник надає Генеральному підряднику два примірники підписаного Акту приймання-передачі наданих Послуг/Робіт.

4.2. Генеральний підрядник протягом 5 робочих днів з моменту отримання Акту зобов'язаний підписати його або надати мотивовану відмову.

4.3. У разі мотивованої відмови Сторони складають двосторонній акт з переліком необхідних доопрацювань та строків їх виконання.

  1. ПРАВА ІНТЕЛЕКТУАЛЬНОЇ ВЛАСНОСТІ

5.1. Субпідрядник передає Генеральному підряднику виключні майнові права на створені в рамках цього Договору об'єкти авторського права в повному обсязі для будь-якого використання будь-яким способом на весь строк дії авторського права.

5.2. Субпідрядник гарантує, що створені ним об'єкти авторського права не порушують прав третіх осіб. У разі пред'явлення претензій третіми особами Субпідрядник зобов'язується врегулювати такі претензії самостійно і за власний рахунок.

5.3. Субпідрядник не має права використовувати створені в рамках цього Договору об'єкти авторського права у власних цілях або передавати права на них третім особам.

  1. КОНФІДЕНЦІЙНІСТЬ

6.1. Субпідрядник зобов'язується зберігати в таємниці всю конфіденційну інформацію, отриману від Генерального підрядника та Замовника в ході виконання цього Договору, і не розголошувати її третім особам без попередньої письмової згоди Генерального підрядника.

6.2. До конфіденційної інформації належать будь-які дані, матеріали, документи, комерційна інформація, що стосуються діяльності Генерального підрядника та Замовника.

6.3. Зобов'язання щодо конфіденційності зберігають свою силу протягом 5 років після припинення дії цього Договору.

  1. ВІДПОВІДАЛЬНІСТЬ СТОРІН

7.1. За порушення умов цього Договору винна Сторона відшкодовує завдані цим збитки в повному обсязі.

7.2. За порушення строків оплати Генеральний підрядник сплачує пеню у розмірі подвійної облікової ставки НБУ від суми заборгованості за кожен день прострочення.

7.3. За порушення строків надання Послуг/Робіт Субпідрядник сплачує пеню в розмірі 0,1% від вартості несвоєчасно наданих Послуг/Робіт за кожен день прострочення.

7.4. Субпідрядник несе повну відповідальність перед Генеральним підрядником за якість та своєчасність наданих Послуг/Робіт.

  1. СТРОК ДІЇ ДОГОВОРУ

8.1. Цей Договір набуває чинності з моменту його підписання і діє до повного виконання Сторонами своїх зобов'язань за цим Договором.

  1. ІНШІ УМОВИ

9.1. Цей Договір складений при повному розумінні Сторонами його умов та термінології українською мовою у двох автентичних примірниках, які мають однакову юридичну силу, - по одному для кожної із Сторін.

9.2. Зміни і доповнення до цього Договору можуть бути внесені за взаємною згодою Сторін шляхом укладання додаткових угод.

9.3. У всьому іншому, що не передбачено цим Договором, Сторони керуються чинним законодавством України.

  1. РЕКВІЗИТИ ТА ПІДПИСИ СТОРІН

ГЕНЕРАЛЬНИЙ ПІДРЯДНИК СУБПІДРЯДНИК
ТОВ "IT-РОЗРОБНИК-УКРАЇНА" ФОП __________________
Код ЄДРПОУ: ______________ ІПН: __________________
р/р ____________________ р/р ____________________
в ______________________ в ______________________
МФО ___________________ МФО ___________________
Адреса: ________________ Адреса: ________________
Тел.: __________________ Тел.: __________________

Директор Фізична особа-підприємець

____________ // ____________ //
м.п. м.п.

@CodeCouturiers
Copy link
Author

Для відповіді на це питання розглянемо основні законодавчі акти та норми, що регулюють підписання договорів в Україні:

  1. Основні законодавчі акти:
  • Цивільний кодекс України (ЦКУ)
  • Господарський кодекс України (ГКУ)
  • Закон України "Про електронні документи та електронний документообіг"
  • Закон України "Про електронні довірчі послуги"
  1. Форма договору:

Згідно зі ст. 205 ЦКУ, правочин може вчинятися усно або в письмовій (електронній) формі. Сторони мають право обирати форму правочину, якщо інше не встановлено законом.

Ст. 207 ЦКУ визначає, що правочин вважається таким, що вчинений у письмовій формі, якщо його зміст зафіксований в одному або кількох документах (у тому числі електронних), у листах, телеграмах, якими обмінялися сторони.

  1. Порядок укладення договору:

Ст. 638 ЦКУ встановлює, що договір є укладеним, якщо сторони в належній формі досягли згоди з усіх істотних умов договору. Договір укладається шляхом пропозиції однієї сторони укласти договір (оферти) і прийняття пропозиції (акцепту) другою стороною.

  1. Електронна форма договору:

Згідно зі ст. 205 ЦКУ, правочин вважається вчиненим в електронній формі, якщо воля сторін виражена за допомогою електронних засобів зв'язку.

Закон України "Про електронні документи та електронний документообіг" визначає, що електронний документ, підписаний електронним підписом, має таку ж юридичну силу, як і паперовий документ з власноручним підписом.

  1. Правомірність:

Укладення договорів є правомірним, якщо дотримано всіх вимог законодавства щодо форми, змісту та порядку укладення договору. Основні вимоги:

  • Дієздатність сторін (ст. 203 ЦКУ)
  • Відповідність змісту договору вимогам законодавства (ст. 203 ЦКУ)
  • Дотримання встановленої законом форми (ст. 203 ЦКУ)
  • Вільне волевиявлення сторін (ст. 203 ЦКУ)
  • Спрямованість на реальне настання правових наслідків (ст. 203 ЦКУ)

Висновок:

Законодавство України детально регулює процес підписання договорів, встановлюючи вимоги до їх форми, змісту та порядку укладення. Підписання договорів є правомірним, якщо дотримано всіх законодавчих вимог.

Важливо зазначити, що сучасне законодавство визнає юридичну силу електронних договорів нарівні з паперовими, що особливо актуально для сфери інформатизації.

При укладенні договорів у сфері інформатизації необхідно також враховувати специфічні норми, передбачені спеціальним законодавством, наприклад, Законом України "Про авторське право і суміжні права" щодо передачі прав на об'єкти інтелектуальної власності.

Отже, підписання договорів, у тому числі в електронній формі, є цілком правомірним за умови дотримання всіх вимог чинного законодавства.

@CodeCouturiers
Copy link
Author

Як фізична особа-підприємець (ФОП), ви маєте право укладати договори відповідно до Цивільного кодексу України (ЦКУ). Розглянемо основні аспекти підписання договорів для ФОП:

  1. Правовий статус ФОП:

ФОП має право укладати договори від свого імені як суб'єкт підприємницької діяльності. Згідно зі ст. 51 ЦКУ, до підприємницької діяльності фізичних осіб застосовуються нормативно-правові акти, що регулюють підприємницьку діяльність юридичних осіб, якщо інше не встановлено законом або не випливає із суті відносин.

  1. Форма договору:

Відповідно до ст. 205 ЦКУ, ви можете укладати договори у письмовій (включаючи електронну) формі. Для більшості договорів достатньо простої письмової форми.

  1. Підписання договору:

Як ФОП, ви підписуєте договір особисто, вказуючи своє повне ім'я та реєстраційні дані. Типовий формат підпису:

Фізична особа-підприємець [Прізвище, Ім'я, По батькові]
РНОКПП: [Ваш ідентифікаційний код]
Місце реєстрації: [Адреса]
Підпис: _______________
  1. Використання печатки:

З 19 липня 2017 року використання печатки не є обов'язковим для ФОП (Закон України "Про внесення змін до деяких законодавчих актів України щодо використання печаток юридичними особами та фізичними особами-підприємцями"). Ви можете використовувати печатку за бажанням, але її відсутність не може бути підставою для визнання договору недійсним.

  1. Електронне підписання:

Ви маєте право підписувати договори електронним підписом. Згідно із Законом України "Про електронні довірчі послуги", кваліфікований електронний підпис має таку ж юридичну силу, як і власноручний підпис.

  1. Особливості для різних видів договорів:
  • Для договорів, сума яких перевищує 20 прожиткових мінімумів, встановлених для працездатних осіб, рекомендується письмова форма (ст. 208 ЦКУ).
  • Деякі види договорів (наприклад, договори оренди нерухомості на строк більше 3 років) вимагають нотаріального посвідчення.
  1. Реквізити договору:

У договорі обов'язково вказуйте свої реквізити як ФОП:

  • Повне ім'я
  • РНОКПП (реєстраційний номер облікової картки платника податків)
  • Номер та дата запису в Єдиному державному реєстрі
  • Місце реєстрації
  • Банківські реквізити (за необхідності)
  1. Податкові аспекти:

Пам'ятайте, що як ФОП ви зобов'язані вести облік доходів і витрат. Укладені договори є підставою для відображення господарських операцій.

Висновок:

Як ФОП, ви можете підписувати договори особисто, використовуючи просту письмову або електронну форму. Важливо правильно вказувати свої реквізити та дотримуватися вимог законодавства щодо форми договору для конкретних видів правочинів. Використання печатки є необов'язковим, а електронний підпис має таку ж юридичну силу, як і власноручний.

@CodeCouturiers
Copy link
Author

image

@CodeCouturiers
Copy link
Author

CodeCouturiers commented Aug 9, 2024

using System;
using System.IO;
using System.Collections.Generic;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.Drawing;
using System.Drawing.Drawing2D;

class Program
{
    static Random random = new Random();

    static List<string> ukrainianNames = new List<string>
    {
        "Петро Іваненко", "Олена Коваленко", "Микола Шевченко", "Ірина Бондаренко", "Андрій Мельник",
        "Оксана Ткаченко", "Василь Кравченко", "Наталія Савченко", "Сергій Бойко", "Людмила Захарченко"
    };

    static string GetRandomName()
    {
        return ukrainianNames[random.Next(ukrainianNames.Count)];
    }

    static string GetRandomDate()
    {
        return $"{random.Next(1, 29):D2} {new string[] { "січня", "лютого", "березня", "квітня", "травня", "червня", "липня", "серпня", "вересня", "жовтня", "листопада", "грудня" }[random.Next(12)]} {DateTime.Now.Year}";
    }

    static string GetRandomId()
    {
        return random.Next(10000000, 99999999).ToString();
    }

    static void Main(string[] args)
    {
        // Create a document with A4 size and margins
        Document document = new Document(PageSize.A4, 30, 30, 30, 30);

        try
        {
            PdfWriter writer = PdfWriter.GetInstance(document, new FileStream("Договір.pdf", FileMode.Create));
            document.Open();

            // Зменшуємо розміри шрифтів
            BaseFont baseFont = BaseFont.CreateFont("C:\\Windows\\Fonts\\Arial.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
            iTextSharp.text.Font normalFont = new iTextSharp.text.Font(baseFont, 8, iTextSharp.text.Font.NORMAL);
            iTextSharp.text.Font boldFont = new iTextSharp.text.Font(baseFont, 8, iTextSharp.text.Font.BOLD);
            iTextSharp.text.Font titleFont = new iTextSharp.text.Font(baseFont, 12, iTextSharp.text.Font.BOLD);

            // Add a formal title section
            Paragraph title = new Paragraph("АКТ ПРИЙМАННЯ-ПЕРЕДАЧІ НАДАНИХ ПОСЛУГ/РОБІТ", titleFont);
            title.Alignment = Element.ALIGN_CENTER;
            document.Add(title);
            document.Add(new Paragraph("\n"));

            // Add header with company information
            PdfPTable headerTable = new PdfPTable(1);
            headerTable.WidthPercentage = 100;
            headerTable.DefaultCell.Border = iTextSharp.text.Rectangle.NO_BORDER;

            // Company name and document title
            PdfPCell titleCell = new PdfPCell(new Phrase("ТОВ \"IT-РОЗРОБНИК-УКРАЇНА\"\nм. Київ", normalFont));
            titleCell.HorizontalAlignment = Element.ALIGN_CENTER;
            titleCell.VerticalAlignment = Element.ALIGN_MIDDLE;
            titleCell.Border = iTextSharp.text.Rectangle.NO_BORDER;
            headerTable.AddCell(titleCell);

            document.Add(headerTable);
            document.Add(new Paragraph("\n"));

            // Information about date and place
            string randomDate = GetRandomDate();
            Paragraph datePlace = new Paragraph($"м. Київ                                                                     «{randomDate}»", normalFont);
            datePlace.Alignment = Element.ALIGN_RIGHT;
            document.Add(datePlace);
            document.Add(new Paragraph("\n"));

            // Main text
            string companyId = GetRandomId();
            string directorName = GetRandomName();
            string contractorName = GetRandomName();

            Paragraph mainText = new Paragraph();
            mainText.Add(new Chunk("Товариство з обмеженою відповідальністю «IT-РОЗРОБНИК-УКРАЇНА»", boldFont));
            mainText.Add(new Chunk($" (Ідентифікаційний код {companyId}), в особі директора {directorName}, який діє на підставі Статуту, іменоване надалі «Замовник», з однієї сторони, та\n", normalFont));
            mainText.Add(new Chunk($"Фізична особа-підприємець {contractorName}", boldFont));
            mainText.Add(new Chunk(", іменований надалі «Виконавець», з іншої сторони, склали цей Акт приймання-передачі наданих Послуг/Робіт (надалі – Акт) про наступне:\n\n", normalFont));
            mainText.Add(new Chunk("1. ", boldFont));
            mainText.Add(new Chunk($"На виконання Договору про надання послуг (виконання робіт) у сфері інформатизації № {random.Next(1, 100)} від «{GetRandomDate()}» Виконавець надав, а Замовник прийняв наступні Послуги/Роботи:", normalFont));
            document.Add(mainText);
            document.Add(new Paragraph("\n"));

            // Service table
            PdfPTable table = new PdfPTable(6);
            table.WidthPercentage = 100;
            table.SetWidths(new float[] { 1f, 4f, 3f, 2f, 3f, 2f });
            table.DefaultCell.Padding = 5;
            table.DefaultCell.BackgroundColor = new BaseColor(240, 240, 240);

            string[] headers = { "№", "Найменування Послуги", "Одиниця виміру", "Кількість", "Ціна за од., грн", "Сума, грн" };
            foreach (string header in headers)
            {
                PdfPCell cell = new PdfPCell(new Phrase(header, boldFont));
                cell.HorizontalAlignment = Element.ALIGN_CENTER;
                cell.VerticalAlignment = Element.ALIGN_MIDDLE;
                cell.BackgroundColor = new BaseColor(220, 220, 220);
                table.AddCell(cell);
            }

            int totalSum = 0;
            string[][] data = {
                new string[] { "1", "Послуги з розробки програмного забезпечення (72210000-0)", "година", $"{random.Next(50, 150)}", $"{random.Next(400, 800)}" },
                new string[] { "2", "Послуги з системного аналізу (72240000-9)", "година", $"{random.Next(20, 80)}", $"{random.Next(500, 900)}" },
                new string[] { "3", "Послуги з тестування програмного забезпечення (72254000-0)", "година", $"{random.Next(20, 60)}", $"{random.Next(300, 600)}" }
            };

            foreach (string[] row in data)
            {
                int quantity = int.Parse(row[3]);
                int price = int.Parse(row[4]);
                int sum = quantity * price;
                totalSum += sum;
                
                foreach (string cell in row)
                {
                    table.AddCell(new PdfPCell(new Phrase(cell, normalFont)) { HorizontalAlignment = Element.ALIGN_CENTER, VerticalAlignment = Element.ALIGN_MIDDLE });
                }
                table.AddCell(new PdfPCell(new Phrase(sum.ToString(), normalFont)) { HorizontalAlignment = Element.ALIGN_CENTER, VerticalAlignment = Element.ALIGN_MIDDLE });
            }

            document.Add(table);
            document.Add(new Paragraph("\n"));

            // Additional information
            Paragraph additionalInfo = new Paragraph();
            additionalInfo.Add(new Chunk("2. ", boldFont));
            additionalInfo.Add(new Chunk($"Загальна вартість наданих Послуг/Робіт становить {totalSum} грн ({NumberToWords(totalSum)} гривень 00 копійок), без ПДВ.\n", normalFont));
            additionalInfo.Add(new Chunk("3. ", boldFont));
            additionalInfo.Add(new Chunk("Послуги/Роботи надані в повному обсязі, своєчасно та якісно відповідно до умов Договору. Замовник претензій до обсягу, якості та строків надання Послуг/Робіт не має.\n", normalFont));
            additionalInfo.Add(new Chunk("4. ", boldFont));
            additionalInfo.Add(new Chunk("Цей Акт складено у двох примірниках, що мають однакову юридичну силу, по одному для кожної зі Сторін.", normalFont));
            document.Add(additionalInfo);
            document.Add(new Paragraph("\n"));

            // Signatures
            PdfPTable signatureTable = new PdfPTable(2);
            signatureTable.WidthPercentage = 100;
            signatureTable.SetWidths(new float[] { 1f, 1f });
            signatureTable.DefaultCell.Padding = 10;
            signatureTable.DefaultCell.BorderWidth = 1;
            signatureTable.DefaultCell.BorderColor = BaseColor.LIGHT_GRAY;

            PdfPCell customerCell = new PdfPCell();
            customerCell.AddElement(new Paragraph("ЗАМОВНИК", boldFont));
            customerCell.AddElement(new Paragraph("ТОВ \"IT-РОЗРОБНИК-УКРАЇНА\"", normalFont));
            customerCell.AddElement(new Paragraph($"Код ЄДРПОУ: {companyId}", normalFont));
            customerCell.AddElement(new Paragraph("Директор", normalFont));
            customerCell.AddElement(new Paragraph("\n"));

            // Add random signature for customer
            iTextSharp.text.Image customerSignature = CreateRandomSignature(directorName);
            customerCell.AddElement(customerSignature);
            
            customerCell.AddElement(new Paragraph($"____________ /{directorName}/", normalFont));
            customerCell.AddElement(new Paragraph("       м.п.", normalFont));
            customerCell.AddElement(new Paragraph("\n"));

            customerCell.BorderWidth = 1;
            customerCell.BorderColor = BaseColor.LIGHT_GRAY;
            customerCell.PaddingBottom = 20;

            PdfPCell executorCell = new PdfPCell();
            executorCell.AddElement(new Paragraph("ВИКОНАВЕЦЬ", boldFont));
            executorCell.AddElement(new Paragraph($"ФОП {contractorName}", normalFont));
            executorCell.AddElement(new Paragraph($"ІПН: {GetRandomId()}", normalFont));
            executorCell.AddElement(new Paragraph("Фізична особа-підприємець", normalFont));
            executorCell.AddElement(new Paragraph("\n"));

            // Add random signature for executor
            iTextSharp.text.Image executorSignature = CreateRandomSignature(contractorName);
            executorCell.AddElement(executorSignature);
            
            executorCell.AddElement(new Paragraph($"____________ /{contractorName}/", normalFont));
            executorCell.AddElement(new Paragraph("       м.п.", normalFont));
            executorCell.AddElement(new Paragraph("\n"));

            executorCell.BorderWidth = 1;
            executorCell.BorderColor = BaseColor.LIGHT_GRAY;
            executorCell.PaddingBottom = 20;

            signatureTable.AddCell(customerCell);
            signatureTable.AddCell(executorCell);

            document.Add(signatureTable);
        }
        catch (Exception e)
        {
            Console.WriteLine(e.Message);
        }
        finally
        {
            document.Close();
        }

        Console.WriteLine("PDF створено успішно.");
    }

    static iTextSharp.text.Image CreateRandomSignature(string name)
    {
        int originalWidth = 200;
        int originalHeight = 100;
        float scale = 1f; //(зменшення)
        int width = (int)(originalWidth * scale);
        int height = (int)(originalHeight * scale);

        Bitmap originalBitmap = new Bitmap(originalWidth, originalHeight);
        using (Graphics graphics = Graphics.FromImage(originalBitmap))
        {
            graphics.Clear(Color.White);

            // Create a path for the signature
            using (GraphicsPath path = new GraphicsPath())
            {
                int lastX = random.Next(10, 30);
                int lastY = random.Next(40, 60);
                int points = random.Next(15, 25);

                for (int i = 0; i < points; i++)
                {
                    int newX = random.Next(Math.Max(0, lastX - 30), Math.Min(originalWidth, lastX + 30));
                    int newY = random.Next(Math.Max(0, lastY - 20), Math.Min(originalHeight, lastY + 20));

                    int controlX = (lastX + newX) / 2 + random.Next(-20, 20);
                    int controlY = (lastY + newY) / 2 + random.Next(-20, 20);

                    path.AddBezier(lastX, lastY, controlX, controlY, controlX, controlY, newX, newY);

                    lastX = newX;
                    lastY = newY;
                }

                // Draw the signature with a gradient
                using (LinearGradientBrush brush = new LinearGradientBrush(
                    new Point(0, 0),
                    new Point(originalWidth, originalHeight),
                    Color.FromArgb(random.Next(50, 150), 0, 0, 0),
                    Color.FromArgb(random.Next(150, 256), 0, 0, 0)))
                {
                    using (Pen pen = new Pen(brush, random.Next(2, 4)))
                    {
                        graphics.DrawPath(pen, path);
                    }
                }
            }

            // Add a decorative underline
            using (Pen underlinePen = new Pen(Color.FromArgb(100, 0, 0, 0), 1))
            {
                underlinePen.DashStyle = System.Drawing.Drawing2D.DashStyle.Dot;
                graphics.DrawLine(underlinePen, 10, originalHeight - 10, originalWidth - 10, originalHeight - 10);
            }

            // Add initials with shadow
            using (System.Drawing.Font font = new System.Drawing.Font("Arial", 14, FontStyle.Bold))
            {
                string[] nameParts = name.Split(' ');
                string initials = $"{nameParts[0][0]}.{nameParts[1][0]}.";

                // Draw shadow
                using (SolidBrush shadowBrush = new SolidBrush(Color.FromArgb(50, 0, 0, 0)))
                {
                    graphics.DrawString(initials, font, shadowBrush, originalWidth - 52, originalHeight - 32);
                }

                // Draw initials
                using (SolidBrush brush = new SolidBrush(Color.FromArgb(200, 0, 0, 0)))
                {
                    graphics.DrawString(initials, font, brush, originalWidth - 50, originalHeight - 30);
                }
            }
        }

        // Scale down the image
        Bitmap scaledBitmap = new Bitmap(width, height);
        using (Graphics graphics = Graphics.FromImage(scaledBitmap))
        {
            graphics.InterpolationMode = InterpolationMode.HighQualityBicubic;
            graphics.DrawImage(originalBitmap, 0, 0, width, height);
        }

        MemoryStream ms = new MemoryStream();
        scaledBitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Png);
        return iTextSharp.text.Image.GetInstance(ms.ToArray());
    }


    static string NumberToWords(int number)
    {
        // This is a simplified version. For a full implementation, you'd need a more complex algorithm.
        string[] units = { "", "одна", "дві", "три", "чотири", "п'ять", "шість", "сім", "вісім", "дев'ять" };
        string[] teens = { "десять", "одинадцять", "дванадцять", "тринадцять", "чотирнадцять", "п'ятнадцять", "шістнадцять", "сімнадцять", "вісімнадцять", "дев'ятнадцять" };
        string[] tens = { "", "", "двадцять", "тридцять", "сорок", "п'ятдесят", "шістдесят", "сімдесят", "вісімдесят", "дев'яносто" };
        string[] thousands = { "", "тисяча", "тисячі", "тисяч" };

        if (number == 0)
            return "нуль";

        if (number < 0)
            return "мінус " + NumberToWords(Math.Abs(number));

        string words = "";

        if ((number / 1000) > 0)
        {
            words += NumberToWords(number / 1000) + " " + thousands[(number / 1000) % 10] + " ";
            number %= 1000;
        }

        if ((number / 100) > 0)
        {
            words += units[number / 100] + "сот ";
            number %= 100;
        }

        if (number >= 20)
        {
            words += tens[number / 10] + " ";
            number %= 10;
        }

        if (number >= 10)
        {
            words += teens[number - 10] + " ";
            return words;
        }

        if (number > 0)
        {
            words += units[number] + " ";
        }

        return words.Trim();
    }
}

@CodeCouturiers
Copy link
Author

image
image
image

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment