Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 9 additions & 1 deletion virtual_pro/virtual_pro/doctype/enquiry/enquiry.json
Original file line number Diff line number Diff line change
Expand Up @@ -10,6 +10,7 @@
"company",
"customer_company_name",
"nationality",
"enquiry_type",
"source_name",
"care_of",
"remarks",
Expand Down Expand Up @@ -176,12 +177,18 @@
"label": "Source",
"options": "\nGoogle Ads\nSEO\nMeta Ads\nReference\nVpro clients",
"reqd": 1
},
{
"fieldname": "enquiry_type",
"fieldtype": "Link",
"label": "Enquiry Type",
"options": "Type"
}
],
"index_web_pages_for_search": 1,
"is_submittable": 1,
"links": [],
"modified": "2025-06-21 08:30:33.390025",
"modified": "2025-06-21 09:53:36.995758",
"modified_by": "Administrator",
"module": "Virtual Pro",
"name": "Enquiry",
Expand All @@ -202,6 +209,7 @@
"write": 1
}
],
"row_format": "Dynamic",
"sort_field": "modified",
"sort_order": "DESC",
"states": []
Expand Down
Empty file.
9 changes: 9 additions & 0 deletions virtual_pro/virtual_pro/doctype/type/test_type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Copyright (c) 2025, sammish and Contributors
# See license.txt

# import frappe
from frappe.tests.utils import FrappeTestCase


class TestType(FrappeTestCase):
pass
8 changes: 8 additions & 0 deletions virtual_pro/virtual_pro/doctype/type/type.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
// Copyright (c) 2025, sammish and contributors
// For license information, please see license.txt

// frappe.ui.form.on("Type", {
// refresh(frm) {

// },
// });
44 changes: 44 additions & 0 deletions virtual_pro/virtual_pro/doctype/type/type.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,44 @@
{
"actions": [],
"allow_rename": 1,
"creation": "2025-06-21 09:52:42.297944",
"doctype": "DocType",
"engine": "InnoDB",
"field_order": [
"type"
],
"fields": [
{
"fieldname": "type",
"fieldtype": "Data",
"label": "Type"
}
],
"grid_page_length": 50,
"index_web_pages_for_search": 1,
"links": [],
"modified": "2025-06-21 09:53:11.402580",
"modified_by": "Administrator",
"module": "Virtual Pro",
"name": "Type",
"owner": "Administrator",
"permissions": [
{
"create": 1,
"delete": 1,
"email": 1,
"export": 1,
"print": 1,
"read": 1,
"report": 1,
"role": "System Manager",
"share": 1,
"write": 1
}
],
"quick_entry": 1,
"row_format": "Dynamic",
"sort_field": "modified",
"sort_order": "DESC",
"states": []
}
9 changes: 9 additions & 0 deletions virtual_pro/virtual_pro/doctype/type/type.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
# Copyright (c) 2025, sammish and contributors
# For license information, please see license.txt

# import frappe
from frappe.model.document import Document


class Type(Document):
pass
Empty file.
Empty file.
32 changes: 32 additions & 0 deletions virtual_pro/virtual_pro/print_format/invoice/invoice.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
{
"absolute_value": 0,
"align_labels_right": 0,
"creation": "2025-06-20 13:26:00.838542",
"custom_format": 1,
"default_print_language": "en",
"disabled": 0,
"doc_type": "Sales Invoice",
"docstatus": 0,
"doctype": "Print Format",
"font_size": 14,
"html": "<!DOCTYPE html>\n<html>\n<head>\n <meta charset=\"utf-8\">\n <title>Virtual PRO Invoice</title>\n <style>\n body {\n font-family: Arial, sans-serif;\n margin: 0;\n padding: 20px;\n background: white;\n font-size: 12px;\n line-height: 1.4;\n }\n \n .invoice-container {\n max-width: 800px;\n margin: 0 auto;\n background: white;\n }\n \n .header {\n display: flex;\n justify-content: space-between;\n align-items: flex-start;\n margin-bottom: 30px;\n border-bottom: 1px solid #eee;\n padding-bottom: 20px;\n }\n \n .logo-section {\n display: flex;\n align-items: center;\n }\n \n .logo {\n width: 80px;\n height: 80px;\n border-radius: 50%;\n background: white;\n display: flex;\n align-items: center;\n justify-content: center;\n margin-right: 15px;\n position: relative;\n overflow: hidden;\n border: 2px solid #8B4513;\n }\n \n .logo img {\n width: 100%;\n height: 100%;\n object-fit: cover;\n border-radius: 50%;\n }\n \n .company-name {\n font-size: 24px;\n font-weight: bold;\n color: #8B4513;\n margin: 0;\n }\n \n .company-tagline {\n font-size: 14px;\n color: #D2691E;\n margin: 0;\n }\n \n .invoice-title {\n text-align: right;\n }\n \n .invoice-title h1 {\n font-size: 36px;\n margin: 0;\n color: #333;\n font-weight: normal;\n }\n \n .invoice-number {\n font-size: 14px;\n color: #666;\n margin: 5px 0 0 0;\n }\n \n .balance-due {\n text-align: right;\n margin-top: 15px;\n }\n \n .balance-label {\n font-size: 12px;\n color: #666;\n }\n \n .balance-amount {\n font-size: 20px;\n font-weight: bold;\n color: #333;\n margin: 5px 0;\n }\n \n .company-details {\n display: flex;\n justify-content: space-between;\n margin-bottom: 30px;\n }\n \n .company-info {\n flex: 1;\n }\n \n .company-info h3 {\n margin: 0 0 10px 0;\n font-size: 16px;\n color: #333;\n }\n \n .address {\n color: #666;\n line-height: 1.6;\n }\n \n .invoice-meta {\n text-align: right;\n flex: 1;\n }\n \n .meta-row {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 8px;\n }\n \n .meta-label {\n margin-right: 20px;\n color: #666;\n min-width: 100px;\n text-align: right;\n }\n \n .meta-value {\n font-weight: bold;\n color: #333;\n }\n \n .client-name {\n margin: 20px 0;\n font-size: 16px;\n font-weight: bold;\n color: #333;\n }\n \n .items-table {\n width: 100%;\n border-collapse: collapse;\n margin-bottom: 20px;\n }\n \n .items-table th {\n background: #8B4513;\n color: white;\n padding: 12px;\n text-align: left;\n font-weight: bold;\n }\n \n .items-table th:first-child {\n width: 5%;\n text-align: center;\n }\n \n .items-table th:nth-child(2) {\n width: 60%;\n }\n \n .items-table th:nth-child(3) {\n width: 10%;\n text-align: center;\n }\n \n .items-table th:nth-child(4) {\n width: 12.5%;\n text-align: right;\n }\n \n .items-table th:nth-child(5) {\n width: 12.5%;\n text-align: right;\n }\n \n .items-table td {\n padding: 12px;\n border-bottom: 1px solid #eee;\n }\n \n .items-table td:first-child {\n text-align: center;\n font-weight: bold;\n }\n \n .items-table td:nth-child(3) {\n text-align: center;\n }\n \n .items-table td:nth-child(4),\n .items-table td:nth-child(5) {\n text-align: right;\n }\n \n .totals-section {\n margin-top: 20px;\n border-top: 1px solid #eee;\n padding-top: 15px;\n }\n \n .total-row {\n display: flex;\n justify-content: flex-end;\n margin-bottom: 8px;\n }\n \n .total-label {\n margin-right: 40px;\n min-width: 120px;\n text-align: right;\n }\n \n .total-value {\n font-weight: bold;\n min-width: 100px;\n text-align: right;\n }\n \n .final-total {\n border-top: 2px solid #8B4513;\n padding-top: 8px;\n margin-top: 8px;\n }\n \n .final-total .total-label,\n .final-total .total-value {\n font-size: 16px;\n font-weight: bold;\n color: #8B4513;\n }\n \n .footer {\n margin-top: 40px;\n border-top: 1px solid #eee;\n padding-top: 20px;\n }\n \n .thanks {\n margin-bottom: 20px;\n font-style: italic;\n color: #666;\n text-align: center;\n font-size: 14px;\n }\n \n .bank-details {\n background: #f9f9f9;\n padding: 20px;\n border-radius: 5px;\n border-left: 4px solid #8B4513;\n }\n \n .bank-details h4 {\n margin: 0 0 15px 0;\n font-size: 14px;\n color: #8B4513;\n font-weight: bold;\n }\n \n .bank-info {\n display: grid;\n grid-template-columns: repeat(2, 1fr);\n gap: 12px;\n color: #666;\n }\n \n .bank-row {\n display: flex;\n }\n \n .bank-label {\n font-weight: bold;\n margin-right: 10px;\n min-width: 120px;\n color: #333;\n }\n \n @media print {\n body {\n padding: 0;\n }\n .invoice-container {\n max-width: none;\n }\n }\n </style>\n</head>\n<body>\n <div class=\"invoice-container\">\n <!-- Header Section -->\n <div class=\"header\">\n <div class=\"logo-section\">\n <div class=\"logo\">\n <!-- Replace this base64 with your actual logo file path when using -->\n <img src=\"/files/Virtual Pro-01.png\" />\n </div>\n \n </div>\n <div class=\"invoice-title\">\n <h1>INVOICE</h1>\n <p class=\"invoice-number\"># {{ doc.name }}</p>\n <div class=\"balance-due\">\n <div class=\"balance-label\">Balance Due</div>\n <div class=\"balance-amount\">{{ doc.currency }} {{ \"%.2f\"|format(doc.grand_total) }}</div>\n </div>\n </div>\n </div>\n\n <!-- Company Details and Invoice Meta -->\n <div class=\"company-details\">\n <div class=\"company-info\">\n <h3>Virtual PRO</h3>\n <div class=\"address\">\n #Wafi Residence Office LHEU<br>\n Dubai Health Care City<br>\n #Innov8 Incubator<br>\n Al quoz 1, Dubai<br><br>\n Email: info@virtualpro.ae<br>\n Mobile: +971 581537204\n </div>\n </div>\n <div class=\"invoice-meta\">\n <div class=\"meta-row\">\n <span class=\"meta-label\">Invoice Date:</span>\n <span class=\"meta-value\">{{ doc.posting_date }}</span>\n </div>\n <div class=\"meta-row\">\n <span class=\"meta-label\">Terms:</span>\n <span class=\"meta-value\">{{ doc.payment_terms_template or \"Net 30\" }}</span>\n </div>\n <div class=\"meta-row\">\n <span class=\"meta-label\">Due Date:</span>\n <span class=\"meta-value\">{{ doc.due_date }}</span>\n </div>\n </div>\n </div>\n\n <!-- Client Name -->\n <div class=\"client-name\">\n Bill To: {{ doc.customer_name or doc.customer }}\n </div>\n\n <!-- Items Table -->\n <table class=\"items-table\">\n <thead>\n <tr>\n <th>#</th>\n <th>Description</th>\n <th>Qty</th>\n <th>Rate</th>\n <th>Amount</th>\n </tr>\n </thead>\n <tbody>\n {% for item in doc.items %}\n <tr>\n <td>{{ loop.index }}</td>\n <td>{{ item.item_name or item.description }}</td>\n <td>{{ \"%.2f\"|format(item.qty) }}</td>\n <td>{{ doc.currency }} {{ \"%.2f\"|format(item.rate) }}</td>\n <td>{{ doc.currency }} {{ \"%.2f\"|format(item.amount) }}</td>\n </tr>\n {% endfor %}\n </tbody>\n </table>\n\n <!-- Totals Section -->\n <div class=\"totals-section\">\n <div class=\"total-row\">\n <span class=\"total-label\">Sub Total</span>\n <span class=\"total-value\">{{ doc.currency }} {{ \"%.2f\"|format(doc.net_total) }}</span>\n </div>\n \n {% if doc.taxes %}\n {% for tax in doc.taxes %}\n <div class=\"total-row\">\n <span class=\"total-label\">{{ tax.description }}</span>\n <span class=\"total-value\">{{ doc.currency }} {{ \"%.2f\"|format(tax.tax_amount) }}</span>\n </div>\n {% endfor %}\n {% endif %}\n \n <div class=\"total-row final-total\">\n <span class=\"total-label\">Total</span>\n <span class=\"total-value\">{{ doc.currency }} {{ \"%.2f\"|format(doc.grand_total) }}</span>\n </div>\n \n <div class=\"total-row final-total\">\n <span class=\"total-label\">Balance Due</span>\n <span class=\"total-value\">{{ doc.currency }} {{ \"%.2f\"|format(doc.outstanding_amount or doc.grand_total) }}</span>\n </div>\n </div>\n\n <!-- Footer -->\n <div class=\"footer\">\n <div class=\"thanks\">\n Thank you for your business!\n </div>\n <div class=\"bank-details\">\n <h4>BANK ACCOUNT DETAILS</h4>\n <div class=\"bank-info\">\n <div class=\"bank-row\">\n <span class=\"bank-label\">NAME:</span>\n <span>VIRTUAL PRO DOCUMENTS CLEAR CO LLC</span>\n </div>\n <div class=\"bank-row\">\n <span class=\"bank-label\">BANK NAME:</span>\n <span>ADCB</span>\n </div>\n <div class=\"bank-row\">\n <span class=\"bank-label\">ACCOUNT NO:</span>\n <span>12539998920001</span>\n </div>\n <div class=\"bank-row\">\n <span class=\"bank-label\">IBAN:</span>\n <span>AE61 0030 0125 3999 8920 001</span>\n </div>\n <div class=\"bank-row\">\n <span class=\"bank-label\">BRANCH:</span>\n <span>DUBAI MALL</span>\n </div>\n </div>\n </div>\n </div>\n </div>\n</body>\n</html>",
"idx": 0,
"line_breaks": 0,
"margin_bottom": 15.0,
"margin_left": 15.0,
"margin_right": 15.0,
"margin_top": 15.0,
"modified": "2025-06-21 09:54:33.745687",
"modified_by": "Administrator",
"module": "Virtual Pro",
"name": "invoice",
"owner": "Administrator",
"page_number": "Hide",
"pdf_generator": "wkhtmltopdf",
"print_format_builder": 0,
"print_format_builder_beta": 0,
"print_format_type": "Jinja",
"raw_printing": 0,
"show_section_headings": 0,
"standard": "Yes"
}